{"version":3,"file":"filex.umd.cjs","sources":["../../../node_modules/.pnpm/@vue+shared@3.5.34/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../node_modules/.pnpm/@vue+reactivity@3.5.34/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../node_modules/.pnpm/@vue+runtime-core@3.5.34/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../node_modules/.pnpm/@vue+runtime-dom@3.5.34/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../core/src/types/FileNode.ts","../../core/src/locales/resolve.ts","../../core/src/composables/useFileApi.ts","../../core/src/lib/uploadResume.ts","../../core/src/composables/useUploadChunked.ts","../../core/src/composables/useSelection.ts","../../core/src/composables/useKeyboardShortcuts.ts","../../core/src/locales/index.ts","../../core/src/locales/tr.ts","../../core/src/locales/en.ts","../../core/src/lib/timezone.ts","../../core/src/composables/useLocale.ts","../../core/src/composables/usePendingOps.ts","../../core/src/lib/realtime.ts","../../core/src/lib/burstDebounce.ts","../../core/src/composables/useRealtime.ts","../../core/src/composables/useThumbs.ts","../../core/src/composables/useMonacoLoader.ts","../../core/src/components/PresenceAvatar.vue","../../core/src/components/PresenceBar.vue","../../core/src/lib/actionIcons.ts","../../core/src/components/ContextMenu.vue","../../core/src/components/Toolbar.vue","../../core/src/components/TagPicker.vue","../../core/src/lib/fileIcons.ts","../../core/src/lib/e2ecrypto.ts","../../core/src/lib/listing.ts","../../core/src/lib/sortOrder.ts","../../core/src/lib/viewPrefs.ts","../../core/src/lib/uiProfile.ts","../../core/src/components/RecentlyOpened.vue","../../core/src/lib/fileFilters.ts","../../core/src/components/UploadProgress.vue","../../core/src/lib/opProgress.ts","../../core/src/components/PendingOpsTray.vue","../../core/src/components/InspectorPanel.vue","../../core/src/components/SideNav.vue","../../core/src/lib/dragOut.ts","../../core/src/composables/useRowTouch.ts","../../core/src/components/ItemCheck.vue","../../core/src/lib/filePreview.ts","../../core/src/lib/dateGroups.ts","../../core/src/lib/star.ts","../../core/src/components/StarButton.vue","../../core/src/lib/snippet.ts","../../core/src/lib/dragGhost.ts","../../core/src/components/GridView.vue","../../core/src/components/HomeView.vue","../../core/src/composables/useConnections.ts","../../core/src/lib/connectionGuides.ts","../../core/src/components/StorageFields.vue","../../core/src/components/ConnectionGuideView.vue","../../core/src/composables/useS3Keys.ts","../../core/src/composables/useScrolledX.ts","../../core/src/components/S3KeysPanel.vue","../../core/src/composables/useSSHKeys.ts","../../core/src/components/SSHKeysPanel.vue","../../core/src/composables/useNFSExports.ts","../../core/src/components/NFSExportsPanel.vue","../../core/src/composables/useTokens.ts","../../core/src/components/TokensPanel.vue","../../core/src/components/ConnectionsPanel.vue","../../core/src/components/CommandPalette.vue","../../core/src/modals/Modal.vue","../../core/src/lib/advSearch.ts","../../core/src/components/AdvancedSearch.vue","../../core/src/components/ShortcutsHelp.vue","../../core/src/lib/themes.ts","../../core/src/components/ThemePalette.vue","../../core/src/components/ThemeGallery.vue","../../core/src/components/TimeZonePicker.vue","../../core/src/components/TimeZoneDialog.vue","../../core/src/composables/useExplorerTimeZone.ts","../../core/src/components/ShortcutSettings.vue","../../core/src/lib/externalReach.ts","../../core/src/modals/PreviewModal.vue","../../core/src/components/QuickLook.vue","../../core/src/components/OperationsCenter.vue","../../core/src/composables/useOperations.ts","../../core/src/components/OnboardingTour.vue","../../core/src/components/TabBar.vue","../../core/src/components/Breadcrumb.vue","../../core/src/components/FilterBar.vue","../../core/src/components/ViewSwitcher.vue","../../core/src/components/ListView.vue","../../core/src/components/GalleryView.vue","../../core/src/components/FilePane.vue","../../core/src/composables/useTabs.ts","../../core/src/components/EncryptedFolderModal.vue","../../core/src/components/RecoveryKeyModal.vue","../../core/src/components/E2eRecoveryUnlockModal.vue","../../core/src/lib/nodeRow.ts","../../core/src/lib/tags.ts","../../core/src/lib/transfer.ts","../../core/src/lib/downloadSelection.ts","../../core/src/lib/destinationTree.ts","../../core/src/modals/NewFolderModal.vue","../../core/src/modals/DestinationPickerModal.vue","../../core/src/modals/NewDocumentModal.vue","../../core/src/modals/RenameModal.vue","../../core/src/modals/DeleteConfirmModal.vue","../../core/src/modals/ConvertModal.vue","../../core/src/lib/shareCli.ts","../../core/src/lib/shareTtl.ts","../../core/src/modals/PermissionsModal.vue","../../core/src/FileExplorer.vue","../../core/dist/index-BArI-B1M.js","../src/index.ts","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/core.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/xml.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/bash.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/c.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/cpp.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/csharp.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/css.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/markdown.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/diff.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/ruby.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/go.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/graphql.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/ini.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/java.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/javascript.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/json.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/kotlin.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/less.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/lua.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/makefile.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/perl.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/objectivec.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/php.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/php-template.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/plaintext.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/python.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/python-repl.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/r.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/rust.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/scss.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/shell.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/sql.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/swift.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/yaml.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/typescript.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/vbnet.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/languages/wasm.js","../../../node_modules/.pnpm/highlight.js@11.11.1/node_modules/highlight.js/lib/common.js","../../core/src/viewers/Viewer3D.vue","../../core/src/viewers/EpubViewer.vue","../../core/src/composables/useViewerFetch.ts","../../core/src/viewers/MermaidViewer.vue","../../core/src/viewers/DrawioViewer.vue","../../core/src/viewers/TiffViewer.vue","../../core/src/viewers/PsdViewer.vue","../../core/src/viewers/IpynbViewer.vue","../../core/src/viewers/CsvViewer.vue","../../core/src/viewers/ArchiveViewer.vue","../../../node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/decode.mjs","../../../node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/encode.mjs","../../../node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/format.mjs","../../../node_modules/.pnpm/mdurl@2.0.0/node_modules/mdurl/lib/parse.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/properties/Any/regex.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Cc/regex.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Cf/regex.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/P/regex.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/S/regex.mjs","../../../node_modules/.pnpm/uc.micro@2.1.0/node_modules/uc.micro/categories/Z/regex.mjs","../../../node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/generated/decode-data-html.js","../../../node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/generated/decode-data-xml.js","../../../node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/decode_codepoint.js","../../../node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/decode.js","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/common/utils.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/helpers/parse_link_label.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/helpers/parse_link_destination.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/helpers/parse_link_title.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/renderer.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/ruler.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/token.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/state_core.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/normalize.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/block.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/inline.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/linkify.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/replacements.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/smartquotes.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_core/text_join.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/parser_core.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/state_block.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/table.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/code.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/fence.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/blockquote.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/hr.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/list.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/reference.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/common/html_blocks.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/common/html_re.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/html_block.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/heading.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/lheading.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_block/paragraph.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/parser_block.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/state_inline.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/text.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/linkify.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/newline.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/escape.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/backticks.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/strikethrough.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/emphasis.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/link.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/image.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/autolink.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/html_inline.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/entity.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/rules_inline/fragments_join.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/parser_inline.mjs","../../../node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs","../../../node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs","../../../node_modules/.pnpm/punycode.js@2.3.1/node_modules/punycode.js/punycode.es6.js","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/index.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/presets/default.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/presets/zero.mjs","../../../node_modules/.pnpm/markdown-it@14.1.1/node_modules/markdown-it/lib/presets/commonmark.mjs","../../../node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.mjs","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/common.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/trees.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/adler32.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/crc32.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/messages.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/deflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/utils/strings.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/zstream.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/deflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inffast.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inftrees.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/inflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/constants.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/zlib/gzheader.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/lib/inflate.js","../../../node_modules/.pnpm/pako@1.0.11/node_modules/pako/index.js","../../../node_modules/.pnpm/utif@3.1.0/node_modules/utif/UTIF.js","../../../node_modules/.pnpm/pako@2.1.0/node_modules/pako/dist/pako.esm.mjs","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/jpeg.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/helpers.js","../../../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/utf8.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/descriptor.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/imageResources.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psdReader.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/effectsHelpers.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/engineData.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/text.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/engineData2.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/additionalInfo.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psdWriter.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/abr.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/csh.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/psd.js","../../../node_modules/.pnpm/ag-psd@30.1.1/node_modules/ag-psd/dist-es/index.js","../../../node_modules/.pnpm/papaparse@5.5.3/node_modules/papaparse/papaparse.min.js"],"sourcesContent":["/**\n* @vue/shared v3.5.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n  const map = /* @__PURE__ */ Object.create(null);\n  for (const key of str.split(\",\")) map[key] = 1;\n  return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return ((str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n  (str) => {\n    return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n  }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n  (str) => {\n    const s = str ? `on${capitalize(str)}` : ``;\n    return s;\n  }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](...arg);\n  }\n};\nconst def = (obj, key, value, writable = false) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    writable,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n  return source + JSON.stringify(\n    options,\n    (_, val) => typeof val === \"function\" ? val.toString() : val\n  );\n}\n\nconst PatchFlags = {\n  \"TEXT\": 1,\n  \"1\": \"TEXT\",\n  \"CLASS\": 2,\n  \"2\": \"CLASS\",\n  \"STYLE\": 4,\n  \"4\": \"STYLE\",\n  \"PROPS\": 8,\n  \"8\": \"PROPS\",\n  \"FULL_PROPS\": 16,\n  \"16\": \"FULL_PROPS\",\n  \"NEED_HYDRATION\": 32,\n  \"32\": \"NEED_HYDRATION\",\n  \"STABLE_FRAGMENT\": 64,\n  \"64\": \"STABLE_FRAGMENT\",\n  \"KEYED_FRAGMENT\": 128,\n  \"128\": \"KEYED_FRAGMENT\",\n  \"UNKEYED_FRAGMENT\": 256,\n  \"256\": \"UNKEYED_FRAGMENT\",\n  \"NEED_PATCH\": 512,\n  \"512\": \"NEED_PATCH\",\n  \"DYNAMIC_SLOTS\": 1024,\n  \"1024\": \"DYNAMIC_SLOTS\",\n  \"DEV_ROOT_FRAGMENT\": 2048,\n  \"2048\": \"DEV_ROOT_FRAGMENT\",\n  \"CACHED\": -1,\n  \"-1\": \"CACHED\",\n  \"BAIL\": -2,\n  \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `NEED_HYDRATION`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `CACHED`,\n  [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"FUNCTIONAL_COMPONENT\": 2,\n  \"2\": \"FUNCTIONAL_COMPONENT\",\n  \"STATEFUL_COMPONENT\": 4,\n  \"4\": \"STATEFUL_COMPONENT\",\n  \"TEXT_CHILDREN\": 8,\n  \"8\": \"TEXT_CHILDREN\",\n  \"ARRAY_CHILDREN\": 16,\n  \"16\": \"ARRAY_CHILDREN\",\n  \"SLOTS_CHILDREN\": 32,\n  \"32\": \"SLOTS_CHILDREN\",\n  \"TELEPORT\": 64,\n  \"64\": \"TELEPORT\",\n  \"SUSPENSE\": 128,\n  \"128\": \"SUSPENSE\",\n  \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n  \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n  \"COMPONENT_KEPT_ALIVE\": 512,\n  \"512\": \"COMPONENT_KEPT_ALIVE\",\n  \"COMPONENT\": 6,\n  \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n  \"STABLE\": 1,\n  \"1\": \"STABLE\",\n  \"DYNAMIC\": 2,\n  \"2\": \"DYNAMIC\",\n  \"FORWARDED\": 3,\n  \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  start = Math.max(0, Math.min(start, source.length));\n  end = Math.max(0, Math.min(end, source.length));\n  if (start > end) return \"\";\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length) continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value) || isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  if (!styles) return \"\";\n  if (isString(styles)) return styles;\n  let ret = \"\";\n  for (const key in styles) {\n    const value = styles[key];\n    if (isString(value) || typeof value === \"number\") {\n      const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props) return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n  `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n  if (value == null) {\n    return false;\n  }\n  const type = typeof value;\n  return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n  return key.replace(\n    cssVarNameEscapeSymbolsRE,\n    (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n  );\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length) return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b) return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n  return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (isRef(val)) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce(\n        (entries, [key, val2], i) => {\n          entries[stringifySymbol(key, i) + \" =>\"] = val2;\n          return entries;\n        },\n        {}\n      )\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n    };\n  } else if (isSymbol(val)) {\n    return stringifySymbol(val);\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n  var _a;\n  return (\n    // Symbol.description in es2019+ so we need to cast here to pass\n    // the lib: es2016 check\n    isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n  );\n};\n\nfunction normalizeCssVarValue(value) {\n  if (value == null) {\n    return \"initial\";\n  }\n  if (typeof value === \"string\") {\n    return value === \"\" ? \" \" : value;\n  }\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      console.warn(\n        \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n        value\n      );\n    }\n  }\n  return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  // TODO isolatedDeclarations \"__v_skip\"\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal track `on` calls, allow `on` call multiple times\n     */\n    this._on = 0;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this._isPaused = false;\n    this._warnOnRun = true;\n    this.__v_skip = true;\n    if (!detached && activeEffectScope) {\n      if (activeEffectScope.active) {\n        this.parent = activeEffectScope;\n        this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n          this\n        ) - 1;\n      } else {\n        this._active = false;\n        this._warnOnRun = false;\n      }\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  pause() {\n    if (this._active) {\n      this._isPaused = true;\n      let i, l;\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].pause();\n        }\n      }\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].pause();\n      }\n    }\n  }\n  /**\n   * Resumes the effect scope, including all child scopes and effects.\n   */\n  resume() {\n    if (this._active) {\n      if (this._isPaused) {\n        this._isPaused = false;\n        let i, l;\n        if (this.scopes) {\n          for (i = 0, l = this.scopes.length; i < l; i++) {\n            this.scopes[i].resume();\n          }\n        }\n        for (i = 0, l = this.effects.length; i < l; i++) {\n          this.effects[i].resume();\n        }\n      }\n    }\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && this._warnOnRun) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    if (++this._on === 1) {\n      this.prevScope = activeEffectScope;\n      activeEffectScope = this;\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    if (this._on > 0 && --this._on === 0) {\n      if (activeEffectScope === this) {\n        activeEffectScope = this.prevScope;\n      } else {\n        let current = activeEffectScope;\n        while (current) {\n          if (current.prevScope === this) {\n            current.prevScope = this.prevScope;\n            break;\n          }\n          current = current.prevScope;\n        }\n      }\n      this.prevScope = void 0;\n    }\n  }\n  stop(fromParent) {\n    if (this._active) {\n      this._active = false;\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      this.effects.length = 0;\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      this.cleanups.length = 0;\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n        this.scopes.length = 0;\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nlet activeSub;\nconst EffectFlags = {\n  \"ACTIVE\": 1,\n  \"1\": \"ACTIVE\",\n  \"RUNNING\": 2,\n  \"2\": \"RUNNING\",\n  \"TRACKING\": 4,\n  \"4\": \"TRACKING\",\n  \"NOTIFIED\": 8,\n  \"8\": \"NOTIFIED\",\n  \"DIRTY\": 16,\n  \"16\": \"DIRTY\",\n  \"ALLOW_RECURSE\": 32,\n  \"32\": \"ALLOW_RECURSE\",\n  \"PAUSED\": 64,\n  \"64\": \"PAUSED\",\n  \"EVALUATED\": 128,\n  \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n  constructor(fn) {\n    this.fn = fn;\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 1 | 4;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    /**\n     * @internal\n     */\n    this.cleanup = void 0;\n    this.scheduler = void 0;\n    if (activeEffectScope) {\n      if (activeEffectScope.active) {\n        activeEffectScope.effects.push(this);\n      } else {\n        this.flags &= -2;\n      }\n    }\n  }\n  pause() {\n    this.flags |= 64;\n  }\n  resume() {\n    if (this.flags & 64) {\n      this.flags &= -65;\n      if (pausedQueueEffects.has(this)) {\n        pausedQueueEffects.delete(this);\n        this.trigger();\n      }\n    }\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    if (this.flags & 2 && !(this.flags & 32)) {\n      return;\n    }\n    if (!(this.flags & 8)) {\n      batch(this);\n    }\n  }\n  run() {\n    if (!(this.flags & 1)) {\n      return this.fn();\n    }\n    this.flags |= 2;\n    cleanupEffect(this);\n    prepareDeps(this);\n    const prevEffect = activeSub;\n    const prevShouldTrack = shouldTrack;\n    activeSub = this;\n    shouldTrack = true;\n    try {\n      return this.fn();\n    } finally {\n      if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n        warn(\n          \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n        );\n      }\n      cleanupDeps(this);\n      activeSub = prevEffect;\n      shouldTrack = prevShouldTrack;\n      this.flags &= -3;\n    }\n  }\n  stop() {\n    if (this.flags & 1) {\n      for (let link = this.deps; link; link = link.nextDep) {\n        removeSub(link);\n      }\n      this.deps = this.depsTail = void 0;\n      cleanupEffect(this);\n      this.onStop && this.onStop();\n      this.flags &= -2;\n    }\n  }\n  trigger() {\n    if (this.flags & 64) {\n      pausedQueueEffects.add(this);\n    } else if (this.scheduler) {\n      this.scheduler();\n    } else {\n      this.runIfDirty();\n    }\n  }\n  /**\n   * @internal\n   */\n  runIfDirty() {\n    if (isDirty(this)) {\n      this.run();\n    }\n  }\n  get dirty() {\n    return isDirty(this);\n  }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n  sub.flags |= 8;\n  if (isComputed) {\n    sub.next = batchedComputed;\n    batchedComputed = sub;\n    return;\n  }\n  sub.next = batchedSub;\n  batchedSub = sub;\n}\nfunction startBatch() {\n  batchDepth++;\n}\nfunction endBatch() {\n  if (--batchDepth > 0) {\n    return;\n  }\n  if (batchedComputed) {\n    let e = batchedComputed;\n    batchedComputed = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= -9;\n      e = next;\n    }\n  }\n  let error;\n  while (batchedSub) {\n    let e = batchedSub;\n    batchedSub = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= -9;\n      if (e.flags & 1) {\n        try {\n          ;\n          e.trigger();\n        } catch (err) {\n          if (!error) error = err;\n        }\n      }\n      e = next;\n    }\n  }\n  if (error) throw error;\n}\nfunction prepareDeps(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    link.version = -1;\n    link.prevActiveLink = link.dep.activeLink;\n    link.dep.activeLink = link;\n  }\n}\nfunction cleanupDeps(sub) {\n  let head;\n  let tail = sub.depsTail;\n  let link = tail;\n  while (link) {\n    const prev = link.prevDep;\n    if (link.version === -1) {\n      if (link === tail) tail = prev;\n      removeSub(link);\n      removeDep(link);\n    } else {\n      head = link;\n    }\n    link.dep.activeLink = link.prevActiveLink;\n    link.prevActiveLink = void 0;\n    link = prev;\n  }\n  sub.deps = head;\n  sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n      return true;\n    }\n  }\n  if (sub._dirty) {\n    return true;\n  }\n  return false;\n}\nfunction refreshComputed(computed) {\n  if (computed.flags & 4 && !(computed.flags & 16)) {\n    return;\n  }\n  computed.flags &= -17;\n  if (computed.globalVersion === globalVersion) {\n    return;\n  }\n  computed.globalVersion = globalVersion;\n  if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n    return;\n  }\n  computed.flags |= 2;\n  const dep = computed.dep;\n  const prevSub = activeSub;\n  const prevShouldTrack = shouldTrack;\n  activeSub = computed;\n  shouldTrack = true;\n  try {\n    prepareDeps(computed);\n    const value = computed.fn(computed._value);\n    if (dep.version === 0 || hasChanged(value, computed._value)) {\n      computed.flags |= 128;\n      computed._value = value;\n      dep.version++;\n    }\n  } catch (err) {\n    dep.version++;\n    throw err;\n  } finally {\n    activeSub = prevSub;\n    shouldTrack = prevShouldTrack;\n    cleanupDeps(computed);\n    computed.flags &= -3;\n  }\n}\nfunction removeSub(link, soft = false) {\n  const { dep, prevSub, nextSub } = link;\n  if (prevSub) {\n    prevSub.nextSub = nextSub;\n    link.prevSub = void 0;\n  }\n  if (nextSub) {\n    nextSub.prevSub = prevSub;\n    link.nextSub = void 0;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n    dep.subsHead = nextSub;\n  }\n  if (dep.subs === link) {\n    dep.subs = prevSub;\n    if (!prevSub && dep.computed) {\n      dep.computed.flags &= -5;\n      for (let l = dep.computed.deps; l; l = l.nextDep) {\n        removeSub(l, true);\n      }\n    }\n  }\n  if (!soft && !--dep.sc && dep.map) {\n    dep.map.delete(dep.key);\n  }\n}\nfunction removeDep(link) {\n  const { prevDep, nextDep } = link;\n  if (prevDep) {\n    prevDep.nextDep = nextDep;\n    link.prevDep = void 0;\n  }\n  if (nextDep) {\n    nextDep.prevDep = prevDep;\n    link.nextDep = void 0;\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect instanceof ReactiveEffect) {\n    fn = fn.effect.fn;\n  }\n  const e = new ReactiveEffect(fn);\n  if (options) {\n    extend(e, options);\n  }\n  try {\n    e.run();\n  } catch (err) {\n    e.stop();\n    throw err;\n  }\n  const runner = e.run.bind(e);\n  runner.effect = e;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n  if (activeSub instanceof ReactiveEffect) {\n    activeSub.cleanup = fn;\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onEffectCleanup() was called when there was no active effect to associate with.`\n    );\n  }\n}\nfunction cleanupEffect(e) {\n  const { cleanup } = e;\n  e.cleanup = void 0;\n  if (cleanup) {\n    const prevSub = activeSub;\n    activeSub = void 0;\n    try {\n      cleanup();\n    } finally {\n      activeSub = prevSub;\n    }\n  }\n}\n\nlet globalVersion = 0;\nclass Link {\n  constructor(sub, dep) {\n    this.sub = sub;\n    this.dep = dep;\n    this.version = dep.version;\n    this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n  }\n}\nclass Dep {\n  // TODO isolatedDeclarations \"__v_skip\"\n  constructor(computed) {\n    this.computed = computed;\n    this.version = 0;\n    /**\n     * Link between this dep and the current active effect\n     */\n    this.activeLink = void 0;\n    /**\n     * Doubly linked list representing the subscribing effects (tail)\n     */\n    this.subs = void 0;\n    /**\n     * For object property deps cleanup\n     */\n    this.map = void 0;\n    this.key = void 0;\n    /**\n     * Subscriber counter\n     */\n    this.sc = 0;\n    /**\n     * @internal\n     */\n    this.__v_skip = true;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.subsHead = void 0;\n    }\n  }\n  track(debugInfo) {\n    if (!activeSub || !shouldTrack || activeSub === this.computed) {\n      return;\n    }\n    let link = this.activeLink;\n    if (link === void 0 || link.sub !== activeSub) {\n      link = this.activeLink = new Link(activeSub, this);\n      if (!activeSub.deps) {\n        activeSub.deps = activeSub.depsTail = link;\n      } else {\n        link.prevDep = activeSub.depsTail;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n      }\n      addSub(link);\n    } else if (link.version === -1) {\n      link.version = this.version;\n      if (link.nextDep) {\n        const next = link.nextDep;\n        next.prevDep = link.prevDep;\n        if (link.prevDep) {\n          link.prevDep.nextDep = next;\n        }\n        link.prevDep = activeSub.depsTail;\n        link.nextDep = void 0;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n        if (activeSub.deps === link) {\n          activeSub.deps = next;\n        }\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n      activeSub.onTrack(\n        extend(\n          {\n            effect: activeSub\n          },\n          debugInfo\n        )\n      );\n    }\n    return link;\n  }\n  trigger(debugInfo) {\n    this.version++;\n    globalVersion++;\n    this.notify(debugInfo);\n  }\n  notify(debugInfo) {\n    startBatch();\n    try {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (let head = this.subsHead; head; head = head.nextSub) {\n          if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n            head.sub.onTrigger(\n              extend(\n                {\n                  effect: head.sub\n                },\n                debugInfo\n              )\n            );\n          }\n        }\n      }\n      for (let link = this.subs; link; link = link.prevSub) {\n        if (link.sub.notify()) {\n          ;\n          link.sub.dep.notify();\n        }\n      }\n    } finally {\n      endBatch();\n    }\n  }\n}\nfunction addSub(link) {\n  link.dep.sc++;\n  if (link.sub.flags & 4) {\n    const computed = link.dep.computed;\n    if (computed && !link.dep.subs) {\n      computed.flags |= 4 | 16;\n      for (let l = computed.deps; l; l = l.nextDep) {\n        addSub(l);\n      }\n    }\n    const currentTail = link.dep.subs;\n    if (currentTail !== link) {\n      link.prevSub = currentTail;\n      if (currentTail) currentTail.nextSub = link;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n      link.dep.subsHead = link;\n    }\n    link.dep.subs = link;\n  }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n  if (shouldTrack && activeSub) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = new Dep());\n      dep.map = depsMap;\n      dep.key = key;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      dep.track({\n        target,\n        type,\n        key\n      });\n    } else {\n      dep.track();\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    globalVersion++;\n    return;\n  }\n  const run = (dep) => {\n    if (dep) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        dep.trigger({\n          target,\n          type,\n          key,\n          newValue,\n          oldValue,\n          oldTarget\n        });\n      } else {\n        dep.trigger();\n      }\n    }\n  };\n  startBatch();\n  if (type === \"clear\") {\n    depsMap.forEach(run);\n  } else {\n    const targetIsArray = isArray(target);\n    const isArrayIndex = targetIsArray && isIntegerKey(key);\n    if (targetIsArray && key === \"length\") {\n      const newLength = Number(newValue);\n      depsMap.forEach((dep, key2) => {\n        if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n          run(dep);\n        }\n      });\n    } else {\n      if (key !== void 0 || depsMap.has(void 0)) {\n        run(depsMap.get(key));\n      }\n      if (isArrayIndex) {\n        run(depsMap.get(ARRAY_ITERATE_KEY));\n      }\n      switch (type) {\n        case \"add\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          } else if (isArrayIndex) {\n            run(depsMap.get(\"length\"));\n          }\n          break;\n        case \"delete\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          }\n          break;\n        case \"set\":\n          if (isMap(target)) {\n            run(depsMap.get(ITERATE_KEY));\n          }\n          break;\n      }\n    }\n  }\n  endBatch();\n}\nfunction getDepFromReactive(object, key) {\n  const depMap = targetMap.get(object);\n  return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n  const raw = toRaw(array);\n  if (raw === array) return raw;\n  track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n  return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n  track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n  return arr;\n}\nfunction toWrapped(target, item) {\n  if (isReadonly(target)) {\n    return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n  }\n  return toReactive(item);\n}\nconst arrayInstrumentations = {\n  __proto__: null,\n  [Symbol.iterator]() {\n    return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n  },\n  concat(...args) {\n    return reactiveReadArray(this).concat(\n      ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n    );\n  },\n  entries() {\n    return iterator(this, \"entries\", (value) => {\n      value[1] = toWrapped(this, value[1]);\n      return value;\n    });\n  },\n  every(fn, thisArg) {\n    return apply(this, \"every\", fn, thisArg, void 0, arguments);\n  },\n  filter(fn, thisArg) {\n    return apply(\n      this,\n      \"filter\",\n      fn,\n      thisArg,\n      (v) => v.map((item) => toWrapped(this, item)),\n      arguments\n    );\n  },\n  find(fn, thisArg) {\n    return apply(\n      this,\n      \"find\",\n      fn,\n      thisArg,\n      (item) => toWrapped(this, item),\n      arguments\n    );\n  },\n  findIndex(fn, thisArg) {\n    return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n  },\n  findLast(fn, thisArg) {\n    return apply(\n      this,\n      \"findLast\",\n      fn,\n      thisArg,\n      (item) => toWrapped(this, item),\n      arguments\n    );\n  },\n  findLastIndex(fn, thisArg) {\n    return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n  },\n  // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n  forEach(fn, thisArg) {\n    return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n  },\n  includes(...args) {\n    return searchProxy(this, \"includes\", args);\n  },\n  indexOf(...args) {\n    return searchProxy(this, \"indexOf\", args);\n  },\n  join(separator) {\n    return reactiveReadArray(this).join(separator);\n  },\n  // keys() iterator only reads `length`, no optimization required\n  lastIndexOf(...args) {\n    return searchProxy(this, \"lastIndexOf\", args);\n  },\n  map(fn, thisArg) {\n    return apply(this, \"map\", fn, thisArg, void 0, arguments);\n  },\n  pop() {\n    return noTracking(this, \"pop\");\n  },\n  push(...args) {\n    return noTracking(this, \"push\", args);\n  },\n  reduce(fn, ...args) {\n    return reduce(this, \"reduce\", fn, args);\n  },\n  reduceRight(fn, ...args) {\n    return reduce(this, \"reduceRight\", fn, args);\n  },\n  shift() {\n    return noTracking(this, \"shift\");\n  },\n  // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n  some(fn, thisArg) {\n    return apply(this, \"some\", fn, thisArg, void 0, arguments);\n  },\n  splice(...args) {\n    return noTracking(this, \"splice\", args);\n  },\n  toReversed() {\n    return reactiveReadArray(this).toReversed();\n  },\n  toSorted(comparer) {\n    return reactiveReadArray(this).toSorted(comparer);\n  },\n  toSpliced(...args) {\n    return reactiveReadArray(this).toSpliced(...args);\n  },\n  unshift(...args) {\n    return noTracking(this, \"unshift\", args);\n  },\n  values() {\n    return iterator(this, \"values\", (item) => toWrapped(this, item));\n  }\n};\nfunction iterator(self, method, wrapValue) {\n  const arr = shallowReadArray(self);\n  const iter = arr[method]();\n  if (arr !== self && !isShallow(self)) {\n    iter._next = iter.next;\n    iter.next = () => {\n      const result = iter._next();\n      if (!result.done) {\n        result.value = wrapValue(result.value);\n      }\n      return result;\n    };\n  }\n  return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n  const arr = shallowReadArray(self);\n  const needsWrap = arr !== self && !isShallow(self);\n  const methodFn = arr[method];\n  if (methodFn !== arrayProto[method]) {\n    const result2 = methodFn.apply(self, args);\n    return needsWrap ? toReactive(result2) : result2;\n  }\n  let wrappedFn = fn;\n  if (arr !== self) {\n    if (needsWrap) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, toWrapped(self, item), index, self);\n      };\n    } else if (fn.length > 2) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, item, index, self);\n      };\n    }\n  }\n  const result = methodFn.call(arr, wrappedFn, thisArg);\n  return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n  const arr = shallowReadArray(self);\n  const needsWrap = arr !== self && !isShallow(self);\n  let wrappedFn = fn;\n  let wrapInitialAccumulator = false;\n  if (arr !== self) {\n    if (needsWrap) {\n      wrapInitialAccumulator = args.length === 0;\n      wrappedFn = function(acc, item, index) {\n        if (wrapInitialAccumulator) {\n          wrapInitialAccumulator = false;\n          acc = toWrapped(self, acc);\n        }\n        return fn.call(this, acc, toWrapped(self, item), index, self);\n      };\n    } else if (fn.length > 3) {\n      wrappedFn = function(acc, item, index) {\n        return fn.call(this, acc, item, index, self);\n      };\n    }\n  }\n  const result = arr[method](wrappedFn, ...args);\n  return wrapInitialAccumulator ? toWrapped(self, result) : result;\n}\nfunction searchProxy(self, method, args) {\n  const arr = toRaw(self);\n  track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n  const res = arr[method](...args);\n  if ((res === -1 || res === false) && isProxy(args[0])) {\n    args[0] = toRaw(args[0]);\n    return arr[method](...args);\n  }\n  return res;\n}\nfunction noTracking(self, method, args = []) {\n  pauseTracking();\n  startBatch();\n  const res = toRaw(self)[method].apply(self, args);\n  endBatch();\n  resetTracking();\n  return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n  if (!isSymbol(key)) key = String(key);\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n  constructor(_isReadonly = false, _isShallow = false) {\n    this._isReadonly = _isReadonly;\n    this._isShallow = _isShallow;\n  }\n  get(target, key, receiver) {\n    if (key === \"__v_skip\") return target[\"__v_skip\"];\n    const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return isShallow2;\n    } else if (key === \"__v_raw\") {\n      if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n      // this means the receiver is a user proxy of the reactive proxy\n      Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n        return target;\n      }\n      return;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      let fn;\n      if (targetIsArray && (fn = arrayInstrumentations[key])) {\n        return fn;\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(\n      target,\n      key,\n      // if this is a proxy wrapping a ref, return methods using the raw ref\n      // as receiver so that we don't have to call `toRaw` on the ref in all\n      // its class methods\n      isRef(target) ? target : receiver\n    );\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (isShallow2) {\n      return res;\n    }\n    if (isRef(res)) {\n      const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n      return isReadonly2 && isObject(value) ? readonly(value) : value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(false, isShallow2);\n  }\n  set(target, key, value, receiver) {\n    let oldValue = target[key];\n    const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n    if (!this._isShallow) {\n      const isOldValueReadonly = isReadonly(oldValue);\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n        if (isOldValueReadonly) {\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn(\n              `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n              target[key]\n            );\n          }\n          return true;\n        } else {\n          oldValue.value = value;\n          return true;\n        }\n      }\n    }\n    const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(\n      target,\n      key,\n      value,\n      isRef(target) ? target : receiver\n    );\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  }\n  deleteProperty(target, key) {\n    const hadKey = hasOwn(target, key);\n    const oldValue = target[key];\n    const result = Reflect.deleteProperty(target, key);\n    if (result && hadKey) {\n      trigger(target, \"delete\", key, void 0, oldValue);\n    }\n    return result;\n  }\n  has(target, key) {\n    const result = Reflect.has(target, key);\n    if (!isSymbol(key) || !builtInSymbols.has(key)) {\n      track(target, \"has\", key);\n    }\n    return result;\n  }\n  ownKeys(target) {\n    track(\n      target,\n      \"iterate\",\n      isArray(target) ? \"length\" : ITERATE_KEY\n    );\n    return Reflect.ownKeys(target);\n  }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(true, isShallow2);\n  }\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n    !isReadonly2 && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return extend(\n      // inheriting all iterator properties\n      Object.create(innerIterator),\n      {\n        // iterator protocol\n        next() {\n          const { value, done } = innerIterator.next();\n          return done ? { value, done } : {\n            value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n            done\n          };\n        }\n      }\n    );\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n  };\n}\nfunction createInstrumentations(readonly, shallow) {\n  const instrumentations = {\n    get(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"get\", key);\n        }\n        track(rawTarget, \"get\", rawKey);\n      }\n      const { has } = getProto(rawTarget);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      if (has.call(rawTarget, key)) {\n        return wrap(target.get(key));\n      } else if (has.call(rawTarget, rawKey)) {\n        return wrap(target.get(rawKey));\n      } else if (target !== rawTarget) {\n        target.get(key);\n      }\n    },\n    get size() {\n      const target = this[\"__v_raw\"];\n      !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n      return target.size;\n    },\n    has(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"has\", key);\n        }\n        track(rawTarget, \"has\", rawKey);\n      }\n      return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n    },\n    forEach(callback, thisArg) {\n      const observed = this;\n      const target = observed[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n      return target.forEach((value, key) => {\n        return callback.call(thisArg, wrap(value), wrap(key), observed);\n      });\n    }\n  };\n  extend(\n    instrumentations,\n    readonly ? {\n      add: createReadonlyMethod(\"add\"),\n      set: createReadonlyMethod(\"set\"),\n      delete: createReadonlyMethod(\"delete\"),\n      clear: createReadonlyMethod(\"clear\")\n    } : {\n      add(value) {\n        const target = toRaw(this);\n        const proto = getProto(target);\n        const rawValue = toRaw(value);\n        const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;\n        const hadKey = proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue);\n        if (!hadKey) {\n          target.add(valueToAdd);\n          trigger(target, \"add\", valueToAdd, valueToAdd);\n        }\n        return this;\n      },\n      set(key, value) {\n        if (!shallow && !isShallow(value) && !isReadonly(value)) {\n          value = toRaw(value);\n        }\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get.call(target, key);\n        target.set(key, value);\n        if (!hadKey) {\n          trigger(target, \"add\", key, value);\n        } else if (hasChanged(value, oldValue)) {\n          trigger(target, \"set\", key, value, oldValue);\n        }\n        return this;\n      },\n      delete(key) {\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get ? get.call(target, key) : void 0;\n        const result = target.delete(key);\n        if (hadKey) {\n          trigger(target, \"delete\", key, void 0, oldValue);\n        }\n        return result;\n      },\n      clear() {\n        const target = toRaw(this);\n        const hadItems = target.size !== 0;\n        const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n        const result = target.clear();\n        if (hadItems) {\n          trigger(\n            target,\n            \"clear\",\n            void 0,\n            void 0,\n            oldTarget\n          );\n        }\n        return result;\n      }\n    }\n  );\n  const iteratorMethods = [\n    \"keys\",\n    \"values\",\n    \"entries\",\n    Symbol.iterator\n  ];\n  iteratorMethods.forEach((method) => {\n    instrumentations[method] = createIterableMethod(method, readonly, shallow);\n  });\n  return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n  const instrumentations = createInstrumentations(isReadonly2, shallow);\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has.call(target, rawKey)) {\n    const type = toRawType(target);\n    warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\n// @__NO_SIDE_EFFECTS__\nfunction reactive(target) {\n  if (/* @__PURE__ */ isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\n// @__NO_SIDE_EFFECTS__\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n          target\n        )}`\n      );\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReactive(value) {\n  if (/* @__PURE__ */ isReadonly(value)) {\n    return /* @__PURE__ */ isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\n// @__NO_SIDE_EFFECTS__\nfunction isProxy(value) {\n  return value ? !!value[\"__v_raw\"] : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? /* @__PURE__ */ toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n    def(value, \"__v_skip\", true);\n  }\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? /* @__PURE__ */ reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? /* @__PURE__ */ readonly(value) : value;\n\n// @__NO_SIDE_EFFECTS__\nfunction isRef(r) {\n  return r ? r[\"__v_isRef\"] === true : false;\n}\n// @__NO_SIDE_EFFECTS__\nfunction ref(value) {\n  return createRef(value, false);\n}\n// @__NO_SIDE_EFFECTS__\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (/* @__PURE__ */ isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, isShallow2) {\n    this.dep = new Dep();\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isShallow\"] = false;\n    this._rawValue = isShallow2 ? value : toRaw(value);\n    this._value = isShallow2 ? value : toReactive(value);\n    this[\"__v_isShallow\"] = isShallow2;\n  }\n  get value() {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.dep.track({\n        target: this,\n        type: \"get\",\n        key: \"value\"\n      });\n    } else {\n      this.dep.track();\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    const oldValue = this._rawValue;\n    const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n    newValue = useDirectValue ? newValue : toRaw(newValue);\n    if (hasChanged(newValue, oldValue)) {\n      this._rawValue = newValue;\n      this._value = useDirectValue ? newValue : toReactive(newValue);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        this.dep.trigger({\n          target: this,\n          type: \"set\",\n          key: \"value\",\n          newValue,\n          oldValue\n        });\n      } else {\n        this.dep.trigger();\n      }\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  if (ref2.dep) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      ref2.dep.trigger({\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: ref2._value\n      });\n    } else {\n      ref2.dep.trigger();\n    }\n  }\n}\nfunction unref(ref2) {\n  return /* @__PURE__ */ isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (/* @__PURE__ */ isRef(oldValue) && !/* @__PURE__ */ isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n    const dep = this.dep = new Dep();\n    const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._value = this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, key, _defaultValue) {\n    this._object = _object;\n    this._defaultValue = _defaultValue;\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n    this._key = isSymbol(key) ? key : String(key);\n    this._raw = toRaw(_object);\n    let shallow = true;\n    let obj = _object;\n    if (!isArray(_object) || isSymbol(this._key) || !isIntegerKey(this._key)) {\n      do {\n        shallow = !isProxy(obj) || isShallow(obj);\n      } while (shallow && (obj = obj[\"__v_raw\"]));\n    }\n    this._shallow = shallow;\n  }\n  get value() {\n    let val = this._object[this._key];\n    if (this._shallow) {\n      val = unref(val);\n    }\n    return this._value = val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    if (this._shallow && /* @__PURE__ */ isRef(this._raw[this._key])) {\n      const nestedRef = this._object[this._key];\n      if (/* @__PURE__ */ isRef(nestedRef)) {\n        nestedRef.value = newVal;\n        return;\n      }\n    }\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(this._raw, this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isReadonly\"] = true;\n    this._value = void 0;\n  }\n  get value() {\n    return this._value = this._getter();\n  }\n}\n// @__NO_SIDE_EFFECTS__\nfunction toRef(source, key, defaultValue) {\n  if (/* @__PURE__ */ isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return /* @__PURE__ */ ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n  constructor(fn, setter, isSSR) {\n    this.fn = fn;\n    this.setter = setter;\n    /**\n     * @internal\n     */\n    this._value = void 0;\n    /**\n     * @internal\n     */\n    this.dep = new Dep(this);\n    /**\n     * @internal\n     */\n    this.__v_isRef = true;\n    // TODO isolatedDeclarations \"__v_isReadonly\"\n    // A computed is also a subscriber that tracks other deps\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 16;\n    /**\n     * @internal\n     */\n    this.globalVersion = globalVersion - 1;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    // for backwards compat\n    this.effect = this;\n    this[\"__v_isReadonly\"] = !setter;\n    this.isSSR = isSSR;\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    this.flags |= 16;\n    if (!(this.flags & 8) && // avoid infinite self recursion\n    activeSub !== this) {\n      batch(this, true);\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n  }\n  get value() {\n    const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n      target: this,\n      type: \"get\",\n      key: \"value\"\n    }) : this.dep.track();\n    refreshComputed(this);\n    if (link) {\n      link.version = this.dep.version;\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    if (this.setter) {\n      this.setter(newValue);\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\"Write operation failed: computed value is readonly\");\n    }\n  }\n}\n// @__NO_SIDE_EFFECTS__\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  if (isFunction(getterOrOptions)) {\n    getter = getterOrOptions;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.onTrack = debugOptions.onTrack;\n    cRef.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nconst TrackOpTypes = {\n  \"GET\": \"get\",\n  \"HAS\": \"has\",\n  \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n  \"SET\": \"set\",\n  \"ADD\": \"add\",\n  \"DELETE\": \"delete\",\n  \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n  \"SKIP\": \"__v_skip\",\n  \"IS_REACTIVE\": \"__v_isReactive\",\n  \"IS_READONLY\": \"__v_isReadonly\",\n  \"IS_SHALLOW\": \"__v_isShallow\",\n  \"RAW\": \"__v_raw\",\n  \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n  \"WATCH_GETTER\": 2,\n  \"2\": \"WATCH_GETTER\",\n  \"WATCH_CALLBACK\": 3,\n  \"3\": \"WATCH_CALLBACK\",\n  \"WATCH_CLEANUP\": 4,\n  \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n  return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n  if (owner) {\n    let cleanups = cleanupMap.get(owner);\n    if (!cleanups) cleanupMap.set(owner, cleanups = []);\n    cleanups.push(cleanupFn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onWatcherCleanup() was called when there was no active watcher to associate with.`\n    );\n  }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, once, scheduler, augmentJob, call } = options;\n  const warnInvalidSource = (s) => {\n    (options.onWarn || warn)(\n      `Invalid watch source: `,\n      s,\n      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n    );\n  };\n  const reactiveGetter = (source2) => {\n    if (deep) return source2;\n    if (isShallow(source2) || deep === false || deep === 0)\n      return traverse(source2, 1);\n    return traverse(source2);\n  };\n  let effect;\n  let getter;\n  let cleanup;\n  let boundCleanup;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow(source);\n  } else if (isReactive(source)) {\n    getter = () => reactiveGetter(source);\n    forceTrigger = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n    getter = () => source.map((s) => {\n      if (isRef(s)) {\n        return s.value;\n      } else if (isReactive(s)) {\n        return reactiveGetter(s);\n      } else if (isFunction(s)) {\n        return call ? call(s, 2) : s();\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n      }\n    });\n  } else if (isFunction(source)) {\n    if (cb) {\n      getter = call ? () => call(source, 2) : source;\n    } else {\n      getter = () => {\n        if (cleanup) {\n          pauseTracking();\n          try {\n            cleanup();\n          } finally {\n            resetTracking();\n          }\n        }\n        const currentEffect = activeWatcher;\n        activeWatcher = effect;\n        try {\n          return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n        } finally {\n          activeWatcher = currentEffect;\n        }\n      };\n    }\n  } else {\n    getter = NOOP;\n    !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    const depth = deep === true ? Infinity : deep;\n    getter = () => traverse(baseGetter(), depth);\n  }\n  const scope = getCurrentScope();\n  const watchHandle = () => {\n    effect.stop();\n    if (scope && scope.active) {\n      remove(scope.effects, effect);\n    }\n  };\n  if (once && cb) {\n    const _cb = cb;\n    cb = (...args) => {\n      _cb(...args);\n      watchHandle();\n    };\n  }\n  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n  const job = (immediateFirstRun) => {\n    if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n      return;\n    }\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n        if (cleanup) {\n          cleanup();\n        }\n        const currentWatcher = activeWatcher;\n        activeWatcher = effect;\n        try {\n          const args = [\n            newValue,\n            // pass undefined as the old value when it's changed for the first time\n            oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n            boundCleanup\n          ];\n          oldValue = newValue;\n          call ? call(cb, 3, args) : (\n            // @ts-expect-error\n            cb(...args)\n          );\n        } finally {\n          activeWatcher = currentWatcher;\n        }\n      }\n    } else {\n      effect.run();\n    }\n  };\n  if (augmentJob) {\n    augmentJob(job);\n  }\n  effect = new ReactiveEffect(getter);\n  effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n  boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n  cleanup = effect.onStop = () => {\n    const cleanups = cleanupMap.get(effect);\n    if (cleanups) {\n      if (call) {\n        call(cleanups, 4);\n      } else {\n        for (const cleanup2 of cleanups) cleanup2();\n      }\n      cleanupMap.delete(effect);\n    }\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    effect.onTrack = options.onTrack;\n    effect.onTrigger = options.onTrigger;\n  }\n  if (cb) {\n    if (immediate) {\n      job(true);\n    } else {\n      oldValue = effect.run();\n    }\n  } else if (scheduler) {\n    scheduler(job.bind(null, true), true);\n  } else {\n    effect.run();\n  }\n  watchHandle.pause = effect.pause.bind(effect);\n  watchHandle.resume = effect.resume.bind(effect);\n  watchHandle.stop = watchHandle;\n  return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n  if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n    return value;\n  }\n  seen = seen || /* @__PURE__ */ new Map();\n  if ((seen.get(value) || 0) >= depth) {\n    return value;\n  }\n  seen.set(value, depth);\n  depth--;\n  if (isRef(value)) {\n    traverse(value.value, depth, seen);\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      traverse(value[i], depth, seen);\n    }\n  } else if (isSet(value) || isMap(value)) {\n    value.forEach((v) => {\n      traverse(v, depth, seen);\n    });\n  } else if (isPlainObject(value)) {\n    for (const key in value) {\n      traverse(value[key], depth, seen);\n    }\n    for (const key of Object.getOwnPropertySymbols(value)) {\n      if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n        traverse(value[key], depth, seen);\n      }\n    }\n  }\n  return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, looseEqual, EMPTY_ARR, toRawType, makeMap, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n  stack.push(vnode);\n}\nfunction popWarningContext() {\n  stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n  if (isWarning) return;\n  isWarning = true;\n  pauseTracking();\n  const instance = stack.length ? stack[stack.length - 1].component : null;\n  const appWarnHandler = instance && instance.appContext.config.warnHandler;\n  const trace = getComponentTrace();\n  if (appWarnHandler) {\n    callWithErrorHandling(\n      appWarnHandler,\n      instance,\n      11,\n      [\n        // eslint-disable-next-line no-restricted-syntax\n        msg + args.map((a) => {\n          var _a, _b;\n          return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n        }).join(\"\"),\n        instance && instance.proxy,\n        trace.map(\n          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n        ).join(\"\\n\"),\n        trace\n      ]\n    );\n  } else {\n    const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n    if (trace.length && // avoid spamming console during tests\n    true) {\n      warnArgs.push(`\n`, ...formatTrace(trace));\n    }\n    console.warn(...warnArgs);\n  }\n  resetTracking();\n  isWarning = false;\n}\nfunction getComponentTrace() {\n  let currentVNode = stack[stack.length - 1];\n  if (!currentVNode) {\n    return [];\n  }\n  const normalizedStack = [];\n  while (currentVNode) {\n    const last = normalizedStack[0];\n    if (last && last.vnode === currentVNode) {\n      last.recurseCount++;\n    } else {\n      normalizedStack.push({\n        vnode: currentVNode,\n        recurseCount: 0\n      });\n    }\n    const parentInstance = currentVNode.component && currentVNode.component.parent;\n    currentVNode = parentInstance && parentInstance.vnode;\n  }\n  return normalizedStack;\n}\nfunction formatTrace(trace) {\n  const logs = [];\n  trace.forEach((entry, i) => {\n    logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n  });\n  return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n  const isRoot = vnode.component ? vnode.component.parent == null : false;\n  const open = ` at <${formatComponentName(\n    vnode.component,\n    vnode.type,\n    isRoot\n  )}`;\n  const close = `>` + postfix;\n  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n  const res = [];\n  const keys = Object.keys(props);\n  keys.slice(0, 3).forEach((key) => {\n    res.push(...formatProp(key, props[key]));\n  });\n  if (keys.length > 3) {\n    res.push(` ...`);\n  }\n  return res;\n}\nfunction formatProp(key, value, raw) {\n  if (isString(value)) {\n    value = JSON.stringify(value);\n    return raw ? value : [`${key}=${value}`];\n  } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n    return raw ? value : [`${key}=${value}`];\n  } else if (isRef(value)) {\n    value = formatProp(key, toRaw(value.value), true);\n    return raw ? value : [`${key}=Ref<`, value, `>`];\n  } else if (isFunction(value)) {\n    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n  } else {\n    value = toRaw(value);\n    return raw ? value : [`${key}=`, value];\n  }\n}\nfunction assertNumber(val, type) {\n  if (!!!(process.env.NODE_ENV !== \"production\")) return;\n  if (val === void 0) {\n    return;\n  } else if (typeof val !== \"number\") {\n    warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n  } else if (isNaN(val)) {\n    warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n  }\n}\n\nconst ErrorCodes = {\n  \"SETUP_FUNCTION\": 0,\n  \"0\": \"SETUP_FUNCTION\",\n  \"RENDER_FUNCTION\": 1,\n  \"1\": \"RENDER_FUNCTION\",\n  \"NATIVE_EVENT_HANDLER\": 5,\n  \"5\": \"NATIVE_EVENT_HANDLER\",\n  \"COMPONENT_EVENT_HANDLER\": 6,\n  \"6\": \"COMPONENT_EVENT_HANDLER\",\n  \"VNODE_HOOK\": 7,\n  \"7\": \"VNODE_HOOK\",\n  \"DIRECTIVE_HOOK\": 8,\n  \"8\": \"DIRECTIVE_HOOK\",\n  \"TRANSITION_HOOK\": 9,\n  \"9\": \"TRANSITION_HOOK\",\n  \"APP_ERROR_HANDLER\": 10,\n  \"10\": \"APP_ERROR_HANDLER\",\n  \"APP_WARN_HANDLER\": 11,\n  \"11\": \"APP_WARN_HANDLER\",\n  \"FUNCTION_REF\": 12,\n  \"12\": \"FUNCTION_REF\",\n  \"ASYNC_COMPONENT_LOADER\": 13,\n  \"13\": \"ASYNC_COMPONENT_LOADER\",\n  \"SCHEDULER\": 14,\n  \"14\": \"SCHEDULER\",\n  \"COMPONENT_UPDATE\": 15,\n  \"15\": \"COMPONENT_UPDATE\",\n  \"APP_UNMOUNT_CLEANUP\": 16,\n  \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n  [\"sp\"]: \"serverPrefetch hook\",\n  [\"bc\"]: \"beforeCreate hook\",\n  [\"c\"]: \"created hook\",\n  [\"bm\"]: \"beforeMount hook\",\n  [\"m\"]: \"mounted hook\",\n  [\"bu\"]: \"beforeUpdate hook\",\n  [\"u\"]: \"updated\",\n  [\"bum\"]: \"beforeUnmount hook\",\n  [\"um\"]: \"unmounted hook\",\n  [\"a\"]: \"activated hook\",\n  [\"da\"]: \"deactivated hook\",\n  [\"ec\"]: \"errorCaptured hook\",\n  [\"rtc\"]: \"renderTracked hook\",\n  [\"rtg\"]: \"renderTriggered hook\",\n  [0]: \"setup function\",\n  [1]: \"render function\",\n  [2]: \"watcher getter\",\n  [3]: \"watcher callback\",\n  [4]: \"watcher cleanup function\",\n  [5]: \"native event handler\",\n  [6]: \"component event handler\",\n  [7]: \"vnode hook\",\n  [8]: \"directive hook\",\n  [9]: \"transition hook\",\n  [10]: \"app errorHandler\",\n  [11]: \"app warnHandler\",\n  [12]: \"ref function\",\n  [13]: \"async component loader\",\n  [14]: \"scheduler flush\",\n  [15]: \"component update\",\n  [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n  try {\n    return args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, instance, type);\n  }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, instance, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, instance, type);\n      });\n    }\n    return res;\n  }\n  if (isArray(fn)) {\n    const values = [];\n    for (let i = 0; i < fn.length; i++) {\n      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n    }\n    return values;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n    );\n  }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n  const contextVNode = instance ? instance.vnode : null;\n  const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n  if (instance) {\n    let cur = instance.parent;\n    const exposedInstance = instance.proxy;\n    const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n    while (cur) {\n      const errorCapturedHooks = cur.ec;\n      if (errorCapturedHooks) {\n        for (let i = 0; i < errorCapturedHooks.length; i++) {\n          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n            return;\n          }\n        }\n      }\n      cur = cur.parent;\n    }\n    if (errorHandler) {\n      pauseTracking();\n      callWithErrorHandling(errorHandler, null, 10, [\n        err,\n        exposedInstance,\n        errorInfo\n      ]);\n      resetTracking();\n      return;\n    }\n  }\n  logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const info = ErrorTypeStrings$1[type];\n    if (contextVNode) {\n      pushWarningContext(contextVNode);\n    }\n    warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n    if (contextVNode) {\n      popWarningContext();\n    }\n    if (throwInDev) {\n      throw err;\n    } else {\n      console.error(err);\n    }\n  } else if (throwInProd) {\n    throw err;\n  } else {\n    console.error(err);\n  }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n  const p = currentFlushPromise || resolvedPromise;\n  return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n  let start = flushIndex + 1;\n  let end = queue.length;\n  while (start < end) {\n    const middle = start + end >>> 1;\n    const middleJob = queue[middle];\n    const middleJobId = getId(middleJob);\n    if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n      start = middle + 1;\n    } else {\n      end = middle;\n    }\n  }\n  return start;\n}\nfunction queueJob(job) {\n  if (!(job.flags & 1)) {\n    const jobId = getId(job);\n    const lastJob = queue[queue.length - 1];\n    if (!lastJob || // fast path when the job id is larger than the tail\n    !(job.flags & 2) && jobId >= getId(lastJob)) {\n      queue.push(job);\n    } else {\n      queue.splice(findInsertionIndex(jobId), 0, job);\n    }\n    job.flags |= 1;\n    queueFlush();\n  }\n}\nfunction queueFlush() {\n  if (!currentFlushPromise) {\n    currentFlushPromise = resolvedPromise.then(flushJobs);\n  }\n}\nfunction queuePostFlushCb(cb) {\n  if (!isArray(cb)) {\n    if (activePostFlushCbs && cb.id === -1) {\n      activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n    } else if (!(cb.flags & 1)) {\n      pendingPostFlushCbs.push(cb);\n      cb.flags |= 1;\n    }\n  } else {\n    pendingPostFlushCbs.push(...cb);\n  }\n  queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  for (; i < queue.length; i++) {\n    const cb = queue[i];\n    if (cb && cb.flags & 2) {\n      if (instance && cb.id !== instance.uid) {\n        continue;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      queue.splice(i, 1);\n      i--;\n      if (cb.flags & 4) {\n        cb.flags &= -2;\n      }\n      cb();\n      if (!(cb.flags & 4)) {\n        cb.flags &= -2;\n      }\n    }\n  }\n}\nfunction flushPostFlushCbs(seen) {\n  if (pendingPostFlushCbs.length) {\n    const deduped = [...new Set(pendingPostFlushCbs)].sort(\n      (a, b) => getId(a) - getId(b)\n    );\n    pendingPostFlushCbs.length = 0;\n    if (activePostFlushCbs) {\n      activePostFlushCbs.push(...deduped);\n      return;\n    }\n    activePostFlushCbs = deduped;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      seen = seen || /* @__PURE__ */ new Map();\n    }\n    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n      const cb = activePostFlushCbs[postFlushIndex];\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      if (cb.flags & 4) {\n        cb.flags &= -2;\n      }\n      if (!(cb.flags & 8)) cb();\n      cb.flags &= -2;\n    }\n    activePostFlushCbs = null;\n    postFlushIndex = 0;\n  }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n  try {\n    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job && !(job.flags & 8)) {\n        if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n          continue;\n        }\n        if (job.flags & 4) {\n          job.flags &= ~1;\n        }\n        callWithErrorHandling(\n          job,\n          job.i,\n          job.i ? 15 : 14\n        );\n        if (!(job.flags & 4)) {\n          job.flags &= ~1;\n        }\n      }\n    }\n  } finally {\n    for (; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job) {\n        job.flags &= -2;\n      }\n    }\n    flushIndex = -1;\n    queue.length = 0;\n    flushPostFlushCbs(seen);\n    currentFlushPromise = null;\n    if (queue.length || pendingPostFlushCbs.length) {\n      flushJobs(seen);\n    }\n  }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n  const count = seen.get(fn) || 0;\n  if (count > RECURSION_LIMIT) {\n    const instance = fn.i;\n    const componentName = instance && getComponentName(instance.type);\n    handleError(\n      `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n      null,\n      10\n    );\n    return true;\n  }\n  seen.set(fn, count + 1);\n  return false;\n}\n\nlet isHmrUpdating = false;\nconst setHmrUpdating = (v) => {\n  try {\n    return isHmrUpdating;\n  } finally {\n    isHmrUpdating = v;\n  }\n};\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  getGlobalThis().__VUE_HMR_RUNTIME__ = {\n    createRecord: tryWrap(createRecord),\n    rerender: tryWrap(rerender),\n    reload: tryWrap(reload)\n  };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n  const id = instance.type.__hmrId;\n  let record = map.get(id);\n  if (!record) {\n    createRecord(id, instance.type);\n    record = map.get(id);\n  }\n  record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n  map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n  if (map.has(id)) {\n    return false;\n  }\n  map.set(id, {\n    initialDef: normalizeClassComponent(initialDef),\n    instances: /* @__PURE__ */ new Set()\n  });\n  return true;\n}\nfunction normalizeClassComponent(component) {\n  return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n  const record = map.get(id);\n  if (!record) {\n    return;\n  }\n  record.initialDef.render = newRender;\n  [...record.instances].forEach((instance) => {\n    if (newRender) {\n      instance.render = newRender;\n      normalizeClassComponent(instance.type).render = newRender;\n    }\n    instance.renderCache = [];\n    isHmrUpdating = true;\n    if (!(instance.job.flags & 8)) {\n      instance.update();\n    }\n    isHmrUpdating = false;\n  });\n}\nfunction reload(id, newComp) {\n  const record = map.get(id);\n  if (!record) return;\n  newComp = normalizeClassComponent(newComp);\n  updateComponentDef(record.initialDef, newComp);\n  const instances = [...record.instances];\n  for (let i = 0; i < instances.length; i++) {\n    const instance = instances[i];\n    const oldComp = normalizeClassComponent(instance.type);\n    let dirtyInstances = hmrDirtyComponents.get(oldComp);\n    if (!dirtyInstances) {\n      if (oldComp !== record.initialDef) {\n        updateComponentDef(oldComp, newComp);\n      }\n      hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n    }\n    dirtyInstances.add(instance);\n    instance.appContext.propsCache.delete(instance.type);\n    instance.appContext.emitsCache.delete(instance.type);\n    instance.appContext.optionsCache.delete(instance.type);\n    if (instance.ceReload) {\n      dirtyInstances.add(instance);\n      instance.ceReload(newComp.styles);\n      dirtyInstances.delete(instance);\n    } else if (instance.parent) {\n      queueJob(() => {\n        if (!(instance.job.flags & 8)) {\n          isHmrUpdating = true;\n          instance.parent.update();\n          isHmrUpdating = false;\n          dirtyInstances.delete(instance);\n        }\n      });\n    } else if (instance.appContext.reload) {\n      instance.appContext.reload();\n    } else if (typeof window !== \"undefined\") {\n      window.location.reload();\n    } else {\n      console.warn(\n        \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n      );\n    }\n    if (instance.root.ce && instance !== instance.root) {\n      instance.root.ce._removeChildStyle(oldComp);\n    }\n  }\n  queuePostFlushCb(() => {\n    hmrDirtyComponents.clear();\n  });\n}\nfunction updateComponentDef(oldComp, newComp) {\n  extend(oldComp, newComp);\n  for (const key in oldComp) {\n    if (key !== \"__file\" && !(key in newComp)) {\n      delete oldComp[key];\n    }\n  }\n}\nfunction tryWrap(fn) {\n  return (id, arg) => {\n    try {\n      return fn(id, arg);\n    } catch (e) {\n      console.error(e);\n      console.warn(\n        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n      );\n    }\n  };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n  if (devtools$1) {\n    devtools$1.emit(event, ...args);\n  } else if (!devtoolsNotInstalled) {\n    buffer.push({ event, args });\n  }\n}\nfunction setDevtoolsHook$1(hook, target) {\n  var _a, _b;\n  devtools$1 = hook;\n  if (devtools$1) {\n    devtools$1.enabled = true;\n    buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n    buffer = [];\n  } else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== \"undefined\" && // some envs mock window but not fully\n    window.HTMLElement && // also exclude jsdom\n    // eslint-disable-next-line no-restricted-syntax\n    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n  ) {\n    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n    replay.push((newHook) => {\n      setDevtoolsHook$1(newHook, target);\n    });\n    setTimeout(() => {\n      if (!devtools$1) {\n        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n        devtoolsNotInstalled = true;\n        buffer = [];\n      }\n    }, 3e3);\n  } else {\n    devtoolsNotInstalled = true;\n    buffer = [];\n  }\n}\nfunction devtoolsInitApp(app, version) {\n  emit$1(\"app:init\" /* APP_INIT */, app, version, {\n    Fragment,\n    Text,\n    Comment,\n    Static\n  });\n}\nfunction devtoolsUnmountApp(app) {\n  emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n  if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n  !devtools$1.cleanupBuffer(component)) {\n    _devtoolsComponentRemoved(component);\n  }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n  return (component) => {\n    emit$1(\n      hook,\n      component.appContext.app,\n      component.uid,\n      component.parent ? component.parent.uid : void 0,\n      component\n    );\n  };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n  return (component, type, time) => {\n    emit$1(hook, component.appContext.app, component.uid, component, type, time);\n  };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n  emit$1(\n    \"component:emit\" /* COMPONENT_EMIT */,\n    component.appContext.app,\n    component,\n    event,\n    params\n  );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n  const prev = currentRenderingInstance;\n  currentRenderingInstance = instance;\n  currentScopeId = instance && instance.type.__scopeId || null;\n  return prev;\n}\nfunction pushScopeId(id) {\n  currentScopeId = id;\n}\nfunction popScopeId() {\n  currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n  if (!ctx) return fn;\n  if (fn._n) {\n    return fn;\n  }\n  const renderFnWithContext = (...args) => {\n    if (renderFnWithContext._d) {\n      setBlockTracking(-1);\n    }\n    const prevInstance = setCurrentRenderingInstance(ctx);\n    let res;\n    try {\n      res = fn(...args);\n    } finally {\n      setCurrentRenderingInstance(prevInstance);\n      if (renderFnWithContext._d) {\n        setBlockTracking(1);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentUpdated(ctx);\n    }\n    return res;\n  };\n  renderFnWithContext._n = true;\n  renderFnWithContext._c = true;\n  renderFnWithContext._d = true;\n  return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n  if (isBuiltInDirective(name)) {\n    warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n  }\n}\nfunction withDirectives(vnode, directives) {\n  if (currentRenderingInstance === null) {\n    !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n    return vnode;\n  }\n  const instance = getComponentPublicInstance(currentRenderingInstance);\n  const bindings = vnode.dirs || (vnode.dirs = []);\n  for (let i = 0; i < directives.length; i++) {\n    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n    if (dir) {\n      if (isFunction(dir)) {\n        dir = {\n          mounted: dir,\n          updated: dir\n        };\n      }\n      if (dir.deep) {\n        traverse(value);\n      }\n      bindings.push({\n        dir,\n        instance,\n        value,\n        oldValue: void 0,\n        arg,\n        modifiers\n      });\n    }\n  }\n  return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n  const bindings = vnode.dirs;\n  const oldBindings = prevVNode && prevVNode.dirs;\n  for (let i = 0; i < bindings.length; i++) {\n    const binding = bindings[i];\n    if (oldBindings) {\n      binding.oldValue = oldBindings[i].value;\n    }\n    let hook = binding.dir[name];\n    if (hook) {\n      pauseTracking();\n      callWithAsyncErrorHandling(hook, instance, 8, [\n        vnode.el,\n        binding,\n        vnode,\n        prevVNode\n      ]);\n      resetTracking();\n    }\n  }\n}\n\nfunction provide(key, value) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (!currentInstance || currentInstance.isMounted) {\n      warn$1(`provide() can only be used inside setup().`);\n    }\n  }\n  if (currentInstance) {\n    let provides = currentInstance.provides;\n    const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n    if (parentProvides === provides) {\n      provides = currentInstance.provides = Object.create(parentProvides);\n    }\n    provides[key] = value;\n  }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n  const instance = getCurrentInstance();\n  if (instance || currentApp) {\n    let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n    if (provides && key in provides) {\n      return provides[key];\n    } else if (arguments.length > 1) {\n      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`injection \"${String(key)}\" not found.`);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`inject() can only be used inside setup() or functional components.`);\n  }\n}\nfunction hasInjectionContext() {\n  return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n  {\n    const ctx = inject(ssrContextKey);\n    if (!ctx) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n      );\n    }\n    return ctx;\n  }\n};\n\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n  );\n}\nfunction watchSyncEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n  );\n}\nfunction watch(source, cb, options) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n    warn$1(\n      `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n    );\n  }\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, flush, once } = options;\n  if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n    if (immediate !== void 0) {\n      warn$1(\n        `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (deep !== void 0) {\n      warn$1(\n        `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (once !== void 0) {\n      warn$1(\n        `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n  }\n  const baseWatchOptions = extend({}, options);\n  if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n  const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n  let ssrCleanup;\n  if (isInSSRComponentSetup) {\n    if (flush === \"sync\") {\n      const ctx = useSSRContext();\n      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n    } else if (!runsImmediately) {\n      const watchStopHandle = () => {\n      };\n      watchStopHandle.stop = NOOP;\n      watchStopHandle.resume = NOOP;\n      watchStopHandle.pause = NOOP;\n      return watchStopHandle;\n    }\n  }\n  const instance = currentInstance;\n  baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n  let isPre = false;\n  if (flush === \"post\") {\n    baseWatchOptions.scheduler = (job) => {\n      queuePostRenderEffect(job, instance && instance.suspense);\n    };\n  } else if (flush !== \"sync\") {\n    isPre = true;\n    baseWatchOptions.scheduler = (job, isFirstRun) => {\n      if (isFirstRun) {\n        job();\n      } else {\n        queueJob(job);\n      }\n    };\n  }\n  baseWatchOptions.augmentJob = (job) => {\n    if (cb) {\n      job.flags |= 4;\n    }\n    if (isPre) {\n      job.flags |= 2;\n      if (instance) {\n        job.id = instance.uid;\n        job.i = instance;\n      }\n    }\n  };\n  const watchHandle = watch$1(source, cb, baseWatchOptions);\n  if (isInSSRComponentSetup) {\n    if (ssrCleanup) {\n      ssrCleanup.push(watchHandle);\n    } else if (runsImmediately) {\n      watchHandle();\n    }\n  }\n  return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n  const publicThis = this.proxy;\n  const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n  let cb;\n  if (isFunction(value)) {\n    cb = value;\n  } else {\n    cb = value.handler;\n    options = value;\n  }\n  const reset = setCurrentInstance(this);\n  const res = doWatch(getter, cb.bind(publicThis), options);\n  reset();\n  return res;\n}\nfunction createPathGetter(ctx, path) {\n  const segments = path.split(\".\");\n  return () => {\n    let cur = ctx;\n    for (let i = 0; i < segments.length && cur; i++) {\n      cur = cur[segments[i]];\n    }\n    return cur;\n  };\n}\n\nconst pendingMounts = /* @__PURE__ */ new WeakMap();\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n  const targetSelector = props && props.to;\n  if (isString(targetSelector)) {\n    if (!select) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n      );\n      return null;\n    } else {\n      const target = select(targetSelector);\n      if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n        warn$1(\n          `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n        );\n      }\n      return target;\n    }\n  } else {\n    if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n      warn$1(`Invalid Teleport target: ${targetSelector}`);\n    }\n    return targetSelector;\n  }\n};\nconst TeleportImpl = {\n  name: \"Teleport\",\n  __isTeleport: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n    const {\n      mc: mountChildren,\n      pc: patchChildren,\n      pbc: patchBlockChildren,\n      o: { insert, querySelector, createText, createComment, parentNode }\n    } = internals;\n    const disabled = isTeleportDisabled(n2.props);\n    let { dynamicChildren } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      optimized = false;\n      dynamicChildren = null;\n    }\n    const mount = (vnode, container2, anchor2) => {\n      if (vnode.shapeFlag & 16) {\n        mountChildren(\n          vnode.children,\n          container2,\n          anchor2,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      }\n    };\n    const mountToTarget = (vnode = n2) => {\n      const disabled2 = isTeleportDisabled(vnode.props);\n      const target = vnode.target = resolveTarget(vnode.props, querySelector);\n      const targetAnchor = prepareAnchor(target, vnode, createText, insert);\n      if (target) {\n        if (namespace !== \"svg\" && isTargetSVG(target)) {\n          namespace = \"svg\";\n        } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n          namespace = \"mathml\";\n        }\n        if (parentComponent && parentComponent.isCE) {\n          (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n        }\n        if (!disabled2) {\n          mount(vnode, target, targetAnchor);\n          updateCssVars(vnode, false);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled2) {\n        warn$1(\"Invalid Teleport target on mount:\", target, `(${typeof target})`);\n      }\n    };\n    const queuePendingMount = (vnode) => {\n      const mountJob = () => {\n        if (pendingMounts.get(vnode) !== mountJob) return;\n        pendingMounts.delete(vnode);\n        if (isTeleportDisabled(vnode.props)) {\n          const mountContainer = parentNode(vnode.el) || container;\n          mount(vnode, mountContainer, vnode.anchor);\n          updateCssVars(vnode, true);\n        }\n        mountToTarget(vnode);\n      };\n      pendingMounts.set(vnode, mountJob);\n      queuePostRenderEffect(mountJob, parentSuspense);\n    };\n    if (n1 == null) {\n      const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n      const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n      insert(placeholder, container, anchor);\n      insert(mainAnchor, container, anchor);\n      if (isTeleportDeferred(n2.props) || parentSuspense && parentSuspense.pendingBranch) {\n        queuePendingMount(n2);\n        return;\n      }\n      if (disabled) {\n        mount(n2, container, mainAnchor);\n        updateCssVars(n2, true);\n      }\n      mountToTarget();\n    } else {\n      n2.el = n1.el;\n      const mainAnchor = n2.anchor = n1.anchor;\n      const pendingMount = pendingMounts.get(n1);\n      if (pendingMount) {\n        pendingMount.flags |= 8;\n        pendingMounts.delete(n1);\n        queuePendingMount(n2);\n        return;\n      }\n      n2.targetStart = n1.targetStart;\n      const target = n2.target = n1.target;\n      const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n      const wasDisabled = isTeleportDisabled(n1.props);\n      const currentContainer = wasDisabled ? container : target;\n      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n      if (namespace === \"svg\" || isTargetSVG(target)) {\n        namespace = \"svg\";\n      } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n        namespace = \"mathml\";\n      }\n      if (dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          currentContainer,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n      } else if (!optimized) {\n        patchChildren(\n          n1,\n          n2,\n          currentContainer,\n          currentAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          false\n        );\n      }\n      if (disabled) {\n        if (!wasDisabled) {\n          moveTeleport(\n            n2,\n            container,\n            mainAnchor,\n            internals,\n            1\n          );\n        } else {\n          if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n            n2.props.to = n1.props.to;\n          }\n        }\n      } else {\n        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n          const nextTarget = n2.target = resolveTarget(\n            n2.props,\n            querySelector\n          );\n          if (nextTarget) {\n            moveTeleport(\n              n2,\n              nextTarget,\n              null,\n              internals,\n              0\n            );\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Invalid Teleport target on update:\",\n              target,\n              `(${typeof target})`\n            );\n          }\n        } else if (wasDisabled) {\n          moveTeleport(\n            n2,\n            target,\n            targetAnchor,\n            internals,\n            1\n          );\n        }\n      }\n      updateCssVars(n2, disabled);\n    }\n  },\n  remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n    const {\n      shapeFlag,\n      children,\n      anchor,\n      targetStart,\n      targetAnchor,\n      target,\n      props\n    } = vnode;\n    let shouldRemove = doRemove || !isTeleportDisabled(props);\n    const pendingMount = pendingMounts.get(vnode);\n    if (pendingMount) {\n      pendingMount.flags |= 8;\n      pendingMounts.delete(vnode);\n      shouldRemove = false;\n    }\n    if (target) {\n      hostRemove(targetStart);\n      hostRemove(targetAnchor);\n    }\n    doRemove && hostRemove(anchor);\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        unmount(\n          child,\n          parentComponent,\n          parentSuspense,\n          shouldRemove,\n          !!child.dynamicChildren\n        );\n      }\n    }\n  },\n  move: moveTeleport,\n  hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n  if (moveType === 0) {\n    insert(vnode.targetAnchor, container, parentAnchor);\n  }\n  const { el, anchor, shapeFlag, children, props } = vnode;\n  const isReorder = moveType === 2;\n  if (isReorder) {\n    insert(el, container, parentAnchor);\n  }\n  if (!pendingMounts.has(vnode) && (!isReorder || isTeleportDisabled(props))) {\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        move(\n          children[i],\n          container,\n          parentAnchor,\n          2\n        );\n      }\n    }\n  }\n  if (isReorder) {\n    insert(anchor, container, parentAnchor);\n  }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n  o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n  function hydrateAnchor(target2, targetNode) {\n    let targetAnchor = targetNode;\n    while (targetAnchor) {\n      if (targetAnchor && targetAnchor.nodeType === 8) {\n        if (targetAnchor.data === \"teleport start anchor\") {\n          vnode.targetStart = targetAnchor;\n        } else if (targetAnchor.data === \"teleport anchor\") {\n          vnode.targetAnchor = targetAnchor;\n          target2._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n          break;\n        }\n      }\n      targetAnchor = nextSibling(targetAnchor);\n    }\n  }\n  function hydrateDisabledTeleport(node2, vnode2) {\n    vnode2.anchor = hydrateChildren(\n      nextSibling(node2),\n      vnode2,\n      parentNode(node2),\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n  }\n  const target = vnode.target = resolveTarget(\n    vnode.props,\n    querySelector\n  );\n  const disabled = isTeleportDisabled(vnode.props);\n  if (target) {\n    const targetNode = target._lpa || target.firstChild;\n    if (vnode.shapeFlag & 16) {\n      if (disabled) {\n        hydrateDisabledTeleport(node, vnode);\n        hydrateAnchor(target, targetNode);\n        if (!vnode.targetAnchor) {\n          prepareAnchor(\n            target,\n            vnode,\n            createText,\n            insert,\n            // if target is the same as the main view, insert anchors before current node\n            // to avoid hydrating mismatch\n            parentNode(node) === target ? node : null\n          );\n        }\n      } else {\n        vnode.anchor = nextSibling(node);\n        hydrateAnchor(target, targetNode);\n        if (!vnode.targetAnchor) {\n          prepareAnchor(target, vnode, createText, insert);\n        }\n        hydrateChildren(\n          targetNode && nextSibling(targetNode),\n          vnode,\n          target,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n    updateCssVars(vnode, disabled);\n  } else if (disabled) {\n    if (vnode.shapeFlag & 16) {\n      hydrateDisabledTeleport(node, vnode);\n      vnode.targetStart = node;\n      vnode.targetAnchor = nextSibling(node);\n    }\n  }\n  return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n  const ctx = vnode.ctx;\n  if (ctx && ctx.ut) {\n    let node, anchor;\n    if (isDisabled) {\n      node = vnode.el;\n      anchor = vnode.anchor;\n    } else {\n      node = vnode.targetStart;\n      anchor = vnode.targetAnchor;\n    }\n    while (node && node !== anchor) {\n      if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n      node = node.nextSibling;\n    }\n    ctx.ut();\n  }\n}\nfunction prepareAnchor(target, vnode, createText, insert, anchor = null) {\n  const targetStart = vnode.targetStart = createText(\"\");\n  const targetAnchor = vnode.targetAnchor = createText(\"\");\n  targetStart[TeleportEndKey] = targetAnchor;\n  if (target) {\n    insert(targetStart, target, anchor);\n    insert(targetAnchor, target, anchor);\n  }\n  return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n  const state = {\n    isMounted: false,\n    isLeaving: false,\n    isUnmounting: false,\n    leavingVNodes: /* @__PURE__ */ new Map()\n  };\n  onMounted(() => {\n    state.isMounted = true;\n  });\n  onBeforeUnmount(() => {\n    state.isUnmounting = true;\n  });\n  return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n  mode: String,\n  appear: Boolean,\n  persisted: Boolean,\n  // enter\n  onBeforeEnter: TransitionHookValidator,\n  onEnter: TransitionHookValidator,\n  onAfterEnter: TransitionHookValidator,\n  onEnterCancelled: TransitionHookValidator,\n  // leave\n  onBeforeLeave: TransitionHookValidator,\n  onLeave: TransitionHookValidator,\n  onAfterLeave: TransitionHookValidator,\n  onLeaveCancelled: TransitionHookValidator,\n  // appear\n  onBeforeAppear: TransitionHookValidator,\n  onAppear: TransitionHookValidator,\n  onAfterAppear: TransitionHookValidator,\n  onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n  const subTree = instance.subTree;\n  return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n  name: `BaseTransition`,\n  props: BaseTransitionPropsValidators,\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    return () => {\n      const children = slots.default && getTransitionRawChildren(slots.default(), true);\n      const child = children && children.length ? findNonCommentChild(children) : (\n        // Keep explicit default-slot conditionals on the same transition path\n        // as regular v-if branches, which render a comment placeholder.\n        instance.subTree ? createCommentVNode() : void 0\n      );\n      if (!child) {\n        return;\n      }\n      const rawProps = toRaw(props);\n      const { mode } = rawProps;\n      if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n        warn$1(`invalid <transition> mode: ${mode}`);\n      }\n      if (state.isLeaving) {\n        return emptyPlaceholder(child);\n      }\n      const innerChild = getInnerChild$1(child);\n      if (!innerChild) {\n        return emptyPlaceholder(child);\n      }\n      let enterHooks = resolveTransitionHooks(\n        innerChild,\n        rawProps,\n        state,\n        instance,\n        // #11061, ensure enterHooks is fresh after clone\n        (hooks) => enterHooks = hooks\n      );\n      if (innerChild.type !== Comment) {\n        setTransitionHooks(innerChild, enterHooks);\n      }\n      let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n      if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n        let leavingHooks = resolveTransitionHooks(\n          oldInnerChild,\n          rawProps,\n          state,\n          instance\n        );\n        setTransitionHooks(oldInnerChild, leavingHooks);\n        if (mode === \"out-in\" && innerChild.type !== Comment) {\n          state.isLeaving = true;\n          leavingHooks.afterLeave = () => {\n            state.isLeaving = false;\n            if (!(instance.job.flags & 8)) {\n              instance.update();\n            }\n            delete leavingHooks.afterLeave;\n            oldInnerChild = void 0;\n          };\n          return emptyPlaceholder(child);\n        } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n            const leavingVNodesCache = getLeavingNodesForType(\n              state,\n              oldInnerChild\n            );\n            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n            el[leaveCbKey] = () => {\n              earlyRemove();\n              el[leaveCbKey] = void 0;\n              delete enterHooks.delayedLeave;\n              oldInnerChild = void 0;\n            };\n            enterHooks.delayedLeave = () => {\n              delayedLeave();\n              delete enterHooks.delayedLeave;\n              oldInnerChild = void 0;\n            };\n          };\n        } else {\n          oldInnerChild = void 0;\n        }\n      } else if (oldInnerChild) {\n        oldInnerChild = void 0;\n      }\n      return child;\n    };\n  }\n};\nfunction findNonCommentChild(children) {\n  let child = children[0];\n  if (children.length > 1) {\n    let hasFound = false;\n    for (const c of children) {\n      if (c.type !== Comment) {\n        if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n          warn$1(\n            \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n          );\n          break;\n        }\n        child = c;\n        hasFound = true;\n        if (!!!(process.env.NODE_ENV !== \"production\")) break;\n      }\n    }\n  }\n  return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n  const { leavingVNodes } = state;\n  let leavingVNodesCache = leavingVNodes.get(vnode.type);\n  if (!leavingVNodesCache) {\n    leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n    leavingVNodes.set(vnode.type, leavingVNodesCache);\n  }\n  return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n  const {\n    appear,\n    mode,\n    persisted = false,\n    onBeforeEnter,\n    onEnter,\n    onAfterEnter,\n    onEnterCancelled,\n    onBeforeLeave,\n    onLeave,\n    onAfterLeave,\n    onLeaveCancelled,\n    onBeforeAppear,\n    onAppear,\n    onAfterAppear,\n    onAppearCancelled\n  } = props;\n  const key = String(vnode.key);\n  const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n  const callHook = (hook, args) => {\n    hook && callWithAsyncErrorHandling(\n      hook,\n      instance,\n      9,\n      args\n    );\n  };\n  const callAsyncHook = (hook, args) => {\n    const done = args[1];\n    callHook(hook, args);\n    if (isArray(hook)) {\n      if (hook.every((hook2) => hook2.length <= 1)) done();\n    } else if (hook.length <= 1) {\n      done();\n    }\n  };\n  const hooks = {\n    mode,\n    persisted,\n    beforeEnter(el) {\n      let hook = onBeforeEnter;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onBeforeAppear || onBeforeEnter;\n        } else {\n          return;\n        }\n      }\n      if (el[leaveCbKey]) {\n        el[leaveCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      const leavingVNode = leavingVNodesCache[key];\n      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n        leavingVNode.el[leaveCbKey]();\n      }\n      callHook(hook, [el]);\n    },\n    enter(el) {\n      if (!isHmrUpdating && leavingVNodesCache[key] === vnode) return;\n      let hook = onEnter;\n      let afterHook = onAfterEnter;\n      let cancelHook = onEnterCancelled;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onAppear || onEnter;\n          afterHook = onAfterAppear || onAfterEnter;\n          cancelHook = onAppearCancelled || onEnterCancelled;\n        } else {\n          return;\n        }\n      }\n      let called = false;\n      el[enterCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        if (cancelled) {\n          callHook(cancelHook, [el]);\n        } else {\n          callHook(afterHook, [el]);\n        }\n        if (hooks.delayedLeave) {\n          hooks.delayedLeave();\n        }\n        el[enterCbKey] = void 0;\n      };\n      const done = el[enterCbKey].bind(null, false);\n      if (hook) {\n        callAsyncHook(hook, [el, done]);\n      } else {\n        done();\n      }\n    },\n    leave(el, remove) {\n      const key2 = String(vnode.key);\n      if (el[enterCbKey]) {\n        el[enterCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      if (state.isUnmounting) {\n        return remove();\n      }\n      callHook(onBeforeLeave, [el]);\n      let called = false;\n      el[leaveCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        remove();\n        if (cancelled) {\n          callHook(onLeaveCancelled, [el]);\n        } else {\n          callHook(onAfterLeave, [el]);\n        }\n        el[leaveCbKey] = void 0;\n        if (leavingVNodesCache[key2] === vnode) {\n          delete leavingVNodesCache[key2];\n        }\n      };\n      const done = el[leaveCbKey].bind(null, false);\n      leavingVNodesCache[key2] = vnode;\n      if (onLeave) {\n        callAsyncHook(onLeave, [el, done]);\n      } else {\n        done();\n      }\n    },\n    clone(vnode2) {\n      const hooks2 = resolveTransitionHooks(\n        vnode2,\n        props,\n        state,\n        instance,\n        postClone\n      );\n      if (postClone) postClone(hooks2);\n      return hooks2;\n    }\n  };\n  return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n  if (isKeepAlive(vnode)) {\n    vnode = cloneVNode(vnode);\n    vnode.children = null;\n    return vnode;\n  }\n}\nfunction getInnerChild$1(vnode) {\n  if (!isKeepAlive(vnode)) {\n    if (isTeleport(vnode.type) && vnode.children) {\n      return findNonCommentChild(vnode.children);\n    }\n    return vnode;\n  }\n  if (vnode.component) {\n    return vnode.component.subTree;\n  }\n  const { shapeFlag, children } = vnode;\n  if (children) {\n    if (shapeFlag & 16) {\n      return children[0];\n    }\n    if (shapeFlag & 32 && isFunction(children.default)) {\n      return children.default();\n    }\n  }\n}\nfunction setTransitionHooks(vnode, hooks) {\n  if (vnode.shapeFlag & 6 && vnode.component) {\n    vnode.transition = hooks;\n    setTransitionHooks(vnode.component.subTree, hooks);\n  } else if (vnode.shapeFlag & 128) {\n    vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n  } else {\n    vnode.transition = hooks;\n  }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n  let ret = [];\n  let keyedFragmentCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n    if (child.type === Fragment) {\n      if (child.patchFlag & 128) keyedFragmentCount++;\n      ret = ret.concat(\n        getTransitionRawChildren(child.children, keepComment, key)\n      );\n    } else if (keepComment || child.type !== Comment) {\n      ret.push(key != null ? cloneVNode(child, { key }) : child);\n    }\n  }\n  if (keyedFragmentCount > 1) {\n    for (let i = 0; i < ret.length; i++) {\n      ret[i].patchFlag = -2;\n    }\n  }\n  return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n  return isFunction(options) ? (\n    // #8236: extend call and options.name access are considered side-effects\n    // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n  ) : options;\n}\n\nfunction useId() {\n  const i = getCurrentInstance();\n  if (i) {\n    return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useId() is called when there is no active component instance to be associated with.`\n    );\n  }\n  return \"\";\n}\nfunction markAsyncBoundary(instance) {\n  instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n  const i = getCurrentInstance();\n  const r = shallowRef(null);\n  if (i) {\n    const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n    if (!!(process.env.NODE_ENV !== \"production\") && isTemplateRefKey(refs, key)) {\n      warn$1(`useTemplateRef('${key}') already exists.`);\n    } else {\n      Object.defineProperty(refs, key, {\n        enumerable: true,\n        get: () => r.value,\n        set: (val) => r.value = val\n      });\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useTemplateRef() is called when there is no active component instance to be associated with.`\n    );\n  }\n  const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    knownTemplateRefs.add(ret);\n  }\n  return ret;\n}\nfunction isTemplateRefKey(refs, key) {\n  let desc;\n  return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable);\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n  if (isArray(rawRef)) {\n    rawRef.forEach(\n      (r, i) => setRef(\n        r,\n        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n        parentSuspense,\n        vnode,\n        isUnmount\n      )\n    );\n    return;\n  }\n  if (isAsyncWrapper(vnode) && !isUnmount) {\n    if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n      setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n    }\n    return;\n  }\n  const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n  const value = isUnmount ? null : refValue;\n  const { i: owner, r: ref } = rawRef;\n  if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n    warn$1(\n      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n    );\n    return;\n  }\n  const oldRef = oldRawRef && oldRawRef.r;\n  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n  const setupState = owner.setupState;\n  const rawSetupState = toRaw(setupState);\n  const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n        warn$1(\n          `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n        );\n      }\n      if (knownTemplateRefs.has(rawSetupState[key])) {\n        return false;\n      }\n    }\n    if (isTemplateRefKey(refs, key)) {\n      return false;\n    }\n    return hasOwn(rawSetupState, key);\n  };\n  const canSetRef = (ref2, key) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && knownTemplateRefs.has(ref2)) {\n      return false;\n    }\n    if (key && isTemplateRefKey(refs, key)) {\n      return false;\n    }\n    return true;\n  };\n  if (oldRef != null && oldRef !== ref) {\n    invalidatePendingSetRef(oldRawRef);\n    if (isString(oldRef)) {\n      refs[oldRef] = null;\n      if (canSetSetupRef(oldRef)) {\n        setupState[oldRef] = null;\n      }\n    } else if (isRef(oldRef)) {\n      const oldRawRefAtom = oldRawRef;\n      if (canSetRef(oldRef, oldRawRefAtom.k)) {\n        oldRef.value = null;\n      }\n      if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n    }\n  }\n  if (isFunction(ref)) {\n    callWithErrorHandling(ref, owner, 12, [value, refs]);\n  } else {\n    const _isString = isString(ref);\n    const _isRef = isRef(ref);\n    if (_isString || _isRef) {\n      const doSet = () => {\n        if (rawRef.f) {\n          const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n          if (isUnmount) {\n            isArray(existing) && remove(existing, refValue);\n          } else {\n            if (!isArray(existing)) {\n              if (_isString) {\n                refs[ref] = [refValue];\n                if (canSetSetupRef(ref)) {\n                  setupState[ref] = refs[ref];\n                }\n              } else {\n                const newVal = [refValue];\n                if (canSetRef(ref, rawRef.k)) {\n                  ref.value = newVal;\n                }\n                if (rawRef.k) refs[rawRef.k] = newVal;\n              }\n            } else if (!existing.includes(refValue)) {\n              existing.push(refValue);\n            }\n          }\n        } else if (_isString) {\n          refs[ref] = value;\n          if (canSetSetupRef(ref)) {\n            setupState[ref] = value;\n          }\n        } else if (_isRef) {\n          if (canSetRef(ref, rawRef.k)) {\n            ref.value = value;\n          }\n          if (rawRef.k) refs[rawRef.k] = value;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n        }\n      };\n      if (value) {\n        const job = () => {\n          doSet();\n          pendingSetRefMap.delete(rawRef);\n        };\n        job.id = -1;\n        pendingSetRefMap.set(rawRef, job);\n        queuePostRenderEffect(job, parentSuspense);\n      } else {\n        invalidatePendingSetRef(rawRef);\n        doSet();\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n    }\n  }\n}\nfunction invalidatePendingSetRef(rawRef) {\n  const pendingSetRef = pendingSetRefMap.get(rawRef);\n  if (pendingSetRef) {\n    pendingSetRef.flags |= 8;\n    pendingSetRefMap.delete(rawRef);\n  }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n  if (hasLoggedMismatchError) {\n    return;\n  }\n  console.error(\"Hydration completed but contains mismatches.\");\n  hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n  if (container.nodeType !== 1) return void 0;\n  if (isSVGContainer(container)) return \"svg\";\n  if (isMathMLContainer(container)) return \"mathml\";\n  return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n  const {\n    mt: mountComponent,\n    p: patch,\n    o: {\n      patchProp,\n      createText,\n      nextSibling,\n      parentNode,\n      remove,\n      insert,\n      createComment\n    }\n  } = rendererInternals;\n  const hydrate = (vnode, container) => {\n    if (!container.hasChildNodes()) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n      );\n      patch(null, vnode, container);\n      flushPostFlushCbs();\n      container._vnode = vnode;\n      return;\n    }\n    hydrateNode(container.firstChild, vnode, null, null, null);\n    flushPostFlushCbs();\n    container._vnode = vnode;\n  };\n  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const isFragmentStart = isComment(node) && node.data === \"[\";\n    const onMismatch = () => handleMismatch(\n      node,\n      vnode,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      isFragmentStart\n    );\n    const { type, ref, shapeFlag, patchFlag } = vnode;\n    let domType = node.nodeType;\n    vnode.el = node;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(node, \"__vnode\", vnode, true);\n      def(node, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (patchFlag === -2) {\n      optimized = false;\n      vnode.dynamicChildren = null;\n    }\n    let nextNode = null;\n    switch (type) {\n      case Text:\n        if (domType !== 3) {\n          if (vnode.children === \"\") {\n            insert(vnode.el = createText(\"\"), parentNode(node), node);\n            nextNode = node;\n          } else {\n            nextNode = onMismatch();\n          }\n        } else {\n          if (node.data !== vnode.children) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text mismatch in`,\n              node.parentNode,\n              `\n  - rendered on server: ${JSON.stringify(\n                node.data\n              )}\n  - expected on client: ${JSON.stringify(vnode.children)}`\n            );\n            logMismatchError();\n            node.data = vnode.children;\n          }\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Comment:\n        if (isTemplateNode(node)) {\n          nextNode = nextSibling(node);\n          replaceNode(\n            vnode.el = node.content.firstChild,\n            node,\n            parentComponent\n          );\n        } else if (domType !== 8 || isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Static:\n        if (isFragmentStart) {\n          node = nextSibling(node);\n          domType = node.nodeType;\n        }\n        if (domType === 1 || domType === 3) {\n          nextNode = node;\n          const needToAdoptContent = !vnode.children.length;\n          for (let i = 0; i < vnode.staticCount; i++) {\n            if (needToAdoptContent)\n              vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n            if (i === vnode.staticCount - 1) {\n              vnode.anchor = nextNode;\n            }\n            nextNode = nextSibling(nextNode);\n          }\n          return isFragmentStart ? nextSibling(nextNode) : nextNode;\n        } else {\n          onMismatch();\n        }\n        break;\n      case Fragment:\n        if (!isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = hydrateFragment(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            slotScopeIds,\n            optimized\n          );\n        }\n        break;\n      default:\n        if (shapeFlag & 1) {\n          if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = hydrateElement(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized\n            );\n          }\n        } else if (shapeFlag & 6) {\n          vnode.slotScopeIds = slotScopeIds;\n          const container = parentNode(node);\n          if (isFragmentStart) {\n            nextNode = locateClosingAnchor(node);\n          } else if (isComment(node) && node.data === \"teleport start\") {\n            nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n          } else {\n            nextNode = nextSibling(node);\n          }\n          mountComponent(\n            vnode,\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            getContainerType(container),\n            optimized\n          );\n          if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n            let subTree;\n            if (isFragmentStart) {\n              subTree = createVNode(Fragment);\n              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n            } else {\n              subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n            }\n            subTree.el = node;\n            vnode.component.subTree = subTree;\n          }\n        } else if (shapeFlag & 64) {\n          if (domType !== 8) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = vnode.type.hydrate(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized,\n              rendererInternals,\n              hydrateChildren\n            );\n          }\n        } else if (shapeFlag & 128) {\n          nextNode = vnode.type.hydrate(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            getContainerType(parentNode(node)),\n            slotScopeIds,\n            optimized,\n            rendererInternals,\n            hydrateNode\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n          warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode);\n    }\n    return nextNode;\n  };\n  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n    const forcePatch = type === \"input\" || type === \"option\";\n    if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n      }\n      let needCallTransitionHooks = false;\n      if (isTemplateNode(el)) {\n        needCallTransitionHooks = needTransition(\n          null,\n          // no need check parentSuspense in hydration\n          transition\n        ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n        const content = el.content.firstChild;\n        if (needCallTransitionHooks) {\n          const cls = content.getAttribute(\"class\");\n          if (cls) content.$cls = cls;\n          transition.beforeEnter(content);\n        }\n        replaceNode(content, el, parentComponent);\n        vnode.el = el = content;\n      }\n      if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n      !(props && (props.innerHTML || props.textContent))) {\n        let next = hydrateChildren(\n          el.firstChild,\n          vnode,\n          el,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        let hasWarned = false;\n        while (next) {\n          if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n              warn$1(\n                `Hydration children mismatch on`,\n                el,\n                `\nServer rendered element contains more child nodes than client vdom.`\n              );\n              hasWarned = true;\n            }\n            logMismatchError();\n          }\n          const cur = next;\n          next = next.nextSibling;\n          remove(cur);\n        }\n      } else if (shapeFlag & 8) {\n        let clientText = vnode.children;\n        if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n          clientText = clientText.slice(1);\n        }\n        const { textContent } = el;\n        if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n        textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n          if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text content mismatch on`,\n              el,\n              `\n  - rendered on server: ${textContent}\n  - expected on client: ${clientText}`\n            );\n            logMismatchError();\n          }\n          el.textContent = vnode.children;\n        }\n      }\n      if (props) {\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n          const isCustomElement = el.tagName.includes(\"-\");\n          for (const key in props) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n            // as it could have mutated the DOM in any possible way\n            !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n              logMismatchError();\n            }\n            if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n            key[0] === \".\" || isCustomElement && !isReservedProp(key)) {\n              patchProp(el, key, null, props[key], void 0, parentComponent);\n            }\n          }\n        } else if (props.onClick) {\n          patchProp(\n            el,\n            \"onClick\",\n            null,\n            props.onClick,\n            void 0,\n            parentComponent\n          );\n        } else if (patchFlag & 4 && isReactive(props.style)) {\n          for (const key in props.style) props.style[key];\n        }\n      }\n      let vnodeHooks;\n      if (vnodeHooks = props && props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n      }\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n      }\n      if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n        queueEffectWithSuspense(() => {\n          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n          needCallTransitionHooks && transition.enter(el);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        }, parentSuspense);\n      }\n    }\n    return el.nextSibling;\n  };\n  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!parentVNode.dynamicChildren;\n    const children = parentVNode.children;\n    const l = children.length;\n    let hasWarned = false;\n    for (let i = 0; i < l; i++) {\n      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n      const isText = vnode.type === Text;\n      if (node) {\n        if (isText && !optimized) {\n          if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n            insert(\n              createText(\n                node.data.slice(vnode.children.length)\n              ),\n              container,\n              nextSibling(node)\n            );\n            node.data = vnode.children;\n          }\n        }\n        node = hydrateNode(\n          node,\n          vnode,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      } else if (isText && !vnode.children) {\n        insert(vnode.el = createText(\"\"), container);\n      } else {\n        if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n          if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n            warn$1(\n              `Hydration children mismatch on`,\n              container,\n              `\nServer rendered element contains fewer child nodes than client vdom.`\n            );\n            hasWarned = true;\n          }\n          logMismatchError();\n        }\n        patch(\n          null,\n          vnode,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          getContainerType(container),\n          slotScopeIds\n        );\n      }\n    }\n    return node;\n  };\n  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    const container = parentNode(node);\n    const next = hydrateChildren(\n      nextSibling(node),\n      vnode,\n      container,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n    if (next && isComment(next) && next.data === \"]\") {\n      return nextSibling(vnode.anchor = next);\n    } else {\n      logMismatchError();\n      insert(vnode.anchor = createComment(`]`), container, next);\n      return next;\n    }\n  };\n  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n    if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Hydration node mismatch:\n- rendered on server:`,\n        node,\n        node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n        `\n- expected on client:`,\n        vnode.type\n      );\n      logMismatchError();\n    }\n    vnode.el = null;\n    if (isFragment) {\n      const end = locateClosingAnchor(node);\n      while (true) {\n        const next2 = nextSibling(node);\n        if (next2 && next2 !== end) {\n          remove(next2);\n        } else {\n          break;\n        }\n      }\n    }\n    const next = nextSibling(node);\n    const container = parentNode(node);\n    remove(node);\n    patch(\n      null,\n      vnode,\n      container,\n      next,\n      parentComponent,\n      parentSuspense,\n      getContainerType(container),\n      slotScopeIds\n    );\n    if (parentComponent) {\n      parentComponent.vnode.el = vnode.el;\n      updateHOCHostEl(parentComponent, vnode.el);\n    }\n    return next;\n  };\n  const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n    let match = 0;\n    while (node) {\n      node = nextSibling(node);\n      if (node && isComment(node)) {\n        if (node.data === open) match++;\n        if (node.data === close) {\n          if (match === 0) {\n            return nextSibling(node);\n          } else {\n            match--;\n          }\n        }\n      }\n    }\n    return node;\n  };\n  const replaceNode = (newNode, oldNode, parentComponent) => {\n    const parentNode2 = oldNode.parentNode;\n    if (parentNode2) {\n      parentNode2.replaceChild(newNode, oldNode);\n    }\n    let parent = parentComponent;\n    while (parent) {\n      if (parent.vnode.el === oldNode) {\n        parent.vnode.el = parent.subTree.el = newNode;\n      }\n      parent = parent.parent;\n    }\n  };\n  const isTemplateNode = (node) => {\n    return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n  };\n  return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n  let mismatchType;\n  let mismatchKey;\n  let actual;\n  let expected;\n  if (key === \"class\") {\n    if (el.$cls) {\n      actual = el.$cls;\n      delete el.$cls;\n    } else {\n      actual = el.getAttribute(\"class\");\n    }\n    expected = normalizeClass(clientValue);\n    if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n      mismatchType = 2 /* CLASS */;\n      mismatchKey = `class`;\n    }\n  } else if (key === \"style\") {\n    actual = el.getAttribute(\"style\") || \"\";\n    expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n    const actualMap = toStyleMap(actual);\n    const expectedMap = toStyleMap(expected);\n    if (vnode.dirs) {\n      for (const { dir, value } of vnode.dirs) {\n        if (dir.name === \"show\" && !value) {\n          expectedMap.set(\"display\", \"none\");\n        }\n      }\n    }\n    if (instance) {\n      resolveCssVars(instance, vnode, expectedMap);\n    }\n    if (!isMapEqual(actualMap, expectedMap)) {\n      mismatchType = 3 /* STYLE */;\n      mismatchKey = \"style\";\n    }\n  } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n    if (isBooleanAttr(key)) {\n      actual = el.hasAttribute(key);\n      expected = includeBooleanAttr(clientValue);\n    } else if (clientValue == null) {\n      actual = el.hasAttribute(key);\n      expected = false;\n    } else {\n      if (el.hasAttribute(key)) {\n        actual = el.getAttribute(key);\n      } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n        actual = el.value;\n      } else {\n        actual = false;\n      }\n      expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n    }\n    if (actual !== expected) {\n      mismatchType = 4 /* ATTRIBUTE */;\n      mismatchKey = key;\n    }\n  }\n  if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n    const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n    const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n    const postSegment = `\n  - rendered on server: ${format(actual)}\n  - expected on client: ${format(expected)}\n  Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n  You should fix the source of the mismatch.`;\n    {\n      warn$1(preSegment, el, postSegment);\n    }\n    return true;\n  }\n  return false;\n}\nfunction toClassSet(str) {\n  return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const s of a) {\n    if (!b.has(s)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction toStyleMap(str) {\n  const styleMap = /* @__PURE__ */ new Map();\n  for (const item of str.split(\";\")) {\n    let [key, value] = item.split(\":\");\n    key = key.trim();\n    value = value && value.trim();\n    if (key && value) {\n      styleMap.set(key, value);\n    }\n  }\n  return styleMap;\n}\nfunction isMapEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const [key, value] of a) {\n    if (value !== b.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n  const root = instance.subTree;\n  if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n    const cssVars = instance.getCssVars();\n    for (const key in cssVars) {\n      const value = normalizeCssVarValue(cssVars[key]);\n      expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n    }\n  }\n  if (vnode === root && instance.parent) {\n    resolveCssVars(instance.parent, instance.vnode, expectedMap);\n  }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n  [0 /* TEXT */]: \"text\",\n  [1 /* CHILDREN */]: \"children\",\n  [2 /* CLASS */]: \"class\",\n  [3 /* STYLE */]: \"style\",\n  [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n  if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n    while (el && !el.hasAttribute(allowMismatchAttr)) {\n      el = el.parentElement;\n    }\n  }\n  const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n  if (allowedAttr == null) {\n    return false;\n  } else if (allowedAttr === \"\") {\n    return true;\n  } else {\n    const list = allowedAttr.split(\",\");\n    if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n      return true;\n    }\n    return list.includes(MismatchTypeString[allowedType]);\n  }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n  const id = requestIdleCallback(hydrate, { timeout });\n  return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n  const { top, left, bottom, right } = el.getBoundingClientRect();\n  const { innerHeight, innerWidth } = window;\n  return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n  const ob = new IntersectionObserver((entries) => {\n    for (const e of entries) {\n      if (!e.isIntersecting) continue;\n      ob.disconnect();\n      hydrate();\n      break;\n    }\n  }, opts);\n  forEach((el) => {\n    if (!(el instanceof Element)) return;\n    if (elementIsVisibleInViewport(el)) {\n      hydrate();\n      ob.disconnect();\n      return false;\n    }\n    ob.observe(el);\n  });\n  return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n  if (query) {\n    const mql = matchMedia(query);\n    if (mql.matches) {\n      hydrate();\n    } else {\n      mql.addEventListener(\"change\", hydrate, { once: true });\n      return () => mql.removeEventListener(\"change\", hydrate);\n    }\n  }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n  if (isString(interactions)) interactions = [interactions];\n  let hasHydrated = false;\n  const doHydrate = (e) => {\n    if (!hasHydrated) {\n      hasHydrated = true;\n      teardown();\n      hydrate();\n      e.target.dispatchEvent(new e.constructor(e.type, e));\n    }\n  };\n  const teardown = () => {\n    forEach((el) => {\n      for (const i of interactions) {\n        el.removeEventListener(i, doHydrate);\n      }\n    });\n  };\n  forEach((el) => {\n    for (const i of interactions) {\n      el.addEventListener(i, doHydrate, { once: true });\n    }\n  });\n  return teardown;\n};\nfunction forEachElement(node, cb) {\n  if (isComment(node) && node.data === \"[\") {\n    let depth = 1;\n    let next = node.nextSibling;\n    while (next) {\n      if (next.nodeType === 1) {\n        const result = cb(next);\n        if (result === false) {\n          break;\n        }\n      } else if (isComment(next)) {\n        if (next.data === \"]\") {\n          if (--depth === 0) break;\n        } else if (next.data === \"[\") {\n          depth++;\n        }\n      }\n      next = next.nextSibling;\n    }\n  } else {\n    cb(node);\n  }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n  if (isFunction(source)) {\n    source = { loader: source };\n  }\n  const {\n    loader,\n    loadingComponent,\n    errorComponent,\n    delay = 200,\n    hydrate: hydrateStrategy,\n    timeout,\n    // undefined = never times out\n    suspensible = true,\n    onError: userOnError\n  } = source;\n  let pendingRequest = null;\n  let resolvedComp;\n  let retries = 0;\n  const retry = () => {\n    retries++;\n    pendingRequest = null;\n    return load();\n  };\n  const load = () => {\n    let thisRequest;\n    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n      err = err instanceof Error ? err : new Error(String(err));\n      if (userOnError) {\n        return new Promise((resolve, reject) => {\n          const userRetry = () => resolve(retry());\n          const userFail = () => reject(err);\n          userOnError(err, userRetry, userFail, retries + 1);\n        });\n      } else {\n        throw err;\n      }\n    }).then((comp) => {\n      if (thisRequest !== pendingRequest && pendingRequest) {\n        return pendingRequest;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n        warn$1(\n          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n        );\n      }\n      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n        comp = comp.default;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n        throw new Error(`Invalid async component load result: ${comp}`);\n      }\n      resolvedComp = comp;\n      return comp;\n    }));\n  };\n  return defineComponent({\n    name: \"AsyncComponentWrapper\",\n    __asyncLoader: load,\n    __asyncHydrate(el, instance, hydrate) {\n      let patched = false;\n      (instance.bu || (instance.bu = [])).push(() => patched = true);\n      const performHydrate = () => {\n        if (patched) {\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n            );\n          }\n          return;\n        }\n        hydrate();\n      };\n      const doHydrate = hydrateStrategy ? () => {\n        const teardown = hydrateStrategy(\n          performHydrate,\n          (cb) => forEachElement(el, cb)\n        );\n        if (teardown) {\n          (instance.bum || (instance.bum = [])).push(teardown);\n        }\n      } : performHydrate;\n      if (resolvedComp) {\n        doHydrate();\n      } else {\n        load().then(() => !instance.isUnmounted && doHydrate());\n      }\n    },\n    get __asyncResolved() {\n      return resolvedComp;\n    },\n    setup() {\n      const instance = currentInstance;\n      markAsyncBoundary(instance);\n      if (resolvedComp) {\n        return () => createInnerComp(resolvedComp, instance);\n      }\n      const onError = (err) => {\n        pendingRequest = null;\n        handleError(\n          err,\n          instance,\n          13,\n          !errorComponent\n        );\n      };\n      if (suspensible && instance.suspense || isInSSRComponentSetup) {\n        return load().then((comp) => {\n          return () => createInnerComp(comp, instance);\n        }).catch((err) => {\n          onError(err);\n          return () => errorComponent ? createVNode(errorComponent, {\n            error: err\n          }) : null;\n        });\n      }\n      const loaded = ref(false);\n      const error = ref();\n      const delayed = ref(!!delay);\n      if (delay) {\n        setTimeout(() => {\n          delayed.value = false;\n        }, delay);\n      }\n      if (timeout != null) {\n        setTimeout(() => {\n          if (!loaded.value && !error.value) {\n            const err = new Error(\n              `Async component timed out after ${timeout}ms.`\n            );\n            onError(err);\n            error.value = err;\n          }\n        }, timeout);\n      }\n      load().then(() => {\n        loaded.value = true;\n        if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n          instance.parent.update();\n        }\n      }).catch((err) => {\n        onError(err);\n        error.value = err;\n      });\n      return () => {\n        if (loaded.value && resolvedComp) {\n          return createInnerComp(resolvedComp, instance);\n        } else if (error.value && errorComponent) {\n          return createVNode(errorComponent, {\n            error: error.value\n          });\n        } else if (loadingComponent && !delayed.value) {\n          return createInnerComp(\n            loadingComponent,\n            instance\n          );\n        }\n      };\n    }\n  });\n}\nfunction createInnerComp(comp, parent) {\n  const { ref: ref2, props, children, ce } = parent.vnode;\n  const vnode = createVNode(comp, props, children);\n  vnode.ref = ref2;\n  vnode.ce = ce;\n  delete parent.vnode.ce;\n  return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n  name: `KeepAlive`,\n  // Marker for special handling inside the renderer. We are not using a ===\n  // check directly on KeepAlive in the renderer, because importing it directly\n  // would prevent it from being tree-shaken.\n  __isKeepAlive: true,\n  props: {\n    include: [String, RegExp, Array],\n    exclude: [String, RegExp, Array],\n    max: [String, Number]\n  },\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    if (!sharedContext.renderer) {\n      return () => {\n        const children = slots.default && slots.default();\n        return children && children.length === 1 ? children[0] : children;\n      };\n    }\n    const cache = /* @__PURE__ */ new Map();\n    const keys = /* @__PURE__ */ new Set();\n    let current = null;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.__v_cache = cache;\n    }\n    const parentSuspense = instance.suspense;\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount,\n        o: { createElement }\n      }\n    } = sharedContext;\n    const storageContainer = createElement(\"div\");\n    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        namespace,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostRenderEffect(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      invalidateMount(instance2.m);\n      invalidateMount(instance2.a);\n      move(vnode, storageContainer, null, 1, parentSuspense);\n      queuePostRenderEffect(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        instance2.__keepAliveStorageContainer = storageContainer;\n      }\n    };\n    function unmount(vnode) {\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    function pruneCache(filter) {\n      cache.forEach((vnode, key) => {\n        const name = getComponentName(\n          isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n        );\n        if (name && !filter(name)) {\n          pruneCacheEntry(key);\n        }\n      });\n    }\n    function pruneCacheEntry(key) {\n      const cached = cache.get(key);\n      if (cached && (!current || !isSameVNodeType(cached, current))) {\n        unmount(cached);\n      } else if (current) {\n        resetShapeFlag(current);\n      }\n      cache.delete(key);\n      keys.delete(key);\n    }\n    watch(\n      () => [props.include, props.exclude],\n      ([include, exclude]) => {\n        include && pruneCache((name) => matches(include, name));\n        exclude && pruneCache((name) => !matches(exclude, name));\n      },\n      // prune post-render after `current` has been updated\n      { flush: \"post\", deep: true }\n    );\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (pendingCacheKey != null) {\n        if (isSuspense(instance.subTree.type)) {\n          queuePostRenderEffect(() => {\n            cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n          }, instance.subTree.suspense);\n        } else {\n          cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n        }\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    onBeforeUnmount(() => {\n      cache.forEach((cached) => {\n        const { subTree, suspense } = instance;\n        const vnode = getInnerChild(subTree);\n        if (cached.type === vnode.type && cached.key === vnode.key) {\n          resetShapeFlag(vnode);\n          const da = vnode.component.da;\n          da && queuePostRenderEffect(da, suspense);\n          return;\n        }\n        unmount(cached);\n      });\n    });\n    return () => {\n      pendingCacheKey = null;\n      if (!slots.default) {\n        return current = null;\n      }\n      const children = slots.default();\n      const rawVNode = children[0];\n      if (children.length > 1) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`KeepAlive should contain exactly one component child.`);\n        }\n        current = null;\n        return children;\n      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n        current = null;\n        return rawVNode;\n      }\n      let vnode = getInnerChild(rawVNode);\n      if (vnode.type === Comment) {\n        current = null;\n        return vnode;\n      }\n      const comp = vnode.type;\n      const name = getComponentName(\n        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n      );\n      const { include, exclude, max } = props;\n      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n        vnode.shapeFlag &= -257;\n        current = vnode;\n        return rawVNode;\n      }\n      const key = vnode.key == null ? comp : vnode.key;\n      const cachedVNode = cache.get(key);\n      if (vnode.el) {\n        vnode = cloneVNode(vnode);\n        if (rawVNode.shapeFlag & 128) {\n          rawVNode.ssContent = vnode;\n        }\n      }\n      pendingCacheKey = key;\n      if (cachedVNode) {\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= 512;\n        keys.delete(key);\n        keys.add(key);\n      } else {\n        keys.add(key);\n        if (max && keys.size > parseInt(max, 10)) {\n          pruneCacheEntry(keys.values().next().value);\n        }\n      }\n      vnode.shapeFlag |= 256;\n      current = vnode;\n      return isSuspense(rawVNode.type) ? rawVNode : vnode;\n    };\n  }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n  if (isArray(pattern)) {\n    return pattern.some((p) => matches(p, name));\n  } else if (isString(pattern)) {\n    return pattern.split(\",\").includes(name);\n  } else if (isRegExp(pattern)) {\n    pattern.lastIndex = 0;\n    return pattern.test(name);\n  }\n  return false;\n}\nfunction onActivated(hook, target) {\n  registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n  registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n  const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n    let current = target;\n    while (current) {\n      if (current.isDeactivated) {\n        return;\n      }\n      current = current.parent;\n    }\n    return hook();\n  });\n  injectHook(type, wrappedHook, target);\n  if (target) {\n    let current = target.parent;\n    while (current && current.parent) {\n      if (isKeepAlive(current.parent.vnode)) {\n        injectToKeepAliveRoot(wrappedHook, type, target, current);\n      }\n      current = current.parent;\n    }\n  }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n  const injected = injectHook(\n    type,\n    hook,\n    keepAliveRoot,\n    true\n    /* prepend */\n  );\n  onUnmounted(() => {\n    remove(keepAliveRoot[type], injected);\n  }, target);\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= -257;\n  vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n  if (target) {\n    const hooks = target[type] || (target[type] = []);\n    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n      pauseTracking();\n      const reset = setCurrentInstance(target);\n      const res = callWithAsyncErrorHandling(hook, target, type, args);\n      reset();\n      resetTracking();\n      return res;\n    });\n    if (prepend) {\n      hooks.unshift(wrappedHook);\n    } else {\n      hooks.push(wrappedHook);\n    }\n    return wrappedHook;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n    warn$1(\n      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n    );\n  }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n  if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n    injectHook(lifecycle, (...args) => hook(...args), target);\n  }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n  \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n  \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n  \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n  injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n  if (isString(component)) {\n    return resolveAsset(COMPONENTS, component, false) || component;\n  } else {\n    return component || NULL_DYNAMIC_COMPONENT;\n  }\n}\nfunction resolveDirective(name) {\n  return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n  const instance = currentRenderingInstance || currentInstance;\n  if (instance) {\n    const Component = instance.type;\n    if (type === COMPONENTS) {\n      const selfName = getComponentName(\n        Component,\n        false\n      );\n      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n        return Component;\n      }\n    }\n    const res = (\n      // local registration\n      // check instance[type] first which is resolved for options API\n      resolve(instance[type] || Component[type], name) || // global registration\n      resolve(instance.appContext[type], name)\n    );\n    if (!res && maybeSelfReference) {\n      return Component;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n      const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n      warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n    }\n    return res;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n    );\n  }\n}\nfunction resolve(registry, name) {\n  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n  let ret;\n  const cached = cache && cache[index];\n  const sourceIsArray = isArray(source);\n  if (sourceIsArray || isString(source)) {\n    const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n    let needsWrap = false;\n    let isReadonlySource = false;\n    if (sourceIsReactiveArray) {\n      needsWrap = !isShallow(source);\n      isReadonlySource = isReadonly(source);\n      source = shallowReadArray(source);\n    }\n    ret = new Array(source.length);\n    for (let i = 0, l = source.length; i < l; i++) {\n      ret[i] = renderItem(\n        needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n        i,\n        void 0,\n        cached && cached[i]\n      );\n    }\n  } else if (typeof source === \"number\") {\n    if (!!(process.env.NODE_ENV !== \"production\") && (!Number.isInteger(source) || source < 0)) {\n      warn$1(\n        `The v-for range expects a positive integer value but got ${source}.`\n      );\n      ret = [];\n    } else {\n      ret = new Array(source);\n      for (let i = 0; i < source; i++) {\n        ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n      }\n    }\n  } else if (isObject(source)) {\n    if (source[Symbol.iterator]) {\n      ret = Array.from(\n        source,\n        (item, i) => renderItem(item, i, void 0, cached && cached[i])\n      );\n    } else {\n      const keys = Object.keys(source);\n      ret = new Array(keys.length);\n      for (let i = 0, l = keys.length; i < l; i++) {\n        const key = keys[i];\n        ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n      }\n    }\n  } else {\n    ret = [];\n  }\n  if (cache) {\n    cache[index] = ret;\n  }\n  return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n  for (let i = 0; i < dynamicSlots.length; i++) {\n    const slot = dynamicSlots[i];\n    if (isArray(slot)) {\n      for (let j = 0; j < slot.length; j++) {\n        slots[slot[j].name] = slot[j].fn;\n      }\n    } else if (slot) {\n      slots[slot.name] = slot.key ? (...args) => {\n        const res = slot.fn(...args);\n        if (res) res.key = slot.key;\n        return res;\n      } : slot.fn;\n    }\n  }\n  return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n    const hasProps = Object.keys(props).length > 0;\n    if (name !== \"default\") props.name = name;\n    return openBlock(), createBlock(\n      Fragment,\n      null,\n      [createVNode(\"slot\", props, fallback && fallback())],\n      hasProps ? -2 : 64\n    );\n  }\n  let slot = slots[name];\n  if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n    warn$1(\n      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n    );\n    slot = () => [];\n  }\n  if (slot && slot._c) {\n    slot._d = false;\n  }\n  openBlock();\n  const validSlotContent = slot && ensureValidVNode(slot(props));\n  const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n  // key attached in the `createSlots` helper, respect that\n  validSlotContent && validSlotContent.key;\n  const rendered = createBlock(\n    Fragment,\n    {\n      key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n      (!validSlotContent && fallback ? \"_fb\" : \"\")\n    },\n    validSlotContent || (fallback ? fallback() : []),\n    validSlotContent && slots._ === 1 ? 64 : -2\n  );\n  if (!noSlotted && rendered.scopeId) {\n    rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n  }\n  if (slot && slot._c) {\n    slot._d = true;\n  }\n  return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n  return vnodes.some((child) => {\n    if (!isVNode(child)) return true;\n    if (child.type === Comment) return false;\n    if (child.type === Fragment && !ensureValidVNode(child.children))\n      return false;\n    return true;\n  }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n  const ret = {};\n  if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n    warn$1(`v-on with no argument expects an object value.`);\n    return ret;\n  }\n  for (const key in obj) {\n    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n  }\n  return ret;\n}\n\nconst getPublicInstance = (i) => {\n  if (!i) return null;\n  if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n  return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n  // Move PURE marker to new line to workaround compiler discarding it\n  // due to type annotation\n  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n    $: (i) => i,\n    $el: (i) => i.vnode.el,\n    $data: (i) => i.data,\n    $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n    $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n    $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n    $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n    $parent: (i) => getPublicInstance(i.parent),\n    $root: (i) => getPublicInstance(i.root),\n    $host: (i) => i.ce,\n    $emit: (i) => i.emit,\n    $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n    $forceUpdate: (i) => i.f || (i.f = () => {\n      queueJob(i.update);\n    }),\n    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n  })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n  get({ _: instance }, key) {\n    if (key === \"__v_skip\") {\n      return true;\n    }\n    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n    if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n      return true;\n    }\n    if (key[0] !== \"$\") {\n      const n = accessCache[key];\n      if (n !== void 0) {\n        switch (n) {\n          case 1 /* SETUP */:\n            return setupState[key];\n          case 2 /* DATA */:\n            return data[key];\n          case 4 /* CONTEXT */:\n            return ctx[key];\n          case 3 /* PROPS */:\n            return props[key];\n        }\n      } else if (hasSetupBinding(setupState, key)) {\n        accessCache[key] = 1 /* SETUP */;\n        return setupState[key];\n      } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n        accessCache[key] = 2 /* DATA */;\n        return data[key];\n      } else if (hasOwn(props, key)) {\n        accessCache[key] = 3 /* PROPS */;\n        return props[key];\n      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n        accessCache[key] = 4 /* CONTEXT */;\n        return ctx[key];\n      } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n        accessCache[key] = 0 /* OTHER */;\n      }\n    }\n    const publicGetter = publicPropertiesMap[key];\n    let cssModule, globalProperties;\n    if (publicGetter) {\n      if (key === \"$attrs\") {\n        track(instance.attrs, \"get\", \"\");\n        !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n      } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n        track(instance, \"get\", key);\n      }\n      return publicGetter(instance);\n    } else if (\n      // css module (injected by vue-loader)\n      (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n    ) {\n      return cssModule;\n    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n      accessCache[key] = 4 /* CONTEXT */;\n      return ctx[key];\n    } else if (\n      // global properties\n      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n    ) {\n      {\n        return globalProperties[key];\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n    // to infinite warning loop\n    key.indexOf(\"__v\") !== 0)) {\n      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n        warn$1(\n          `Property ${JSON.stringify(\n            key\n          )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n        );\n      } else if (instance === currentRenderingInstance) {\n        warn$1(\n          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n        );\n      }\n    }\n  },\n  set({ _: instance }, key, value) {\n    const { data, setupState, ctx } = instance;\n    if (hasSetupBinding(setupState, key)) {\n      setupState[key] = value;\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n      warn$1(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n      return false;\n    } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n      data[key] = value;\n      return true;\n    } else if (hasOwn(instance.props, key)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n      return false;\n    }\n    if (key[0] === \"$\" && key.slice(1) in instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n      );\n      return false;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n        Object.defineProperty(ctx, key, {\n          enumerable: true,\n          configurable: true,\n          value\n        });\n      } else {\n        ctx[key] = value;\n      }\n    }\n    return true;\n  },\n  has({\n    _: { data, setupState, accessCache, ctx, appContext, props, type }\n  }, key) {\n    let cssModules;\n    return !!(accessCache[key] || __VUE_OPTIONS_API__ && data !== EMPTY_OBJ && key[0] !== \"$\" && hasOwn(data, key) || hasSetupBinding(setupState, key) || hasOwn(props, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]);\n  },\n  defineProperty(target, key, descriptor) {\n    if (descriptor.get != null) {\n      target._.accessCache[key] = 0;\n    } else if (hasOwn(descriptor, \"value\")) {\n      this.set(target, key, descriptor.value, null);\n    }\n    return Reflect.defineProperty(target, key, descriptor);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n  PublicInstanceProxyHandlers.ownKeys = (target) => {\n    warn$1(\n      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n    );\n    return Reflect.ownKeys(target);\n  };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend({}, PublicInstanceProxyHandlers, {\n  get(target, key) {\n    if (key === Symbol.unscopables) {\n      return;\n    }\n    return PublicInstanceProxyHandlers.get(target, key, target);\n  },\n  has(_, key) {\n    const has = key[0] !== \"_\" && !isGloballyAllowed(key);\n    if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n      warn$1(\n        `Property ${JSON.stringify(\n          key\n        )} should not start with _ which is a reserved prefix for Vue internals.`\n      );\n    }\n    return has;\n  }\n});\nfunction createDevRenderContext(instance) {\n  const target = {};\n  Object.defineProperty(target, `_`, {\n    configurable: true,\n    enumerable: false,\n    get: () => instance\n  });\n  Object.keys(publicPropertiesMap).forEach((key) => {\n    Object.defineProperty(target, key, {\n      configurable: true,\n      enumerable: false,\n      get: () => publicPropertiesMap[key](instance),\n      // intercepted by the proxy so no need for implementation,\n      // but needed to prevent set errors\n      set: NOOP\n    });\n  });\n  return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n  const {\n    ctx,\n    propsOptions: [propsOptions]\n  } = instance;\n  if (propsOptions) {\n    Object.keys(propsOptions).forEach((key) => {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => instance.props[key],\n        set: NOOP\n      });\n    });\n  }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n  const { ctx, setupState } = instance;\n  Object.keys(toRaw(setupState)).forEach((key) => {\n    if (!setupState.__isScriptSetup) {\n      if (isReservedPrefix(key[0])) {\n        warn$1(\n          `setup() return property ${JSON.stringify(\n            key\n          )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n        );\n        return;\n      }\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => setupState[key],\n        set: NOOP\n      });\n    }\n  });\n}\n\nconst warnRuntimeUsage = (method) => warn$1(\n  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineProps`);\n  }\n  return null;\n}\nfunction defineEmits() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineEmits`);\n  }\n  return null;\n}\nfunction defineExpose(exposed) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineExpose`);\n  }\n}\nfunction defineOptions(options) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineOptions`);\n  }\n}\nfunction defineSlots() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineSlots`);\n  }\n  return null;\n}\nfunction defineModel() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(\"defineModel\");\n  }\n}\nfunction withDefaults(props, defaults) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`withDefaults`);\n  }\n  return null;\n}\nfunction useSlots() {\n  return getContext(\"useSlots\").slots;\n}\nfunction useAttrs() {\n  return getContext(\"useAttrs\").attrs;\n}\nfunction getContext(calledFunctionName) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`${calledFunctionName}() called without active instance.`);\n  }\n  return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n  return isArray(props) ? props.reduce(\n    (normalized, p) => (normalized[p] = null, normalized),\n    {}\n  ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n  const props = normalizePropsOrEmits(raw);\n  for (const key in defaults) {\n    if (key.startsWith(\"__skip\")) continue;\n    let opt = props[key];\n    if (opt) {\n      if (isArray(opt) || isFunction(opt)) {\n        opt = props[key] = { type: opt, default: defaults[key] };\n      } else {\n        opt.default = defaults[key];\n      }\n    } else if (opt === null) {\n      opt = props[key] = { default: defaults[key] };\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`props default key \"${key}\" has no corresponding declaration.`);\n    }\n    if (opt && defaults[`__skip_${key}`]) {\n      opt.skipFactory = true;\n    }\n  }\n  return props;\n}\nfunction mergeModels(a, b) {\n  if (!a || !b) return a || b;\n  if (isArray(a) && isArray(b)) return a.concat(b);\n  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n  const ret = {};\n  for (const key in props) {\n    if (!excludedKeys.includes(key)) {\n      Object.defineProperty(ret, key, {\n        enumerable: true,\n        get: () => props[key]\n      });\n    }\n  }\n  return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n  const ctx = getCurrentInstance();\n  const inSSRSetup = isInSSRComponentSetup;\n  if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n    warn$1(\n      `withAsyncContext called without active current instance. This is likely a bug.`\n    );\n  }\n  let awaitable = getAwaitable();\n  unsetCurrentInstance();\n  if (inSSRSetup) {\n    setInSSRSetupState(false);\n  }\n  const restore = () => {\n    setCurrentInstance(ctx);\n    if (inSSRSetup) {\n      setInSSRSetupState(true);\n    }\n  };\n  const cleanup = () => {\n    if (getCurrentInstance() !== ctx) ctx.scope.off();\n    unsetCurrentInstance();\n    if (inSSRSetup) {\n      setInSSRSetupState(false);\n    }\n  };\n  if (isPromise(awaitable)) {\n    awaitable = awaitable.catch((e) => {\n      restore();\n      Promise.resolve().then(() => Promise.resolve().then(cleanup));\n      throw e;\n    });\n  }\n  return [\n    awaitable,\n    () => {\n      restore();\n      Promise.resolve().then(cleanup);\n    }\n  ];\n}\n\nfunction createDuplicateChecker() {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (type, key) => {\n    if (cache[key]) {\n      warn$1(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n    } else {\n      cache[key] = type;\n    }\n  };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n  const options = resolveMergedOptions(instance);\n  const publicThis = instance.proxy;\n  const ctx = instance.ctx;\n  shouldCacheAccess = false;\n  if (options.beforeCreate) {\n    callHook(options.beforeCreate, instance, \"bc\");\n  }\n  const {\n    // state\n    data: dataOptions,\n    computed: computedOptions,\n    methods,\n    watch: watchOptions,\n    provide: provideOptions,\n    inject: injectOptions,\n    // lifecycle\n    created,\n    beforeMount,\n    mounted,\n    beforeUpdate,\n    updated,\n    activated,\n    deactivated,\n    beforeDestroy,\n    beforeUnmount,\n    destroyed,\n    unmounted,\n    render,\n    renderTracked,\n    renderTriggered,\n    errorCaptured,\n    serverPrefetch,\n    // public API\n    expose,\n    inheritAttrs,\n    // assets\n    components,\n    directives,\n    filters\n  } = options;\n  const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const [propsOptions] = instance.propsOptions;\n    if (propsOptions) {\n      for (const key in propsOptions) {\n        checkDuplicateProperties(\"Props\" /* PROPS */, key);\n      }\n    }\n  }\n  if (injectOptions) {\n    resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n  }\n  if (methods) {\n    for (const key in methods) {\n      const methodHandler = methods[key];\n      if (isFunction(methodHandler)) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          Object.defineProperty(ctx, key, {\n            value: methodHandler.bind(publicThis),\n            configurable: true,\n            enumerable: true,\n            writable: true\n          });\n        } else {\n          ctx[key] = methodHandler.bind(publicThis);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(\n          `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n        );\n      }\n    }\n  }\n  if (dataOptions) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n      warn$1(\n        `The data option must be a function. Plain object usage is no longer supported.`\n      );\n    }\n    const data = dataOptions.call(publicThis, publicThis);\n    if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n      warn$1(\n        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n      );\n    }\n    if (!isObject(data)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`data() should return an object.`);\n    } else {\n      instance.data = reactive(data);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (const key in data) {\n          checkDuplicateProperties(\"Data\" /* DATA */, key);\n          if (!isReservedPrefix(key[0])) {\n            Object.defineProperty(ctx, key, {\n              configurable: true,\n              enumerable: true,\n              get: () => data[key],\n              set: NOOP\n            });\n          }\n        }\n      }\n    }\n  }\n  shouldCacheAccess = true;\n  if (computedOptions) {\n    for (const key in computedOptions) {\n      const opt = computedOptions[key];\n      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n      if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n        warn$1(`Computed property \"${key}\" has no getter.`);\n      }\n      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n        warn$1(\n          `Write operation failed: computed property \"${key}\" is readonly.`\n        );\n      } : NOOP;\n      const c = computed({\n        get,\n        set\n      });\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => c.value,\n        set: (v) => c.value = v\n      });\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n      }\n    }\n  }\n  if (watchOptions) {\n    for (const key in watchOptions) {\n      createWatcher(watchOptions[key], ctx, publicThis, key);\n    }\n  }\n  if (provideOptions) {\n    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n    Reflect.ownKeys(provides).forEach((key) => {\n      provide(key, provides[key]);\n    });\n  }\n  if (created) {\n    callHook(created, instance, \"c\");\n  }\n  function registerLifecycleHook(register, hook) {\n    if (isArray(hook)) {\n      hook.forEach((_hook) => register(_hook.bind(publicThis)));\n    } else if (hook) {\n      register(hook.bind(publicThis));\n    }\n  }\n  registerLifecycleHook(onBeforeMount, beforeMount);\n  registerLifecycleHook(onMounted, mounted);\n  registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n  registerLifecycleHook(onUpdated, updated);\n  registerLifecycleHook(onActivated, activated);\n  registerLifecycleHook(onDeactivated, deactivated);\n  registerLifecycleHook(onErrorCaptured, errorCaptured);\n  registerLifecycleHook(onRenderTracked, renderTracked);\n  registerLifecycleHook(onRenderTriggered, renderTriggered);\n  registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n  registerLifecycleHook(onUnmounted, unmounted);\n  registerLifecycleHook(onServerPrefetch, serverPrefetch);\n  if (isArray(expose)) {\n    if (expose.length) {\n      const exposed = instance.exposed || (instance.exposed = {});\n      expose.forEach((key) => {\n        Object.defineProperty(exposed, key, {\n          get: () => publicThis[key],\n          set: (val) => publicThis[key] = val,\n          enumerable: true\n        });\n      });\n    } else if (!instance.exposed) {\n      instance.exposed = {};\n    }\n  }\n  if (render && instance.render === NOOP) {\n    instance.render = render;\n  }\n  if (inheritAttrs != null) {\n    instance.inheritAttrs = inheritAttrs;\n  }\n  if (components) instance.components = components;\n  if (directives) instance.directives = directives;\n  if (serverPrefetch) {\n    markAsyncBoundary(instance);\n  }\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n  if (isArray(injectOptions)) {\n    injectOptions = normalizeInject(injectOptions);\n  }\n  for (const key in injectOptions) {\n    const opt = injectOptions[key];\n    let injected;\n    if (isObject(opt)) {\n      if (\"default\" in opt) {\n        injected = inject(\n          opt.from || key,\n          opt.default,\n          true\n        );\n      } else {\n        injected = inject(opt.from || key);\n      }\n    } else {\n      injected = inject(opt);\n    }\n    if (isRef(injected)) {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => injected.value,\n        set: (v) => injected.value = v\n      });\n    } else {\n      ctx[key] = injected;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n    }\n  }\n}\nfunction callHook(hook, instance, type) {\n  callWithAsyncErrorHandling(\n    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n    instance,\n    type\n  );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n  let getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n  if (isString(raw)) {\n    const handler = ctx[raw];\n    if (isFunction(handler)) {\n      {\n        watch(getter, handler);\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`Invalid watch handler specified by key \"${raw}\"`, handler);\n    }\n  } else if (isFunction(raw)) {\n    {\n      watch(getter, raw.bind(publicThis));\n    }\n  } else if (isObject(raw)) {\n    if (isArray(raw)) {\n      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n    } else {\n      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n      if (isFunction(handler)) {\n        watch(getter, handler, raw);\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n      }\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid watch option: \"${key}\"`, raw);\n  }\n}\nfunction resolveMergedOptions(instance) {\n  const base = instance.type;\n  const { mixins, extends: extendsOptions } = base;\n  const {\n    mixins: globalMixins,\n    optionsCache: cache,\n    config: { optionMergeStrategies }\n  } = instance.appContext;\n  const cached = cache.get(base);\n  let resolved;\n  if (cached) {\n    resolved = cached;\n  } else if (!globalMixins.length && !mixins && !extendsOptions) {\n    {\n      resolved = base;\n    }\n  } else {\n    resolved = {};\n    if (globalMixins.length) {\n      globalMixins.forEach(\n        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n      );\n    }\n    mergeOptions(resolved, base, optionMergeStrategies);\n  }\n  if (isObject(base)) {\n    cache.set(base, resolved);\n  }\n  return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n  const { mixins, extends: extendsOptions } = from;\n  if (extendsOptions) {\n    mergeOptions(to, extendsOptions, strats, true);\n  }\n  if (mixins) {\n    mixins.forEach(\n      (m) => mergeOptions(to, m, strats, true)\n    );\n  }\n  for (const key in from) {\n    if (asMixin && key === \"expose\") {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n      );\n    } else {\n      const strat = internalOptionMergeStrats[key] || strats && strats[key];\n      to[key] = strat ? strat(to[key], from[key]) : from[key];\n    }\n  }\n  return to;\n}\nconst internalOptionMergeStrats = {\n  data: mergeDataFn,\n  props: mergeEmitsOrPropsOptions,\n  emits: mergeEmitsOrPropsOptions,\n  // objects\n  methods: mergeObjectOptions,\n  computed: mergeObjectOptions,\n  // lifecycle\n  beforeCreate: mergeAsArray,\n  created: mergeAsArray,\n  beforeMount: mergeAsArray,\n  mounted: mergeAsArray,\n  beforeUpdate: mergeAsArray,\n  updated: mergeAsArray,\n  beforeDestroy: mergeAsArray,\n  beforeUnmount: mergeAsArray,\n  destroyed: mergeAsArray,\n  unmounted: mergeAsArray,\n  activated: mergeAsArray,\n  deactivated: mergeAsArray,\n  errorCaptured: mergeAsArray,\n  serverPrefetch: mergeAsArray,\n  // assets\n  components: mergeObjectOptions,\n  directives: mergeObjectOptions,\n  // watch\n  watch: mergeWatchOptions,\n  // provide / inject\n  provide: mergeDataFn,\n  inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n  if (!from) {\n    return to;\n  }\n  if (!to) {\n    return from;\n  }\n  return function mergedDataFn() {\n    return (extend)(\n      isFunction(to) ? to.call(this, this) : to,\n      isFunction(from) ? from.call(this, this) : from\n    );\n  };\n}\nfunction mergeInject(to, from) {\n  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n  if (isArray(raw)) {\n    const res = {};\n    for (let i = 0; i < raw.length; i++) {\n      res[raw[i]] = raw[i];\n    }\n    return res;\n  }\n  return raw;\n}\nfunction mergeAsArray(to, from) {\n  return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n  if (to) {\n    if (isArray(to) && isArray(from)) {\n      return [.../* @__PURE__ */ new Set([...to, ...from])];\n    }\n    return extend(\n      /* @__PURE__ */ Object.create(null),\n      normalizePropsOrEmits(to),\n      normalizePropsOrEmits(from != null ? from : {})\n    );\n  } else {\n    return from;\n  }\n}\nfunction mergeWatchOptions(to, from) {\n  if (!to) return from;\n  if (!from) return to;\n  const merged = extend(/* @__PURE__ */ Object.create(null), to);\n  for (const key in from) {\n    merged[key] = mergeAsArray(to[key], from[key]);\n  }\n  return merged;\n}\n\nfunction createAppContext() {\n  return {\n    app: null,\n    config: {\n      isNativeTag: NO,\n      performance: false,\n      globalProperties: {},\n      optionMergeStrategies: {},\n      errorHandler: void 0,\n      warnHandler: void 0,\n      compilerOptions: {}\n    },\n    mixins: [],\n    components: {},\n    directives: {},\n    provides: /* @__PURE__ */ Object.create(null),\n    optionsCache: /* @__PURE__ */ new WeakMap(),\n    propsCache: /* @__PURE__ */ new WeakMap(),\n    emitsCache: /* @__PURE__ */ new WeakMap()\n  };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n  return function createApp(rootComponent, rootProps = null) {\n    if (!isFunction(rootComponent)) {\n      rootComponent = extend({}, rootComponent);\n    }\n    if (rootProps != null && !isObject(rootProps)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n      rootProps = null;\n    }\n    const context = createAppContext();\n    const installedPlugins = /* @__PURE__ */ new WeakSet();\n    const pluginCleanupFns = [];\n    let isMounted = false;\n    const app = context.app = {\n      _uid: uid$1++,\n      _component: rootComponent,\n      _props: rootProps,\n      _container: null,\n      _context: context,\n      _instance: null,\n      version,\n      get config() {\n        return context.config;\n      },\n      set config(v) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `app.config cannot be replaced. Modify individual options instead.`\n          );\n        }\n      },\n      use(plugin, ...options) {\n        if (installedPlugins.has(plugin)) {\n          !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n        } else if (plugin && isFunction(plugin.install)) {\n          installedPlugins.add(plugin);\n          plugin.install(app, ...options);\n        } else if (isFunction(plugin)) {\n          installedPlugins.add(plugin);\n          plugin(app, ...options);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `A plugin must either be a function or an object with an \"install\" function.`\n          );\n        }\n        return app;\n      },\n      mixin(mixin) {\n        if (__VUE_OPTIONS_API__) {\n          if (!context.mixins.includes(mixin)) {\n            context.mixins.push(mixin);\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n            );\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Mixins are only available in builds supporting Options API\");\n        }\n        return app;\n      },\n      component(name, component) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateComponentName(name, context.config);\n        }\n        if (!component) {\n          return context.components[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n          warn$1(`Component \"${name}\" has already been registered in target app.`);\n        }\n        context.components[name] = component;\n        return app;\n      },\n      directive(name, directive) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateDirectiveName(name);\n        }\n        if (!directive) {\n          return context.directives[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n          warn$1(`Directive \"${name}\" has already been registered in target app.`);\n        }\n        context.directives[name] = directive;\n        return app;\n      },\n      mount(rootContainer, isHydrate, namespace) {\n        if (!isMounted) {\n          if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n            warn$1(\n              `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n            );\n          }\n          const vnode = app._ceVNode || createVNode(rootComponent, rootProps);\n          vnode.appContext = context;\n          if (namespace === true) {\n            namespace = \"svg\";\n          } else if (namespace === false) {\n            namespace = void 0;\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            context.reload = () => {\n              const cloned = cloneVNode(vnode);\n              cloned.el = null;\n              render(cloned, rootContainer, namespace);\n            };\n          }\n          if (isHydrate && hydrate) {\n            hydrate(vnode, rootContainer);\n          } else {\n            render(vnode, rootContainer, namespace);\n          }\n          isMounted = true;\n          app._container = rootContainer;\n          rootContainer.__vue_app__ = app;\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = vnode.component;\n            devtoolsInitApp(app, version);\n          }\n          return getComponentPublicInstance(vnode.component);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n          );\n        }\n      },\n      onUnmount(cleanupFn) {\n        if (!!(process.env.NODE_ENV !== \"production\") && typeof cleanupFn !== \"function\") {\n          warn$1(\n            `Expected function as first argument to app.onUnmount(), but got ${typeof cleanupFn}`\n          );\n        }\n        pluginCleanupFns.push(cleanupFn);\n      },\n      unmount() {\n        if (isMounted) {\n          callWithAsyncErrorHandling(\n            pluginCleanupFns,\n            app._instance,\n            16\n          );\n          render(null, app._container);\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = null;\n            devtoolsUnmountApp(app);\n          }\n          delete app._container.__vue_app__;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`Cannot unmount an app that is not mounted.`);\n        }\n      },\n      provide(key, value) {\n        if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n          if (hasOwn(context.provides, key)) {\n            warn$1(\n              `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n            );\n          } else {\n            warn$1(\n              `App already provides property with key \"${String(key)}\" inherited from its parent element. It will be overwritten with the new value.`\n            );\n          }\n        }\n        context.provides[key] = value;\n        return app;\n      },\n      runWithContext(fn) {\n        const lastApp = currentApp;\n        currentApp = app;\n        try {\n          return fn();\n        } finally {\n          currentApp = lastApp;\n        }\n      }\n    };\n    return app;\n  };\n}\nlet currentApp = null;\n\nfunction useModel(props, name, options = EMPTY_OBJ) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useModel() called without active instance.`);\n    return ref();\n  }\n  const camelizedName = camelize(name);\n  if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][camelizedName]) {\n    warn$1(`useModel() called with prop \"${name}\" which is not declared.`);\n    return ref();\n  }\n  const hyphenatedName = hyphenate(name);\n  const modifiers = getModelModifiers(props, camelizedName);\n  const res = customRef((track, trigger) => {\n    let localValue;\n    let prevSetValue = EMPTY_OBJ;\n    let prevEmittedValue;\n    watchSyncEffect(() => {\n      const propValue = props[camelizedName];\n      if (hasChanged(localValue, propValue)) {\n        localValue = propValue;\n        trigger();\n      }\n    });\n    return {\n      get() {\n        track();\n        return options.get ? options.get(localValue) : localValue;\n      },\n      set(value) {\n        const emittedValue = options.set ? options.set(value) : value;\n        if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) {\n          return;\n        }\n        const rawProps = i.vnode.props;\n        if (!(rawProps && // check if parent has passed v-model\n        (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {\n          localValue = value;\n          trigger();\n        }\n        i.emit(`update:${name}`, emittedValue);\n        if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) {\n          trigger();\n        }\n        prevSetValue = value;\n        prevEmittedValue = emittedValue;\n      }\n    };\n  });\n  res[Symbol.iterator] = () => {\n    let i2 = 0;\n    return {\n      next() {\n        if (i2 < 2) {\n          return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false };\n        } else {\n          return { done: true };\n        }\n      }\n    };\n  };\n  return res;\n}\nconst getModelModifiers = (props, modelName) => {\n  return modelName === \"modelValue\" || modelName === \"model-value\" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];\n};\n\nfunction emit(instance, event, ...rawArgs) {\n  if (instance.isUnmounted) return;\n  const props = instance.vnode.props || EMPTY_OBJ;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const {\n      emitsOptions,\n      propsOptions: [propsOptions]\n    } = instance;\n    if (emitsOptions) {\n      if (!(event in emitsOptions) && true) {\n        if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) {\n          warn$1(\n            `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(camelize(event))}\" prop.`\n          );\n        }\n      } else {\n        const validator = emitsOptions[event];\n        if (isFunction(validator)) {\n          const isValid = validator(...rawArgs);\n          if (!isValid) {\n            warn$1(\n              `Invalid event arguments: event validation failed for event \"${event}\".`\n            );\n          }\n        }\n      }\n    }\n  }\n  let args = rawArgs;\n  const isModelListener = event.startsWith(\"update:\");\n  const modifiers = isModelListener && getModelModifiers(props, event.slice(7));\n  if (modifiers) {\n    if (modifiers.trim) {\n      args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n    }\n    if (modifiers.number) {\n      args = rawArgs.map(looseToNumber);\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsComponentEmit(instance, event, args);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const lowerCaseEvent = event.toLowerCase();\n    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n      warn$1(\n        `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n          instance,\n          instance.type\n        )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n          event\n        )}\" instead of \"${event}\".`\n      );\n    }\n  }\n  let handlerName;\n  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n  props[handlerName = toHandlerKey(camelize(event))];\n  if (!handler && isModelListener) {\n    handler = props[handlerName = toHandlerKey(hyphenate(event))];\n  }\n  if (handler) {\n    callWithAsyncErrorHandling(\n      handler,\n      instance,\n      6,\n      args\n    );\n  }\n  const onceHandler = props[handlerName + `Once`];\n  if (onceHandler) {\n    if (!instance.emitted) {\n      instance.emitted = {};\n    } else if (instance.emitted[handlerName]) {\n      return;\n    }\n    instance.emitted[handlerName] = true;\n    callWithAsyncErrorHandling(\n      onceHandler,\n      instance,\n      6,\n      args\n    );\n  }\n}\nconst mixinEmitsCache = /* @__PURE__ */ new WeakMap();\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n  const cache = __VUE_OPTIONS_API__ && asMixin ? mixinEmitsCache : appContext.emitsCache;\n  const cached = cache.get(comp);\n  if (cached !== void 0) {\n    return cached;\n  }\n  const raw = comp.emits;\n  let normalized = {};\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendEmits = (raw2) => {\n      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n      if (normalizedFromExtend) {\n        hasExtends = true;\n        extend(normalized, normalizedFromExtend);\n      }\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendEmits);\n    }\n    if (comp.extends) {\n      extendEmits(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendEmits);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, null);\n    }\n    return null;\n  }\n  if (isArray(raw)) {\n    raw.forEach((key) => normalized[key] = null);\n  } else {\n    extend(normalized, raw);\n  }\n  if (isObject(comp)) {\n    cache.set(comp, normalized);\n  }\n  return normalized;\n}\nfunction isEmitListener(options, key) {\n  if (!options || !isOn(key)) {\n    return false;\n  }\n  key = key.slice(2).replace(/Once$/, \"\");\n  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n  accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n  const {\n    type: Component,\n    vnode,\n    proxy,\n    withProxy,\n    propsOptions: [propsOptions],\n    slots,\n    attrs,\n    emit,\n    render,\n    renderCache,\n    props,\n    data,\n    setupState,\n    ctx,\n    inheritAttrs\n  } = instance;\n  const prev = setCurrentRenderingInstance(instance);\n  let result;\n  let fallthroughAttrs;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    accessedAttrs = false;\n  }\n  try {\n    if (vnode.shapeFlag & 4) {\n      const proxyToUse = withProxy || proxy;\n      const thisProxy = !!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup ? new Proxy(proxyToUse, {\n        get(target, key, receiver) {\n          warn$1(\n            `Property '${String(\n              key\n            )}' was accessed via 'this'. Avoid using 'this' in templates.`\n          );\n          return Reflect.get(target, key, receiver);\n        }\n      }) : proxyToUse;\n      result = normalizeVNode(\n        render.call(\n          thisProxy,\n          proxyToUse,\n          renderCache,\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          setupState,\n          data,\n          ctx\n        )\n      );\n      fallthroughAttrs = attrs;\n    } else {\n      const render2 = Component;\n      if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n        markAttrsAccessed();\n      }\n      result = normalizeVNode(\n        render2.length > 1 ? render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          !!(process.env.NODE_ENV !== \"production\") ? {\n            get attrs() {\n              markAttrsAccessed();\n              return shallowReadonly(attrs);\n            },\n            slots,\n            emit\n          } : { attrs, slots, emit }\n        ) : render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          null\n        )\n      );\n      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n    }\n  } catch (err) {\n    blockStack.length = 0;\n    handleError(err, instance, 1);\n    result = createVNode(Comment);\n  }\n  let root = result;\n  let setRoot = void 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n    [root, setRoot] = getChildRoot(result);\n  }\n  if (fallthroughAttrs && inheritAttrs !== false) {\n    const keys = Object.keys(fallthroughAttrs);\n    const { shapeFlag } = root;\n    if (keys.length) {\n      if (shapeFlag & (1 | 6)) {\n        if (propsOptions && keys.some(isModelListener)) {\n          fallthroughAttrs = filterModelListeners(\n            fallthroughAttrs,\n            propsOptions\n          );\n        }\n        root = cloneVNode(root, fallthroughAttrs, false, true);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n        const allAttrs = Object.keys(attrs);\n        const eventAttrs = [];\n        const extraAttrs = [];\n        for (let i = 0, l = allAttrs.length; i < l; i++) {\n          const key = allAttrs[i];\n          if (isOn(key)) {\n            if (!isModelListener(key)) {\n              eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n            }\n          } else {\n            extraAttrs.push(key);\n          }\n        }\n        if (extraAttrs.length) {\n          warn$1(\n            `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes.`\n          );\n        }\n        if (eventAttrs.length) {\n          warn$1(\n            `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n          );\n        }\n      }\n    }\n  }\n  if (vnode.dirs) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n      );\n    }\n    root = cloneVNode(root, null, false, true);\n    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n  }\n  if (vnode.transition) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Component inside <Transition> renders non-element root node that cannot be animated.`\n      );\n    }\n    setTransitionHooks(root, vnode.transition);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n    setRoot(root);\n  } else {\n    result = root;\n  }\n  setCurrentRenderingInstance(prev);\n  return result;\n}\nconst getChildRoot = (vnode) => {\n  const rawChildren = vnode.children;\n  const dynamicChildren = vnode.dynamicChildren;\n  const childRoot = filterSingleRoot(rawChildren, false);\n  if (!childRoot) {\n    return [vnode, void 0];\n  } else if (!!(process.env.NODE_ENV !== \"production\") && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {\n    return getChildRoot(childRoot);\n  }\n  const index = rawChildren.indexOf(childRoot);\n  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n  const setRoot = (updatedRoot) => {\n    rawChildren[index] = updatedRoot;\n    if (dynamicChildren) {\n      if (dynamicIndex > -1) {\n        dynamicChildren[dynamicIndex] = updatedRoot;\n      } else if (updatedRoot.patchFlag > 0) {\n        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n      }\n    }\n  };\n  return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children, recurse = true) {\n  let singleRoot;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (isVNode(child)) {\n      if (child.type !== Comment || child.children === \"v-if\") {\n        if (singleRoot) {\n          return;\n        } else {\n          singleRoot = child;\n          if (!!(process.env.NODE_ENV !== \"production\") && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {\n            return filterSingleRoot(singleRoot.children);\n          }\n        }\n      }\n    } else {\n      return;\n    }\n  }\n  return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n  let res;\n  for (const key in attrs) {\n    if (key === \"class\" || key === \"style\" || isOn(key)) {\n      (res || (res = {}))[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst filterModelListeners = (attrs, props) => {\n  const res = {};\n  for (const key in attrs) {\n    if (!isModelListener(key) || !(key.slice(9) in props)) {\n      res[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst isElementRoot = (vnode) => {\n  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n  const { props: prevProps, children: prevChildren, component } = prevVNode;\n  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n  const emits = component.emitsOptions;\n  if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n    return true;\n  }\n  if (nextVNode.dirs || nextVNode.transition) {\n    return true;\n  }\n  if (optimized && patchFlag >= 0) {\n    if (patchFlag & 1024) {\n      return true;\n    }\n    if (patchFlag & 16) {\n      if (!prevProps) {\n        return !!nextProps;\n      }\n      return hasPropsChanged(prevProps, nextProps, emits);\n    } else if (patchFlag & 8) {\n      const dynamicProps = nextVNode.dynamicProps;\n      for (let i = 0; i < dynamicProps.length; i++) {\n        const key = dynamicProps[i];\n        if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) {\n          return true;\n        }\n      }\n    }\n  } else {\n    if (prevChildren || nextChildren) {\n      if (!nextChildren || !nextChildren.$stable) {\n        return true;\n      }\n    }\n    if (prevProps === nextProps) {\n      return false;\n    }\n    if (!prevProps) {\n      return !!nextProps;\n    }\n    if (!nextProps) {\n      return true;\n    }\n    return hasPropsChanged(prevProps, nextProps, emits);\n  }\n  return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n  const nextKeys = Object.keys(nextProps);\n  if (nextKeys.length !== Object.keys(prevProps).length) {\n    return true;\n  }\n  for (let i = 0; i < nextKeys.length; i++) {\n    const key = nextKeys[i];\n    if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction hasPropValueChanged(nextProps, prevProps, key) {\n  const nextProp = nextProps[key];\n  const prevProp = prevProps[key];\n  if (key === \"style\" && isObject(nextProp) && isObject(prevProp)) {\n    return !looseEqual(nextProp, prevProp);\n  }\n  return nextProp !== prevProp;\n}\nfunction updateHOCHostEl({ vnode, parent, suspense }, el) {\n  while (parent) {\n    const root = parent.subTree;\n    if (root.suspense && root.suspense.activeBranch === vnode) {\n      root.suspense.vnode.el = root.el = el;\n      vnode = root;\n    }\n    if (root === vnode) {\n      (vnode = parent.vnode).el = el;\n      parent = parent.parent;\n    } else {\n      break;\n    }\n  }\n  if (suspense && suspense.activeBranch === vnode) {\n    suspense.vnode.el = el;\n  }\n}\n\nconst internalObjectProto = {};\nconst createInternalObject = () => Object.create(internalObjectProto);\nconst isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n  const props = {};\n  const attrs = createInternalObject();\n  instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n  setFullProps(instance, rawProps, props, attrs);\n  for (const key in instance.propsOptions[0]) {\n    if (!(key in props)) {\n      props[key] = void 0;\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n  if (isStateful) {\n    instance.props = isSSR ? props : shallowReactive(props);\n  } else {\n    if (!instance.type.props) {\n      instance.props = attrs;\n    } else {\n      instance.props = props;\n    }\n  }\n  instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n  while (instance) {\n    if (instance.type.__hmrId) return true;\n    instance = instance.parent;\n  }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n  const {\n    props,\n    attrs,\n    vnode: { patchFlag }\n  } = instance;\n  const rawCurrentProps = toRaw(props);\n  const [options] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n  ) {\n    if (patchFlag & 8) {\n      const propsToUpdate = instance.vnode.dynamicProps;\n      for (let i = 0; i < propsToUpdate.length; i++) {\n        let key = propsToUpdate[i];\n        if (isEmitListener(instance.emitsOptions, key)) {\n          continue;\n        }\n        const value = rawProps[key];\n        if (options) {\n          if (hasOwn(attrs, key)) {\n            if (value !== attrs[key]) {\n              attrs[key] = value;\n              hasAttrsChanged = true;\n            }\n          } else {\n            const camelizedKey = camelize(key);\n            props[camelizedKey] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              camelizedKey,\n              value,\n              instance,\n              false\n            );\n          }\n        } else {\n          if (value !== attrs[key]) {\n            attrs[key] = value;\n            hasAttrsChanged = true;\n          }\n        }\n      }\n    }\n  } else {\n    if (setFullProps(instance, rawProps, props, attrs)) {\n      hasAttrsChanged = true;\n    }\n    let kebabKey;\n    for (const key in rawCurrentProps) {\n      if (!rawProps || // for camelCase\n      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n      // and converted to camelCase (#955)\n      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n        if (options) {\n          if (rawPrevProps && // for camelCase\n          (rawPrevProps[key] !== void 0 || // for kebab-case\n          rawPrevProps[kebabKey] !== void 0)) {\n            props[key] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              key,\n              void 0,\n              instance,\n              true\n            );\n          }\n        } else {\n          delete props[key];\n        }\n      }\n    }\n    if (attrs !== rawCurrentProps) {\n      for (const key in attrs) {\n        if (!rawProps || !hasOwn(rawProps, key) && true) {\n          delete attrs[key];\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (hasAttrsChanged) {\n    trigger(instance.attrs, \"set\", \"\");\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n  const [options, needCastKeys] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  let rawCastValues;\n  if (rawProps) {\n    for (let key in rawProps) {\n      if (isReservedProp(key)) {\n        continue;\n      }\n      const value = rawProps[key];\n      let camelKey;\n      if (options && hasOwn(options, camelKey = camelize(key))) {\n        if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n          props[camelKey] = value;\n        } else {\n          (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n        }\n      } else if (!isEmitListener(instance.emitsOptions, key)) {\n        if (!(key in attrs) || value !== attrs[key]) {\n          attrs[key] = value;\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (needCastKeys) {\n    const rawCurrentProps = toRaw(props);\n    const castValues = rawCastValues || EMPTY_OBJ;\n    for (let i = 0; i < needCastKeys.length; i++) {\n      const key = needCastKeys[i];\n      props[key] = resolvePropValue(\n        options,\n        rawCurrentProps,\n        key,\n        castValues[key],\n        instance,\n        !hasOwn(castValues, key)\n      );\n    }\n  }\n  return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n  const opt = options[key];\n  if (opt != null) {\n    const hasDefault = hasOwn(opt, \"default\");\n    if (hasDefault && value === void 0) {\n      const defaultValue = opt.default;\n      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n        const { propsDefaults } = instance;\n        if (key in propsDefaults) {\n          value = propsDefaults[key];\n        } else {\n          const reset = setCurrentInstance(instance);\n          value = propsDefaults[key] = defaultValue.call(\n            null,\n            props\n          );\n          reset();\n        }\n      } else {\n        value = defaultValue;\n      }\n      if (instance.ce) {\n        instance.ce._setProp(key, value);\n      }\n    }\n    if (opt[0 /* shouldCast */]) {\n      if (isAbsent && !hasDefault) {\n        value = false;\n      } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n  }\n  return value;\n}\nconst mixinPropsCache = /* @__PURE__ */ new WeakMap();\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n  const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache;\n  const cached = cache.get(comp);\n  if (cached) {\n    return cached;\n  }\n  const raw = comp.props;\n  const normalized = {};\n  const needCastKeys = [];\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendProps = (raw2) => {\n      hasExtends = true;\n      const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n      extend(normalized, props);\n      if (keys) needCastKeys.push(...keys);\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendProps);\n    }\n    if (comp.extends) {\n      extendProps(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendProps);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, EMPTY_ARR);\n    }\n    return EMPTY_ARR;\n  }\n  if (isArray(raw)) {\n    for (let i = 0; i < raw.length; i++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n        warn$1(`props must be strings when using array syntax.`, raw[i]);\n      }\n      const normalizedKey = camelize(raw[i]);\n      if (validatePropName(normalizedKey)) {\n        normalized[normalizedKey] = EMPTY_OBJ;\n      }\n    }\n  } else if (raw) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n      warn$1(`invalid props options`, raw);\n    }\n    for (const key in raw) {\n      const normalizedKey = camelize(key);\n      if (validatePropName(normalizedKey)) {\n        const opt = raw[key];\n        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n        const propType = prop.type;\n        let shouldCast = false;\n        let shouldCastTrue = true;\n        if (isArray(propType)) {\n          for (let index = 0; index < propType.length; ++index) {\n            const type = propType[index];\n            const typeName = isFunction(type) && type.name;\n            if (typeName === \"Boolean\") {\n              shouldCast = true;\n              break;\n            } else if (typeName === \"String\") {\n              shouldCastTrue = false;\n            }\n          }\n        } else {\n          shouldCast = isFunction(propType) && propType.name === \"Boolean\";\n        }\n        prop[0 /* shouldCast */] = shouldCast;\n        prop[1 /* shouldCastTrue */] = shouldCastTrue;\n        if (shouldCast || hasOwn(prop, \"default\")) {\n          needCastKeys.push(normalizedKey);\n        }\n      }\n    }\n  }\n  const res = [normalized, needCastKeys];\n  if (isObject(comp)) {\n    cache.set(comp, res);\n  }\n  return res;\n}\nfunction validatePropName(key) {\n  if (key[0] !== \"$\" && !isReservedProp(key)) {\n    return true;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid prop name: \"${key}\" is a reserved property.`);\n  }\n  return false;\n}\nfunction getType(ctor) {\n  if (ctor === null) {\n    return \"null\";\n  }\n  if (typeof ctor === \"function\") {\n    return ctor.name || \"\";\n  } else if (typeof ctor === \"object\") {\n    const name = ctor.constructor && ctor.constructor.name;\n    return name || \"\";\n  }\n  return \"\";\n}\nfunction validateProps(rawProps, props, instance) {\n  const resolvedValues = toRaw(props);\n  const options = instance.propsOptions[0];\n  const camelizePropsKey = Object.keys(rawProps).map((key) => camelize(key));\n  for (const key in options) {\n    let opt = options[key];\n    if (opt == null) continue;\n    validateProp(\n      key,\n      resolvedValues[key],\n      opt,\n      !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(resolvedValues) : resolvedValues,\n      !camelizePropsKey.includes(key)\n    );\n  }\n}\nfunction validateProp(name, value, prop, props, isAbsent) {\n  const { type, required, validator, skipCheck } = prop;\n  if (required && isAbsent) {\n    warn$1('Missing required prop: \"' + name + '\"');\n    return;\n  }\n  if (value == null && !required) {\n    return;\n  }\n  if (type != null && type !== true && !skipCheck) {\n    let isValid = false;\n    const types = isArray(type) ? type : [type];\n    const expectedTypes = [];\n    for (let i = 0; i < types.length && !isValid; i++) {\n      const { valid, expectedType } = assertType(value, types[i]);\n      expectedTypes.push(expectedType || \"\");\n      isValid = valid;\n    }\n    if (!isValid) {\n      warn$1(getInvalidTypeMessage(name, value, expectedTypes));\n      return;\n    }\n  }\n  if (validator && !validator(value, props)) {\n    warn$1('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n  }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n  \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n  let valid;\n  const expectedType = getType(type);\n  if (expectedType === \"null\") {\n    valid = value === null;\n  } else if (isSimpleType(expectedType)) {\n    const t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    if (!valid && t === \"object\") {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === \"Object\") {\n    valid = isObject(value);\n  } else if (expectedType === \"Array\") {\n    valid = isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid,\n    expectedType\n  };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n  if (expectedTypes.length === 0) {\n    return `Prop type [] for prop \"${name}\" won't match anything. Did you mean to use type Array instead?`;\n  }\n  let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n  const expectedType = expectedTypes[0];\n  const receivedType = toRawType(value);\n  const expectedValue = styleValue(value, expectedType);\n  const receivedValue = styleValue(value, receivedType);\n  if (expectedTypes.length === 1 && isExplicable(expectedType) && isCoercible(expectedType, receivedType)) {\n    message += ` with value ${expectedValue}`;\n  }\n  message += `, got ${receivedType} `;\n  if (isExplicable(receivedType)) {\n    message += `with value ${receivedValue}.`;\n  }\n  return message;\n}\nfunction styleValue(value, type) {\n  if (isSymbol(value)) {\n    return value.toString();\n  } else if (type === \"String\") {\n    return `\"${value}\"`;\n  } else if (type === \"Number\") {\n    return `${Number(value)}`;\n  } else {\n    return `${value}`;\n  }\n}\nfunction isExplicable(type) {\n  const explicitTypes = [\"string\", \"number\", \"boolean\"];\n  return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isCoercible(...args) {\n  return args.every((elem) => {\n    const value = elem.toLowerCase();\n    return value !== \"boolean\" && value !== \"symbol\";\n  });\n}\n\nconst isInternalKey = (key) => key === \"_\" || key === \"_ctx\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n  if (rawSlot._n) {\n    return rawSlot;\n  }\n  const normalized = withCtx((...args) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && currentInstance && !(ctx === null && currentRenderingInstance) && !(ctx && ctx.root !== currentInstance.root)) {\n      warn$1(\n        `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n      );\n    }\n    return normalizeSlotValue(rawSlot(...args));\n  }, ctx);\n  normalized._c = false;\n  return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n  const ctx = rawSlots._ctx;\n  for (const key in rawSlots) {\n    if (isInternalKey(key)) continue;\n    const value = rawSlots[key];\n    if (isFunction(value)) {\n      slots[key] = normalizeSlot(key, value, ctx);\n    } else if (value != null) {\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        warn$1(\n          `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n        );\n      }\n      const normalized = normalizeSlotValue(value);\n      slots[key] = () => normalized;\n    }\n  }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n    warn$1(\n      `Non-function value encountered for default slot. Prefer function slots for better performance.`\n    );\n  }\n  const normalized = normalizeSlotValue(children);\n  instance.slots.default = () => normalized;\n};\nconst assignSlots = (slots, children, optimized) => {\n  for (const key in children) {\n    if (optimized || !isInternalKey(key)) {\n      slots[key] = children[key];\n    }\n  }\n};\nconst initSlots = (instance, children, optimized) => {\n  const slots = instance.slots = createInternalObject();\n  if (instance.vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      assignSlots(slots, children, optimized);\n      if (optimized) {\n        def(slots, \"_\", type, true);\n      }\n    } else {\n      normalizeObjectSlots(children, slots);\n    }\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n  }\n};\nconst updateSlots = (instance, children, optimized) => {\n  const { vnode, slots } = instance;\n  let needDeletionCheck = true;\n  let deletionComparisonTarget = EMPTY_OBJ;\n  if (vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n        assignSlots(slots, children, optimized);\n        trigger(instance, \"set\", \"$slots\");\n      } else if (optimized && type === 1) {\n        needDeletionCheck = false;\n      } else {\n        assignSlots(slots, children, optimized);\n      }\n    } else {\n      needDeletionCheck = !children.$stable;\n      normalizeObjectSlots(children, slots);\n    }\n    deletionComparisonTarget = children;\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n    deletionComparisonTarget = { default: 1 };\n  }\n  if (needDeletionCheck) {\n    for (const key in slots) {\n      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {\n        delete slots[key];\n      }\n    }\n  }\n};\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    perf.mark(`vue-${type}-${instance.uid}`);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction endMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    const startTag = `vue-${type}-${instance.uid}`;\n    const endTag = startTag + `:end`;\n    const measureName = `<${formatComponentName(instance, instance.type)}> ${type}`;\n    perf.mark(endTag);\n    perf.measure(measureName, startTag, endTag);\n    perf.clearMeasures(measureName);\n    perf.clearMarks(startTag);\n    perf.clearMarks(endTag);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction isSupported() {\n  if (supported !== void 0) {\n    return supported;\n  }\n  if (typeof window !== \"undefined\" && window.performance) {\n    supported = true;\n    perf = window.performance;\n  } else {\n    supported = false;\n  }\n  return supported;\n}\n\nfunction initFeatureFlags() {\n  const needWarn = [];\n  if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n    getGlobalThis().__VUE_OPTIONS_API__ = true;\n  }\n  if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n    getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n  }\n  if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);\n    getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n    const multi = needWarn.length > 1;\n    console.warn(\n      `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n    );\n  }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n  return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n  return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n  {\n    initFeatureFlags();\n  }\n  const target = getGlobalThis();\n  target.__VUE__ = true;\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n  }\n  const {\n    insert: hostInsert,\n    remove: hostRemove,\n    patchProp: hostPatchProp,\n    createElement: hostCreateElement,\n    createText: hostCreateText,\n    createComment: hostCreateComment,\n    setText: hostSetText,\n    setElementText: hostSetElementText,\n    parentNode: hostParentNode,\n    nextSibling: hostNextSibling,\n    setScopeId: hostSetScopeId = NOOP,\n    insertStaticContent: hostInsertStaticContent\n  } = options;\n  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n    if (n1 === n2) {\n      return;\n    }\n    if (n1 && !isSameVNodeType(n1, n2)) {\n      anchor = getNextHostNode(n1);\n      unmount(n1, parentComponent, parentSuspense, true);\n      n1 = null;\n    }\n    if (n2.patchFlag === -2) {\n      optimized = false;\n      n2.dynamicChildren = null;\n    }\n    const { type, ref, shapeFlag } = n2;\n    switch (type) {\n      case Text:\n        processText(n1, n2, container, anchor);\n        break;\n      case Comment:\n        processCommentNode(n1, n2, container, anchor);\n        break;\n      case Static:\n        if (n1 == null) {\n          mountStaticNode(n2, container, anchor, namespace);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          patchStaticNode(n1, n2, container, namespace);\n        }\n        break;\n      case Fragment:\n        processFragment(\n          n1,\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        break;\n      default:\n        if (shapeFlag & 1) {\n          processElement(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 6) {\n          processComponent(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 64) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (shapeFlag & 128) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid VNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null && parentComponent) {\n      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n    } else if (ref == null && n1 && n1.ref != null) {\n      setRef(n1.ref, null, parentSuspense, n1, true);\n    }\n  };\n  const processText = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateText(n2.children),\n        container,\n        anchor\n      );\n    } else {\n      const el = n2.el = n1.el;\n      if (n2.children !== n1.children) {\n        hostSetText(el, n2.children);\n      }\n    }\n  };\n  const processCommentNode = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateComment(n2.children || \"\"),\n        container,\n        anchor\n      );\n    } else {\n      n2.el = n1.el;\n    }\n  };\n  const mountStaticNode = (n2, container, anchor, namespace) => {\n    [n2.el, n2.anchor] = hostInsertStaticContent(\n      n2.children,\n      container,\n      anchor,\n      namespace,\n      n2.el,\n      n2.anchor\n    );\n  };\n  const patchStaticNode = (n1, n2, container, namespace) => {\n    if (n2.children !== n1.children) {\n      const anchor = hostNextSibling(n1.anchor);\n      removeStaticNode(n1);\n      [n2.el, n2.anchor] = hostInsertStaticContent(\n        n2.children,\n        container,\n        anchor,\n        namespace\n      );\n    } else {\n      n2.el = n1.el;\n      n2.anchor = n1.anchor;\n    }\n  };\n  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostInsert(el, container, nextSibling);\n      el = next;\n    }\n    hostInsert(anchor, container, nextSibling);\n  };\n  const removeStaticNode = ({ el, anchor }) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostRemove(el);\n      el = next;\n    }\n    hostRemove(anchor);\n  };\n  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    if (n2.type === \"svg\") {\n      namespace = \"svg\";\n    } else if (n2.type === \"math\") {\n      namespace = \"mathml\";\n    }\n    if (n1 == null) {\n      mountElement(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      const customElement = n1.el && n1.el._isVueCE ? n1.el : null;\n      try {\n        if (customElement) {\n          customElement._beginPatch();\n        }\n        patchElement(\n          n1,\n          n2,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } finally {\n        if (customElement) {\n          customElement._endPatch();\n        }\n      }\n    }\n  };\n  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let el;\n    let vnodeHook;\n    const { props, shapeFlag, transition, dirs } = vnode;\n    el = vnode.el = hostCreateElement(\n      vnode.type,\n      namespace,\n      props && props.is,\n      props\n    );\n    if (shapeFlag & 8) {\n      hostSetElementText(el, vnode.children);\n    } else if (shapeFlag & 16) {\n      mountChildren(\n        vnode.children,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(vnode, namespace),\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n    }\n    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n    if (props) {\n      for (const key in props) {\n        if (key !== \"value\" && !isReservedProp(key)) {\n          hostPatchProp(el, key, null, props[key], namespace, parentComponent);\n        }\n      }\n      if (\"value\" in props) {\n        hostPatchProp(el, \"value\", null, props.value, namespace);\n      }\n      if (vnodeHook = props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHook, parentComponent, vnode);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(el, \"__vnode\", vnode, true);\n      def(el, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n    }\n    const needCallTransitionHooks = needTransition(parentSuspense, transition);\n    if (needCallTransitionHooks) {\n      transition.beforeEnter(el);\n    }\n    hostInsert(el, container, anchor);\n    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n      const isHmr = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating;\n      queuePostRenderEffect(() => {\n        let prev;\n        if (!!(process.env.NODE_ENV !== \"production\")) prev = setHmrUpdating(isHmr);\n        try {\n          vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n          needCallTransitionHooks && transition.enter(el);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        } finally {\n          if (!!(process.env.NODE_ENV !== \"production\")) setHmrUpdating(prev);\n        }\n      }, parentSuspense);\n    }\n  };\n  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n    if (scopeId) {\n      hostSetScopeId(el, scopeId);\n    }\n    if (slotScopeIds) {\n      for (let i = 0; i < slotScopeIds.length; i++) {\n        hostSetScopeId(el, slotScopeIds[i]);\n      }\n    }\n    if (parentComponent) {\n      let subTree = parentComponent.subTree;\n      if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n        subTree = filterSingleRoot(subTree.children) || subTree;\n      }\n      if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {\n        const parentVNode = parentComponent.vnode;\n        setScopeId(\n          el,\n          parentVNode,\n          parentVNode.scopeId,\n          parentVNode.slotScopeIds,\n          parentComponent.parent\n        );\n      }\n    }\n  };\n  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n      patch(\n        null,\n        child,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const el = n2.el = n1.el;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      el.__vnode = n2;\n    }\n    let { patchFlag, dynamicChildren, dirs } = n2;\n    patchFlag |= n1.patchFlag & 16;\n    const oldProps = n1.props || EMPTY_OBJ;\n    const newProps = n2.props || EMPTY_OBJ;\n    let vnodeHook;\n    parentComponent && toggleRecurse(parentComponent, false);\n    if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n    }\n    if (dirs) {\n      invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n    }\n    parentComponent && toggleRecurse(parentComponent, true);\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {\n      hostSetElementText(el, \"\");\n    }\n    if (dynamicChildren) {\n      patchBlockChildren(\n        n1.dynamicChildren,\n        dynamicChildren,\n        el,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds\n      );\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        traverseStaticChildren(n1, n2);\n      }\n    } else if (!optimized) {\n      patchChildren(\n        n1,\n        n2,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds,\n        false\n      );\n    }\n    if (patchFlag > 0) {\n      if (patchFlag & 16) {\n        patchProps(el, oldProps, newProps, parentComponent, namespace);\n      } else {\n        if (patchFlag & 2) {\n          if (oldProps.class !== newProps.class) {\n            hostPatchProp(el, \"class\", null, newProps.class, namespace);\n          }\n        }\n        if (patchFlag & 4) {\n          hostPatchProp(el, \"style\", oldProps.style, newProps.style, namespace);\n        }\n        if (patchFlag & 8) {\n          const propsToUpdate = n2.dynamicProps;\n          for (let i = 0; i < propsToUpdate.length; i++) {\n            const key = propsToUpdate[i];\n            const prev = oldProps[key];\n            const next = newProps[key];\n            if (next !== prev || key === \"value\") {\n              hostPatchProp(el, key, prev, next, namespace, parentComponent);\n            }\n          }\n        }\n      }\n      if (patchFlag & 1) {\n        if (n1.children !== n2.children) {\n          hostSetElementText(el, n2.children);\n        }\n      }\n    } else if (!optimized && dynamicChildren == null) {\n      patchProps(el, oldProps, newProps, parentComponent, namespace);\n    }\n    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n      }, parentSuspense);\n    }\n  };\n  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {\n    for (let i = 0; i < newChildren.length; i++) {\n      const oldVNode = oldChildren[i];\n      const newVNode = newChildren[i];\n      const container = (\n        // oldVNode may be an errored async setup() component inside Suspense\n        // which will not have a mounted element\n        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n        // of the Fragment itself so it can move its children.\n        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n        // which also requires the correct parent container\n        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n        oldVNode.shapeFlag & (6 | 64 | 128)) ? hostParentNode(oldVNode.el) : (\n          // In other cases, the parent container is not actually used so we\n          // just pass the block element here to avoid a DOM parentNode call.\n          fallbackContainer\n        )\n      );\n      patch(\n        oldVNode,\n        newVNode,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        true\n      );\n    }\n  };\n  const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {\n    if (oldProps !== newProps) {\n      if (oldProps !== EMPTY_OBJ) {\n        for (const key in oldProps) {\n          if (!isReservedProp(key) && !(key in newProps)) {\n            hostPatchProp(\n              el,\n              key,\n              oldProps[key],\n              null,\n              namespace,\n              parentComponent\n            );\n          }\n        }\n      }\n      for (const key in newProps) {\n        if (isReservedProp(key)) continue;\n        const next = newProps[key];\n        const prev = oldProps[key];\n        if (next !== prev && key !== \"value\") {\n          hostPatchProp(el, key, prev, next, namespace, parentComponent);\n        }\n      }\n      if (\"value\" in newProps) {\n        hostPatchProp(el, \"value\", oldProps.value, newProps.value, namespace);\n      }\n    }\n  };\n  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n    (isHmrUpdating || patchFlag & 2048)) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    if (n1 == null) {\n      hostInsert(fragmentStartAnchor, container, anchor);\n      hostInsert(fragmentEndAnchor, container, anchor);\n      mountChildren(\n        // #10007\n        // such fragment like `<></>` will be compiled into\n        // a fragment which doesn't have a children.\n        // In this case fallback to an empty array\n        n2.children || [],\n        container,\n        fragmentEndAnchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n      // of renderSlot() with no valid children\n      n1.dynamicChildren && n1.dynamicChildren.length === dynamicChildren.length) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          container,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          traverseStaticChildren(n1, n2);\n        } else if (\n          // #2080 if the stable fragment has a key, it's a <template v-for> that may\n          //  get moved around. Make sure all root level vnodes inherit el.\n          // #2134 or if it's a component root, it may also get moved around\n          // as the component is being moved.\n          n2.key != null || parentComponent && n2 === parentComponent.subTree\n        ) {\n          traverseStaticChildren(\n            n1,\n            n2,\n            true\n            /* shallow */\n          );\n        }\n      } else {\n        patchChildren(\n          n1,\n          n2,\n          container,\n          fragmentEndAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n  };\n  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    n2.slotScopeIds = slotScopeIds;\n    if (n1 == null) {\n      if (n2.shapeFlag & 512) {\n        parentComponent.ctx.activate(\n          n2,\n          container,\n          anchor,\n          namespace,\n          optimized\n        );\n      } else {\n        mountComponent(\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          optimized\n        );\n      }\n    } else {\n      updateComponent(n1, n2, optimized);\n    }\n  };\n  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {\n    const instance = (initialVNode.component = createComponentInstance(\n      initialVNode,\n      parentComponent,\n      parentSuspense\n    ));\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      registerHMR(instance);\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      pushWarningContext(initialVNode);\n      startMeasure(instance, `mount`);\n    }\n    if (isKeepAlive(initialVNode)) {\n      instance.ctx.renderer = internals;\n    }\n    {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        startMeasure(instance, `init`);\n      }\n      setupComponent(instance, false, optimized);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        endMeasure(instance, `init`);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) initialVNode.el = null;\n    if (instance.asyncDep) {\n      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);\n      if (!initialVNode.el) {\n        const placeholder = instance.subTree = createVNode(Comment);\n        processCommentNode(null, placeholder, container, anchor);\n        initialVNode.placeholder = placeholder.el;\n      }\n    } else {\n      setupRenderEffect(\n        instance,\n        initialVNode,\n        container,\n        anchor,\n        parentSuspense,\n        namespace,\n        optimized\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      popWarningContext();\n      endMeasure(instance, `mount`);\n    }\n  };\n  const updateComponent = (n1, n2, optimized) => {\n    const instance = n2.component = n1.component;\n    if (shouldUpdateComponent(n1, n2, optimized)) {\n      if (instance.asyncDep && !instance.asyncResolved) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(n2);\n        }\n        updateComponentPreRender(instance, n2, optimized);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        return;\n      } else {\n        instance.next = n2;\n        instance.update();\n      }\n    } else {\n      n2.el = n1.el;\n      instance.vnode = n2;\n    }\n  };\n  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {\n    const componentUpdateFn = () => {\n      if (!instance.isMounted) {\n        let vnodeHook;\n        const { el, props } = initialVNode;\n        const { bm, m, parent, root, type } = instance;\n        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n        toggleRecurse(instance, false);\n        if (bm) {\n          invokeArrayFns(bm);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n          invokeVNodeHook(vnodeHook, parent, initialVNode);\n        }\n        toggleRecurse(instance, true);\n        if (el && hydrateNode) {\n          const hydrateSubTree = () => {\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `render`);\n            }\n            instance.subTree = renderComponentRoot(instance);\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `render`);\n            }\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `hydrate`);\n            }\n            hydrateNode(\n              el,\n              instance.subTree,\n              instance,\n              parentSuspense,\n              null\n            );\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `hydrate`);\n            }\n          };\n          if (isAsyncWrapperVNode && type.__asyncHydrate) {\n            type.__asyncHydrate(\n              el,\n              instance,\n              hydrateSubTree\n            );\n          } else {\n            hydrateSubTree();\n          }\n        } else {\n          if (root.ce && root.ce._hasShadowRoot()) {\n            root.ce._injectChildStyle(\n              type,\n              instance.parent ? instance.parent.type : void 0\n            );\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `render`);\n          }\n          const subTree = instance.subTree = renderComponentRoot(instance);\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `render`);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `patch`);\n          }\n          patch(\n            null,\n            subTree,\n            container,\n            anchor,\n            instance,\n            parentSuspense,\n            namespace\n          );\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `patch`);\n          }\n          initialVNode.el = subTree.el;\n        }\n        if (m) {\n          queuePostRenderEffect(m, parentSuspense);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n          const scopedInitialVNode = initialVNode;\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n            parentSuspense\n          );\n        }\n        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n          instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n        }\n        instance.isMounted = true;\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentAdded(instance);\n        }\n        initialVNode = container = anchor = null;\n      } else {\n        let { next, bu, u, parent, vnode } = instance;\n        {\n          const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);\n          if (nonHydratedAsyncRoot) {\n            if (next) {\n              next.el = vnode.el;\n              updateComponentPreRender(instance, next, optimized);\n            }\n            nonHydratedAsyncRoot.asyncDep.then(() => {\n              queuePostRenderEffect(() => {\n                if (!instance.isUnmounted) update();\n              }, parentSuspense);\n            });\n            return;\n          }\n        }\n        let originNext = next;\n        let vnodeHook;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(next || instance.vnode);\n        }\n        toggleRecurse(instance, false);\n        if (next) {\n          next.el = vnode.el;\n          updateComponentPreRender(instance, next, optimized);\n        } else {\n          next = vnode;\n        }\n        if (bu) {\n          invokeArrayFns(bu);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n          invokeVNodeHook(vnodeHook, parent, next, vnode);\n        }\n        toggleRecurse(instance, true);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `render`);\n        }\n        const nextTree = renderComponentRoot(instance);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `render`);\n        }\n        const prevTree = instance.subTree;\n        instance.subTree = nextTree;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `patch`);\n        }\n        patch(\n          prevTree,\n          nextTree,\n          // parent may have changed if it's in a teleport\n          hostParentNode(prevTree.el),\n          // anchor may have changed if it's in a fragment\n          getNextHostNode(prevTree),\n          instance,\n          parentSuspense,\n          namespace\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `patch`);\n        }\n        next.el = nextTree.el;\n        if (originNext === null) {\n          updateHOCHostEl(instance, nextTree.el);\n        }\n        if (u) {\n          queuePostRenderEffect(u, parentSuspense);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n            parentSuspense\n          );\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentUpdated(instance);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n      }\n    };\n    instance.scope.on();\n    const effect = instance.effect = new ReactiveEffect(componentUpdateFn);\n    instance.scope.off();\n    const update = instance.update = effect.run.bind(effect);\n    const job = instance.job = effect.runIfDirty.bind(effect);\n    job.i = instance;\n    job.id = instance.uid;\n    effect.scheduler = () => queueJob(job);\n    toggleRecurse(instance, true);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n    }\n    update();\n  };\n  const updateComponentPreRender = (instance, nextVNode, optimized) => {\n    nextVNode.component = instance;\n    const prevProps = instance.vnode.props;\n    instance.vnode = nextVNode;\n    instance.next = null;\n    updateProps(instance, nextVNode.props, prevProps, optimized);\n    updateSlots(instance, nextVNode.children, optimized);\n    pauseTracking();\n    flushPreFlushCbs(instance);\n    resetTracking();\n  };\n  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {\n    const c1 = n1 && n1.children;\n    const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n    const c2 = n2.children;\n    const { patchFlag, shapeFlag } = n2;\n    if (patchFlag > 0) {\n      if (patchFlag & 128) {\n        patchKeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      } else if (patchFlag & 256) {\n        patchUnkeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      }\n    }\n    if (shapeFlag & 8) {\n      if (prevShapeFlag & 16) {\n        unmountChildren(c1, parentComponent, parentSuspense);\n      }\n      if (c2 !== c1) {\n        hostSetElementText(container, c2);\n      }\n    } else {\n      if (prevShapeFlag & 16) {\n        if (shapeFlag & 16) {\n          patchKeyedChildren(\n            c1,\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else {\n          unmountChildren(c1, parentComponent, parentSuspense, true);\n        }\n      } else {\n        if (prevShapeFlag & 8) {\n          hostSetElementText(container, \"\");\n        }\n        if (shapeFlag & 16) {\n          mountChildren(\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      }\n    }\n  };\n  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    c1 = c1 || EMPTY_ARR;\n    c2 = c2 || EMPTY_ARR;\n    const oldLength = c1.length;\n    const newLength = c2.length;\n    const commonLength = Math.min(oldLength, newLength);\n    let i;\n    for (i = 0; i < commonLength; i++) {\n      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      patch(\n        c1[i],\n        nextChild,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (oldLength > newLength) {\n      unmountChildren(\n        c1,\n        parentComponent,\n        parentSuspense,\n        true,\n        false,\n        commonLength\n      );\n    } else {\n      mountChildren(\n        c2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        commonLength\n      );\n    }\n  };\n  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let i = 0;\n    const l2 = c2.length;\n    let e1 = c1.length - 1;\n    let e2 = l2 - 1;\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[i];\n      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      i++;\n    }\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[e1];\n      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      e1--;\n      e2--;\n    }\n    if (i > e1) {\n      if (i <= e2) {\n        const nextPos = e2 + 1;\n        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n        while (i <= e2) {\n          patch(\n            null,\n            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          i++;\n        }\n      }\n    } else if (i > e2) {\n      while (i <= e1) {\n        unmount(c1[i], parentComponent, parentSuspense, true);\n        i++;\n      }\n    } else {\n      const s1 = i;\n      const s2 = i;\n      const keyToNewIndexMap = /* @__PURE__ */ new Map();\n      for (i = s2; i <= e2; i++) {\n        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n        if (nextChild.key != null) {\n          if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n            warn$1(\n              `Duplicate keys found during update:`,\n              JSON.stringify(nextChild.key),\n              `Make sure keys are unique.`\n            );\n          }\n          keyToNewIndexMap.set(nextChild.key, i);\n        }\n      }\n      let j;\n      let patched = 0;\n      const toBePatched = e2 - s2 + 1;\n      let moved = false;\n      let maxNewIndexSoFar = 0;\n      const newIndexToOldIndexMap = new Array(toBePatched);\n      for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;\n      for (i = s1; i <= e1; i++) {\n        const prevChild = c1[i];\n        if (patched >= toBePatched) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n          continue;\n        }\n        let newIndex;\n        if (prevChild.key != null) {\n          newIndex = keyToNewIndexMap.get(prevChild.key);\n        } else {\n          for (j = s2; j <= e2; j++) {\n            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n              newIndex = j;\n              break;\n            }\n          }\n        }\n        if (newIndex === void 0) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n        } else {\n          newIndexToOldIndexMap[newIndex - s2] = i + 1;\n          if (newIndex >= maxNewIndexSoFar) {\n            maxNewIndexSoFar = newIndex;\n          } else {\n            moved = true;\n          }\n          patch(\n            prevChild,\n            c2[newIndex],\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          patched++;\n        }\n      }\n      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n      j = increasingNewIndexSequence.length - 1;\n      for (i = toBePatched - 1; i >= 0; i--) {\n        const nextIndex = s2 + i;\n        const nextChild = c2[nextIndex];\n        const anchorVNode = c2[nextIndex + 1];\n        const anchor = nextIndex + 1 < l2 ? (\n          // #13559, #14173 fallback to el placeholder for unresolved async component\n          anchorVNode.el || resolveAsyncComponentPlaceholder(anchorVNode)\n        ) : parentAnchor;\n        if (newIndexToOldIndexMap[i] === 0) {\n          patch(\n            null,\n            nextChild,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (moved) {\n          if (j < 0 || i !== increasingNewIndexSequence[j]) {\n            move(nextChild, container, anchor, 2);\n          } else {\n            j--;\n          }\n        }\n      }\n    }\n  };\n  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n    const { el, type, transition, children, shapeFlag } = vnode;\n    if (shapeFlag & 6) {\n      move(vnode.component.subTree, container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 128) {\n      vnode.suspense.move(container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 64) {\n      type.move(vnode, container, anchor, internals);\n      return;\n    }\n    if (type === Fragment) {\n      hostInsert(el, container, anchor);\n      for (let i = 0; i < children.length; i++) {\n        move(children[i], container, anchor, moveType);\n      }\n      hostInsert(vnode.anchor, container, anchor);\n      return;\n    }\n    if (type === Static) {\n      moveStaticNode(vnode, container, anchor);\n      return;\n    }\n    const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;\n    if (needTransition2) {\n      if (moveType === 0) {\n        transition.beforeEnter(el);\n        hostInsert(el, container, anchor);\n        queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n      } else {\n        const { leave, delayLeave, afterLeave } = transition;\n        const remove2 = () => {\n          if (vnode.ctx.isUnmounted) {\n            hostRemove(el);\n          } else {\n            hostInsert(el, container, anchor);\n          }\n        };\n        const performLeave = () => {\n          if (el._isLeaving) {\n            el[leaveCbKey](\n              true\n              /* cancelled */\n            );\n          }\n          leave(el, () => {\n            remove2();\n            afterLeave && afterLeave();\n          });\n        };\n        if (delayLeave) {\n          delayLeave(el, remove2, performLeave);\n        } else {\n          performLeave();\n        }\n      }\n    } else {\n      hostInsert(el, container, anchor);\n    }\n  };\n  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n    const {\n      type,\n      props,\n      ref,\n      children,\n      dynamicChildren,\n      shapeFlag,\n      patchFlag,\n      dirs,\n      cacheIndex,\n      memo\n    } = vnode;\n    if (patchFlag === -2) {\n      optimized = false;\n    }\n    if (ref != null) {\n      pauseTracking();\n      setRef(ref, null, parentSuspense, vnode, true);\n      resetTracking();\n    }\n    if (cacheIndex != null) {\n      parentComponent.renderCache[cacheIndex] = void 0;\n    }\n    if (shapeFlag & 256) {\n      parentComponent.ctx.deactivate(vnode);\n      return;\n    }\n    const shouldInvokeDirs = shapeFlag & 1 && dirs;\n    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n    let vnodeHook;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n      invokeVNodeHook(vnodeHook, parentComponent, vnode);\n    }\n    if (shapeFlag & 6) {\n      unmountComponent(vnode.component, parentSuspense, doRemove);\n    } else {\n      if (shapeFlag & 128) {\n        vnode.suspense.unmount(parentSuspense, doRemove);\n        return;\n      }\n      if (shouldInvokeDirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n      }\n      if (shapeFlag & 64) {\n        vnode.type.remove(\n          vnode,\n          parentComponent,\n          parentSuspense,\n          internals,\n          doRemove\n        );\n      } else if (dynamicChildren && // #5154\n      // when v-once is used inside a block, setBlockTracking(-1) marks the\n      // parent block with hasOnce: true\n      // so that it doesn't take the fast path during unmount - otherwise\n      // components nested in v-once are never unmounted.\n      !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments\n      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n        unmountChildren(\n          dynamicChildren,\n          parentComponent,\n          parentSuspense,\n          false,\n          true\n        );\n      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n        unmountChildren(children, parentComponent, parentSuspense);\n      }\n      if (doRemove) {\n        remove(vnode);\n      }\n    }\n    const shouldInvalidateMemo = memo != null && cacheIndex == null;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs || shouldInvalidateMemo) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n        if (shouldInvalidateMemo) {\n          vnode.el = null;\n        }\n      }, parentSuspense);\n    }\n  };\n  const remove = (vnode) => {\n    const { type, el, anchor, transition } = vnode;\n    if (type === Fragment) {\n      if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n        vnode.children.forEach((child) => {\n          if (child.type === Comment) {\n            hostRemove(child.el);\n          } else {\n            remove(child);\n          }\n        });\n      } else {\n        removeFragment(el, anchor);\n      }\n      return;\n    }\n    if (type === Static) {\n      removeStaticNode(vnode);\n      return;\n    }\n    const performRemove = () => {\n      hostRemove(el);\n      if (transition && !transition.persisted && transition.afterLeave) {\n        transition.afterLeave();\n      }\n    };\n    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n      const { leave, delayLeave } = transition;\n      const performLeave = () => leave(el, performRemove);\n      if (delayLeave) {\n        delayLeave(vnode.el, performRemove, performLeave);\n      } else {\n        performLeave();\n      }\n    } else {\n      performRemove();\n    }\n  };\n  const removeFragment = (cur, end) => {\n    let next;\n    while (cur !== end) {\n      next = hostNextSibling(cur);\n      hostRemove(cur);\n      cur = next;\n    }\n    hostRemove(end);\n  };\n  const unmountComponent = (instance, parentSuspense, doRemove) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      unregisterHMR(instance);\n    }\n    const { bum, scope, job, subTree, um, m, a } = instance;\n    invalidateMount(m);\n    invalidateMount(a);\n    if (bum) {\n      invokeArrayFns(bum);\n    }\n    scope.stop();\n    if (job) {\n      job.flags |= 8;\n      unmount(subTree, instance, parentSuspense, doRemove);\n    }\n    if (um) {\n      queuePostRenderEffect(um, parentSuspense);\n    }\n    queuePostRenderEffect(() => {\n      instance.isUnmounted = true;\n    }, parentSuspense);\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentRemoved(instance);\n    }\n  };\n  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n    }\n  };\n  const getNextHostNode = (vnode) => {\n    if (vnode.shapeFlag & 6) {\n      return getNextHostNode(vnode.component.subTree);\n    }\n    if (vnode.shapeFlag & 128) {\n      return vnode.suspense.next();\n    }\n    const el = hostNextSibling(vnode.anchor || vnode.el);\n    const teleportEnd = el && el[TeleportEndKey];\n    return teleportEnd ? hostNextSibling(teleportEnd) : el;\n  };\n  let isFlushing = false;\n  const render = (vnode, container, namespace) => {\n    let instance;\n    if (vnode == null) {\n      if (container._vnode) {\n        unmount(container._vnode, null, null, true);\n        instance = container._vnode.component;\n      }\n    } else {\n      patch(\n        container._vnode || null,\n        vnode,\n        container,\n        null,\n        null,\n        null,\n        namespace\n      );\n    }\n    container._vnode = vnode;\n    if (!isFlushing) {\n      isFlushing = true;\n      flushPreFlushCbs(instance);\n      flushPostFlushCbs();\n      isFlushing = false;\n    }\n  };\n  const internals = {\n    p: patch,\n    um: unmount,\n    m: move,\n    r: remove,\n    mt: mountComponent,\n    mc: mountChildren,\n    pc: patchChildren,\n    pbc: patchBlockChildren,\n    n: getNextHostNode,\n    o: options\n  };\n  let hydrate;\n  let hydrateNode;\n  if (createHydrationFns) {\n    [hydrate, hydrateNode] = createHydrationFns(\n      internals\n    );\n  }\n  return {\n    render,\n    hydrate,\n    createApp: createAppAPI(render, hydrate)\n  };\n}\nfunction resolveChildrenNamespace({ type, props }, currentNamespace) {\n  return currentNamespace === \"svg\" && type === \"foreignObject\" || currentNamespace === \"mathml\" && type === \"annotation-xml\" && props && props.encoding && props.encoding.includes(\"html\") ? void 0 : currentNamespace;\n}\nfunction toggleRecurse({ effect, job }, allowed) {\n  if (allowed) {\n    effect.flags |= 32;\n    job.flags |= 4;\n  } else {\n    effect.flags &= -33;\n    job.flags &= -5;\n  }\n}\nfunction needTransition(parentSuspense, transition) {\n  return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n  const ch1 = n1.children;\n  const ch2 = n2.children;\n  if (isArray(ch1) && isArray(ch2)) {\n    for (let i = 0; i < ch1.length; i++) {\n      const c1 = ch1[i];\n      let c2 = ch2[i];\n      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n          c2 = ch2[i] = cloneIfMounted(ch2[i]);\n          c2.el = c1.el;\n        }\n        if (!shallow && c2.patchFlag !== -2)\n          traverseStaticChildren(c1, c2);\n      }\n      if (c2.type === Text) {\n        if (c2.patchFlag === -1) {\n          c2 = ch2[i] = cloneIfMounted(c2);\n        }\n        c2.el = c1.el;\n      }\n      if (c2.type === Comment && !c2.el) {\n        c2.el = c1.el;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        c2.el && (c2.el.__vnode = c2);\n      }\n    }\n  }\n}\nfunction getSequence(arr) {\n  const p = arr.slice();\n  const result = [0];\n  let i, j, u, v, c;\n  const len = arr.length;\n  for (i = 0; i < len; i++) {\n    const arrI = arr[i];\n    if (arrI !== 0) {\n      j = result[result.length - 1];\n      if (arr[j] < arrI) {\n        p[i] = j;\n        result.push(i);\n        continue;\n      }\n      u = 0;\n      v = result.length - 1;\n      while (u < v) {\n        c = u + v >> 1;\n        if (arr[result[c]] < arrI) {\n          u = c + 1;\n        } else {\n          v = c;\n        }\n      }\n      if (arrI < arr[result[u]]) {\n        if (u > 0) {\n          p[i] = result[u - 1];\n        }\n        result[u] = i;\n      }\n    }\n  }\n  u = result.length;\n  v = result[u - 1];\n  while (u-- > 0) {\n    result[u] = v;\n    v = p[v];\n  }\n  return result;\n}\nfunction locateNonHydratedAsyncRoot(instance) {\n  const subComponent = instance.subTree.component;\n  if (subComponent) {\n    if (subComponent.asyncDep && !subComponent.asyncResolved) {\n      return subComponent;\n    } else {\n      return locateNonHydratedAsyncRoot(subComponent);\n    }\n  }\n}\nfunction invalidateMount(hooks) {\n  if (hooks) {\n    for (let i = 0; i < hooks.length; i++)\n      hooks[i].flags |= 8;\n  }\n}\nfunction resolveAsyncComponentPlaceholder(anchorVnode) {\n  if (anchorVnode.placeholder) {\n    return anchorVnode.placeholder;\n  }\n  const instance = anchorVnode.component;\n  if (instance) {\n    return resolveAsyncComponentPlaceholder(instance.subTree);\n  }\n  return null;\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nlet suspenseId = 0;\nconst SuspenseImpl = {\n  name: \"Suspense\",\n  // In order to make Suspense tree-shakable, we need to avoid importing it\n  // directly in the renderer. The renderer checks for the __isSuspense flag\n  // on a vnode's type and calls the `process` method, passing in renderer\n  // internals.\n  __isSuspense: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n    if (n1 == null) {\n      mountSuspense(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    } else {\n      if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {\n        n2.suspense = n1.suspense;\n        n2.suspense.vnode = n2;\n        n2.el = n1.el;\n        return;\n      }\n      patchSuspense(\n        n1,\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    }\n  },\n  hydrate: hydrateSuspense,\n  normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n  const eventListener = vnode.props && vnode.props[name];\n  if (isFunction(eventListener)) {\n    eventListener();\n  }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n  const {\n    p: patch,\n    o: { createElement }\n  } = rendererInternals;\n  const hiddenContainer = createElement(\"div\");\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    container,\n    hiddenContainer,\n    anchor,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals\n  );\n  patch(\n    null,\n    suspense.pendingBranch = vnode.ssContent,\n    hiddenContainer,\n    null,\n    parentComponent,\n    suspense,\n    namespace,\n    slotScopeIds\n  );\n  if (suspense.deps > 0) {\n    triggerEvent(vnode, \"onPending\");\n    triggerEvent(vnode, \"onFallback\");\n    patch(\n      null,\n      vnode.ssFallback,\n      container,\n      anchor,\n      parentComponent,\n      null,\n      // fallback tree will not have suspense context\n      namespace,\n      slotScopeIds\n    );\n    setActiveBranch(suspense, vnode.ssFallback);\n  } else {\n    suspense.resolve(false, true);\n  }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n  const suspense = n2.suspense = n1.suspense;\n  suspense.vnode = n2;\n  n2.el = n1.el;\n  const newBranch = n2.ssContent;\n  const newFallback = n2.ssFallback;\n  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n  if (pendingBranch) {\n    suspense.pendingBranch = newBranch;\n    if (isSameVNodeType(pendingBranch, newBranch)) {\n      patch(\n        pendingBranch,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else if (isInFallback) {\n        if (!isHydrating) {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      }\n    } else {\n      suspense.pendingId = suspenseId++;\n      if (isHydrating) {\n        suspense.isHydrating = false;\n        suspense.activeBranch = pendingBranch;\n      } else {\n        unmount(pendingBranch, parentComponent, suspense);\n      }\n      suspense.deps = 0;\n      suspense.effects.length = 0;\n      suspense.hiddenContainer = createElement(\"div\");\n      if (isInFallback) {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        } else {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      } else if (activeBranch && isSameVNodeType(activeBranch, newBranch)) {\n        patch(\n          activeBranch,\n          newBranch,\n          container,\n          anchor,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        suspense.resolve(true);\n      } else {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        }\n      }\n    }\n  } else {\n    if (activeBranch && isSameVNodeType(activeBranch, newBranch)) {\n      patch(\n        activeBranch,\n        newBranch,\n        container,\n        anchor,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      setActiveBranch(suspense, newBranch);\n    } else {\n      triggerEvent(n2, \"onPending\");\n      suspense.pendingBranch = newBranch;\n      if (newBranch.shapeFlag & 512) {\n        suspense.pendingId = newBranch.component.suspenseId;\n      } else {\n        suspense.pendingId = suspenseId++;\n      }\n      patch(\n        null,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else {\n        const { timeout, pendingId } = suspense;\n        if (timeout > 0) {\n          setTimeout(() => {\n            if (suspense.pendingId === pendingId) {\n              suspense.fallback(newFallback);\n            }\n          }, timeout);\n        } else if (timeout === 0) {\n          suspense.fallback(newFallback);\n        }\n      }\n    }\n  }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n  if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n    hasWarned = true;\n    console[console.info ? \"info\" : \"log\"](\n      `<Suspense> is an experimental feature and its API will likely change.`\n    );\n  }\n  const {\n    p: patch,\n    m: move,\n    um: unmount,\n    n: next,\n    o: { parentNode, remove }\n  } = rendererInternals;\n  let parentSuspenseId;\n  const isSuspensible = isVNodeSuspensible(vnode);\n  if (isSuspensible) {\n    if (parentSuspense && parentSuspense.pendingBranch) {\n      parentSuspenseId = parentSuspense.pendingId;\n      parentSuspense.deps++;\n    }\n  }\n  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(timeout, `Suspense timeout`);\n  }\n  const initialAnchor = anchor;\n  const suspense = {\n    vnode,\n    parent: parentSuspense,\n    parentComponent,\n    namespace,\n    container,\n    hiddenContainer,\n    deps: 0,\n    pendingId: suspenseId++,\n    timeout: typeof timeout === \"number\" ? timeout : -1,\n    activeBranch: null,\n    isFallbackMountPending: false,\n    pendingBranch: null,\n    isInFallback: !isHydrating,\n    isHydrating,\n    isUnmounted: false,\n    effects: [],\n    resolve(resume = false, sync = false) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!resume && !suspense.pendingBranch) {\n          throw new Error(\n            `suspense.resolve() is called without a pending branch.`\n          );\n        }\n        if (suspense.isUnmounted) {\n          throw new Error(\n            `suspense.resolve() is called on an already unmounted suspense boundary.`\n          );\n        }\n      }\n      const {\n        vnode: vnode2,\n        activeBranch,\n        pendingBranch,\n        pendingId,\n        effects,\n        parentComponent: parentComponent2,\n        container: container2,\n        isInFallback\n      } = suspense;\n      let delayEnter = false;\n      if (suspense.isHydrating) {\n        suspense.isHydrating = false;\n      } else if (!resume) {\n        delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n        let hasUpdatedAnchor = false;\n        if (delayEnter) {\n          activeBranch.transition.afterLeave = () => {\n            if (pendingId === suspense.pendingId) {\n              move(\n                pendingBranch,\n                container2,\n                anchor === initialAnchor && !hasUpdatedAnchor ? next(activeBranch) : anchor,\n                0\n              );\n              queuePostFlushCb(effects);\n              if (isInFallback && vnode2.ssFallback) {\n                vnode2.ssFallback.el = null;\n              }\n            }\n          };\n        }\n        if (activeBranch && !suspense.isFallbackMountPending) {\n          if (parentNode(activeBranch.el) === container2) {\n            anchor = next(activeBranch);\n            hasUpdatedAnchor = true;\n          }\n          unmount(activeBranch, parentComponent2, suspense, true);\n          if (!delayEnter && isInFallback && vnode2.ssFallback) {\n            queuePostRenderEffect(() => vnode2.ssFallback.el = null, suspense);\n          }\n        }\n        if (!delayEnter) {\n          move(pendingBranch, container2, anchor, 0);\n        }\n      }\n      suspense.isFallbackMountPending = false;\n      setActiveBranch(suspense, pendingBranch);\n      suspense.pendingBranch = null;\n      suspense.isInFallback = false;\n      let parent = suspense.parent;\n      let hasUnresolvedAncestor = false;\n      while (parent) {\n        if (parent.pendingBranch) {\n          parent.effects.push(...effects);\n          hasUnresolvedAncestor = true;\n          break;\n        }\n        parent = parent.parent;\n      }\n      if (!hasUnresolvedAncestor && !delayEnter) {\n        queuePostFlushCb(effects);\n      }\n      suspense.effects = [];\n      if (isSuspensible) {\n        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n          parentSuspense.deps--;\n          if (parentSuspense.deps === 0 && !sync) {\n            parentSuspense.resolve();\n          }\n        }\n      }\n      triggerEvent(vnode2, \"onResolve\");\n    },\n    fallback(fallbackVNode) {\n      if (!suspense.pendingBranch) {\n        return;\n      }\n      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;\n      triggerEvent(vnode2, \"onFallback\");\n      const anchor2 = next(activeBranch);\n      const mountFallback = () => {\n        suspense.isFallbackMountPending = false;\n        if (!suspense.isInFallback) {\n          return;\n        }\n        patch(\n          null,\n          fallbackVNode,\n          container2,\n          anchor2,\n          parentComponent2,\n          null,\n          // fallback tree will not have suspense context\n          namespace2,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, fallbackVNode);\n      };\n      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n      if (delayEnter) {\n        suspense.isFallbackMountPending = true;\n        activeBranch.transition.afterLeave = mountFallback;\n      }\n      suspense.isInFallback = true;\n      unmount(\n        activeBranch,\n        parentComponent2,\n        null,\n        // no suspense so unmount hooks fire now\n        true\n        // shouldRemove\n      );\n      if (!delayEnter) {\n        mountFallback();\n      }\n    },\n    move(container2, anchor2, type) {\n      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n      suspense.container = container2;\n    },\n    next() {\n      return suspense.activeBranch && next(suspense.activeBranch);\n    },\n    registerDep(instance, setupRenderEffect, optimized2) {\n      const isInPendingSuspense = !!suspense.pendingBranch;\n      if (isInPendingSuspense) {\n        suspense.deps++;\n      }\n      const hydratedEl = instance.vnode.el;\n      instance.asyncDep.catch((err) => {\n        handleError(err, instance, 0);\n      }).then((asyncSetupResult) => {\n        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n          return;\n        }\n        unsetCurrentInstance();\n        instance.asyncResolved = true;\n        const { vnode: vnode2 } = instance;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(vnode2);\n        }\n        handleSetupResult(instance, asyncSetupResult, false);\n        if (hydratedEl) {\n          vnode2.el = hydratedEl;\n        }\n        const placeholder = !hydratedEl && instance.subTree.el;\n        setupRenderEffect(\n          instance,\n          vnode2,\n          // component may have been moved before resolve.\n          // if this is not a hydration, instance.subTree will be the comment\n          // placeholder.\n          parentNode(hydratedEl || instance.subTree.el),\n          // anchor will not be used if this is hydration, so only need to\n          // consider the comment placeholder case.\n          hydratedEl ? null : next(instance.subTree),\n          suspense,\n          namespace,\n          optimized2\n        );\n        if (placeholder) {\n          vnode2.placeholder = null;\n          remove(placeholder);\n        }\n        updateHOCHostEl(instance, vnode2.el);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        if (isInPendingSuspense && --suspense.deps === 0) {\n          suspense.resolve();\n        }\n      });\n    },\n    unmount(parentSuspense2, doRemove) {\n      suspense.isUnmounted = true;\n      if (suspense.activeBranch) {\n        unmount(\n          suspense.activeBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n      if (suspense.pendingBranch) {\n        unmount(\n          suspense.pendingBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n    }\n  };\n  return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    node.parentNode,\n    // eslint-disable-next-line no-restricted-globals\n    document.createElement(\"div\"),\n    null,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals,\n    true\n  );\n  const result = hydrateNode(\n    node,\n    suspense.pendingBranch = vnode.ssContent,\n    parentComponent,\n    suspense,\n    slotScopeIds,\n    optimized\n  );\n  if (suspense.deps === 0) {\n    suspense.resolve(false, true);\n  }\n  return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n  const { shapeFlag, children } = vnode;\n  const isSlotChildren = shapeFlag & 32;\n  vnode.ssContent = normalizeSuspenseSlot(\n    isSlotChildren ? children.default : children\n  );\n  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n  let block;\n  if (isFunction(s)) {\n    const trackBlock = isBlockTreeEnabled && s._c;\n    if (trackBlock) {\n      s._d = false;\n      openBlock();\n    }\n    s = s();\n    if (trackBlock) {\n      s._d = true;\n      block = currentBlock;\n      closeBlock();\n    }\n  }\n  if (isArray(s)) {\n    const singleChild = filterSingleRoot(s);\n    if (!!(process.env.NODE_ENV !== \"production\") && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {\n      warn$1(`<Suspense> slots expect a single root node.`);\n    }\n    s = singleChild;\n  }\n  s = normalizeVNode(s);\n  if (block && !s.dynamicChildren) {\n    s.dynamicChildren = block.filter((c) => c !== s);\n  }\n  return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n  if (suspense && suspense.pendingBranch) {\n    if (isArray(fn)) {\n      suspense.effects.push(...fn);\n    } else {\n      suspense.effects.push(fn);\n    }\n  } else {\n    queuePostFlushCb(fn);\n  }\n}\nfunction setActiveBranch(suspense, branch) {\n  suspense.activeBranch = branch;\n  const { vnode, parentComponent } = suspense;\n  let el = branch.el;\n  while (!el && branch.component) {\n    branch = branch.component.subTree;\n    el = branch.el;\n  }\n  vnode.el = el;\n  if (parentComponent && parentComponent.subTree === vnode) {\n    parentComponent.vnode.el = el;\n    updateHOCHostEl(parentComponent, el);\n  }\n}\nfunction isVNodeSuspensible(vnode) {\n  const suspensible = vnode.props && vnode.props.suspensible;\n  return suspensible != null && suspensible !== false;\n}\n\nconst Fragment = /* @__PURE__ */ Symbol.for(\"v-fgt\");\nconst Text = /* @__PURE__ */ Symbol.for(\"v-txt\");\nconst Comment = /* @__PURE__ */ Symbol.for(\"v-cmt\");\nconst Static = /* @__PURE__ */ Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n  blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n  blockStack.pop();\n  currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value, inVOnce = false) {\n  isBlockTreeEnabled += value;\n  if (value < 0 && currentBlock && inVOnce) {\n    currentBlock.hasOnce = true;\n  }\n}\nfunction setupBlock(vnode) {\n  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n  closeBlock();\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n  return setupBlock(\n    createBaseVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      shapeFlag,\n      true\n    )\n  );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n  return setupBlock(\n    createVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      true\n    )\n  );\n}\nfunction isVNode(value) {\n  return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n  if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && n1.component) {\n    const dirtyInstances = hmrDirtyComponents.get(n2.type);\n    if (dirtyInstances && dirtyInstances.has(n1.component)) {\n      n1.shapeFlag &= -257;\n      n2.shapeFlag &= -513;\n      return false;\n    }\n  }\n  return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n  vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n  return _createVNode(\n    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n  );\n};\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n  ref,\n  ref_key,\n  ref_for\n}) => {\n  if (typeof ref === \"number\") {\n    ref = \"\" + ref;\n  }\n  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n  const vnode = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type,\n    props,\n    key: props && normalizeKey(props),\n    ref: props && normalizeRef(props),\n    scopeId: currentScopeId,\n    slotScopeIds: null,\n    children,\n    component: null,\n    suspense: null,\n    ssContent: null,\n    ssFallback: null,\n    dirs: null,\n    transition: null,\n    el: null,\n    anchor: null,\n    target: null,\n    targetStart: null,\n    targetAnchor: null,\n    staticCount: 0,\n    shapeFlag,\n    patchFlag,\n    dynamicProps,\n    dynamicChildren: null,\n    appContext: null,\n    ctx: currentRenderingInstance\n  };\n  if (needFullChildrenNormalization) {\n    normalizeChildren(vnode, children);\n    if (shapeFlag & 128) {\n      type.normalize(vnode);\n    }\n  } else if (children) {\n    vnode.shapeFlag |= isString(children) ? 8 : 16;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n    warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n  }\n  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n  !isBlockNode && // has current parent block\n  currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n  // component nodes also should always be patched, because even if the\n  // component doesn't need to update, it needs to persist the instance on to\n  // the next vnode so that it can be properly unmounted later.\n  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n  // vnode should not be considered dynamic due to handler caching.\n  vnode.patchFlag !== 32) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n  if (!type || type === NULL_DYNAMIC_COMPONENT) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n      warn$1(`Invalid vnode type when creating vnode: ${type}.`);\n    }\n    type = Comment;\n  }\n  if (isVNode(type)) {\n    const cloned = cloneVNode(\n      type,\n      props,\n      true\n      /* mergeRef: true */\n    );\n    if (children) {\n      normalizeChildren(cloned, children);\n    }\n    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n      if (cloned.shapeFlag & 6) {\n        currentBlock[currentBlock.indexOf(type)] = cloned;\n      } else {\n        currentBlock.push(cloned);\n      }\n    }\n    cloned.patchFlag = -2;\n    return cloned;\n  }\n  if (isClassComponent(type)) {\n    type = type.__vccOpts;\n  }\n  if (props) {\n    props = guardReactiveProps(props);\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n      props.class = normalizeClass(klass);\n    }\n    if (isObject(style)) {\n      if (isProxy(style) && !isArray(style)) {\n        style = extend({}, style);\n      }\n      props.style = normalizeStyle(style);\n    }\n  }\n  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n    type = toRaw(type);\n    warn$1(\n      `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n      `\nComponent that was made reactive: `,\n      type\n    );\n  }\n  return createBaseVNode(\n    type,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    shapeFlag,\n    isBlockNode,\n    true\n  );\n}\nfunction guardReactiveProps(props) {\n  if (!props) return null;\n  return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {\n  const { props, ref, patchFlag, children, transition } = vnode;\n  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n  const cloned = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type: vnode.type,\n    props: mergedProps,\n    key: mergedProps && normalizeKey(mergedProps),\n    ref: extraProps && extraProps.ref ? (\n      // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n      // if the vnode itself already has a ref, cloneVNode will need to merge\n      // the refs so the single vnode can be set on multiple refs\n      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n    ) : ref,\n    scopeId: vnode.scopeId,\n    slotScopeIds: vnode.slotScopeIds,\n    children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n    target: vnode.target,\n    targetStart: vnode.targetStart,\n    targetAnchor: vnode.targetAnchor,\n    staticCount: vnode.staticCount,\n    shapeFlag: vnode.shapeFlag,\n    // if the vnode is cloned with extra props, we can no longer assume its\n    // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n    // note: preserve flag for fragments since they use the flag for children\n    // fast paths only.\n    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n    dynamicProps: vnode.dynamicProps,\n    dynamicChildren: vnode.dynamicChildren,\n    appContext: vnode.appContext,\n    dirs: vnode.dirs,\n    transition,\n    // These should technically only be non-null on mounted VNodes. However,\n    // they *should* be copied for kept-alive vnodes. So we just always copy\n    // them since them being non-null during a mount doesn't affect the logic as\n    // they will simply be overwritten.\n    component: vnode.component,\n    suspense: vnode.suspense,\n    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n    placeholder: vnode.placeholder,\n    el: vnode.el,\n    anchor: vnode.anchor,\n    ctx: vnode.ctx,\n    ce: vnode.ce\n  };\n  if (transition && cloneTransition) {\n    setTransitionHooks(\n      cloned,\n      transition.clone(cloned)\n    );\n  }\n  return cloned;\n}\nfunction deepCloneVNode(vnode) {\n  const cloned = cloneVNode(vnode);\n  if (isArray(vnode.children)) {\n    cloned.children = vnode.children.map(deepCloneVNode);\n  }\n  return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n  return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n  const vnode = createVNode(Static, null, content);\n  vnode.staticCount = numberOfNodes;\n  return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n  if (child == null || typeof child === \"boolean\") {\n    return createVNode(Comment);\n  } else if (isArray(child)) {\n    return createVNode(\n      Fragment,\n      null,\n      // #3666, avoid reference pollution when reusing vnode\n      child.slice()\n    );\n  } else if (isVNode(child)) {\n    return cloneIfMounted(child);\n  } else {\n    return createVNode(Text, null, String(child));\n  }\n}\nfunction cloneIfMounted(child) {\n  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n  let type = 0;\n  const { shapeFlag } = vnode;\n  if (children == null) {\n    children = null;\n  } else if (isArray(children)) {\n    type = 16;\n  } else if (typeof children === \"object\") {\n    if (shapeFlag & (1 | 64)) {\n      const slot = children.default;\n      if (slot) {\n        slot._c && (slot._d = false);\n        normalizeChildren(vnode, slot());\n        slot._c && (slot._d = true);\n      }\n      return;\n    } else {\n      type = 32;\n      const slotFlag = children._;\n      if (!slotFlag && !isInternalObject(children)) {\n        children._ctx = currentRenderingInstance;\n      } else if (slotFlag === 3 && currentRenderingInstance) {\n        if (currentRenderingInstance.slots._ === 1) {\n          children._ = 1;\n        } else {\n          children._ = 2;\n          vnode.patchFlag |= 1024;\n        }\n      }\n    }\n  } else if (isFunction(children)) {\n    children = { default: children, _ctx: currentRenderingInstance };\n    type = 32;\n  } else {\n    children = String(children);\n    if (shapeFlag & 64) {\n      type = 16;\n      children = [createTextVNode(children)];\n    } else {\n      type = 8;\n    }\n  }\n  vnode.children = children;\n  vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n  const ret = {};\n  for (let i = 0; i < args.length; i++) {\n    const toMerge = args[i];\n    for (const key in toMerge) {\n      if (key === \"class\") {\n        if (ret.class !== toMerge.class) {\n          ret.class = normalizeClass([ret.class, toMerge.class]);\n        }\n      } else if (key === \"style\") {\n        ret.style = normalizeStyle([ret.style, toMerge.style]);\n      } else if (isOn(key)) {\n        const existing = ret[key];\n        const incoming = toMerge[key];\n        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n          ret[key] = existing ? [].concat(existing, incoming) : incoming;\n        } else if (incoming == null && existing == null && // mergeProps({ 'onUpdate:modelValue': undefined }) should not retain\n        // the model listener.\n        !isModelListener(key)) {\n          ret[key] = incoming;\n        }\n      } else if (key !== \"\") {\n        ret[key] = toMerge[key];\n      }\n    }\n  }\n  return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, 7, [\n    vnode,\n    prevVNode\n  ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n  const type = vnode.type;\n  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n  const instance = {\n    uid: uid++,\n    vnode,\n    type,\n    parent,\n    appContext,\n    root: null,\n    // to be immediately set\n    next: null,\n    subTree: null,\n    // will be set synchronously right after creation\n    effect: null,\n    update: null,\n    // will be set synchronously right after creation\n    job: null,\n    scope: new EffectScope(\n      true\n      /* detached */\n    ),\n    render: null,\n    proxy: null,\n    exposed: null,\n    exposeProxy: null,\n    withProxy: null,\n    provides: parent ? parent.provides : Object.create(appContext.provides),\n    ids: parent ? parent.ids : [\"\", 0, 0],\n    accessCache: null,\n    renderCache: [],\n    // local resolved assets\n    components: null,\n    directives: null,\n    // resolved props and emits options\n    propsOptions: normalizePropsOptions(type, appContext),\n    emitsOptions: normalizeEmitsOptions(type, appContext),\n    // emit\n    emit: null,\n    // to be set immediately\n    emitted: null,\n    // props default value\n    propsDefaults: EMPTY_OBJ,\n    // inheritAttrs\n    inheritAttrs: type.inheritAttrs,\n    // state\n    ctx: EMPTY_OBJ,\n    data: EMPTY_OBJ,\n    props: EMPTY_OBJ,\n    attrs: EMPTY_OBJ,\n    slots: EMPTY_OBJ,\n    refs: EMPTY_OBJ,\n    setupState: EMPTY_OBJ,\n    setupContext: null,\n    // suspense related\n    suspense,\n    suspenseId: suspense ? suspense.pendingId : 0,\n    asyncDep: null,\n    asyncResolved: false,\n    // lifecycle hooks\n    // not using enums here because it results in computed properties\n    isMounted: false,\n    isUnmounted: false,\n    isDeactivated: false,\n    bc: null,\n    c: null,\n    bm: null,\n    m: null,\n    bu: null,\n    u: null,\n    um: null,\n    bum: null,\n    da: null,\n    a: null,\n    rtg: null,\n    rtc: null,\n    ec: null,\n    sp: null\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.ctx = createDevRenderContext(instance);\n  } else {\n    instance.ctx = { _: instance };\n  }\n  instance.root = parent ? parent.root : instance;\n  instance.emit = emit.bind(null, instance);\n  if (vnode.ce) {\n    vnode.ce(instance);\n  }\n  return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet setInSSRSetupState;\n{\n  const g = getGlobalThis();\n  const registerGlobalSetter = (key, setter) => {\n    let setters;\n    if (!(setters = g[key])) setters = g[key] = [];\n    setters.push(setter);\n    return (v) => {\n      if (setters.length > 1) setters.forEach((set) => set(v));\n      else setters[0](v);\n    };\n  };\n  internalSetCurrentInstance = registerGlobalSetter(\n    `__VUE_INSTANCE_SETTERS__`,\n    (v) => currentInstance = v\n  );\n  setInSSRSetupState = registerGlobalSetter(\n    `__VUE_SSR_SETTERS__`,\n    (v) => isInSSRComponentSetup = v\n  );\n}\nconst setCurrentInstance = (instance) => {\n  const prev = currentInstance;\n  internalSetCurrentInstance(instance);\n  instance.scope.on();\n  return () => {\n    instance.scope.off();\n    internalSetCurrentInstance(prev);\n  };\n};\nconst unsetCurrentInstance = () => {\n  currentInstance && currentInstance.scope.off();\n  internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, { isNativeTag }) {\n  if (isBuiltInTag(name) || isNativeTag(name)) {\n    warn$1(\n      \"Do not use built-in or reserved HTML elements as component id: \" + name\n    );\n  }\n}\nfunction isStatefulComponent(instance) {\n  return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false, optimized = false) {\n  isSSR && setInSSRSetupState(isSSR);\n  const { props, children } = instance.vnode;\n  const isStateful = isStatefulComponent(instance);\n  initProps(instance, props, isStateful, isSSR);\n  initSlots(instance, children, optimized || isSSR);\n  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n  isSSR && setInSSRSetupState(false);\n  return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n  const Component = instance.type;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (Component.name) {\n      validateComponentName(Component.name, instance.appContext.config);\n    }\n    if (Component.components) {\n      const names = Object.keys(Component.components);\n      for (let i = 0; i < names.length; i++) {\n        validateComponentName(names[i], instance.appContext.config);\n      }\n    }\n    if (Component.directives) {\n      const names = Object.keys(Component.directives);\n      for (let i = 0; i < names.length; i++) {\n        validateDirectiveName(names[i]);\n      }\n    }\n    if (Component.compilerOptions && isRuntimeOnly()) {\n      warn$1(\n        `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n      );\n    }\n  }\n  instance.accessCache = /* @__PURE__ */ Object.create(null);\n  instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    exposePropsOnRenderContext(instance);\n  }\n  const { setup } = Component;\n  if (setup) {\n    pauseTracking();\n    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n    const reset = setCurrentInstance(instance);\n    const setupResult = callWithErrorHandling(\n      setup,\n      instance,\n      0,\n      [\n        !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props,\n        setupContext\n      ]\n    );\n    const isAsyncSetup = isPromise(setupResult);\n    resetTracking();\n    reset();\n    if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) {\n      markAsyncBoundary(instance);\n    }\n    if (isAsyncSetup) {\n      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n      if (isSSR) {\n        return setupResult.then((resolvedResult) => {\n          handleSetupResult(instance, resolvedResult, isSSR);\n        }).catch((e) => {\n          handleError(e, instance, 0);\n        });\n      } else {\n        instance.asyncDep = setupResult;\n        if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n          const name = formatComponentName(instance, Component);\n          warn$1(\n            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n          );\n        }\n      }\n    } else {\n      handleSetupResult(instance, setupResult, isSSR);\n    }\n  } else {\n    finishComponentSetup(instance, isSSR);\n  }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n  if (isFunction(setupResult)) {\n    if (instance.type.__ssrInlineRender) {\n      instance.ssrRender = setupResult;\n    } else {\n      instance.render = setupResult;\n    }\n  } else if (isObject(setupResult)) {\n    if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n      warn$1(\n        `setup() should not return VNodes directly - return a render function instead.`\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.devtoolsRawSetupState = setupResult;\n    }\n    instance.setupState = proxyRefs(setupResult);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      exposeSetupStateOnRenderContext(instance);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n    warn$1(\n      `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n    );\n  }\n  finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n  compile = _compile;\n  installWithProxy = (i) => {\n    if (i.render._rc) {\n      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n    }\n  };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n  const Component = instance.type;\n  if (!instance.render) {\n    if (!isSSR && compile && !Component.render) {\n      const template = Component.template || __VUE_OPTIONS_API__ && resolveMergedOptions(instance).template;\n      if (template) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `compile`);\n        }\n        const { isCustomElement, compilerOptions } = instance.appContext.config;\n        const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n        const finalCompilerOptions = extend(\n          extend(\n            {\n              isCustomElement,\n              delimiters\n            },\n            compilerOptions\n          ),\n          componentCompilerOptions\n        );\n        Component.render = compile(template, finalCompilerOptions);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `compile`);\n        }\n      }\n    }\n    instance.render = Component.render || NOOP;\n    if (installWithProxy) {\n      installWithProxy(instance);\n    }\n  }\n  if (__VUE_OPTIONS_API__ && true) {\n    const reset = setCurrentInstance(instance);\n    pauseTracking();\n    try {\n      applyOptions(instance);\n    } finally {\n      resetTracking();\n      reset();\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n    if (!compile && Component.template) {\n      warn$1(\n        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n      );\n    } else {\n      warn$1(`Component is missing template or render function: `, Component);\n    }\n  }\n}\nconst attrsProxyHandlers = !!(process.env.NODE_ENV !== \"production\") ? {\n  get(target, key) {\n    markAttrsAccessed();\n    track(target, \"get\", \"\");\n    return target[key];\n  },\n  set() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  },\n  deleteProperty() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  }\n} : {\n  get(target, key) {\n    track(target, \"get\", \"\");\n    return target[key];\n  }\n};\nfunction getSlotsProxy(instance) {\n  return new Proxy(instance.slots, {\n    get(target, key) {\n      track(instance, \"get\", \"$slots\");\n      return target[key];\n    }\n  });\n}\nfunction createSetupContext(instance) {\n  const expose = (exposed) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (instance.exposed) {\n        warn$1(`expose() should be called only once per setup().`);\n      }\n      if (exposed != null) {\n        let exposedType = typeof exposed;\n        if (exposedType === \"object\") {\n          if (isArray(exposed)) {\n            exposedType = \"array\";\n          } else if (isRef(exposed)) {\n            exposedType = \"ref\";\n          }\n        }\n        if (exposedType !== \"object\") {\n          warn$1(\n            `expose() should be passed a plain object, received ${exposedType}.`\n          );\n        }\n      }\n    }\n    instance.exposed = exposed || {};\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    let attrsProxy;\n    let slotsProxy;\n    return Object.freeze({\n      get attrs() {\n        return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));\n      },\n      get slots() {\n        return slotsProxy || (slotsProxy = getSlotsProxy(instance));\n      },\n      get emit() {\n        return (event, ...args) => instance.emit(event, ...args);\n      },\n      expose\n    });\n  } else {\n    return {\n      attrs: new Proxy(instance.attrs, attrsProxyHandlers),\n      slots: instance.slots,\n      emit: instance.emit,\n      expose\n    };\n  }\n}\nfunction getComponentPublicInstance(instance) {\n  if (instance.exposed) {\n    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n      get(target, key) {\n        if (key in target) {\n          return target[key];\n        } else if (key in publicPropertiesMap) {\n          return publicPropertiesMap[key](instance);\n        }\n      },\n      has(target, key) {\n        return key in target || key in publicPropertiesMap;\n      }\n    }));\n  } else {\n    return instance.proxy;\n  }\n}\nconst classifyRE = /(?:^|[-_])\\w/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n  let name = getComponentName(Component);\n  if (!name && Component.__file) {\n    const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n  if (!name && instance) {\n    const inferFromRegistry = (registry) => {\n      for (const key in registry) {\n        if (registry[key] === Component) {\n          return key;\n        }\n      }\n    };\n    name = inferFromRegistry(instance.components) || instance.parent && inferFromRegistry(\n      instance.parent.type.components\n    ) || inferFromRegistry(instance.appContext.components);\n  }\n  return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n  return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n  const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const i = getCurrentInstance();\n    if (i && i.appContext.config.warnRecursiveComputed) {\n      c._warnRecursive = true;\n    }\n  }\n  return c;\n};\n\nfunction h(type, propsOrChildren, children) {\n  try {\n    setBlockTracking(-1);\n    const l = arguments.length;\n    if (l === 2) {\n      if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n        if (isVNode(propsOrChildren)) {\n          return createVNode(type, null, [propsOrChildren]);\n        }\n        return createVNode(type, propsOrChildren);\n      } else {\n        return createVNode(type, null, propsOrChildren);\n      }\n    } else {\n      if (l > 3) {\n        children = Array.prototype.slice.call(arguments, 2);\n      } else if (l === 3 && isVNode(children)) {\n        children = [children];\n      }\n      return createVNode(type, propsOrChildren, children);\n    }\n  } finally {\n    setBlockTracking(1);\n  }\n}\n\nfunction initCustomFormatter() {\n  if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n    return;\n  }\n  const vueStyle = { style: \"color:#3ba776\" };\n  const numberStyle = { style: \"color:#1677ff\" };\n  const stringStyle = { style: \"color:#f5222d\" };\n  const keywordStyle = { style: \"color:#eb2f96\" };\n  const formatter = {\n    __vue_custom_formatter: true,\n    header(obj) {\n      if (!isObject(obj)) {\n        return null;\n      }\n      if (obj.__isVue) {\n        return [\"div\", vueStyle, `VueInstance`];\n      } else if (isRef(obj)) {\n        pauseTracking();\n        const value = obj.value;\n        resetTracking();\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, genRefFlag(obj)],\n          \"<\",\n          formatValue(value),\n          `>`\n        ];\n      } else if (isReactive(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n          \"<\",\n          formatValue(obj),\n          `>${isReadonly(obj) ? ` (readonly)` : ``}`\n        ];\n      } else if (isReadonly(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n          \"<\",\n          formatValue(obj),\n          \">\"\n        ];\n      }\n      return null;\n    },\n    hasBody(obj) {\n      return obj && obj.__isVue;\n    },\n    body(obj) {\n      if (obj && obj.__isVue) {\n        return [\n          \"div\",\n          {},\n          ...formatInstance(obj.$)\n        ];\n      }\n    }\n  };\n  function formatInstance(instance) {\n    const blocks = [];\n    if (instance.type.props && instance.props) {\n      blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n    }\n    if (instance.setupState !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n    }\n    if (instance.data !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n    }\n    const computed = extractKeys(instance, \"computed\");\n    if (computed) {\n      blocks.push(createInstanceBlock(\"computed\", computed));\n    }\n    const injected = extractKeys(instance, \"inject\");\n    if (injected) {\n      blocks.push(createInstanceBlock(\"injected\", injected));\n    }\n    blocks.push([\n      \"div\",\n      {},\n      [\n        \"span\",\n        {\n          style: keywordStyle.style + \";opacity:0.66\"\n        },\n        \"$ (internal): \"\n      ],\n      [\"object\", { object: instance }]\n    ]);\n    return blocks;\n  }\n  function createInstanceBlock(type, target) {\n    target = extend({}, target);\n    if (!Object.keys(target).length) {\n      return [\"span\", {}];\n    }\n    return [\n      \"div\",\n      { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n      [\n        \"div\",\n        {\n          style: \"color:#476582\"\n        },\n        type\n      ],\n      [\n        \"div\",\n        {\n          style: \"padding-left:1.25em\"\n        },\n        ...Object.keys(target).map((key) => {\n          return [\n            \"div\",\n            {},\n            [\"span\", keywordStyle, key + \": \"],\n            formatValue(target[key], false)\n          ];\n        })\n      ]\n    ];\n  }\n  function formatValue(v, asRaw = true) {\n    if (typeof v === \"number\") {\n      return [\"span\", numberStyle, v];\n    } else if (typeof v === \"string\") {\n      return [\"span\", stringStyle, JSON.stringify(v)];\n    } else if (typeof v === \"boolean\") {\n      return [\"span\", keywordStyle, v];\n    } else if (isObject(v)) {\n      return [\"object\", { object: asRaw ? toRaw(v) : v }];\n    } else {\n      return [\"span\", stringStyle, String(v)];\n    }\n  }\n  function extractKeys(instance, type) {\n    const Comp = instance.type;\n    if (isFunction(Comp)) {\n      return;\n    }\n    const extracted = {};\n    for (const key in instance.ctx) {\n      if (isKeyOfType(Comp, key, type)) {\n        extracted[key] = instance.ctx[key];\n      }\n    }\n    return extracted;\n  }\n  function isKeyOfType(Comp, key, type) {\n    const opts = Comp[type];\n    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n      return true;\n    }\n    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n      return true;\n    }\n    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n      return true;\n    }\n  }\n  function genRefFlag(v) {\n    if (isShallow(v)) {\n      return `ShallowRef`;\n    }\n    if (v.effect) {\n      return `ComputedRef`;\n    }\n    return `Ref`;\n  }\n  if (window.devtoolsFormatters) {\n    window.devtoolsFormatters.push(formatter);\n  } else {\n    window.devtoolsFormatters = [formatter];\n  }\n}\n\nfunction withMemo(memo, render, cache, index) {\n  const cached = cache[index];\n  if (cached && isMemoSame(cached, memo)) {\n    return cached;\n  }\n  const ret = render();\n  ret.memo = memo.slice();\n  ret.cacheIndex = index;\n  return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n  const prev = cached.memo;\n  if (prev.length != memo.length) {\n    return false;\n  }\n  for (let i = 0; i < prev.length; i++) {\n    if (hasChanged(prev[i], memo[i])) {\n      return false;\n    }\n  }\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(cached);\n  }\n  return true;\n}\n\nconst version = \"3.5.34\";\nconst warn = !!(process.env.NODE_ENV !== \"production\") ? warn$1 : NOOP;\nconst ErrorTypeStrings = ErrorTypeStrings$1 ;\nconst devtools = !!(process.env.NODE_ENV !== \"production\") || true ? devtools$1 : void 0;\nconst setDevtoolsHook = !!(process.env.NODE_ENV !== \"production\") || true ? setDevtoolsHook$1 : NOOP;\nconst _ssrUtils = {\n  createComponentInstance,\n  setupComponent,\n  renderComponentRoot,\n  setCurrentRenderingInstance,\n  isVNode: isVNode,\n  normalizeVNode,\n  getComponentPublicInstance,\n  ensureValidVNode,\n  pushWarningContext,\n  popWarningContext\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\nconst DeprecationTypes = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrateOnIdle, hydrateOnInteraction, hydrateOnMediaQuery, hydrateOnVisible, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useId, useModel, useSSRContext, useSlots, useTemplateRef, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n","/**\n* @vue/runtime-dom v3.5.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { warn, BaseTransitionPropsValidators, h, BaseTransition, assertNumber, getCurrentInstance, onBeforeUpdate, queuePostFlushCb, onMounted, watch, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, nextTick, unref, createVNode, defineComponent, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, createRenderer, isRuntimeOnly, createHydrationRenderer } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { extend, isObject, toNumber, isArray, NOOP, normalizeCssVarValue, isString, hyphenate, capitalize, includeBooleanAttr, isSymbol, isSpecialBooleanAttr, isFunction, isOn, isModelListener, camelize as camelize$1, hasOwn, isPlainObject, EMPTY_OBJ, looseIndexOf, isSet, looseEqual, looseToNumber, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';\n\nlet policy = void 0;\nconst tt = typeof window !== \"undefined\" && window.trustedTypes;\nif (tt) {\n  try {\n    policy = /* @__PURE__ */ tt.createPolicy(\"vue\", {\n      createHTML: (val) => val\n    });\n  } catch (e) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`Error creating trusted types policy: ${e}`);\n  }\n}\nconst unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst mathmlNS = \"http://www.w3.org/1998/Math/MathML\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n  insert: (child, parent, anchor) => {\n    parent.insertBefore(child, anchor || null);\n  },\n  remove: (child) => {\n    const parent = child.parentNode;\n    if (parent) {\n      parent.removeChild(child);\n    }\n  },\n  createElement: (tag, namespace, is, props) => {\n    const el = namespace === \"svg\" ? doc.createElementNS(svgNS, tag) : namespace === \"mathml\" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);\n    if (tag === \"select\" && props && props.multiple != null) {\n      el.setAttribute(\"multiple\", props.multiple);\n    }\n    return el;\n  },\n  createText: (text) => doc.createTextNode(text),\n  createComment: (text) => doc.createComment(text),\n  setText: (node, text) => {\n    node.nodeValue = text;\n  },\n  setElementText: (el, text) => {\n    el.textContent = text;\n  },\n  parentNode: (node) => node.parentNode,\n  nextSibling: (node) => node.nextSibling,\n  querySelector: (selector) => doc.querySelector(selector),\n  setScopeId(el, id) {\n    el.setAttribute(id, \"\");\n  },\n  // __UNSAFE__\n  // Reason: innerHTML.\n  // Static content here can only come from compiled templates.\n  // As long as the user only uses trusted templates, this is safe.\n  insertStaticContent(content, parent, anchor, namespace, start, end) {\n    const before = anchor ? anchor.previousSibling : parent.lastChild;\n    if (start && (start === end || start.nextSibling)) {\n      while (true) {\n        parent.insertBefore(start.cloneNode(true), anchor);\n        if (start === end || !(start = start.nextSibling)) break;\n      }\n    } else {\n      templateContainer.innerHTML = unsafeToTrustedHTML(\n        namespace === \"svg\" ? `<svg>${content}</svg>` : namespace === \"mathml\" ? `<math>${content}</math>` : content\n      );\n      const template = templateContainer.content;\n      if (namespace === \"svg\" || namespace === \"mathml\") {\n        const wrapper = template.firstChild;\n        while (wrapper.firstChild) {\n          template.appendChild(wrapper.firstChild);\n        }\n        template.removeChild(wrapper);\n      }\n      parent.insertBefore(template, anchor);\n    }\n    return [\n      // first\n      before ? before.nextSibling : parent.firstChild,\n      // last\n      anchor ? anchor.previousSibling : parent.lastChild\n    ];\n  }\n};\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst vtcKey = /* @__PURE__ */ Symbol(\"_vtc\");\nconst DOMTransitionPropsValidators = {\n  name: String,\n  type: String,\n  css: {\n    type: Boolean,\n    default: true\n  },\n  duration: [String, Number, Object],\n  enterFromClass: String,\n  enterActiveClass: String,\n  enterToClass: String,\n  appearFromClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  leaveFromClass: String,\n  leaveActiveClass: String,\n  leaveToClass: String\n};\nconst TransitionPropsValidators = /* @__PURE__ */ extend(\n  {},\n  BaseTransitionPropsValidators,\n  DOMTransitionPropsValidators\n);\nconst decorate$1 = (t) => {\n  t.displayName = \"Transition\";\n  t.props = TransitionPropsValidators;\n  return t;\n};\nconst Transition = /* @__PURE__ */ decorate$1(\n  (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots)\n);\nconst callHook = (hook, args = []) => {\n  if (isArray(hook)) {\n    hook.forEach((h2) => h2(...args));\n  } else if (hook) {\n    hook(...args);\n  }\n};\nconst hasExplicitCallback = (hook) => {\n  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n  const baseProps = {};\n  for (const key in rawProps) {\n    if (!(key in DOMTransitionPropsValidators)) {\n      baseProps[key] = rawProps[key];\n    }\n  }\n  if (rawProps.css === false) {\n    return baseProps;\n  }\n  const {\n    name = \"v\",\n    type,\n    duration,\n    enterFromClass = `${name}-enter-from`,\n    enterActiveClass = `${name}-enter-active`,\n    enterToClass = `${name}-enter-to`,\n    appearFromClass = enterFromClass,\n    appearActiveClass = enterActiveClass,\n    appearToClass = enterToClass,\n    leaveFromClass = `${name}-leave-from`,\n    leaveActiveClass = `${name}-leave-active`,\n    leaveToClass = `${name}-leave-to`\n  } = rawProps;\n  const durations = normalizeDuration(duration);\n  const enterDuration = durations && durations[0];\n  const leaveDuration = durations && durations[1];\n  const {\n    onBeforeEnter,\n    onEnter,\n    onEnterCancelled,\n    onLeave,\n    onLeaveCancelled,\n    onBeforeAppear = onBeforeEnter,\n    onAppear = onEnter,\n    onAppearCancelled = onEnterCancelled\n  } = baseProps;\n  const finishEnter = (el, isAppear, done, isCancelled) => {\n    el._enterCancelled = isCancelled;\n    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n    done && done();\n  };\n  const finishLeave = (el, done) => {\n    el._isLeaving = false;\n    removeTransitionClass(el, leaveFromClass);\n    removeTransitionClass(el, leaveToClass);\n    removeTransitionClass(el, leaveActiveClass);\n    done && done();\n  };\n  const makeEnterHook = (isAppear) => {\n    return (el, done) => {\n      const hook = isAppear ? onAppear : onEnter;\n      const resolve = () => finishEnter(el, isAppear, done);\n      callHook(hook, [el, resolve]);\n      nextFrame(() => {\n        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n        addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        if (!hasExplicitCallback(hook)) {\n          whenTransitionEnds(el, type, enterDuration, resolve);\n        }\n      });\n    };\n  };\n  return extend(baseProps, {\n    onBeforeEnter(el) {\n      callHook(onBeforeEnter, [el]);\n      addTransitionClass(el, enterFromClass);\n      addTransitionClass(el, enterActiveClass);\n    },\n    onBeforeAppear(el) {\n      callHook(onBeforeAppear, [el]);\n      addTransitionClass(el, appearFromClass);\n      addTransitionClass(el, appearActiveClass);\n    },\n    onEnter: makeEnterHook(false),\n    onAppear: makeEnterHook(true),\n    onLeave(el, done) {\n      el._isLeaving = true;\n      const resolve = () => finishLeave(el, done);\n      addTransitionClass(el, leaveFromClass);\n      if (!el._enterCancelled) {\n        forceReflow(el);\n        addTransitionClass(el, leaveActiveClass);\n      } else {\n        addTransitionClass(el, leaveActiveClass);\n        forceReflow(el);\n      }\n      nextFrame(() => {\n        if (!el._isLeaving) {\n          return;\n        }\n        removeTransitionClass(el, leaveFromClass);\n        addTransitionClass(el, leaveToClass);\n        if (!hasExplicitCallback(onLeave)) {\n          whenTransitionEnds(el, type, leaveDuration, resolve);\n        }\n      });\n      callHook(onLeave, [el, resolve]);\n    },\n    onEnterCancelled(el) {\n      finishEnter(el, false, void 0, true);\n      callHook(onEnterCancelled, [el]);\n    },\n    onAppearCancelled(el) {\n      finishEnter(el, true, void 0, true);\n      callHook(onAppearCancelled, [el]);\n    },\n    onLeaveCancelled(el) {\n      finishLeave(el);\n      callHook(onLeaveCancelled, [el]);\n    }\n  });\n}\nfunction normalizeDuration(duration) {\n  if (duration == null) {\n    return null;\n  } else if (isObject(duration)) {\n    return [NumberOf(duration.enter), NumberOf(duration.leave)];\n  } else {\n    const n = NumberOf(duration);\n    return [n, n];\n  }\n}\nfunction NumberOf(val) {\n  const res = toNumber(val);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(res, \"<transition> explicit duration\");\n  }\n  return res;\n}\nfunction addTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.delete(cls);\n    if (!_vtc.size) {\n      el[vtcKey] = void 0;\n    }\n  }\n}\nfunction nextFrame(cb) {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(cb);\n  });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n  const id = el._endId = ++endId;\n  const resolveIfNotStale = () => {\n    if (id === el._endId) {\n      resolve();\n    }\n  };\n  if (explicitTimeout != null) {\n    return setTimeout(resolveIfNotStale, explicitTimeout);\n  }\n  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n  if (!type) {\n    return resolve();\n  }\n  const endEvent = type + \"end\";\n  let ended = 0;\n  const end = () => {\n    el.removeEventListener(endEvent, onEnd);\n    resolveIfNotStale();\n  };\n  const onEnd = (e) => {\n    if (e.target === el && ++ended >= propCount) {\n      end();\n    }\n  };\n  setTimeout(() => {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n  const styles = window.getComputedStyle(el);\n  const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n  const animationTimeout = getTimeout(animationDelays, animationDurations);\n  let type = null;\n  let timeout = 0;\n  let propCount = 0;\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n  }\n  const hasTransform = type === TRANSITION && /\\b(?:transform|all)(?:,|$)/.test(\n    getStyleProperties(`${TRANSITION}Property`).toString()\n  );\n  return {\n    type,\n    timeout,\n    propCount,\n    hasTransform\n  };\n}\nfunction getTimeout(delays, durations) {\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n  if (s === \"auto\") return 0;\n  return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow(el) {\n  const targetDocument = el ? el.ownerDocument : document;\n  return targetDocument.body.offsetHeight;\n}\n\nfunction patchClass(el, value, isSVG) {\n  const transitionClasses = el[vtcKey];\n  if (transitionClasses) {\n    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n  }\n  if (value == null) {\n    el.removeAttribute(\"class\");\n  } else if (isSVG) {\n    el.setAttribute(\"class\", value);\n  } else {\n    el.className = value;\n  }\n}\n\nconst vShowOriginalDisplay = /* @__PURE__ */ Symbol(\"_vod\");\nconst vShowHidden = /* @__PURE__ */ Symbol(\"_vsh\");\nconst vShow = {\n  // used for prop mismatch check during hydration\n  name: \"show\",\n  beforeMount(el, { value }, { transition }) {\n    el[vShowOriginalDisplay] = el.style.display === \"none\" ? \"\" : el.style.display;\n    if (transition && value) {\n      transition.beforeEnter(el);\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  mounted(el, { value }, { transition }) {\n    if (transition && value) {\n      transition.enter(el);\n    }\n  },\n  updated(el, { value, oldValue }, { transition }) {\n    if (!value === !oldValue) return;\n    if (transition) {\n      if (value) {\n        transition.beforeEnter(el);\n        setDisplay(el, true);\n        transition.enter(el);\n      } else {\n        transition.leave(el, () => {\n          setDisplay(el, false);\n        });\n      }\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  beforeUnmount(el, { value }) {\n    setDisplay(el, value);\n  }\n};\nfunction setDisplay(el, value) {\n  el.style.display = value ? el[vShowOriginalDisplay] : \"none\";\n  el[vShowHidden] = !value;\n}\nfunction initVShowForSSR() {\n  vShow.getSSRProps = ({ value }) => {\n    if (!value) {\n      return { style: { display: \"none\" } };\n    }\n  };\n}\n\nconst CSS_VAR_TEXT = /* @__PURE__ */ Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"CSS_VAR_TEXT\" : \"\");\nfunction useCssVars(getter) {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n    return;\n  }\n  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n    Array.from(\n      document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n    ).forEach((node) => setVarsOnNode(node, vars));\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.getCssVars = () => getter(instance.proxy);\n  }\n  const setVars = () => {\n    const vars = getter(instance.proxy);\n    if (instance.ce) {\n      setVarsOnNode(instance.ce, vars);\n    } else {\n      setVarsOnVNode(instance.subTree, vars);\n    }\n    updateTeleports(vars);\n  };\n  onBeforeUpdate(() => {\n    queuePostFlushCb(setVars);\n  });\n  onMounted(() => {\n    watch(setVars, NOOP, { flush: \"post\" });\n    const ob = new MutationObserver(setVars);\n    ob.observe(instance.subTree.el.parentNode, { childList: true });\n    onUnmounted(() => ob.disconnect());\n  });\n}\nfunction setVarsOnVNode(vnode, vars) {\n  if (vnode.shapeFlag & 128) {\n    const suspense = vnode.suspense;\n    vnode = suspense.activeBranch;\n    if (suspense.pendingBranch && !suspense.isHydrating) {\n      suspense.effects.push(() => {\n        setVarsOnVNode(suspense.activeBranch, vars);\n      });\n    }\n  }\n  while (vnode.component) {\n    vnode = vnode.component.subTree;\n  }\n  if (vnode.shapeFlag & 1 && vnode.el) {\n    setVarsOnNode(vnode.el, vars);\n  } else if (vnode.type === Fragment) {\n    vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n  } else if (vnode.type === Static) {\n    let { el, anchor } = vnode;\n    while (el) {\n      setVarsOnNode(el, vars);\n      if (el === anchor) break;\n      el = el.nextSibling;\n    }\n  }\n}\nfunction setVarsOnNode(el, vars) {\n  if (el.nodeType === 1) {\n    const style = el.style;\n    let cssText = \"\";\n    for (const key in vars) {\n      const value = normalizeCssVarValue(vars[key]);\n      style.setProperty(`--${key}`, value);\n      cssText += `--${key}: ${value};`;\n    }\n    style[CSS_VAR_TEXT] = cssText;\n  }\n}\n\nconst displayRE = /(?:^|;)\\s*display\\s*:/;\nfunction patchStyle(el, prev, next) {\n  const style = el.style;\n  const isCssString = isString(next);\n  let hasControlledDisplay = false;\n  if (next && !isCssString) {\n    if (prev) {\n      if (!isString(prev)) {\n        for (const key in prev) {\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      } else {\n        for (const prevStyle of prev.split(\";\")) {\n          const key = prevStyle.slice(0, prevStyle.indexOf(\":\")).trim();\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      }\n    }\n    for (const key in next) {\n      if (key === \"display\") {\n        hasControlledDisplay = true;\n      }\n      const value = next[key];\n      if (value != null) {\n        if (!shouldPreserveTextareaResizeStyle(\n          el,\n          key,\n          !isString(prev) && prev ? prev[key] : void 0,\n          value\n        )) {\n          setStyle(style, key, value);\n        }\n      } else {\n        setStyle(style, key, \"\");\n      }\n    }\n  } else {\n    if (isCssString) {\n      if (prev !== next) {\n        const cssVarText = style[CSS_VAR_TEXT];\n        if (cssVarText) {\n          next += \";\" + cssVarText;\n        }\n        style.cssText = next;\n        hasControlledDisplay = displayRE.test(next);\n      }\n    } else if (prev) {\n      el.removeAttribute(\"style\");\n    }\n  }\n  if (vShowOriginalDisplay in el) {\n    el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : \"\";\n    if (el[vShowHidden]) {\n      style.display = \"none\";\n    }\n  }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n  if (isArray(val)) {\n    val.forEach((v) => setStyle(style, name, v));\n  } else {\n    if (val == null) val = \"\";\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (semicolonRE.test(val)) {\n        warn(\n          `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n        );\n      }\n    }\n    if (name.startsWith(\"--\")) {\n      style.setProperty(name, val);\n    } else {\n      const prefixed = autoPrefix(style, name);\n      if (importantRE.test(val)) {\n        style.setProperty(\n          hyphenate(prefixed),\n          val.replace(importantRE, \"\"),\n          \"important\"\n        );\n      } else {\n        style[prefixed] = val;\n      }\n    }\n  }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n  const cached = prefixCache[rawName];\n  if (cached) {\n    return cached;\n  }\n  let name = camelize(rawName);\n  if (name !== \"filter\" && name in style) {\n    return prefixCache[rawName] = name;\n  }\n  name = capitalize(name);\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefixed = prefixes[i] + name;\n    if (prefixed in style) {\n      return prefixCache[rawName] = prefixed;\n    }\n  }\n  return rawName;\n}\nfunction shouldPreserveTextareaResizeStyle(el, key, prev, next) {\n  return el.tagName === \"TEXTAREA\" && (key === \"width\" || key === \"height\") && isString(next) && prev === next;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {\n  if (isSVG && key.startsWith(\"xlink:\")) {\n    if (value == null) {\n      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    if (value == null || isBoolean && !includeBooleanAttr(value)) {\n      el.removeAttribute(key);\n    } else {\n      el.setAttribute(\n        key,\n        isBoolean ? \"\" : isSymbol(value) ? String(value) : value\n      );\n    }\n  }\n}\n\nfunction patchDOMProp(el, key, value, parentComponent, attrName) {\n  if (key === \"innerHTML\" || key === \"textContent\") {\n    if (value != null) {\n      el[key] = key === \"innerHTML\" ? unsafeToTrustedHTML(value) : value;\n    }\n    return;\n  }\n  const tag = el.tagName;\n  if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n  !tag.includes(\"-\")) {\n    const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") || \"\" : el.value;\n    const newValue = value == null ? (\n      // #11647: value should be set as empty string for null and undefined,\n      // but <input type=\"checkbox\"> should be set as 'on'.\n      el.type === \"checkbox\" ? \"on\" : \"\"\n    ) : String(value);\n    if (oldValue !== newValue || !(\"_value\" in el)) {\n      el.value = newValue;\n    }\n    if (value == null) {\n      el.removeAttribute(key);\n    }\n    el._value = value;\n    return;\n  }\n  let needRemove = false;\n  if (value === \"\" || value == null) {\n    const type = typeof el[key];\n    if (type === \"boolean\") {\n      value = includeBooleanAttr(value);\n    } else if (value == null && type === \"string\") {\n      value = \"\";\n      needRemove = true;\n    } else if (type === \"number\") {\n      value = 0;\n      needRemove = true;\n    }\n  }\n  try {\n    el[key] = value;\n  } catch (e) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n      warn(\n        `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n        e\n      );\n    }\n  }\n  needRemove && el.removeAttribute(attrName || key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n  el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n  el.removeEventListener(event, handler, options);\n}\nconst veiKey = /* @__PURE__ */ Symbol(\"_vei\");\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n  const invokers = el[veiKey] || (el[veiKey] = {});\n  const existingInvoker = invokers[rawName];\n  if (nextValue && existingInvoker) {\n    existingInvoker.value = !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue;\n  } else {\n    const [name, options] = parseName(rawName);\n    if (nextValue) {\n      const invoker = invokers[rawName] = createInvoker(\n        !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue,\n        instance\n      );\n      addEventListener(el, name, invoker, options);\n    } else if (existingInvoker) {\n      removeEventListener(el, name, existingInvoker, options);\n      invokers[rawName] = void 0;\n    }\n  }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n  let options;\n  if (optionsModifierRE.test(name)) {\n    options = {};\n    let m;\n    while (m = name.match(optionsModifierRE)) {\n      name = name.slice(0, name.length - m[0].length);\n      options[m[0].toLowerCase()] = true;\n    }\n  }\n  const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n  return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n  const invoker = (e) => {\n    if (!e._vts) {\n      e._vts = Date.now();\n    } else if (e._vts <= invoker.attached) {\n      return;\n    }\n    callWithAsyncErrorHandling(\n      patchStopImmediatePropagation(e, invoker.value),\n      instance,\n      5,\n      [e]\n    );\n  };\n  invoker.value = initialValue;\n  invoker.attached = getNow();\n  return invoker;\n}\nfunction sanitizeEventValue(value, propName) {\n  if (isFunction(value) || isArray(value)) {\n    return value;\n  }\n  warn(\n    `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`\n  );\n  return NOOP;\n}\nfunction patchStopImmediatePropagation(e, value) {\n  if (isArray(value)) {\n    const originalStop = e.stopImmediatePropagation;\n    e.stopImmediatePropagation = () => {\n      originalStop.call(e);\n      e._stopped = true;\n    };\n    return value.map(\n      (fn) => (e2) => !e2._stopped && fn && fn(e2)\n    );\n  } else {\n    return value;\n  }\n}\n\nconst isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter\nkey.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;\nconst patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {\n  const isSVG = namespace === \"svg\";\n  if (key === \"class\") {\n    patchClass(el, nextValue, isSVG);\n  } else if (key === \"style\") {\n    patchStyle(el, prevValue, nextValue);\n  } else if (isOn(key)) {\n    if (!isModelListener(key)) {\n      patchEvent(el, key, prevValue, nextValue, parentComponent);\n    }\n  } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n    patchDOMProp(el, key, nextValue);\n    if (!el.tagName.includes(\"-\") && (key === \"value\" || key === \"checked\" || key === \"selected\")) {\n      patchAttr(el, key, nextValue, isSVG, parentComponent, key !== \"value\");\n    }\n  } else if (\n    // #11081 force set props for possible async custom element\n    el._isVueCE && // #12408 check if it's declared prop or it's async custom element\n    (shouldSetAsPropForVueCE(el, key) || // @ts-expect-error _def is private\n    el._def.__asyncLoader && (/[A-Z]/.test(key) || !isString(nextValue)))\n  ) {\n    patchDOMProp(el, camelize$1(key), nextValue, parentComponent, key);\n  } else {\n    if (key === \"true-value\") {\n      el._trueValue = nextValue;\n    } else if (key === \"false-value\") {\n      el._falseValue = nextValue;\n    }\n    patchAttr(el, key, nextValue, isSVG);\n  }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n  if (isSVG) {\n    if (key === \"innerHTML\" || key === \"textContent\") {\n      return true;\n    }\n    if (key in el && isNativeOn(key) && isFunction(value)) {\n      return true;\n    }\n    return false;\n  }\n  if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\" || key === \"autocorrect\") {\n    return false;\n  }\n  if (key === \"sandbox\" && el.tagName === \"IFRAME\") {\n    return false;\n  }\n  if (key === \"form\") {\n    return false;\n  }\n  if (key === \"list\" && el.tagName === \"INPUT\") {\n    return false;\n  }\n  if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n    return false;\n  }\n  if (key === \"width\" || key === \"height\") {\n    const tag = el.tagName;\n    if (tag === \"IMG\" || tag === \"VIDEO\" || tag === \"CANVAS\" || tag === \"SOURCE\") {\n      return false;\n    }\n  }\n  if (isNativeOn(key) && isString(value)) {\n    return false;\n  }\n  return key in el;\n}\nfunction shouldSetAsPropForVueCE(el, key) {\n  const props = (\n    // @ts-expect-error _def is private\n    el._def.props\n  );\n  if (!props) {\n    return false;\n  }\n  const camelKey = camelize$1(key);\n  return Array.isArray(props) ? props.some((prop) => camelize$1(prop) === camelKey) : Object.keys(props).some((prop) => camelize$1(prop) === camelKey);\n}\n\nconst REMOVAL = {};\n// @__NO_SIDE_EFFECTS__\nfunction defineCustomElement(options, extraOptions, _createApp) {\n  let Comp = defineComponent(options, extraOptions);\n  if (isPlainObject(Comp)) Comp = extend({}, Comp, extraOptions);\n  class VueCustomElement extends VueElement {\n    constructor(initialProps) {\n      super(Comp, initialProps, _createApp);\n    }\n  }\n  VueCustomElement.def = Comp;\n  return VueCustomElement;\n}\nconst defineSSRCustomElement = (/* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {\n  return /* @__PURE__ */ defineCustomElement(options, extraOptions, createSSRApp);\n});\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n  constructor(_def, _props = {}, _createApp = createApp) {\n    super();\n    this._def = _def;\n    this._props = _props;\n    this._createApp = _createApp;\n    this._isVueCE = true;\n    /**\n     * @internal\n     */\n    this._instance = null;\n    /**\n     * @internal\n     */\n    this._app = null;\n    /**\n     * @internal\n     */\n    this._nonce = this._def.nonce;\n    this._connected = false;\n    this._resolved = false;\n    this._patching = false;\n    this._dirty = false;\n    this._numberProps = null;\n    this._styleChildren = /* @__PURE__ */ new WeakSet();\n    this._styleAnchors = /* @__PURE__ */ new WeakMap();\n    this._ob = null;\n    if (this.shadowRoot && _createApp !== createApp) {\n      this._root = this.shadowRoot;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n        warn(\n          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n        );\n      }\n      if (_def.shadowRoot !== false) {\n        this.attachShadow(\n          extend({}, _def.shadowRootOptions, {\n            mode: \"open\"\n          })\n        );\n        this._root = this.shadowRoot;\n      } else {\n        this._root = this;\n      }\n    }\n  }\n  connectedCallback() {\n    if (!this.isConnected) return;\n    if (!this.shadowRoot && !this._resolved) {\n      this._parseSlots();\n    }\n    this._connected = true;\n    let parent = this;\n    while (parent = parent && // #12479 should check assignedSlot first to get correct parent\n    (parent.assignedSlot || parent.parentNode || parent.host)) {\n      if (parent instanceof VueElement) {\n        this._parent = parent;\n        break;\n      }\n    }\n    if (!this._instance) {\n      if (this._resolved) {\n        this._mount(this._def);\n      } else {\n        if (parent && parent._pendingResolve) {\n          this._pendingResolve = parent._pendingResolve.then(() => {\n            this._pendingResolve = void 0;\n            this._resolveDef();\n          });\n        } else {\n          this._resolveDef();\n        }\n      }\n    }\n  }\n  _setParent(parent = this._parent) {\n    if (parent) {\n      this._instance.parent = parent._instance;\n      this._inheritParentContext(parent);\n    }\n  }\n  _inheritParentContext(parent = this._parent) {\n    if (parent && this._app) {\n      Object.setPrototypeOf(\n        this._app._context.provides,\n        parent._instance.provides\n      );\n    }\n  }\n  disconnectedCallback() {\n    this._connected = false;\n    nextTick(() => {\n      if (!this._connected) {\n        if (this._ob) {\n          this._ob.disconnect();\n          this._ob = null;\n        }\n        this._app && this._app.unmount();\n        if (this._instance) this._instance.ce = void 0;\n        this._app = this._instance = null;\n        if (this._teleportTargets) {\n          this._teleportTargets.clear();\n          this._teleportTargets = void 0;\n        }\n      }\n    });\n  }\n  _processMutations(mutations) {\n    for (const m of mutations) {\n      this._setAttr(m.attributeName);\n    }\n  }\n  /**\n   * resolve inner component definition (handle possible async component)\n   */\n  _resolveDef() {\n    if (this._pendingResolve) {\n      return;\n    }\n    for (let i = 0; i < this.attributes.length; i++) {\n      this._setAttr(this.attributes[i].name);\n    }\n    this._ob = new MutationObserver(this._processMutations.bind(this));\n    this._ob.observe(this, { attributes: true });\n    const resolve = (def, isAsync = false) => {\n      this._resolved = true;\n      this._pendingResolve = void 0;\n      const { props, styles } = def;\n      let numberProps;\n      if (props && !isArray(props)) {\n        for (const key in props) {\n          const opt = props[key];\n          if (opt === Number || opt && opt.type === Number) {\n            if (key in this._props) {\n              this._props[key] = toNumber(this._props[key]);\n            }\n            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n          }\n        }\n      }\n      this._numberProps = numberProps;\n      this._resolveProps(def);\n      if (this.shadowRoot) {\n        this._applyStyles(styles);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && styles) {\n        warn(\n          \"Custom element style injection is not supported when using shadowRoot: false\"\n        );\n      }\n      this._mount(def);\n    };\n    const asyncDef = this._def.__asyncLoader;\n    if (asyncDef) {\n      this._pendingResolve = asyncDef().then((def) => {\n        def.configureApp = this._def.configureApp;\n        resolve(this._def = def, true);\n      });\n    } else {\n      resolve(this._def);\n    }\n  }\n  _mount(def) {\n    if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) && !def.name) {\n      def.name = \"VueElement\";\n    }\n    this._app = this._createApp(def);\n    this._inheritParentContext();\n    if (def.configureApp) {\n      def.configureApp(this._app);\n    }\n    this._app._ceVNode = this._createVNode();\n    this._app.mount(this._root);\n    const exposed = this._instance && this._instance.exposed;\n    if (!exposed) return;\n    for (const key in exposed) {\n      if (!hasOwn(this, key)) {\n        Object.defineProperty(this, key, {\n          // unwrap ref to be consistent with public instance behavior\n          get: () => unref(exposed[key])\n        });\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn(`Exposed property \"${key}\" already exists on custom element.`);\n      }\n    }\n  }\n  _resolveProps(def) {\n    const { props } = def;\n    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n    for (const key of Object.keys(this)) {\n      if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n        this._setProp(key, this[key]);\n      }\n    }\n    for (const key of declaredPropKeys.map(camelize$1)) {\n      Object.defineProperty(this, key, {\n        get() {\n          return this._getProp(key);\n        },\n        set(val) {\n          this._setProp(key, val, true, !this._patching);\n        }\n      });\n    }\n  }\n  _setAttr(key) {\n    if (key.startsWith(\"data-v-\")) return;\n    const has = this.hasAttribute(key);\n    let value = has ? this.getAttribute(key) : REMOVAL;\n    const camelKey = camelize$1(key);\n    if (has && this._numberProps && this._numberProps[camelKey]) {\n      value = toNumber(value);\n    }\n    this._setProp(camelKey, value, false, true);\n  }\n  /**\n   * @internal\n   */\n  _getProp(key) {\n    return this._props[key];\n  }\n  /**\n   * @internal\n   */\n  _setProp(key, val, shouldReflect = true, shouldUpdate = false) {\n    if (val !== this._props[key]) {\n      this._dirty = true;\n      if (val === REMOVAL) {\n        delete this._props[key];\n      } else {\n        this._props[key] = val;\n        if (key === \"key\" && this._app) {\n          this._app._ceVNode.key = val;\n        }\n      }\n      if (shouldUpdate && this._instance) {\n        this._update();\n      }\n      if (shouldReflect) {\n        const ob = this._ob;\n        if (ob) {\n          this._processMutations(ob.takeRecords());\n          ob.disconnect();\n        }\n        if (val === true) {\n          this.setAttribute(hyphenate(key), \"\");\n        } else if (typeof val === \"string\" || typeof val === \"number\") {\n          this.setAttribute(hyphenate(key), val + \"\");\n        } else if (!val) {\n          this.removeAttribute(hyphenate(key));\n        }\n        ob && ob.observe(this, { attributes: true });\n      }\n    }\n  }\n  _update() {\n    const vnode = this._createVNode();\n    if (this._app) vnode.appContext = this._app._context;\n    render(vnode, this._root);\n  }\n  _createVNode() {\n    const baseProps = {};\n    if (!this.shadowRoot) {\n      baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this);\n    }\n    const vnode = createVNode(this._def, extend(baseProps, this._props));\n    if (!this._instance) {\n      vnode.ce = (instance) => {\n        this._instance = instance;\n        instance.ce = this;\n        instance.isCE = true;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          instance.ceReload = (newStyles) => {\n            if (this._styles) {\n              this._styles.forEach((s) => this._root.removeChild(s));\n              this._styles.length = 0;\n            }\n            this._styleAnchors.delete(this._def);\n            this._applyStyles(newStyles);\n            this._instance = null;\n            this._update();\n          };\n        }\n        const dispatch = (event, args) => {\n          this.dispatchEvent(\n            new CustomEvent(\n              event,\n              isPlainObject(args[0]) ? extend({ detail: args }, args[0]) : { detail: args }\n            )\n          );\n        };\n        instance.emit = (event, ...args) => {\n          dispatch(event, args);\n          if (hyphenate(event) !== event) {\n            dispatch(hyphenate(event), args);\n          }\n        };\n        this._setParent();\n      };\n    }\n    return vnode;\n  }\n  _applyStyles(styles, owner, parentComp) {\n    if (!styles) return;\n    if (owner) {\n      if (owner === this._def || this._styleChildren.has(owner)) {\n        return;\n      }\n      this._styleChildren.add(owner);\n    }\n    const nonce = this._nonce;\n    const root = this.shadowRoot;\n    const insertionAnchor = parentComp ? this._getStyleAnchor(parentComp) || this._getStyleAnchor(this._def) : this._getRootStyleInsertionAnchor(root);\n    let last = null;\n    for (let i = styles.length - 1; i >= 0; i--) {\n      const s = document.createElement(\"style\");\n      if (nonce) s.setAttribute(\"nonce\", nonce);\n      s.textContent = styles[i];\n      root.insertBefore(s, last || insertionAnchor);\n      last = s;\n      if (i === 0) {\n        if (!parentComp) this._styleAnchors.set(this._def, s);\n        if (owner) this._styleAnchors.set(owner, s);\n      }\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (owner) {\n          if (owner.__hmrId) {\n            if (!this._childStyles) this._childStyles = /* @__PURE__ */ new Map();\n            let entry = this._childStyles.get(owner.__hmrId);\n            if (!entry) {\n              this._childStyles.set(owner.__hmrId, entry = []);\n            }\n            entry.push(s);\n          }\n        } else {\n          (this._styles || (this._styles = [])).push(s);\n        }\n      }\n    }\n  }\n  _getStyleAnchor(comp) {\n    if (!comp) {\n      return null;\n    }\n    const anchor = this._styleAnchors.get(comp);\n    if (anchor && anchor.parentNode === this.shadowRoot) {\n      return anchor;\n    }\n    if (anchor) {\n      this._styleAnchors.delete(comp);\n    }\n    return null;\n  }\n  _getRootStyleInsertionAnchor(root) {\n    for (let i = 0; i < root.childNodes.length; i++) {\n      const node = root.childNodes[i];\n      if (!(node instanceof HTMLStyleElement)) {\n        return node;\n      }\n    }\n    return null;\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _parseSlots() {\n    const slots = this._slots = {};\n    let n;\n    while (n = this.firstChild) {\n      const slotName = n.nodeType === 1 && n.getAttribute(\"slot\") || \"default\";\n      (slots[slotName] || (slots[slotName] = [])).push(n);\n      this.removeChild(n);\n    }\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _renderSlots() {\n    const outlets = this._getSlots();\n    const scopeId = this._instance.type.__scopeId;\n    for (let i = 0; i < outlets.length; i++) {\n      const o = outlets[i];\n      const slotName = o.getAttribute(\"name\") || \"default\";\n      const content = this._slots[slotName];\n      const parent = o.parentNode;\n      if (content) {\n        for (const n of content) {\n          if (scopeId && n.nodeType === 1) {\n            const id = scopeId + \"-s\";\n            const walker = document.createTreeWalker(n, 1);\n            n.setAttribute(id, \"\");\n            let child;\n            while (child = walker.nextNode()) {\n              child.setAttribute(id, \"\");\n            }\n          }\n          parent.insertBefore(n, o);\n        }\n      } else {\n        while (o.firstChild) parent.insertBefore(o.firstChild, o);\n      }\n      parent.removeChild(o);\n    }\n  }\n  /**\n   * @internal\n   */\n  _getSlots() {\n    const roots = [this];\n    if (this._teleportTargets) {\n      roots.push(...this._teleportTargets);\n    }\n    const slots = /* @__PURE__ */ new Set();\n    for (const root of roots) {\n      const found = root.querySelectorAll(\"slot\");\n      for (let i = 0; i < found.length; i++) {\n        slots.add(found[i]);\n      }\n    }\n    return Array.from(slots);\n  }\n  /**\n   * @internal\n   */\n  _injectChildStyle(comp, parentComp) {\n    this._applyStyles(comp.styles, comp, parentComp);\n  }\n  /**\n   * @internal\n   */\n  _beginPatch() {\n    this._patching = true;\n    this._dirty = false;\n  }\n  /**\n   * @internal\n   */\n  _endPatch() {\n    this._patching = false;\n    if (this._dirty && this._instance) {\n      this._update();\n    }\n  }\n  /**\n   * @internal\n   */\n  _hasShadowRoot() {\n    return this._def.shadowRoot !== false;\n  }\n  /**\n   * @internal\n   */\n  _removeChildStyle(comp) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this._styleChildren.delete(comp);\n      this._styleAnchors.delete(comp);\n      if (this._childStyles && comp.__hmrId) {\n        const oldStyles = this._childStyles.get(comp.__hmrId);\n        if (oldStyles) {\n          oldStyles.forEach((s) => this._root.removeChild(s));\n          oldStyles.length = 0;\n        }\n      }\n    }\n  }\n}\nfunction useHost(caller) {\n  const instance = getCurrentInstance();\n  const el = instance && instance.ce;\n  if (el) {\n    return el;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (!instance) {\n      warn(\n        `${caller || \"useHost\"} called without an active component instance.`\n      );\n    } else {\n      warn(\n        `${caller || \"useHost\"} can only be used in components defined via defineCustomElement.`\n      );\n    }\n  }\n  return null;\n}\nfunction useShadowRoot() {\n  const el = !!(process.env.NODE_ENV !== \"production\") ? useHost(\"useShadowRoot\") : useHost();\n  return el && el.shadowRoot;\n}\n\nfunction useCssModule(name = \"$style\") {\n  {\n    const instance = getCurrentInstance();\n    if (!instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n      return EMPTY_OBJ;\n    }\n    const modules = instance.type.__cssModules;\n    if (!modules) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n      return EMPTY_OBJ;\n    }\n    const mod = modules[name];\n    if (!mod) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n      return EMPTY_OBJ;\n    }\n    return mod;\n  }\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst moveCbKey = /* @__PURE__ */ Symbol(\"_moveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nconst decorate = (t) => {\n  delete t.props.mode;\n  return t;\n};\nconst TransitionGroupImpl = /* @__PURE__ */ decorate({\n  name: \"TransitionGroup\",\n  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n    tag: String,\n    moveClass: String\n  }),\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevChildren;\n    let children;\n    onUpdated(() => {\n      if (!prevChildren.length) {\n        return;\n      }\n      const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n      if (!hasCSSTransform(\n        prevChildren[0].el,\n        instance.vnode.el,\n        moveClass\n      )) {\n        prevChildren = [];\n        return;\n      }\n      prevChildren.forEach(callPendingCbs);\n      prevChildren.forEach(recordPosition);\n      const movedChildren = prevChildren.filter(applyTranslation);\n      forceReflow(instance.vnode.el);\n      movedChildren.forEach((c) => {\n        const el = c.el;\n        const style = el.style;\n        addTransitionClass(el, moveClass);\n        style.transform = style.webkitTransform = style.transitionDuration = \"\";\n        const cb = el[moveCbKey] = (e) => {\n          if (e && e.target !== el) {\n            return;\n          }\n          if (!e || e.propertyName.endsWith(\"transform\")) {\n            el.removeEventListener(\"transitionend\", cb);\n            el[moveCbKey] = null;\n            removeTransitionClass(el, moveClass);\n          }\n        };\n        el.addEventListener(\"transitionend\", cb);\n      });\n      prevChildren = [];\n    });\n    return () => {\n      const rawProps = toRaw(props);\n      const cssTransitionProps = resolveTransitionProps(rawProps);\n      let tag = rawProps.tag || Fragment;\n      prevChildren = [];\n      if (children) {\n        for (let i = 0; i < children.length; i++) {\n          const child = children[i];\n          if (child.el && child.el instanceof Element) {\n            prevChildren.push(child);\n            setTransitionHooks(\n              child,\n              resolveTransitionHooks(\n                child,\n                cssTransitionProps,\n                state,\n                instance\n              )\n            );\n            positionMap.set(child, getPosition(child.el));\n          }\n        }\n      }\n      children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (child.key != null) {\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") && child.type !== Text) {\n          warn(`<TransitionGroup> children must be keyed.`);\n        }\n      }\n      return createVNode(tag, null, children);\n    };\n  }\n});\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n  const el = c.el;\n  if (el[moveCbKey]) {\n    el[moveCbKey]();\n  }\n  if (el[enterCbKey]) {\n    el[enterCbKey]();\n  }\n}\nfunction recordPosition(c) {\n  newPositionMap.set(c, getPosition(c.el));\n}\nfunction applyTranslation(c) {\n  const oldPos = positionMap.get(c);\n  const newPos = newPositionMap.get(c);\n  const dx = oldPos.left - newPos.left;\n  const dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    const el = c.el;\n    const s = el.style;\n    const rect = el.getBoundingClientRect();\n    let scaleX = 1;\n    let scaleY = 1;\n    if (el.offsetWidth) scaleX = rect.width / el.offsetWidth;\n    if (el.offsetHeight) scaleY = rect.height / el.offsetHeight;\n    if (!Number.isFinite(scaleX) || scaleX === 0) scaleX = 1;\n    if (!Number.isFinite(scaleY) || scaleY === 0) scaleY = 1;\n    if (Math.abs(scaleX - 1) < 0.01) scaleX = 1;\n    if (Math.abs(scaleY - 1) < 0.01) scaleY = 1;\n    s.transform = s.webkitTransform = `translate(${dx / scaleX}px,${dy / scaleY}px)`;\n    s.transitionDuration = \"0s\";\n    return c;\n  }\n}\nfunction getPosition(el) {\n  const rect = el.getBoundingClientRect();\n  return {\n    left: rect.left,\n    top: rect.top\n  };\n}\nfunction hasCSSTransform(el, root, moveClass) {\n  const clone = el.cloneNode();\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.forEach((cls) => {\n      cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n    });\n  }\n  moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n  clone.style.display = \"none\";\n  const container = root.nodeType === 1 ? root : root.parentNode;\n  container.appendChild(clone);\n  const { hasTransform } = getTransitionInfo(clone);\n  container.removeChild(clone);\n  return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n  const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n  e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n  const target = e.target;\n  if (target.composing) {\n    target.composing = false;\n    target.dispatchEvent(new Event(\"input\"));\n  }\n}\nconst assignKey = /* @__PURE__ */ Symbol(\"_assign\");\nfunction castValue(value, trim, number) {\n  if (trim) value = value.trim();\n  if (number) value = looseToNumber(value);\n  return value;\n}\nconst vModelText = {\n  created(el, { modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n    addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n      if (e.target.composing) return;\n      el[assignKey](castValue(el.value, trim, castToNumber));\n    });\n    if (trim || castToNumber) {\n      addEventListener(el, \"change\", () => {\n        el.value = castValue(el.value, trim, castToNumber);\n      });\n    }\n    if (!lazy) {\n      addEventListener(el, \"compositionstart\", onCompositionStart);\n      addEventListener(el, \"compositionend\", onCompositionEnd);\n      addEventListener(el, \"change\", onCompositionEnd);\n    }\n  },\n  // set value on mounted so it's after min/max for type=\"range\"\n  mounted(el, { value }) {\n    el.value = value == null ? \"\" : value;\n  },\n  beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (el.composing) return;\n    const elValue = (number || el.type === \"number\") && !/^0\\d/.test(el.value) ? looseToNumber(el.value) : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (elValue === newValue) {\n      return;\n    }\n    const rootNode = el.getRootNode();\n    if ((rootNode instanceof Document || rootNode instanceof ShadowRoot) && rootNode.activeElement === el && el.type !== \"range\") {\n      if (lazy && value === oldValue) {\n        return;\n      }\n      if (trim && el.value.trim() === newValue) {\n        return;\n      }\n    }\n    el.value = newValue;\n  }\n};\nconst vModelCheckbox = {\n  // #4096 array checkboxes need to be deep traversed\n  deep: true,\n  created(el, _, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      const modelValue = el._modelValue;\n      const elementValue = getValue(el);\n      const checked = el.checked;\n      const assign = el[assignKey];\n      if (isArray(modelValue)) {\n        const index = looseIndexOf(modelValue, elementValue);\n        const found = index !== -1;\n        if (checked && !found) {\n          assign(modelValue.concat(elementValue));\n        } else if (!checked && found) {\n          const filtered = [...modelValue];\n          filtered.splice(index, 1);\n          assign(filtered);\n        }\n      } else if (isSet(modelValue)) {\n        const cloned = new Set(modelValue);\n        if (checked) {\n          cloned.add(elementValue);\n        } else {\n          cloned.delete(elementValue);\n        }\n        assign(cloned);\n      } else {\n        assign(getCheckboxValue(el, checked));\n      }\n    });\n  },\n  // set initial checked on mount to wait for true-value/false-value\n  mounted: setChecked,\n  beforeUpdate(el, binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    setChecked(el, binding, vnode);\n  }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n  el._modelValue = value;\n  let checked;\n  if (isArray(value)) {\n    checked = looseIndexOf(value, vnode.props.value) > -1;\n  } else if (isSet(value)) {\n    checked = value.has(vnode.props.value);\n  } else {\n    if (value === oldValue) return;\n    checked = looseEqual(value, getCheckboxValue(el, true));\n  }\n  if (el.checked !== checked) {\n    el.checked = checked;\n  }\n}\nconst vModelRadio = {\n  created(el, { value }, vnode) {\n    el.checked = looseEqual(value, vnode.props.value);\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      el[assignKey](getValue(el));\n    });\n  },\n  beforeUpdate(el, { value, oldValue }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (value !== oldValue) {\n      el.checked = looseEqual(value, vnode.props.value);\n    }\n  }\n};\nconst vModelSelect = {\n  // <select multiple> value need to be deep traversed\n  deep: true,\n  created(el, { value, modifiers: { number } }, vnode) {\n    const isSetModel = isSet(value);\n    addEventListener(el, \"change\", () => {\n      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n        (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n      );\n      el[assignKey](\n        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n      );\n      el._assigning = true;\n      nextTick(() => {\n        el._assigning = false;\n      });\n    });\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  // set value in mounted & updated because <select> relies on its children\n  // <option>s.\n  mounted(el, { value }) {\n    setSelected(el, value);\n  },\n  beforeUpdate(el, _binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  updated(el, { value }) {\n    if (!el._assigning) {\n      setSelected(el, value);\n    }\n  }\n};\nfunction setSelected(el, value) {\n  const isMultiple = el.multiple;\n  const isArrayValue = isArray(value);\n  if (isMultiple && !isArrayValue && !isSet(value)) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n    );\n    return;\n  }\n  for (let i = 0, l = el.options.length; i < l; i++) {\n    const option = el.options[i];\n    const optionValue = getValue(option);\n    if (isMultiple) {\n      if (isArrayValue) {\n        const optionType = typeof optionValue;\n        if (optionType === \"string\" || optionType === \"number\") {\n          option.selected = value.some((v) => String(v) === String(optionValue));\n        } else {\n          option.selected = looseIndexOf(value, optionValue) > -1;\n        }\n      } else {\n        option.selected = value.has(optionValue);\n      }\n    } else if (looseEqual(getValue(option), value)) {\n      if (el.selectedIndex !== i) el.selectedIndex = i;\n      return;\n    }\n  }\n  if (!isMultiple && el.selectedIndex !== -1) {\n    el.selectedIndex = -1;\n  }\n}\nfunction getValue(el) {\n  return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n  const key = checked ? \"_trueValue\" : \"_falseValue\";\n  return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n  created(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"created\");\n  },\n  mounted(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"mounted\");\n  },\n  beforeUpdate(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n  },\n  updated(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"updated\");\n  }\n};\nfunction resolveDynamicModel(tagName, type) {\n  switch (tagName) {\n    case \"SELECT\":\n      return vModelSelect;\n    case \"TEXTAREA\":\n      return vModelText;\n    default:\n      switch (type) {\n        case \"checkbox\":\n          return vModelCheckbox;\n        case \"radio\":\n          return vModelRadio;\n        default:\n          return vModelText;\n      }\n  }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n  const modelToUse = resolveDynamicModel(\n    el.tagName,\n    vnode.props && vnode.props.type\n  );\n  const fn = modelToUse[hook];\n  fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n  vModelText.getSSRProps = ({ value }) => ({ value });\n  vModelRadio.getSSRProps = ({ value }, vnode) => {\n    if (vnode.props && looseEqual(vnode.props.value, value)) {\n      return { checked: true };\n    }\n  };\n  vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n    if (isArray(value)) {\n      if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n        return { checked: true };\n      }\n    } else if (isSet(value)) {\n      if (vnode.props && value.has(vnode.props.value)) {\n        return { checked: true };\n      }\n    } else if (value) {\n      return { checked: true };\n    }\n  };\n  vModelDynamic.getSSRProps = (binding, vnode) => {\n    if (typeof vnode.type !== \"string\") {\n      return;\n    }\n    const modelToUse = resolveDynamicModel(\n      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n      vnode.type.toUpperCase(),\n      vnode.props && vnode.props.type\n    );\n    if (modelToUse.getSSRProps) {\n      return modelToUse.getSSRProps(binding, vnode);\n    }\n  };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n  stop: (e) => e.stopPropagation(),\n  prevent: (e) => e.preventDefault(),\n  self: (e) => e.target !== e.currentTarget,\n  ctrl: (e) => !e.ctrlKey,\n  shift: (e) => !e.shiftKey,\n  alt: (e) => !e.altKey,\n  meta: (e) => !e.metaKey,\n  left: (e) => \"button\" in e && e.button !== 0,\n  middle: (e) => \"button\" in e && e.button !== 1,\n  right: (e) => \"button\" in e && e.button !== 2,\n  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n  if (!fn) return fn;\n  const cache = fn._withMods || (fn._withMods = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {\n    for (let i = 0; i < modifiers.length; i++) {\n      const guard = modifierGuards[modifiers[i]];\n      if (guard && guard(event, modifiers)) return;\n    }\n    return fn(event, ...args);\n  }));\n};\nconst keyNames = {\n  esc: \"escape\",\n  space: \" \",\n  up: \"arrow-up\",\n  left: \"arrow-left\",\n  right: \"arrow-right\",\n  down: \"arrow-down\",\n  delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n  const cache = fn._withKeys || (fn._withKeys = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = ((event) => {\n    if (!(\"key\" in event)) {\n      return;\n    }\n    const eventKey = hyphenate(event.key);\n    if (modifiers.some(\n      (k) => k === eventKey || keyNames[k] === eventKey\n    )) {\n      return fn(event);\n    }\n  }));\n};\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n  return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n  enabledHydration = true;\n  return renderer;\n}\nconst render = ((...args) => {\n  ensureRenderer().render(...args);\n});\nconst hydrate = ((...args) => {\n  ensureHydrationRenderer().hydrate(...args);\n});\nconst createApp = ((...args) => {\n  const app = ensureRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (!container) return;\n    const component = app._component;\n    if (!isFunction(component) && !component.render && !component.template) {\n      component.template = container.innerHTML;\n    }\n    if (container.nodeType === 1) {\n      container.textContent = \"\";\n    }\n    const proxy = mount(container, false, resolveRootNamespace(container));\n    if (container instanceof Element) {\n      container.removeAttribute(\"v-cloak\");\n      container.setAttribute(\"data-v-app\", \"\");\n    }\n    return proxy;\n  };\n  return app;\n});\nconst createSSRApp = ((...args) => {\n  const app = ensureHydrationRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (container) {\n      return mount(container, true, resolveRootNamespace(container));\n    }\n  };\n  return app;\n});\nfunction resolveRootNamespace(container) {\n  if (container instanceof SVGElement) {\n    return \"svg\";\n  }\n  if (typeof MathMLElement === \"function\" && container instanceof MathMLElement) {\n    return \"mathml\";\n  }\n}\nfunction injectNativeTagCheck(app) {\n  Object.defineProperty(app.config, \"isNativeTag\", {\n    value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n    writable: false\n  });\n}\nfunction injectCompilerOptionsCheck(app) {\n  if (isRuntimeOnly()) {\n    const isCustomElement = app.config.isCustomElement;\n    Object.defineProperty(app.config, \"isCustomElement\", {\n      get() {\n        return isCustomElement;\n      },\n      set() {\n        warn(\n          `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n        );\n      }\n    });\n    const compilerOptions = app.config.compilerOptions;\n    const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n    Object.defineProperty(app.config, \"compilerOptions\", {\n      get() {\n        warn(msg);\n        return compilerOptions;\n      },\n      set() {\n        warn(msg);\n      }\n    });\n  }\n}\nfunction normalizeContainer(container) {\n  if (isString(container)) {\n    const res = document.querySelector(container);\n    if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n      warn(\n        `Failed to mount app: mount target selector \"${container}\" returned null.`\n      );\n    }\n    return res;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n    warn(\n      `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n    );\n  }\n  return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n  if (!ssrDirectiveInitialized) {\n    ssrDirectiveInitialized = true;\n    initVModelForSSR();\n    initVShowForSSR();\n  }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, nodeOps, patchProp, render, useCssModule, useCssVars, useHost, useShadowRoot, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n","/**\n * FileNode — node shape returned by the manager endpoint.\n *\n * Backend `?q=index` (or `GET /api/files/manager?action=index`) returns:\n *   { adapter, storages, dirname, files: FileNode[] }\n */\nexport interface FileNode {\n  /** DB node ID — needed by the per-user meta routes (starred, tags,\n   *  recently-opened). Backend's projectFileNodes() emits it for every\n   *  row; only client-synthesized rows (e.g. multi-storage virtual\n   *  folders) lack one. */\n  id?: number;\n  /** Full adapter-qualified path: `local://receipts/2024/invoice.pdf` */\n  path: string;\n  /** Relative basename: `invoice.pdf` */\n  basename: string;\n  /** Adapter-stripped relative path: `receipts/2024/invoice.pdf` */\n  relativePath?: string;\n  /** `file` or `dir` */\n  type: 'file' | 'dir';\n  /** Extension (lowercased, no dot). Empty string = no extension. */\n  extension?: string;\n  /** Bytes. 0 = directory. */\n  size?: number;\n  /** Unix ms (backend \"last_modified\"). */\n  last_modified?: number;\n  /** MIME. */\n  mime_type?: string;\n  /** Optional thumbnail URL (backend may inline). */\n  thumb_url?: string | null;\n  /** Visibility: private | public. */\n  visibility?: 'private' | 'public';\n  /** File count for directories. */\n  count?: number;\n  /** Client-side tag (localStorage or backend). */\n  starred?: boolean;\n  /** Hex color tag. */\n  color?: string | null;\n  /** Server-side trash marker. */\n  trashed?: boolean;\n  /** RBAC effective level for the current user on this entry (backend\n   *  projectFileNodes emits it when a storage has RBAC on). '' / undefined =\n   *  ACL not enforced. Used to gate edit/manage affordances client-side. */\n  perm?: 'none' | 'viewer' | 'editor' | 'owner';\n  /** The row sits on a read-only storage. Carried by the rows that come from\n   *  OUTSIDE a folder listing — Recent, Starred, a tag view, the Home cards,\n   *  the Recently-opened tray (`handlers/meta.go`) — because there the\n   *  listing-level `read_only` has no folder to describe. A folder listing's\n   *  rows leave it unset; `dirReadOnly` answers for the whole folder. Folded\n   *  into the write gate with `perm`, so the context menu is the same in\n   *  every view. */\n  read_only?: boolean;\n  /* wiring:e2 — dir rows: true when the folder is E2E-encrypted (carries a\n   * `.filex-e2e.json` marker). Drives the 🔒 badge in the listings. */\n  e2e?: boolean;\n  /** Generic — any additional fields the backend wants to inline. */\n  [k: string]: unknown;\n}\n\nexport interface ShareInfo {\n  uuid: string;\n  url: string;\n  password_pin?: string | null;\n  expires_at?: string | null;\n  /** True when the server shortened (or set) the expiry to honour its\n   *  max-TTL setting — the UI then shows the real date, not the request. */\n  expiry_clamped?: boolean;\n  max_downloads?: number | null;\n  downloads?: number;\n  created_at?: string;\n}\n\nexport interface UploadLimits {\n  max_upload_mb: number;\n}\n\nexport type ExternalServiceState = 'ok' | 'error' | 'disabled' | 'unknown';\n\nexport interface ExternalServiceStatus {\n  enabled: boolean;\n  state: ExternalServiceState;\n  url?: string;\n  last_check?: string;\n  detail?: string;\n}\n\n/**\n * One document type the SERVER can create, from `capabilities.newdoc_types`.\n *\n * ⚠ `requires` is the whole point of shipping this list instead of hardcoding\n * one in the client. The server knows it holds template bytes for `.docx`; it\n * does NOT know whether this deployment has a document server that can open\n * one. So it names the dependency and the client — which already resolves\n * OnlyOffice/drawio, config override included — answers it. A client that\n * re-derived \"docx needs OnlyOffice\" from a list of its own would be a second\n * source of truth, and the one that rots first.\n */\nexport interface NewDocType {\n  /** Extension without the dot, lowercase. Also the key the create call sends. */\n  ext: string;\n  /** Coarse family, used for the picker's section headings. */\n  group: 'document' | 'text' | 'diagram';\n  mime: string;\n  /** External service the editor for this type needs; absent = built-in. */\n  requires?: 'onlyoffice' | 'drawio';\n}\n\nexport interface Capabilities {\n  /** Document types this build can create. Absent on a server older than the\n   *  \"New document\" feature — hosts must treat that as \"offer nothing\". */\n  newdoc_types?: NewDocType[];\n  ffmpeg?: boolean;\n  ghostscript?: boolean;\n  libreoffice?: boolean;\n  onlyoffice_url?: string | null;\n  drawio_url?: string | null;\n  convert_url?: string | null;\n  max_chunk_mb?: number;\n  upload_limit_mb?: number;\n  /** Longest life a new share link may be given, in days (0 = no ceiling).\n   *  Read by the share dialogs so they offer only expiries the server keeps. */\n  share_max_ttl_days?: number;\n  /** Is the caller a person (`'user'` — a session OR their own API token) or an\n   *  integration (`'app'` — a host proxy, a bot, an MCP client)? The explorer\n   *  reads it to decide whether to draw the identity-bearing surfaces; see\n   *  ExplorerConfig.callerKind. Absent on a server older than the app/user\n   *  token split, which is why every reader treats \"missing\" as a person. */\n  caller_kind?: 'user' | 'app';\n  /** The address this deployment is reached at — only when it is real (the\n   *  operator configured it, or the request came in on a tenant's host).\n   *  Read by the connection guides; see `connectionsOrigin`. */\n  public_url?: string;\n  external?: {\n    onlyoffice?: ExternalServiceStatus;\n    drawio?: ExternalServiceStatus;\n    mermaid?: ExternalServiceStatus;\n  };\n  /* wiring:e2 */\n  /** Whether this installation holds an escrow key for E2E-encrypted folders,\n   *  and the public half the browser wraps new folders' master keys to.\n   *\n   *  Published on purpose. Escrow means the operator can open the folders you\n   *  create here without your password, and someone about to create one is\n   *  entitled to know that BEFORE they create it. Fixed at install time\n   *  (FILEX_INSTALLATION_E2E_ESCROW_KEY), so this answer never changes for a\n   *  running installation. */\n  e2e_escrow?: {\n    enabled: boolean;\n    /** Short id of the escrow key (SHA-256(SPKI)[:8], hex). */\n    kid?: string;\n    alg?: string;\n    /** Base64 SPKI. Public material — it can only seal, never open. */\n    public_key?: string;\n  };\n}\n\n/** Single source of truth for \"is the IdP/editor/diagram service ready?\".\n *  A capability is usable only when both flags say so — `enabled=true` but\n *  `state='error'` means an operator turned it on but a probe just failed,\n *  and we'd rather hide the entry than offer a button that 500s on click.\n */\nexport function isExternalUsable(s: ExternalServiceStatus | undefined): boolean {\n  return !!s && s.enabled && s.state === 'ok';\n}\n\nexport interface UploadInitResponse {\n  uploadId: string;\n  parts: Array<{ partNumber: number; presignedUrl: string }>;\n  expiresAt: string;\n  s3Key?: string;\n}\n\nexport interface UploadFinalizeResponse {\n  s3Key: string;\n  url?: string;\n}\n\nexport interface ArchiveEntry {\n  name: string;\n  size: number;\n  isDir: boolean;\n  lastModified?: number;\n}\n\nexport type ViewMode = 'list' | 'grid' | 'gallery'; /* wiring:d2 — the third view: gallery */\n\nexport interface ClipboardState {\n  mode: 'cut' | 'copy' | null;\n  items: FileNode[];\n  sourcePath: string | null;\n}\n\n/** A soft-deleted node as returned by the filex trash listing endpoint. */\nexport interface TrashEntry {\n  id: number;\n  storage_id: number;\n  storage_name?: string;\n  path: string;\n  name: string;\n  size: number;\n  mime?: string;\n  deleted_at: string;\n  ttl_days?: number | null;\n}\n","import type { LocaleCode } from '../types/ExplorerConfig';\n\n/** The locales this component actually has a catalogue for. */\nconst SUPPORTED: readonly LocaleCode[] = ['en', 'tr'];\n\n/**\n * The language filex falls back to when the host does not say.\n *\n * ⚠ It used to be `tr`, in eleven places. filex is an English-first\n * open-source product, so `<filex-explorer api-base=\"…\">` with no `locale`\n * rendered a Turkish UI to whoever installed it — and the web component\n * defaults `locale` to `''`, so \"no locale\" is the normal case for an embed.\n * The admin SPA never showed it because it always passes one.\n */\nconst FALLBACK: LocaleCode = 'en';\n\n/**\n * Resolve the locale to render in.\n *\n * Order, and the reasoning for it:\n *\n *   1. **What the host asked for.** An explicit `locale` always wins. A host\n *      that names a language has made a decision, and guessing over it would\n *      make the prop advisory.\n *   2. **What the browser asks for**, via `navigator.languages` /\n *      `navigator.language` — the same signal `Accept-Language` carries, and\n *      the reason a Turkish reader gets Turkish without the embedder doing\n *      anything.\n *   3. **`en`.**\n *\n * ⚠ Step 2 makes the same embed render differently for two people. That is\n * deliberate — it is what \"follow the browser\" means — but it also means a\n * screenshot, a test or a bug report about this component must state its\n * locale, because the component alone no longer determines it. Pass an\n * explicit `locale` anywhere the answer has to be stable.\n *\n * Matching is on the primary subtag, so `tr-TR` and `en-GB` resolve; anything\n * with no catalogue falls through rather than half-rendering.\n */\nexport function resolveLocale(explicit?: LocaleCode | '' | null): LocaleCode {\n  if (explicit && SUPPORTED.includes(explicit)) return explicit;\n  return detectLocale();\n}\n\n/**\n * The browser's preference, or `en`.\n *\n * ⚠ Guarded for a non-browser runtime: this package is imported by SSR and by\n * unit tests under Node, where `navigator` is absent — and an exception here\n * would take down the whole explorer over a language choice.\n */\nexport function detectLocale(): LocaleCode {\n  try {\n    const nav = typeof navigator === 'undefined' ? undefined : navigator;\n    if (!nav) return FALLBACK;\n    const wanted = nav.languages && nav.languages.length ? nav.languages : [nav.language];\n    for (const tag of wanted) {\n      if (!tag) continue;\n      const primary = String(tag).toLowerCase().split('-')[0] as LocaleCode;\n      if (SUPPORTED.includes(primary)) return primary;\n    }\n  } catch {\n    /* a hostile or exotic runtime is not a reason to fail to render */\n  }\n  return FALLBACK;\n}\n","/**\n * useFileApi — backend wrapper for the manager + ancillary endpoints.\n *\n * Two URL strategies, picked at construction time:\n *\n *   1. NEW (RESTful): caller passes `apiBase: 'https://files.example.com'`.\n *      The manager endpoint becomes `${apiBase}/api/files/manager` and\n *      every action uses `?action=…&path=…` as a query parameter (still\n *      Vuefinder-compatible — the same `?q=…` convention is accepted by\n *      the new Go backend, but `action` is the canonical name in v0.1+).\n *\n *   2. LEGACY (Vuefinder-compat): caller passes `endpoint:\n *      '/api/files/manager'` (and the rest of the per-route fields).\n *      Used by `@brftech/file-explorer` 0.1.0 embedders that have a\n *      Laravel/Filament backend already.\n *\n * Per-route fields (`uploadInit`, `shareCreate`, …) ALWAYS win over\n * the auto-derived `apiBase` URL — lets the caller mix and match.\n *\n * Auth normalisation is centralised here. The component code never\n * thinks about CSRF vs Bearer vs Basic — it just calls `index(path)`.\n */\n\nimport type { ExplorerConfig, AuthConfig, EndpointMap } from '../types/ExplorerConfig';\nimport { resolveLocale } from '../locales/resolve';\nimport type {\n  FileNode,\n  ShareInfo,\n  UploadLimits,\n  Capabilities,\n  ArchiveEntry,\n  TrashEntry,\n} from '../types/FileNode';\n\n/** Server-side PendingOp DTO (mirror of Modules\\FishApp\\Models\\PendingOp::toApiArray). */\nexport interface PendingOpDto {\n  id: number;\n  op_type: 'copy' | 'move' | 'delete';\n  status: 'pending' | 'running' | 'done' | 'error';\n  progress_total: number;\n  progress_done: number;\n  target_path: string | null;\n  source_dir: string | null;\n  source_count: number;\n  error_message: string | null;\n  started_at: string | null;\n  finished_at: string | null;\n  created_at: string | null;\n}\n\n/** Answer to `?action=newfile` — where the new document actually landed. */\nexport interface NewFileResponse {\n  /** Adapter-qualified path, ready to hand to the viewer. */\n  path: string;\n  /** Final basename, which may have gained the extension server-side. */\n  name: string;\n  ext: string;\n  size: number;\n  mime: string;\n}\n\nexport interface ManagerResponse {\n  adapter: string;\n  storages: string[];\n  dirname: string;\n  read_only: boolean;\n  /** RBAC effective level for the current user on this directory ('' when ACL\n   *  is not enforced on the storage). Gates the folder-level write actions. */\n  perm?: 'none' | 'viewer' | 'editor' | 'owner';\n  /* wiring:e2 — E2E-encrypted folder awareness: `e2e` is true when the listed\n   * dir IS an encrypted root; `e2e_root` is the adapter-qualified path of the\n   * nearest encrypted root covering this dir (set for the root itself AND for\n   * every subfolder inside the subtree). Absent on plain folders / old\n   * backends — consumers must stay undefined-safe. */\n  e2e?: boolean;\n  e2e_root?: string;\n  files: FileNode[];\n}\n\n/** A single ACL grant row (RBAC permissions panel). */\nexport interface Grant {\n  id: number;\n  storage_id: number;\n  path_prefix: string;\n  user_id: number;\n  level: 'viewer' | 'editor' | 'owner';\n  user_email?: string;\n  user_display_name?: string;\n  inherited?: boolean;\n}\n\n/** surucu:d1 — `GET /api/files/quota/me` (quota.Snapshot). */\nexport interface QuotaSnapshot {\n  used_bytes: number;\n  quota_bytes: number;\n  percent_used: number;\n  unlimited: boolean;\n}\n\nexport interface PermissionsResponse {\n  path: string;\n  storage_rbac: boolean;\n  direct: Grant[];\n  inherited: Grant[];\n  effective: string;\n}\n\nexport interface ResolveEmailResponse {\n  found: boolean;\n  user?: { id: number; email: string; display_name: string; role: string };\n}\n\nexport interface UserSuggestion {\n  id: number;\n  email: string;\n  display_name: string;\n  role: string;\n}\n\n/* === koru:k1 — version history (inspector panel) === */\n\n/** Mirrors backend `model.NodeVersion` (GET /api/files/versions?node_id=…). */\nexport interface NodeVersion {\n  id: number;\n  node_id: number;\n  version_n: number;\n  storage_key?: string;\n  size: number;\n  etag?: string;\n  created_at: string;\n}\nexport interface UserSearchResponse {\n  users: UserSuggestion[];\n}\n\n/* === calisma:d3 — node comments (inspector panel) === */\n\n/** Mirrors backend `model.NodeComment` (GET /api/files/comments?node_id=…). */\nexport interface NodeComment {\n  id: number;\n  node_id: number;\n  user_id: number;\n  body: string;\n  created_at: string;\n  updated_at?: string;\n  /** Joined author display name (email fallback), filled by the backend. */\n  author_name?: string;\n  /** Whether the CURRENT caller may delete this row (author or admin). */\n  can_delete?: boolean;\n}\n/* === /calisma:d3 === */\n\nexport interface InviteResponse {\n  mode: 'granted' | 'user_created' | 'shared';\n  user_id?: number;\n  url?: string;\n  temp_password?: string;\n  emailed: boolean;\n}\n\n/* === bul:s3 — global search (GET /api/files/search) === */\n\nexport type GlobalSearchScope = 'name' | 'content' | 'all';\n\n/**\n * One hit from the dedicated files-search endpoint. The backend returns raw\n * node rows (`{results: [...]}`), so `path` is the IN-STORAGE relative path\n * (no `adapter://` prefix) and the storage comes back as a numeric\n * `storage_id`. `snippet`/`matched` are the v0.2 \"Bul\" contract additions —\n * older backends simply omit them, so every consumer must stay\n * undefined-safe.\n */\nexport interface GlobalSearchHit {\n  id?: number;\n  storage_id?: number;\n  name?: string;\n  path?: string;\n  /** `file` | `dir` (backend NodeType). */\n  type?: string;\n  size?: number;\n  mime?: string;\n  /** Plain-text content snippet; matches wrapped in «» (never HTML). */\n  snippet?: string;\n  /** Where the hit matched: name | content | both. */\n  matched?: 'name' | 'content' | 'both';\n  [k: string]: unknown;\n}\n\n/**\n * Resolve a Vuefinder-compatible endpoint map from the user's config.\n * Either `apiBase` is set (auto-derive everything) or each route is\n * supplied explicitly (legacy). Mixed mode works too — explicit fields\n * trump the derived URL.\n */\nexport function resolveEndpoints(config: ExplorerConfig): EndpointMap {\n  // `apiBase: ''` (empty string) is a *valid* relative-root prefix —\n  // it produces URLs like `/api/files/copy`. Treat only `undefined`\n  // as \"no apiBase, legacy explicit-only mode\". Falsy boolean checks\n  // would silently drop relative-root callers and leave every derived\n  // endpoint null → \"endpoint not configured\" UI dead-ends.\n  const base =\n    config.apiBase != null ? config.apiBase.replace(/\\/+$/, '') : null;\n\n  function derive(path: string | undefined, autoSegment: string): string | null {\n    if (path) return path;\n    if (base === null) return null;\n    return `${base}${autoSegment}`;\n  }\n\n  // Manager URL is mandatory — pick the explicit `endpoint` first, then\n  // fall back to `${apiBase}/api/files/manager`.\n  const manager =\n    config.endpoint ??\n    (base !== null ? `${base}/api/files/manager` : null);\n\n  if (!manager) {\n    throw new Error(\n      \"[@brftech/filex-core] config requires either `apiBase` or `endpoint`\",\n    );\n  }\n\n  return {\n    manager,\n    // Staged (chunked + resumable) uploads — what useUploadChunked speaks on\n    // every driver. The {id} routes are derived from this one.\n    uploadBegin: derive(config.uploadBegin, '/api/files/upload/begin'),\n    uploadInit: derive(config.uploadInit, '/api/files/upload/init'),\n    uploadFinalize: derive(config.uploadFinalize, '/api/files/upload/finalize'),\n    uploadAbort: derive(config.uploadAbort, '/api/files/upload/abort'),\n    shareCreate: derive(config.shareCreate, '/api/files/share'),\n    shareList: derive(config.shareList, '/api/files/share'),\n    shareDelete: derive(config.shareDelete, '/api/files/share/{uuid}'),\n    limits: derive(config.limits, '/api/files/limits'),\n    capabilities: derive(config.capabilities, '/api/files/capabilities'),\n    archiveList: derive(config.archiveList, '/api/files/archive/list'),\n    archiveExtract: derive(config.archiveExtract, '/api/files/archive/extract'),\n    archiveAdd: derive(config.archiveAdd, '/api/files/archive/add'),\n    copy: derive(config.copy, '/api/files/copy'),\n    moveAsync: derive(config.moveAsync, '/api/files/move'),\n    deleteAsync: derive(config.deleteAsync, '/api/files/delete'),\n    opsList: derive(config.opsList, '/api/files/ops'),\n    opsShow: derive(config.opsShow, '/api/files/ops/{id}'),\n    onlyOfficeConfig: derive(config.onlyOfficeConfig, '/api/files/onlyoffice/config'),\n    saveText: derive(config.saveText, '/api/files/save-text'),\n    restore: derive(config.restore, '/api/files/restore'),\n    // filex trash: list soft-deleted nodes + restore one by node id.\n    trashList: derive(config.trashList, '/api/files/manager/trash'),\n    trashRestore: derive(config.trashRestore, '/api/files/manager/restore'),\n    /* wiring:e2 — escrow proof-of-possession, then the owner is told. */\n    e2eEscrowChallenge: derive(config.e2eEscrowChallenge, '/api/files/e2e/escrow/challenge'),\n    e2eEscrowUsed: derive(config.e2eEscrowUsed, '/api/files/e2e/escrow/used'),\n  };\n}\n\n/**\n * Resolve a possibly-async bearer token to a string. Caller passes\n * `auth.token` here so the auth header is fresh on every request.\n */\nasync function resolveToken(t: string | (() => string | Promise<string>)): Promise<string> {\n  if (typeof t === 'function') {\n    const out = t();\n    return out instanceof Promise ? await out : out;\n  }\n  return t;\n}\n\n/**\n * Normalise the legacy `{type: 'bearer'}` shape to the modern\n * `{kind: 'bearer'}` discriminator. Lets us write a single auth-header\n * builder downstream.\n */\nfunction normalizeAuth(auth: AuthConfig | undefined): { kind: 'bearer'; token: string | (() => string | Promise<string>) }\n  | { kind: 'csrf'; csrf: string }\n  | { kind: 'basic'; user: string; pass: string }\n  | { kind: 'none' } {\n  if (!auth) return { kind: 'none' };\n  if ('kind' in auth) return auth;\n  // Legacy shape — translate.\n  if (auth.type === 'bearer') return { kind: 'bearer', token: auth.token };\n  if (auth.type === 'csrf') return { kind: 'csrf', csrf: auth.csrf };\n  return { kind: 'none' };\n}\n\nexport function useFileApi(config: ExplorerConfig) {\n  const endpoints = resolveEndpoints(config);\n  const authConf = normalizeAuth(config.auth);\n\n  /**\n   * Last bearer value a function-token actually produced.\n   *\n   * ⚠ Exists for `authHeadersSync` only. A function token is resolved\n   * asynchronously (the desktop app fetches it from the main process per\n   * call), and a synchronous caller cannot wait for that — before this cache\n   * it simply emitted NO Authorization header, so the request went out\n   * anonymous and came back 401. Remembering the last value turns \"no\n   * credential at all\" into \"the credential we last held\", which is the\n   * difference between a dead feature and a stale-token retry.\n   */\n  let lastBearer: string | null = null;\n\n  async function authHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n    const h: Record<string, string> = { Accept: 'application/json', ...extra };\n    if (authConf.kind === 'bearer') {\n      const token = await resolveToken(authConf.token);\n      if (token) {\n        h.Authorization = `Bearer ${token}`;\n        lastBearer = token;\n      }\n    } else if (authConf.kind === 'csrf') {\n      h['X-CSRF-TOKEN'] = authConf.csrf;\n      h['X-Requested-With'] = 'XMLHttpRequest';\n    } else if (authConf.kind === 'basic') {\n      const creds = btoa(`${authConf.user}:${authConf.pass}`);\n      h.Authorization = `Basic ${creds}`;\n    }\n    return h;\n  }\n\n  /**\n   * Sync auth-header builder for the few callers that genuinely cannot await\n   * (XMLHttpRequest's `setRequestHeader` loop).\n   *\n   * ⚠ Prefer `authHeaders()`. A function token can only be *resolved*\n   * asynchronously, so this returns the last value one produced — which is\n   * nothing at all until the first async call has run. Measured on 2026-08-10\n   * in the desktop app: the OnlyOffice config POST, the starred list and the\n   * recently-opened POST all went out with no Authorization header and came\n   * back 401, because every one of them reached the API through this function.\n   */\n  function authHeadersSync(extra: Record<string, string> = {}): Record<string, string> {\n    const h: Record<string, string> = { Accept: 'application/json', ...extra };\n    if (authConf.kind === 'bearer') {\n      const token = typeof authConf.token === 'string' ? authConf.token : lastBearer;\n      if (token) h.Authorization = `Bearer ${token}`;\n    } else if (authConf.kind === 'csrf') {\n      h['X-CSRF-TOKEN'] = authConf.csrf;\n      h['X-Requested-With'] = 'XMLHttpRequest';\n    } else if (authConf.kind === 'basic') {\n      const creds = btoa(`${authConf.user}:${authConf.pass}`);\n      h.Authorization = `Basic ${creds}`;\n    }\n    return h;\n  }\n\n  function credentialsMode(): RequestCredentials {\n    return authConf.kind === 'csrf' ? 'include' : 'same-origin';\n  }\n\n  // Map an HTTP status to a short, human-readable message in the explorer's\n  // locale. The raw JSON body is attached as `.detail` for debugging but never\n  // shown in the toast (Ada, translated from Turkish: \"when it gives a 404/403\n  // or whatever, I see raw json\").\n  function statusMessage(status: number): string {\n    const tr = resolveLocale(config.locale) !== 'en';\n    const m: Record<number, [string, string]> = {\n      400: ['Geçersiz istek', 'Bad request'],\n      401: ['Oturum gerekli, tekrar giriş yapın', 'Sign-in required'],\n      403: ['Bu işlem için yetkiniz yok', 'You are not allowed to do this'],\n      404: ['Bulunamadı', 'Not found'],\n      409: ['Zaten var / çakışma', 'Already exists / conflict'],\n      413: ['Dosya çok büyük', 'File too large'],\n      415: ['Bu dosya türü desteklenmiyor', 'Unsupported file type'],\n      422: ['Geçersiz veri', 'Invalid data'],\n      429: ['Çok fazla istek, biraz bekleyin', 'Too many requests'],\n      500: ['Sunucu hatası', 'Server error'],\n      501: ['Bu işlem desteklenmiyor', 'Not supported'],\n      503: ['Servis şu an kullanılamıyor', 'Service unavailable'],\n    };\n    const e = m[status];\n    if (e) return tr ? e[0] : e[1];\n    return tr ? `Hata (${status})` : `Error (${status})`;\n  }\n\n  async function jsonFetch<T>(url: string, init: RequestInit = {}): Promise<T> {\n    const headers = {\n      ...(await authHeaders()),\n      ...((init.headers as Record<string, string> | undefined) ?? {}),\n    };\n    const res = await fetch(url, {\n      ...init,\n      headers,\n      credentials: credentialsMode(),\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      const err = new Error(statusMessage(res.status)) as Error & { status?: number; detail?: string };\n      err.status = res.status;\n      err.detail = text.slice(0, 300);\n      throw err;\n    }\n    // ⚠⚠ A 204 carries NO BODY, and several endpoints answer with one (every\n    // delete does). Parsing it throws \"Unexpected end of JSON input\" AFTER the\n    // server has already done the work, so the caller reports a failure for an\n    // operation that succeeded — measured 2026-08-16 in a browser: revoking an\n    // S3 access key deleted it on the server and left it on screen with an\n    // error under it, which invites the user to trust a credential that is\n    // gone. An empty success is a success.\n    if (res.status === 204 || res.status === 205) return undefined as T;\n    const body = await res.text();\n    if (!body) return undefined as T;\n    return JSON.parse(body) as T;\n  }\n\n  // --------------------------------------------------------------------\n  // Permissions (RBAC) — derived from the manager endpoint by swapping the\n  // trailing `/manager` for `/permissions`. Owner/admin only (backend gated).\n  // --------------------------------------------------------------------\n  function permissionsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/permissions');\n    return base + sub;\n  }\n  async function listPermissions(path: string): Promise<PermissionsResponse> {\n    return jsonFetch<PermissionsResponse>(permissionsUrl() + '?path=' + encodeURIComponent(path));\n  }\n  async function resolveEmail(email: string): Promise<ResolveEmailResponse> {\n    return jsonFetch<ResolveEmailResponse>(permissionsUrl('/resolve') + '?email=' + encodeURIComponent(email));\n  }\n  async function searchUsers(q: string): Promise<UserSearchResponse> {\n    return jsonFetch<UserSearchResponse>(permissionsUrl('/users') + '?q=' + encodeURIComponent(q));\n  }\n  async function addPermission(body: { path: string; user_id: number; level: string; is_dir?: boolean }): Promise<unknown> {\n    return jsonFetch(permissionsUrl(), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n  async function updatePermission(id: number, level: string): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/' + id), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ level }) });\n  }\n  async function deletePermission(id: number): Promise<unknown> {\n    return jsonFetch(permissionsUrl('/' + id), { method: 'DELETE' });\n  }\n  async function invitePermission(body: { path: string; email: string; level: string; create_user?: boolean; role?: string; is_dir?: boolean; locale?: string }): Promise<InviteResponse> {\n    return jsonFetch<InviteResponse>(permissionsUrl('/invite'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n  async function shareMail(body: { path: string; email?: string; emails?: string[]; url: string; pin?: string | null; expires_days?: number; locale?: string; is_dir?: boolean; size?: number; mode?: string }): Promise<{ emailed: boolean; sent?: string[]; failed?: string[] }> {\n    return jsonFetch<{ emailed: boolean; sent?: string[]; failed?: string[] }>(permissionsUrl('/share-mail'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });\n  }\n\n  // --------------------------------------------------------------------\n  // Manager contract — supports both `?q=action` (legacy) and\n  // `?action=action` (new) by emitting BOTH. Backends recognising one\n  // ignore the other; new backends prefer `action`.\n  // --------------------------------------------------------------------\n\n  function qs(params: Record<string, string | number | boolean | undefined>): string {\n    const sp = new URLSearchParams();\n    for (const [k, v] of Object.entries(params)) {\n      if (v === undefined || v === null) continue;\n      sp.set(k, String(v));\n    }\n    return sp.toString();\n  }\n\n  function managerUrl(action: string, params: Record<string, string | number | boolean | undefined> = {}): string {\n    const sep = endpoints.manager.includes('?') ? '&' : '?';\n    return `${endpoints.manager}${sep}${qs({ q: action, action, ...params })}`;\n  }\n\n  async function index(path: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('index', { path }));\n  }\n\n  async function search(path: string, filter: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('search', { path, filter }));\n  }\n\n  /* === bul:s3 — global \"search everywhere\" ===\n   * Derived from the manager endpoint by swapping `/manager` for `/search`\n   * (same trick permissionsUrl uses), so embedded proxies that forward the\n   * whole /api/files/* subtree keep working. Errors and legacy backends\n   * degrade to an empty result list — the palette just shows nothing. */\n  async function globalSearch(\n    query: string,\n    opts: { limit?: number; scope?: GlobalSearchScope } = {},\n  ): Promise<GlobalSearchHit[]> {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/search');\n    const sep = base.includes('?') ? '&' : '?';\n    const url = `${base}${sep}${qs({ q: query, limit: opts.limit, scope: opts.scope })}`;\n    const data = await jsonFetch<{ results?: GlobalSearchHit[] | null }>(url);\n    return Array.isArray(data?.results) ? data.results : [];\n  }\n\n  /* === surucu:d1 — the signed-in person's storage line ==================\n   * `GET /api/files/quota/me` → `{used_bytes, quota_bytes, percent_used,\n   * unlimited}` (internal/quota/service.go `Snapshot`). Derived from the\n   * manager endpoint the same way permissions and search are, so a proxy that\n   * forwards /api/files/* keeps working.\n   *\n   * ⚠ PER-USER, never per-storage: usage is `SUM(nodes.size) WHERE owner_id=me`\n   * and there is no per-provider quota. Anything labelling this figure with a\n   * drive's name is describing a number the server did not send.\n   *\n   * ⚠ Returns null rather than throwing on ANY failure — a server without the\n   * route (404), an app token with no person behind it (403) or an older build\n   * must leave the panel exactly as it was, not put an error where a status\n   * line goes.\n   */\n  async function quotaMe(): Promise<QuotaSnapshot | null> {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/quota/me');\n    try {\n      const q = await jsonFetch<QuotaSnapshot>(base);\n      return q && typeof q.used_bytes === 'number' ? q : null;\n    } catch {\n      return null;\n    }\n  }\n\n  async function subfolders(path: string): Promise<{ folders: FileNode[] }> {\n    return jsonFetch<{ folders: FileNode[] }>(managerUrl('subfolders', { path }));\n  }\n\n  async function newFolder(path: string, name: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('newfolder'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, name }),\n    });\n  }\n\n  /**\n   * Create an empty document of a known type in `path`.\n   *\n   * `type` is an extension from `capabilities.newdoc_types` — the registry the\n   * SERVER compiled in, not a list the client keeps. That matters for the\n   * office formats: a .docx is a ZIP of XML parts, so \"create an empty file\"\n   * has to be answered by whoever holds the template bytes, and the client\n   * cannot manufacture one.\n   *\n   * `name` may or may not already carry the extension; the server appends it\n   * when it is missing. Throws on a name collision (409 NAME_TAKEN) — the\n   * dialog warns first, but this is the check.\n   */\n  async function newFile(path: string, name: string, type: string): Promise<NewFileResponse> {\n    return jsonFetch<NewFileResponse>(managerUrl('newfile'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, name, type }),\n    });\n  }\n\n  async function rename(path: string, item: string, name: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('rename'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, item, name }),\n    });\n  }\n\n  async function move(path: string, items: string[], target: string): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('move'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, item: target, items: items.map((p) => ({ path: p })) }),\n    });\n  }\n\n  async function deleteItems(path: string, items: string[]): Promise<ManagerResponse> {\n    return jsonFetch<ManagerResponse>(managerUrl('delete'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, items: items.map((p) => ({ path: p })) }),\n    });\n  }\n\n  /** Server-side recursive copy (async — returns a PendingOp). */\n  async function copy(source: string[], target: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.copy) throw new Error('copy endpoint not configured');\n    return jsonFetch(endpoints.copy, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, target }),\n    });\n  }\n\n  async function moveAsync(source: string[], target: string, sourceDir?: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.moveAsync) throw new Error('moveAsync endpoint not configured');\n    return jsonFetch(endpoints.moveAsync, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, target, sourceDir }),\n    });\n  }\n\n  async function deleteAsync(source: string[], sourceDir?: string): Promise<{ op: PendingOpDto }> {\n    if (!endpoints.deleteAsync) throw new Error('deleteAsync endpoint not configured');\n    return jsonFetch(endpoints.deleteAsync, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source, sourceDir }),\n    });\n  }\n\n  async function restore(source: string[]): Promise<{ ok: boolean; restored: number }> {\n    if (!endpoints.restore) throw new Error('restore endpoint not configured');\n    return jsonFetch(endpoints.restore, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ source }),\n    });\n  }\n\n  /** filex trash listing — soft-deleted nodes across (or within) storages. */\n  async function listTrash(storageName?: string): Promise<{ entries: TrashEntry[]; total: number }> {\n    if (!endpoints.trashList) throw new Error('trashList endpoint not configured');\n    const base = endpoints.trashList;\n    const sep = base.includes('?') ? '&' : '?';\n    const url = storageName ? `${base}${sep}storage=${encodeURIComponent(storageName)}` : base;\n    return jsonFetch<{ entries: TrashEntry[]; total: number }>(url);\n  }\n\n  /**\n   * Restore soft-deleted nodes by their node id. The filex backend restores\n   * one node per call (`POST {node_id}`), so we fan out and tally successes.\n   *\n   * `taken` names the entries the server refused because something already\n   * holds their original path (409 `EXISTS`). That refusal is the server\n   * protecting the file that holds the name — a restore used to overwrite it —\n   * so it is reported by name rather than folded into \"0 items restored\",\n   * which would read as if nothing had been tried.\n   */\n  async function restoreIds(ids: number[]): Promise<{ restored: number; taken: string[] }> {\n    const url = endpoints.trashRestore;\n    if (!url) throw new Error('trashRestore endpoint not configured');\n    let restored = 0;\n    const taken: string[] = [];\n    for (const id of ids) {\n      try {\n        await jsonFetch(url, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ node_id: id }),\n        });\n        restored++;\n      } catch (err) {\n        const e = err as { status?: number; detail?: string };\n        if (e.status === 409) {\n          try {\n            const body = JSON.parse(e.detail ?? '') as { code?: string; name?: string };\n            if (body.code === 'EXISTS') taken.push(body.name || String(id));\n          } catch {\n            /* a 409 without the envelope is counted as a plain failure */\n          }\n        }\n        /* any other failure: skip it, report the count that succeeded */\n      }\n    }\n    return { restored, taken };\n  }\n\n  /**\n   * Legacy in-band multipart upload (small files / chunked endpoint\n   * absent). XMLHttpRequest because fetch doesn't expose upload\n   * progress on most browsers.\n   */\n  async function uploadMultipart(\n    path: string,\n    files: File[],\n    onProgress?: (p: number) => void,\n  ): Promise<ManagerResponse> {\n    const fd = new FormData();\n    fd.append('path', path);\n    for (const f of files) {\n      fd.append('file[]', f, f.name);\n    }\n    const headers = await authHeaders();\n    return new Promise<ManagerResponse>((resolve, reject) => {\n      const xhr = new XMLHttpRequest();\n      xhr.open('POST', managerUrl('upload'));\n      for (const [k, v] of Object.entries(headers)) {\n        if (k === 'Content-Type') continue;\n        xhr.setRequestHeader(k, v);\n      }\n      xhr.withCredentials = credentialsMode() === 'include';\n      xhr.upload.onprogress = (ev) => {\n        if (onProgress && ev.lengthComputable) {\n          onProgress(Math.round((ev.loaded / ev.total) * 100));\n        }\n      };\n      xhr.onload = () => {\n        if (xhr.status >= 200 && xhr.status < 300) {\n          try {\n            resolve(JSON.parse(xhr.responseText));\n          } catch (e) {\n            reject(e);\n          }\n        } else {\n          reject(new Error(`${xhr.status} ${xhr.statusText}: ${xhr.responseText.slice(0, 200)}`));\n        }\n      };\n      xhr.onerror = () => reject(new Error('Network error'));\n      xhr.send(fd);\n    });\n  }\n\n  function downloadUrl(path: string): string {\n    return managerUrl('download', { path });\n  }\n\n  function previewUrl(path: string): string {\n    return managerUrl('preview', { path });\n  }\n\n  /**\n   * Fetch a file body with the configured auth headers + credentials,\n   * returning the raw blob plus a normalized object URL viewers can mount\n   * directly. Used by the rich viewers (3D, EPUB, PDF, PSD, TIFF, …) which\n   * need an `ArrayBuffer` or a `Blob`-backed `objectURL` rather than the\n   * relative preview URL.\n   *\n   * Caller is responsible for revoking `url` (`URL.revokeObjectURL(url)`)\n   * once the viewer unmounts to avoid leaking the blob.\n   */\n  async function fetchBlob(\n    path: string,\n    opts: { fresh?: boolean } = {},\n  ): Promise<{ url: string; blob: Blob; mime: string }> {\n    const headers = await authHeaders();\n    const res = await fetch(previewUrl(path), {\n      headers,\n      credentials: credentialsMode(),\n      // ⚠ The preview endpoint answers `Cache-Control: private, max-age=60`,\n      // which is right for the thing it was built for — a viewer re-opening\n      // an image — and wrong for anything the client treats as CONTROL data.\n      // `.filex-e2e.json` is control data: after the client rewrites it\n      // (recovery upgrade, escrow slot, escrow refusal) the next read inside\n      // that minute came back PRE-write, so the folder looked un-upgraded\n      // and the question filex had just been answered was asked again.\n      // Measured 2026-09-05 in a real browser: decline the escrow offer,\n      // reopen the folder, and the offer was back.\n      cache: opts.fresh ? 'no-store' : 'default',\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw new Error(\n        `${res.status} ${res.statusText}${text ? ' — ' + text.slice(0, 200) : ''}`,\n      );\n    }\n    const blob = await res.blob();\n    const mime = blob.type || res.headers.get('content-type') || '';\n    const url = URL.createObjectURL(blob);\n    return { url, blob, mime };\n  }\n\n  /**\n   * Like `fetchBlob` but returns the raw bytes — viewers that need\n   * binary parsing (utif, ag-psd, pdfjs-dist) get the buffer directly\n   * without the extra `Blob → arrayBuffer` round trip.\n   */\n  async function fetchArrayBuffer(path: string): Promise<ArrayBuffer> {\n    const headers = await authHeaders();\n    const res = await fetch(previewUrl(path), {\n      headers,\n      credentials: credentialsMode(),\n    });\n    if (!res.ok) {\n      const text = await res.text().catch(() => '');\n      throw new Error(\n        `${res.status} ${res.statusText}${text ? ' — ' + text.slice(0, 200) : ''}`,\n      );\n    }\n    return res.arrayBuffer();\n  }\n\n  // --------------------------------------------------------------------\n  // Peripheral endpoints\n  // --------------------------------------------------------------------\n\n  async function limits(): Promise<UploadLimits> {\n    if (!endpoints.limits) return { max_upload_mb: 1024 };\n    return jsonFetch<UploadLimits>(endpoints.limits);\n  }\n\n  async function capabilities(): Promise<Capabilities> {\n    if (!endpoints.capabilities) {\n      return {\n        ffmpeg: false,\n        ghostscript: false,\n        libreoffice: false,\n        max_chunk_mb: 5,\n        upload_limit_mb: 1024,\n        onlyoffice_url: config.onlyOfficeBase ?? null,\n        drawio_url: config.drawioBase ?? null,\n        convert_url: config.convertBase ?? null,\n      };\n    }\n    return jsonFetch<Capabilities>(endpoints.capabilities);\n  }\n\n  /* wiring:e2 — escrow use is announced, not merely performed.\n   *\n   * Ask the server for a nonce sealed to the escrow public key; only the\n   * holder of the private half can read it back. Returning it is what earns\n   * the notification to the folder's owner — a bare \"I used escrow\" POST\n   * would be a string anyone could send.\n   *\n   * ⚠ This is an announcement, not a gate. An operator holding the private\n   * key can decrypt the folder offline with a script and never come here.\n   * docs/E2E-ENCRYPTION.md says so plainly and must keep saying so. */\n  async function e2eEscrowChallenge(\n    path: string,\n  ): Promise<{ id: string; challenge: string; kid: string }> {\n    if (!endpoints.e2eEscrowChallenge) throw new Error('e2e escrow endpoint not configured');\n    return jsonFetch(endpoints.e2eEscrowChallenge, {\n      method: 'POST',\n      body: JSON.stringify({ path }),\n    });\n  }\n\n  async function e2eEscrowUsed(payload: {\n    path: string;\n    id: string;\n    nonce: string;\n  }): Promise<{ ok: boolean; notified: boolean }> {\n    if (!endpoints.e2eEscrowUsed) throw new Error('e2e escrow endpoint not configured');\n    return jsonFetch(endpoints.e2eEscrowUsed, {\n      method: 'POST',\n      body: JSON.stringify(payload),\n    });\n  }\n\n  async function createShare(payload: {\n    path: string;\n    password?: boolean;\n    expires_at?: string | null;\n    max_downloads?: number | null;\n    // File-drop (public upload link) — kind:'drop' mints an upload link into a\n    // folder instead of a download link; drop_settings carries the caps.\n    kind?: string;\n    max_uploads?: number | null;\n    drop_settings?: Record<string, unknown> | null;\n  }): Promise<{ share: ShareInfo & { url: string; path: string; filename: string; kind?: string } }> {\n    if (!endpoints.shareCreate) throw new Error('shareCreate endpoint not configured');\n    return jsonFetch(endpoints.shareCreate, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n  }\n\n  async function listShares(path: string): Promise<{ shares: ShareInfo[] }> {\n    if (!endpoints.shareList) return { shares: [] };\n    const sep = endpoints.shareList.includes('?') ? '&' : '?';\n    return jsonFetch(`${endpoints.shareList}${sep}path=${encodeURIComponent(path)}`);\n  }\n\n  async function revokeShare(uuid: string): Promise<{ success: boolean }> {\n    if (!endpoints.shareDelete) throw new Error('shareDelete endpoint not configured');\n    const url = endpoints.shareDelete.replace('{uuid}', encodeURIComponent(uuid));\n    return jsonFetch(url, { method: 'DELETE' });\n  }\n\n  async function archiveList(path: string): Promise<{ entries: ArchiveEntry[] }> {\n    if (!endpoints.archiveList) throw new Error('archiveList endpoint not configured');\n    const raw = await jsonFetch<{ entries: Array<{ name: string; size: number; is_dir: boolean; mtime?: number }> }>(\n      endpoints.archiveList,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ path }),\n      },\n    );\n    return {\n      entries: raw.entries.map((e) => ({\n        name: e.name,\n        size: e.size,\n        isDir: e.is_dir,\n        lastModified: e.mtime,\n      })),\n    };\n  }\n\n  async function archiveExtract(path: string, members?: string[]): Promise<{ keys: string[]; count: number }> {\n    if (!endpoints.archiveExtract) throw new Error('archiveExtract endpoint not configured');\n    return jsonFetch(endpoints.archiveExtract, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, members }),\n    });\n  }\n\n  async function archiveAdd(path: string, files: Array<{ name: string; source: string }>): Promise<{ path: string }> {\n    if (!endpoints.archiveAdd) throw new Error('archiveAdd endpoint not configured');\n    return jsonFetch(endpoints.archiveAdd, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ path, files }),\n    });\n  }\n\n  /* === koru:k1 — version history (inspector panel) ===\n   * Derived from the manager endpoint by swapping `/manager` for `/versions`\n   * (same trick permissionsUrl/globalSearch use) so embedded proxies that\n   * forward the whole /api/files/* subtree keep working.\n   *   GET  /api/files/versions?node_id=N       → {versions, node_id}\n   *   POST /api/files/versions/restore         → {node_id, version_id, snapshot_current}\n   *   POST /api/files/versions/snapshot        → {node_id}   (may not exist on older backends)\n   */\n  function versionsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/versions');\n    return base + sub;\n  }\n  async function listVersions(nodeId: number): Promise<NodeVersion[]> {\n    const data = await jsonFetch<{ versions?: NodeVersion[] | null }>(\n      versionsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n    );\n    return Array.isArray(data?.versions) ? data.versions : [];\n  }\n  async function restoreVersion(\n    nodeId: number,\n    versionId: number,\n    snapshotCurrent = true,\n  ): Promise<void> {\n    await jsonFetch(versionsUrl('/restore'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        node_id: nodeId,\n        version_id: versionId,\n        snapshot_current: snapshotCurrent,\n      }),\n    });\n  }\n  async function snapshotVersion(nodeId: number): Promise<void> {\n    await jsonFetch(versionsUrl('/snapshot'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_id: nodeId }),\n    });\n  }\n  /* === /koru:k1 === */\n\n  /* === calisma:d3 — node comments (inspector panel) ===\n   * Same manager-URL derivation trick as versions/permissions so embedded\n   * proxies forwarding the whole /api/files/* subtree keep working.\n   *   GET    /api/files/comments?node_id=N → {comments, node_id}\n   *   POST   /api/files/comments           → {node_id, body}\n   *   DELETE /api/files/comments/{id}      → {ok}\n   */\n  function commentsUrl(sub = ''): string {\n    const base = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/comments');\n    return base + sub;\n  }\n  async function listComments(nodeId: number): Promise<NodeComment[]> {\n    const data = await jsonFetch<{ comments?: NodeComment[] | null }>(\n      commentsUrl() + '?node_id=' + encodeURIComponent(String(nodeId)),\n    );\n    return Array.isArray(data?.comments) ? data.comments : [];\n  }\n  async function addComment(nodeId: number, body: string): Promise<NodeComment> {\n    const data = await jsonFetch<{ comment: NodeComment }>(commentsUrl(), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ node_id: nodeId, body }),\n    });\n    return data.comment;\n  }\n  async function deleteComment(id: number): Promise<void> {\n    await jsonFetch(commentsUrl('/' + encodeURIComponent(String(id))), {\n      method: 'DELETE',\n    });\n  }\n  /* === /calisma:d3 === */\n\n  // Mint a short-lived WebSocket auth ticket for the realtime layer. Derived\n  // from the manager URL (so it flows through the same host proxy) and uses the\n  // same auth/creds as every other call. Returns null on any failure (a backend\n  // without the endpoint, a network error) so the caller falls back to polling.\n  async function wsTicket(): Promise<{ ticket: string; ws_url: string } | null> {\n    const url = endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/ws-ticket');\n    try {\n      return await jsonFetch<{ ticket: string; ws_url: string }>(url, { method: 'POST' });\n    } catch {\n      return null;\n    }\n  }\n\n  return {\n    // Realtime\n    wsTicket,\n    // Manager\n    index,\n    search,\n    globalSearch /* bul:s3 */,\n    quotaMe /* surucu:d1 */,\n    subfolders,\n    newFolder,\n    newFile,\n    rename,\n    move,\n    copy,\n    moveAsync,\n    deleteAsync,\n    deleteItems,\n    restore,\n    listTrash,\n    restoreIds,\n    uploadMultipart,\n    downloadUrl,\n    previewUrl,\n    fetchBlob,\n    fetchArrayBuffer,\n    // Peripheral\n    limits,\n    capabilities,\n    /* wiring:e2 */\n    e2eEscrowChallenge,\n    e2eEscrowUsed,\n    createShare,\n    listShares,\n    revokeShare,\n    archiveList,\n    archiveExtract,\n    archiveAdd,\n    // Version history (koru:k1 inspector)\n    listVersions,\n    restoreVersion,\n    snapshotVersion,\n    // Node comments (calisma:d3 inspector)\n    listComments,\n    addComment,\n    deleteComment,\n    // Permissions (RBAC panel)\n    listPermissions,\n    resolveEmail,\n    searchUsers,\n    addPermission,\n    updatePermission,\n    deletePermission,\n    invitePermission,\n    shareMail,\n    // Internals (exposed for useUploadChunked + PreviewModal)\n    endpoints,\n    authHeaders,\n    authHeadersSync,\n    credentialsMode,\n    jsonFetch,\n  };\n}\n\nexport type FileApi = ReturnType<typeof useFileApi>;\n","/**\n * uploadResume — where a browser upload writes down that it is not finished.\n *\n * A staged upload survives a dropped connection because the SERVER holds the\n * bytes and can be asked for its offset. What the browser has to survive is\n * itself: a reloaded tab, a closed laptop, a crashed renderer. None of those\n * reach the server, and without a note on disk the next visit has no idea an\n * upload id ever existed — so the same 4 GB starts again at zero, which is the\n * exact complaint this work exists to answer.\n *\n * The note is deliberately small and deliberately a hint:\n *\n *   - it stores the upload id, not the bytes. localStorage cannot hold a File,\n *     and the browser will not hand a File back without a fresh user gesture.\n *     Recovery is therefore \"pick the same file again and it continues\", not\n *     \"it silently continues\" — the honest shape, and the one the platform\n *     allows.\n *   - `offset` here is never used as a resume point. It is shown to the user\n *     (\"resuming at 62%\") and used to decide a session is worth asking about;\n *     the byte to continue from always comes from GET /api/files/upload/{id}.\n *\n * The fingerprint pins a record to one file: name, size and lastModified. A\n * different file with the same name must not inherit the session, because\n * appending its tail to the previous head is the one way a resumable upload\n * corrupts data.\n *\n * This lives in `packages/core` because it is not browser-chrome: the web\n * explorer, the desktop app's explorer and the work.example.com / fishapp embeds all\n * mount the same component, and an upload that resumes in one of them and not\n * the others would be two products again.\n */\n\nconst STORE_KEY = 'filex:uploads:v1';\n\n/** How long an unfinished record is worth keeping. The server sweeps its own\n *  staging after FILEX_UPLOAD_STAGING_TTL (24 h by default); a note that\n *  outlives the bytes it describes only produces a confusing \"resuming…\" that\n *  immediately restarts. */\nexport const RESUME_TTL_MS = 24 * 60 * 60 * 1000;\n\nexport interface ResumeRecord {\n  /** Server-side staged upload id. */\n  uploadId: string;\n  /** Destination directory, qualified (`adapter://sub/dir`). */\n  path: string;\n  name: string;\n  size: number;\n  /** File.lastModified — part of the identity, not metadata. */\n  lastModified: number;\n  chunkSize: number;\n  /** Last offset the server acknowledged. Display + triage only. */\n  offset: number;\n  updatedAt: number;\n}\n\n/** Identity of one (destination, file) pair. */\nexport function uploadFingerprint(\n  path: string,\n  file: { name: string; size: number; lastModified?: number },\n): string {\n  return [path, file.name, file.size, file.lastModified ?? 0].join('\\u0000');\n}\n\ntype Store = Record<string, ResumeRecord>;\n\n/** A Storage-shaped thing. Injected so tests (and any surface without\n *  localStorage — SSR, a locked-down embed) do not have to fake globals. */\nexport interface ResumeStorage {\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n}\n\n/** The default backing store, or null where the platform has none. Reading\n *  localStorage throws in a partitioned/blocked context, so the probe is a real\n *  try, not a typeof check. */\nexport function defaultResumeStorage(): ResumeStorage | null {\n  try {\n    if (typeof localStorage === 'undefined') return null;\n    localStorage.getItem(STORE_KEY);\n    return localStorage;\n  } catch {\n    return null;\n  }\n}\n\nfunction read(store: ResumeStorage | null): Store {\n  if (!store) return {};\n  try {\n    const raw = store.getItem(STORE_KEY);\n    if (!raw) return {};\n    const parsed = JSON.parse(raw) as Store;\n    return parsed && typeof parsed === 'object' ? parsed : {};\n  } catch {\n    // Corrupt payload: an upload that starts over is a far smaller problem\n    // than one that throws on every page load.\n    return {};\n  }\n}\n\nfunction write(store: ResumeStorage | null, data: Store): void {\n  if (!store) return;\n  try {\n    store.setItem(STORE_KEY, JSON.stringify(data));\n  } catch {\n    /* quota / private mode — resume degrades, uploads still work */\n  }\n}\n\n/** Drop records older than RESUME_TTL_MS. Returns what survived. */\nexport function pruneResume(store: ResumeStorage | null, now = Date.now()): Store {\n  const data = read(store);\n  let changed = false;\n  for (const [key, rec] of Object.entries(data)) {\n    if (!rec?.uploadId || now - (rec.updatedAt ?? 0) > RESUME_TTL_MS) {\n      delete data[key];\n      changed = true;\n    }\n  }\n  if (changed) write(store, data);\n  return data;\n}\n\n/** The record for this exact (destination, file), or null. */\nexport function loadResume(\n  store: ResumeStorage | null,\n  key: string,\n  now = Date.now(),\n): ResumeRecord | null {\n  const rec = pruneResume(store, now)[key];\n  return rec ?? null;\n}\n\nexport function saveResume(\n  store: ResumeStorage | null,\n  key: string,\n  rec: Omit<ResumeRecord, 'updatedAt'>,\n  now = Date.now(),\n): void {\n  const data = read(store);\n  data[key] = { ...rec, updatedAt: now };\n  write(store, data);\n}\n\nexport function clearResume(store: ResumeStorage | null, key: string): void {\n  const data = read(store);\n  if (key in data) {\n    delete data[key];\n    write(store, data);\n  }\n}\n\n/** Every unfinished upload this browser knows about, newest first. Surfaces\n *  use it to say \"you have an unfinished upload\" instead of forgetting. */\nexport function listResume(store: ResumeStorage | null, now = Date.now()): ResumeRecord[] {\n  return Object.values(pruneResume(store, now)).sort((a, b) => b.updatedAt - a.updatedAt);\n}\n","/**\n * useUploadChunked — chunked, resumable uploads for every browser surface.\n *\n * It speaks the STAGED protocol (docs/UPLOADS.md), which works on every storage\n * driver:\n *\n *   POST   /api/files/upload/begin      {path,name,size,mime?,hash?,chunk_size?}\n *                                       → {id, chunk_size, offset, total_size}\n *   PUT    /api/files/upload/{id}       Content-Range: bytes A-B/total + body\n *                                       → {offset, received, total_size, state}\n *   GET    /api/files/upload/{id}       → {offset, state, complete, …}\n *   POST   /api/files/upload/{id}/commit→ 202 {op_id, node_id}\n *   DELETE /api/files/upload/{id}       → abort + delete staging\n *\n * It used to speak the S3-presigned one (`/upload/{init,finalize,abort}`), which\n * needed the S3 driver — every other backend answered 501 — and on which filex\n * never saw the bytes at all. That path still exists on the server and is\n * untouched; nothing in the client calls it any more.\n *\n * Three properties are the point of the rewrite, and each is a test:\n *\n *  - **The offset comes from the server.** After any failure the client asks\n *    GET /upload/{id} rather than trusting its own counter. A chunk can fail\n *    after its bytes landed (the response was lost); re-sending is merely slow,\n *    assuming success is wrong.\n *  - **Progress is filex's ingest.** `uploadedBytes` counts bytes filex has\n *    acknowledged plus the in-flight chunk — not bytes handed to a socket, and\n *    not the backend's own write, which happens afterwards in the ops worker\n *    and shows as the `transferring` phase.\n *  - **A reload is resumable, not a restart.** The upload id is bookmarked in\n *    localStorage (lib/uploadResume). The browser will not hand a File back\n *    without a fresh gesture, so recovery is \"pick the same file and it\n *    continues from where filex stopped\", with `job.resumedFrom` set so the UI\n *    can say so rather than silently starting over.\n */\n\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { FileApi } from './useFileApi';\nimport {\n  clearResume,\n  defaultResumeStorage,\n  listResume,\n  loadResume,\n  saveResume,\n  uploadFingerprint,\n  type ResumeRecord,\n  type ResumeStorage,\n} from '../lib/uploadResume';\n\nexport interface UploadJob {\n  id: string; // local uuid\n  file: File;\n  path: string;\n  /** Server-side staged upload id, once `begin` has answered. */\n  uploadId?: string;\n  totalBytes: number;\n  /** Bytes filex has acknowledged (plus the chunk currently in flight). */\n  uploadedBytes: number;\n  percent: number;\n  status:\n    | 'pending'\n    | 'initializing'\n    | 'uploading'\n    /** Every byte is in filex; the commit is being accepted. */\n    | 'committing'\n    /** Committed and listed; the ops worker is writing it to the backend. */\n    | 'transferring'\n    | 'done'\n    | 'error'\n    | 'aborted';\n  /** Byte offset an interrupted session was picked up from, when it was. */\n  resumedFrom?: number;\n  /** Background transfer op, once the commit is accepted. */\n  opId?: number;\n  nodeId?: number;\n  error?: string;\n  cancel(): void;\n}\n\nexport interface UploadOptions {\n  path: string;\n  file: File;\n  chunkSize?: number;\n  onProgress?: (job: UploadJob) => void;\n  onDone?: (job: UploadJob, result: UploadResult) => void;\n  onError?: (job: UploadJob, err: Error) => void;\n  /**\n   * Wait for the backend transfer before resolving. Defaults to TRUE, because\n   * \"the server has the bytes\" and \"the storage has the bytes\" are different\n   * claims and only the second one is an upload.\n   *\n   * ⚠ It used to default to false and no caller ever set it, so the job went\n   * straight to `done` on the 202 — a transfer that failed afterwards in the\n   * ops worker left the user looking at a finished upload for a file that was\n   * never stored (issue #16: every file over the chunk threshold, on every S3\n   * backend). The `transferring` phase is short for a healthy storage and is\n   * the only place a failure can still be shown, so it is the default; pass\n   * false to opt out where the wait is genuinely unwanted.\n   */\n  waitForTransfer?: boolean;\n}\n\n/** What `commit` answers, plus the fields a caller wants afterwards. */\nexport interface UploadResult {\n  id: string;\n  op_id?: number;\n  node_id?: number;\n  path?: string;\n  transfer_state?: string;\n}\n\ninterface BeginResponse {\n  id: string;\n  chunk_size?: number;\n  chunkSize?: number;\n  offset?: number;\n  total_size?: number;\n}\n\ninterface StatusResponse {\n  id?: string;\n  offset?: number;\n  received?: number;\n  total_size?: number;\n  chunk_size?: number;\n  chunkSize?: number;\n  state?: string;\n  complete?: boolean;\n  error?: string;\n  op_id?: number;\n  node_id?: number;\n}\n\n/** Only a session still taking chunks can be continued. */\nfunction resumableState(state: string | undefined): boolean {\n  return !state || state === 'staging';\n}\n\n/** Error carrying \"this server has no staged path\" — the ONLY condition under\n *  which a caller may retry the file on the single-POST path. Any other\n *  failure has either sent bytes or been refused on the merits. */\nexport interface UnsupportedUploadError extends Error {\n  stagedUnsupported?: true;\n}\n\nfunction markUnsupported(err: Error): UnsupportedUploadError {\n  (err as UnsupportedUploadError).stagedUnsupported = true;\n  return err;\n}\n\n/** True when the staged protocol is simply not there. */\nexport function isStagedUnsupported(err: unknown): boolean {\n  return !!(err as UnsupportedUploadError)?.stagedUnsupported;\n}\n\nexport function useUploadChunked(\n  config: ExplorerConfig,\n  api: FileApi,\n  storage: ResumeStorage | null = defaultResumeStorage(),\n) {\n  /** Client-side default. The server's answer at `begin` is binding — this only\n   *  decides what to ask for and what counts as \"large enough to chunk\". */\n  const DEFAULT_CHUNK = config.chunkSize ?? 8 * 1024 * 1024;\n\n  /** Base of the staged routes, derived from the manager endpoint the same way\n   *  every other derived route is, so an embedder that passes only `endpoint`\n   *  still reaches them. */\n  function stagedBase(): string {\n    const explicit = api.endpoints.uploadBegin;\n    if (explicit) return explicit.replace(/\\/begin$/, '');\n    return api.endpoints.manager.replace(/\\/manager(\\?.*)?$/, '/upload');\n  }\n\n  /** Is the staged protocol reachable at all? */\n  function available(): boolean {\n    return !!stagedBase();\n  }\n\n  /** Files at or above this go chunked; smaller ones use the single-POST fast\n   *  path, which is fine for a 20 KB text file. */\n  function threshold(): number {\n    return DEFAULT_CHUNK;\n  }\n\n  function shouldChunk(file: { size: number }): boolean {\n    return available() && file.size > threshold();\n  }\n\n  /** The bookmark for this (destination, file), if there is one. Exposed so a\n   *  host can tell the user an upload is resumable BEFORE starting it. */\n  function resumableFor(path: string, file: File): ResumeRecord | null {\n    return loadResume(storage, uploadFingerprint(path, file));\n  }\n\n  /** Every unfinished upload this browser remembers. */\n  function listResumable(): ResumeRecord[] {\n    return listResume(storage);\n  }\n\n  /** Forget a bookmark and, best effort, drop the server-side staging with it. */\n  async function discardResumable(rec: ResumeRecord): Promise<void> {\n    clearResume(storage, uploadFingerprint(rec.path, { name: rec.name, size: rec.size, lastModified: rec.lastModified }));\n    try {\n      await api.jsonFetch(`${stagedBase()}/${encodeURIComponent(rec.uploadId)}`, { method: 'DELETE' });\n    } catch {\n      /* already gone, or being transferred — the sweeper handles the rest */\n    }\n  }\n\n  async function status(uploadId: string): Promise<StatusResponse> {\n    return api.jsonFetch<StatusResponse>(`${stagedBase()}/${encodeURIComponent(uploadId)}`);\n  }\n\n  async function uploadFile(opts: UploadOptions): Promise<UploadResult> {\n    const key = uploadFingerprint(opts.path, opts.file);\n\n    const job: UploadJob = {\n      id: crypto.randomUUID(),\n      file: opts.file,\n      path: opts.path,\n      totalBytes: opts.file.size,\n      uploadedBytes: 0,\n      percent: 0,\n      status: 'initializing',\n      cancel: () => {},\n    };\n\n    let cancelled = false;\n    let inFlight: XMLHttpRequest | null = null;\n    job.cancel = () => {\n      cancelled = true;\n      inFlight?.abort();\n    };\n\n    /** Acknowledged bytes; the in-flight chunk is added on top for display. */\n    let acked = 0;\n    function report(inflight = 0) {\n      job.uploadedBytes = Math.min(job.totalBytes, acked + inflight);\n      job.percent =\n        job.totalBytes > 0\n          ? Math.min(100, Math.round((job.uploadedBytes / job.totalBytes) * 100))\n          : job.status === 'done'\n            ? 100\n            : 0;\n      opts.onProgress?.(job);\n    }\n\n    try {\n      if (!available()) {\n        throw markUnsupported(new Error('staged upload endpoint not configured'));\n      }\n\n      const base = stagedBase();\n      let uploadId = '';\n      let chunkSize = opts.chunkSize ?? DEFAULT_CHUNK;\n\n      // ── resume, or begin ────────────────────────────────────────────────\n      const bookmark = loadResume(storage, key);\n      if (bookmark) {\n        try {\n          const st = await status(bookmark.uploadId);\n          if (resumableState(st.state) && (st.total_size ?? 0) === opts.file.size) {\n            uploadId = bookmark.uploadId;\n            chunkSize = st.chunk_size ?? st.chunkSize ?? bookmark.chunkSize;\n            acked = st.offset ?? 0;\n            job.resumedFrom = acked;\n          } else {\n            clearResume(storage, key);\n          }\n        } catch {\n          // Swept, aborted, or belongs to someone else now. Not a failure —\n          // `begin` below decides what happens next.\n          clearResume(storage, key);\n        }\n      }\n\n      if (!uploadId) {\n        let begun: BeginResponse;\n        try {\n          begun = await api.jsonFetch<BeginResponse>(`${base}/begin`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({\n              path: opts.path,\n              name: opts.file.name,\n              size: opts.file.size,\n              mime: opts.file.type || 'application/octet-stream',\n              // Asked for, not imposed: the server clamps this to its own\n              // limits and its answer is what the loop below uses.\n              chunk_size: opts.chunkSize ?? DEFAULT_CHUNK,\n            }),\n          });\n        } catch (err) {\n          // 404 = an older server with no staged routes; 501 = staging not\n          // configured on this instance. Both mean \"use the other path\", and\n          // both happen before a byte is sent, so the caller can safely fall\n          // back. Everything else is a real refusal (quota, permission, disk)\n          // and must be reported, NOT retried as a whole-file POST.\n          const st = (err as Error & { status?: number }).status;\n          if (st === 404 || st === 501) markUnsupported(err as Error);\n          throw err;\n        }\n        if (!begun?.id) throw new Error('begin returned no upload id');\n        uploadId = begun.id;\n        chunkSize = begun.chunk_size ?? begun.chunkSize ?? chunkSize;\n        acked = begun.offset ?? 0;\n      }\n\n      job.uploadId = uploadId;\n      job.status = 'uploading';\n      // Bookmarked BEFORE the first chunk: a tab closed between `begin` and the\n      // first PUT would otherwise leave a staging directory nobody can name.\n      saveResume(storage, key, {\n        uploadId,\n        path: opts.path,\n        name: opts.file.name,\n        size: opts.file.size,\n        lastModified: opts.file.lastModified,\n        chunkSize,\n        offset: acked,\n      });\n      report();\n\n      // ── chunks ──────────────────────────────────────────────────────────\n      const MAX_ATTEMPTS = 4;\n      while (acked < opts.file.size) {\n        if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n        const end = Math.min(acked + chunkSize, opts.file.size);\n        const blob = opts.file.slice(acked, end);\n\n        let next = -1;\n        let lastErr: Error | null = null;\n        for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n          if (attempt > 0) {\n            await sleep(300 * attempt + Math.floor(Math.random() * 150));\n            if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n            // Re-ask before re-sending: the previous attempt may have landed\n            // and lost only its response.\n            try {\n              const st = await status(uploadId);\n              if ((st.offset ?? 0) >= end) {\n                next = st.offset ?? end;\n                break;\n              }\n              if ((st.offset ?? 0) !== acked) {\n                acked = st.offset ?? acked;\n                report();\n                next = -2; // grid moved — recompute the slice\n                break;\n              }\n            } catch {\n              /* keep retrying the chunk itself */\n            }\n          }\n          try {\n            next = await putChunk(uploadId, blob, acked, end, opts.file.size);\n            break;\n          } catch (err) {\n            const e = err instanceof Error ? err : new Error(String(err));\n            if (cancelled || e.name === 'AbortError') throw e;\n            const st = (e as Error & { status?: number }).status;\n            // 403/404/413 will not become true by repeating them; a dropped\n            // body (400 SHORT_CHUNK) or a transient 5xx will.\n            if (st && st !== 400 && st !== 409 && st < 500) throw e;\n            lastErr = e;\n          }\n        }\n        if (next === -2) continue; // offset moved under us; re-slice\n        if (next < 0) throw lastErr ?? new Error('chunk upload failed');\n        if (next <= acked) throw new Error(`upload stalled at byte ${acked}`);\n        acked = next;\n        report();\n        saveResume(storage, key, {\n          uploadId,\n          path: opts.path,\n          name: opts.file.name,\n          size: opts.file.size,\n          lastModified: opts.file.lastModified,\n          chunkSize,\n          offset: acked,\n        });\n      }\n\n      if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n\n      // ── commit ──────────────────────────────────────────────────────────\n      job.status = 'committing';\n      report();\n      const result = await api.jsonFetch<UploadResult>(\n        `${base}/${encodeURIComponent(uploadId)}/commit`,\n        { method: 'POST' },\n      );\n      // Committed: the node is listed and the bytes are filex's problem now,\n      // so the bookmark has nothing left to recover.\n      clearResume(storage, key);\n      job.opId = result?.op_id;\n      job.nodeId = result?.node_id;\n\n      if (opts.waitForTransfer !== false && result?.op_id && api.endpoints.opsShow) {\n        job.status = 'transferring';\n        report();\n        await waitForOp(result.op_id);\n      }\n\n      job.status = 'done';\n      acked = job.totalBytes;\n      report();\n      opts.onDone?.(job, result);\n      return result;\n    } catch (err) {\n      const asError = err instanceof Error ? err : new Error(String(err));\n      job.status = asError.name === 'AbortError' ? 'aborted' : 'error';\n      job.error = asError.message;\n      report();\n\n      // A user-cancelled upload is meant to be gone; a failed one is meant to\n      // be resumable. So only the abort releases the server's staging — an\n      // error keeps both the staging directory and the bookmark, which is what\n      // makes the retry cost nothing.\n      if (job.uploadId && job.status === 'aborted') {\n        clearResume(storage, key);\n        try {\n          await api.jsonFetch(`${stagedBase()}/${encodeURIComponent(job.uploadId)}`, {\n            method: 'DELETE',\n          });\n        } catch {\n          /* swallow — the staging sweeper collects it either way */\n        }\n      }\n\n      opts.onError?.(job, asError);\n      throw asError;\n    }\n\n    /** One chunk, over XHR because fetch cannot report upload progress. */\n    function putChunk(\n      uploadId: string,\n      blob: Blob,\n      start: number,\n      end: number,\n      total: number,\n    ): Promise<number> {\n      return new Promise<number>((resolve, reject) => {\n        const xhr = new XMLHttpRequest();\n        inFlight = xhr;\n        xhr.open('PUT', `${stagedBase()}/${encodeURIComponent(uploadId)}`);\n        const headers = api.authHeadersSync({\n          'Content-Type': 'application/octet-stream',\n          'Content-Range': `bytes ${start}-${end - 1}/${total}`,\n        });\n        for (const [k, v] of Object.entries(headers)) xhr.setRequestHeader(k, v);\n        xhr.withCredentials = api.credentialsMode() === 'include';\n        xhr.upload.onprogress = (ev) => {\n          if (ev.lengthComputable) report(ev.loaded);\n        };\n        xhr.onload = () => {\n          inFlight = null;\n          if (xhr.status >= 200 && xhr.status < 300) {\n            try {\n              const body = JSON.parse(xhr.responseText) as StatusResponse;\n              resolve(body.offset ?? end);\n            } catch {\n              // A 2xx we cannot parse still means the bytes landed; the offset\n              // is re-read from the server rather than guessed.\n              resolve(end);\n            }\n            return;\n          }\n          const err = new Error(\n            `chunk ${start}-${end - 1} → ${xhr.status}`,\n          ) as Error & { status?: number; detail?: string };\n          err.status = xhr.status;\n          err.detail = xhr.responseText.slice(0, 200);\n          reject(err);\n        };\n        xhr.onerror = () => {\n          inFlight = null;\n          reject(new Error(`chunk ${start}-${end - 1}: network error`));\n        };\n        xhr.onabort = () => {\n          inFlight = null;\n          reject(new DOMException('Aborted', 'AbortError'));\n        };\n        xhr.send(blob);\n      });\n    }\n\n    /** Poll the shared ops tray until the transfer leaves the queue. */\n    async function waitForOp(opId: number): Promise<void> {\n      const tmpl = api.endpoints.opsShow;\n      if (!tmpl) return;\n      const url = tmpl.replace('{id}', String(opId));\n      let delay = 200;\n      // ⚠ A tray read that keeps failing must not park the upload in\n      // `transferring` for ever. One hiccup is not a verdict, but a row we\n      // cannot read at all (purged, or the endpoint is gone) is unknowable, so\n      // after a bounded run of failures the wait ends and the job settles the\n      // way it did before the wait existed — optimistic, but not hung.\n      let misses = 0;\n      for (;;) {\n        if (cancelled) throw new DOMException('Aborted by user', 'AbortError');\n        try {\n          const op = await api.jsonFetch<{ status?: string; error?: string }>(url);\n          if (op?.status === 'ok') return;\n          if (op?.status === 'failed' || op?.status === 'partial') {\n            throw new TransferFailedError(op.error || 'transfer failed');\n          }\n          misses = 0;\n        } catch (err) {\n          // ⚠ The verdict is told apart from the hiccup by TYPE, not by\n          // message. It used to be `message === 'transfer failed'`, which only\n          // matched when the server sent NO error text: the moment it sent a\n          // real one — which is every interesting failure — the throw above was\n          // swallowed here and the poll span for ever. Harmless while nothing\n          // set waitForTransfer; a hang the moment anything did.\n          if (err instanceof TransferFailedError || (err as Error).name === 'AbortError') throw err;\n          /* a hiccup reading the tray is not a failed transfer */\n          if (++misses >= MAX_OP_POLL_MISSES) return;\n        }\n        await sleep(delay);\n        delay = Math.min(delay * 2, 2000);\n      }\n    }\n  }\n\n  return {\n    uploadFile,\n    /** True when this file is big enough (and the endpoints exist) to chunk. */\n    shouldChunk,\n    /** The size at which chunking kicks in. */\n    threshold,\n    resumableFor,\n    listResumable,\n    discardResumable,\n  };\n}\n\n/** How many consecutive unreadable op polls end the transfer wait (~7s). */\nconst MAX_OP_POLL_MISSES = 6;\n\n/** The backend said the transfer failed — as opposed to \"I could not ask\". */\nclass TransferFailedError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'TransferFailedError';\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * useSelection — multi-select state with Ctrl/Shift semantics.\n *\n * click(path, {ctrl, shift})\n *   no-mod  → replace selection with [path]\n *   ctrl    → toggle path in selection\n *   shift   → range select from anchor to path\n */\n\nimport { ref, computed } from 'vue';\nimport type { FileNode } from '../types/FileNode';\n\nexport function useSelection(items: () => FileNode[]) {\n  const selected = ref<Set<string>>(new Set());\n  const anchor = ref<string | null>(null);\n\n  function click(path: string, mod: { ctrl?: boolean; shift?: boolean } = {}) {\n    if (mod.shift && anchor.value) {\n      const list = items();\n      const aIdx = list.findIndex((n) => n.path === anchor.value);\n      const bIdx = list.findIndex((n) => n.path === path);\n      if (aIdx === -1 || bIdx === -1) {\n        selected.value = new Set([path]);\n        anchor.value = path;\n        return;\n      }\n      const [lo, hi] = aIdx < bIdx ? [aIdx, bIdx] : [bIdx, aIdx];\n      const next = new Set<string>();\n      for (let i = lo; i <= hi; i++) next.add(list[i].path);\n      selected.value = next;\n      return;\n    }\n\n    if (mod.ctrl) {\n      const next = new Set(selected.value);\n      if (next.has(path)) next.delete(path);\n      else next.add(path);\n      selected.value = next;\n      anchor.value = path;\n      return;\n    }\n\n    selected.value = new Set([path]);\n    anchor.value = path;\n  }\n\n  function clear() {\n    selected.value = new Set();\n    anchor.value = null;\n  }\n\n  function selectAll() {\n    selected.value = new Set(items().map((n) => n.path));\n  }\n\n  function has(path: string): boolean {\n    return selected.value.has(path);\n  }\n\n  function add(path: string) {\n    const next = new Set(selected.value);\n    next.add(path);\n    selected.value = next;\n  }\n\n  function remove(path: string) {\n    const next = new Set(selected.value);\n    next.delete(path);\n    selected.value = next;\n  }\n\n  const size = computed(() => selected.value.size);\n  const isEmpty = computed(() => selected.value.size === 0);\n\n  const nodes = computed(() => {\n    const list = items();\n    return list.filter((n) => selected.value.has(n.path));\n  });\n\n  return { selected, anchor, click, clear, selectAll, has, add, remove, size, isEmpty, nodes };\n}\n","/**\n * useKeyboardShortcuts — binds FileExplorer's keyboard affordances.\n *\n * wiring:c2 — rewritten as a REGISTRY: every action is declared once\n * (id + default combo + i18n label + category) and the user may remap\n * the customizable ones. Overrides persist in localStorage under\n * `filex.shortcuts` as `{ \"<actionId>\": \"<combo>\" }` — only deviations\n * from the defaults are stored; an empty string means \"unbound\".\n *\n * Canonical combo format (also the display format): modifiers in\n * `Ctrl+Alt+Shift` order followed by a single key token, joined with\n * `+`. Key tokens: uppercase letters/digits, symbols as typed (`/`,\n * `?`), `F1`–`F12`, `Space`, `Enter`, `Esc`, `Del`, `Backspace`, `Tab`,\n * `Home`, `End`, `PgUp`, `PgDn` and arrows as `↑ ↓ ← →`. Meta (Cmd) is\n * folded into `Ctrl` so one saved combo works on macOS too. For\n * printable symbols Shift is omitted (`?` already encodes it).\n *\n * Activated whenever the explorer is mounted (only one instance per\n * page is expected). Skips events that originate inside form controls\n * so the user can type filenames in the search box, modals, etc.\n */\n\nimport { computed, onMounted, onBeforeUnmount, ref, type ComputedRef, type Ref } from 'vue';\n\nexport interface ShortcutHandlers {\n  onDelete?: () => void;\n  onRename?: () => void; // F2\n  onSelectAll?: () => void; // Ctrl+A\n  onCut?: () => void; // Ctrl+X\n  onCopy?: () => void; // Ctrl+C\n  onPaste?: () => void; // Ctrl+V\n  onOpen?: () => void; // Enter\n  onClose?: () => void; // Escape\n  onFocusSearch?: () => void; // /\n  onDuplicate?: () => void; // (unwired — kept for API compat)\n  onPathJump?: () => void; // Cmd+K / Ctrl+K\n  onGoUp?: () => void; // Alt+Up / Backspace (when nothing selected)\n  onShowHelp?: () => void; // ? (Shift+/ on most layouts)\n  onToggleInspector?: () => void; // i (koru:k1 details panel)\n  onToggleHidden?: () => void; // Ctrl+Shift+. — dot-file visibility\n  /* yildiz:s1 */\n  onStar?: () => void; // S — star / unstar the selection\n  onQuickLook?: () => void; // Space (wiring:c2 quick-look overlay)\n  /* wiring:d1 — tab strip actions */\n  onTabNew?: () => void; // Ctrl+T\n  onTabClose?: () => void; // Ctrl+W\n  onTabNext?: () => void; // Ctrl+Tab\n  onTabPrev?: () => void; // Ctrl+Shift+Tab\n  /* /wiring:d1 */\n  /* tus:t1 — the verbs that were only ever reachable from the menus. Every\n   * one of them is remappable like the rest; the ones that ship unbound are\n   * there so the user can give them a key, not because they do less. */\n  onNewFolder?: () => void; // Shift+N\n  onUpload?: () => void; // U\n  onRefresh?: () => void; // R\n  onDownload?: () => void; // D\n  onPreview?: () => void; // P\n  onShare?: () => void; // Shift+S\n  onTags?: () => void; // T\n  onConvert?: () => void; // (unbound)\n  onOpenTab?: () => void; // (unbound)\n  onCopyPath?: () => void; // (unbound)\n  onCopyId?: () => void; // (unbound)\n  onRestore?: () => void; // (unbound)\n  /* /tus:t1 */\n  hasSelection?: () => boolean; // disambiguates Backspace\n}\n\n// --------------------------------------------------------------------\n// Registry\n// --------------------------------------------------------------------\n\n/** One remappable action in the shortcut registry. */\nexport interface ShortcutActionDef {\n  /** Stable id — also the localStorage override key. */\n  id: string;\n  /** Default combo in canonical form. */\n  defaultCombo: string;\n  /**\n   * Extra built-in combos that also trigger the action but are NOT\n   * remappable (e.g. Backspace on go-up, which carries the\n   * selection-dependent dual behaviour). Shown in the help sheet and\n   * reserved in conflict detection.\n   */\n  fixedCombos?: string[];\n  labelKey: string;\n  groupKey: string;\n  /** false → the combo can't be remapped (Esc). Default true. */\n  customizable?: boolean;\n  /** false → don't preventDefault on match (Enter / Esc). Default true. */\n  prevent?: boolean;\n  /** true → fires even when focus sits in a form control (Esc). */\n  inForms?: boolean;\n}\n\n/**\n * Combos the BROWSER takes before the page sees them. `preventDefault()`\n * cannot stop these in an ordinary tab — Chrome and Firefox handle them at\n * the window level — so an action bound to one of them only ever fires in\n * the desktop app, an installed PWA or a kiosk window.\n *\n * They are not forbidden as DEFAULTS (the tab actions have shipped on\n * Ctrl+T/W/Tab since wiring:d1 and work in the desktop app), but the\n * settings modal refuses to let a user assign one: choosing a key that\n * silently does nothing where you are standing is not a choice, it is a\n * trap. `isReservedCombo` is the one place that list lives.\n */\nconst RESERVED_COMBOS = new Set([\n  'Ctrl+N', 'Ctrl+Shift+N',\n  'Ctrl+T', 'Ctrl+Shift+T',\n  'Ctrl+W', 'Ctrl+Shift+W',\n  'Ctrl+Tab', 'Ctrl+Shift+Tab',\n  'Ctrl+Q',\n  'Ctrl+Shift+I', 'Ctrl+Shift+J', 'Ctrl+Shift+C',\n  'F11', 'F12',\n]);\n\n/** Does the browser eat this combo before the page can see it? */\nexport function isReservedCombo(combo: string): boolean {\n  return RESERVED_COMBOS.has(combo);\n}\n\n/** Registry order = help/settings display order. */\nexport const SHORTCUT_ACTIONS: ShortcutActionDef[] = [\n  // Navigation\n  { id: 'palette', defaultCombo: 'Ctrl+K', labelKey: 'shortcuts.palette', groupKey: 'shortcuts.group.nav' },\n  { id: 'search', defaultCombo: '/', labelKey: 'shortcuts.search', groupKey: 'shortcuts.group.nav' },\n  { id: 'go-up', defaultCombo: 'Alt+↑', fixedCombos: ['Backspace'], labelKey: 'shortcuts.go_up', groupKey: 'shortcuts.group.nav' },\n  { id: 'open', defaultCombo: 'Enter', prevent: false, labelKey: 'shortcuts.open', groupKey: 'shortcuts.group.nav' },\n  { id: 'quicklook', defaultCombo: 'Space', labelKey: 'shortcuts.quicklook', groupKey: 'shortcuts.group.nav' },\n  { id: 'close', defaultCombo: 'Esc', customizable: false, prevent: false, inForms: true, labelKey: 'shortcuts.close', groupKey: 'shortcuts.group.nav' },\n  { id: 'inspector', defaultCombo: 'I', labelKey: 'shortcuts.inspector', groupKey: 'shortcuts.group.nav' } /* koru:k1 */,\n  { id: 'help', defaultCombo: '?', labelKey: 'shortcuts.help', groupKey: 'shortcuts.group.nav' },\n  { id: 'toggle-hidden', defaultCombo: 'Ctrl+Shift+.', labelKey: 'shortcuts.toggle_hidden', groupKey: 'shortcuts.group.nav' },\n  /* yildiz:s1 — starring is an action, so it belongs where the other verbs\n   * are. A bare letter like the inspector's `I`; the handler ignores events\n   * from form controls, so it never eats a keystroke meant for a filename. */\n  { id: 'star', defaultCombo: 'S', labelKey: 'shortcuts.star', groupKey: 'shortcuts.group.file' },\n  // Selection\n  { id: 'select-all', defaultCombo: 'Ctrl+A', labelKey: 'shortcuts.select_all', groupKey: 'shortcuts.group.selection' },\n  // File operations\n  { id: 'rename', defaultCombo: 'F2', labelKey: 'shortcuts.rename', groupKey: 'shortcuts.group.file' },\n  { id: 'delete', defaultCombo: 'Del', labelKey: 'shortcuts.delete', groupKey: 'shortcuts.group.file' },\n  { id: 'cut', defaultCombo: 'Ctrl+X', labelKey: 'shortcuts.cut', groupKey: 'shortcuts.group.file' },\n  { id: 'copy', defaultCombo: 'Ctrl+C', labelKey: 'shortcuts.copy', groupKey: 'shortcuts.group.file' },\n  { id: 'paste', defaultCombo: 'Ctrl+V', labelKey: 'shortcuts.paste', groupKey: 'shortcuts.group.file' },\n  /* wiring:d1 — tabs. Note: browsers reserve Ctrl+T/W/Tab in normal pages\n   * (preventDefault can't stop them there); they work in webcomponent/PWA/\n   * kiosk contexts and stay remappable through the settings modal. */\n  { id: 'tab-new', defaultCombo: 'Ctrl+T', labelKey: 'shortcuts.tab_new', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-close', defaultCombo: 'Ctrl+W', labelKey: 'shortcuts.tab_close', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-next', defaultCombo: 'Ctrl+Tab', labelKey: 'shortcuts.tab_next', groupKey: 'shortcuts.group.tabs' },\n  { id: 'tab-prev', defaultCombo: 'Ctrl+Shift+Tab', labelKey: 'shortcuts.tab_prev', groupKey: 'shortcuts.group.tabs' },\n  /* /wiring:d1 */\n  /* tus:t1 — the rest of the menu verbs. Until now these were reachable only\n   * by right-clicking, and the right-click menu named no keys at all, so 16 of\n   * the registry's actions were invisible unless somebody opened the `?` sheet\n   * on their own. The ones with no default are deliberate: they are rare\n   * enough that taking a key from the user by default is the wrong trade, and\n   * they are in the registry so the user can take one. */\n  { id: 'new-folder', defaultCombo: 'Shift+N', labelKey: 'shortcuts.new_folder', groupKey: 'shortcuts.group.file' },\n  { id: 'upload', defaultCombo: 'U', labelKey: 'shortcuts.upload', groupKey: 'shortcuts.group.file' },\n  { id: 'refresh', defaultCombo: 'R', labelKey: 'shortcuts.refresh', groupKey: 'shortcuts.group.nav' },\n  { id: 'download', defaultCombo: 'D', labelKey: 'shortcuts.download', groupKey: 'shortcuts.group.file' },\n  { id: 'preview', defaultCombo: 'P', labelKey: 'shortcuts.preview', groupKey: 'shortcuts.group.nav' },\n  { id: 'share', defaultCombo: 'Shift+S', labelKey: 'shortcuts.share', groupKey: 'shortcuts.group.file' },\n  { id: 'tags', defaultCombo: 'T', labelKey: 'shortcuts.tags', groupKey: 'shortcuts.group.file' },\n  { id: 'convert', defaultCombo: '', labelKey: 'shortcuts.convert', groupKey: 'shortcuts.group.file' },\n  { id: 'open-tab', defaultCombo: '', labelKey: 'shortcuts.open_tab', groupKey: 'shortcuts.group.tabs' },\n  { id: 'copy-path', defaultCombo: '', labelKey: 'shortcuts.copy_path', groupKey: 'shortcuts.group.file' },\n  { id: 'copy-id', defaultCombo: '', labelKey: 'shortcuts.copy_id', groupKey: 'shortcuts.group.file' },\n  { id: 'restore', defaultCombo: '', labelKey: 'shortcuts.restore', groupKey: 'shortcuts.group.file' },\n  /* /tus:t1 */\n];\n\n/** action id → ShortcutHandlers callback name. */\nconst HANDLER_KEY: Record<string, keyof ShortcutHandlers> = {\n  palette: 'onPathJump',\n  search: 'onFocusSearch',\n  'go-up': 'onGoUp',\n  open: 'onOpen',\n  quicklook: 'onQuickLook',\n  close: 'onClose',\n  inspector: 'onToggleInspector',\n  'toggle-hidden': 'onToggleHidden',\n  star: 'onStar' /* yildiz:s1 */,\n  help: 'onShowHelp',\n  'select-all': 'onSelectAll',\n  rename: 'onRename',\n  delete: 'onDelete',\n  cut: 'onCut',\n  copy: 'onCopy',\n  paste: 'onPaste',\n  /* wiring:d1 */\n  'tab-new': 'onTabNew',\n  'tab-close': 'onTabClose',\n  'tab-next': 'onTabNext',\n  'tab-prev': 'onTabPrev',\n  /* tus:t1 */\n  'new-folder': 'onNewFolder',\n  upload: 'onUpload',\n  refresh: 'onRefresh',\n  download: 'onDownload',\n  preview: 'onPreview',\n  share: 'onShare',\n  tags: 'onTags',\n  convert: 'onConvert',\n  'open-tab': 'onOpenTab',\n  'copy-path': 'onCopyPath',\n  'copy-id': 'onCopyId',\n  restore: 'onRestore',\n};\n\n// --------------------------------------------------------------------\n// Overrides (localStorage `filex.shortcuts`)\n// --------------------------------------------------------------------\n\nconst SHORTCUTS_LS_KEY = 'filex.shortcuts';\n\nfunction readOverrides(): Record<string, string> {\n  try {\n    const raw = localStorage.getItem(SHORTCUTS_LS_KEY);\n    if (!raw) return {};\n    const parsed = JSON.parse(raw) as unknown;\n    if (!parsed || typeof parsed !== 'object') return {};\n    const out: Record<string, string> = {};\n    for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n      if (typeof v === 'string' && SHORTCUT_ACTIONS.some((a) => a.id === k)) out[k] = v;\n    }\n    return out;\n  } catch {\n    return {};\n  }\n}\n\n// Module-level so the key handler, the \"?\" help sheet and the settings\n// modal all observe the same reactive mapping.\nconst overrides = ref<Record<string, string>>(readOverrides());\n\nfunction writeOverrides(): void {\n  try {\n    if (Object.keys(overrides.value).length === 0) localStorage.removeItem(SHORTCUTS_LS_KEY);\n    else localStorage.setItem(SHORTCUTS_LS_KEY, JSON.stringify(overrides.value));\n  } catch {\n    /* private mode / quota */\n  }\n}\n\nfunction defOf(id: string): ShortcutActionDef | undefined {\n  return SHORTCUT_ACTIONS.find((a) => a.id === id);\n}\n\n/** Current combo for an action ('' = unbound). */\nexport function effectiveCombo(id: string): string {\n  const o = overrides.value[id];\n  if (o !== undefined) return o;\n  return defOf(id)?.defaultCombo ?? '';\n}\n\n/** Set (or clear back to default) a user override. '' unbinds. */\nexport function setShortcutOverride(id: string, combo: string): void {\n  const def = defOf(id);\n  if (!def || def.customizable === false) return;\n  const next = { ...overrides.value };\n  if (combo === def.defaultCombo) delete next[id];\n  else next[id] = combo;\n  overrides.value = next;\n  writeOverrides();\n}\n\nexport function resetShortcut(id: string): void {\n  if (!(id in overrides.value)) return;\n  const next = { ...overrides.value };\n  delete next[id];\n  overrides.value = next;\n  writeOverrides();\n}\n\nexport function resetAllShortcuts(): void {\n  overrides.value = {};\n  writeOverrides();\n}\n\nexport interface ShortcutConflict {\n  id: string;\n  /** true → the clash is with a fixed (non-remappable) combo. */\n  fixed: boolean;\n}\n\n/**\n * Does `combo` already trigger another action? Checks both effective\n * combos and the reserved fixed combos (Backspace, Esc). Returns null\n * when free.\n */\nexport function findShortcutConflict(combo: string, excludeId: string): ShortcutConflict | null {\n  if (!combo) return null;\n  for (const def of SHORTCUT_ACTIONS) {\n    if (def.id === excludeId) continue;\n    if (def.fixedCombos?.includes(combo)) return { id: def.id, fixed: true };\n    if (effectiveCombo(def.id) === combo) return { id: def.id, fixed: def.customizable === false };\n  }\n  return null;\n}\n\n// --------------------------------------------------------------------\n// Event → canonical combo\n// --------------------------------------------------------------------\n\nconst KEY_TOKEN_MAP: Record<string, string> = {\n  ' ': 'Space',\n  Spacebar: 'Space',\n  Escape: 'Esc',\n  Delete: 'Del',\n  ArrowUp: '↑',\n  ArrowDown: '↓',\n  ArrowLeft: '←',\n  ArrowRight: '→',\n  PageUp: 'PgUp',\n  PageDown: 'PgDn',\n};\n\nconst MODIFIER_KEYS = new Set(['Control', 'Alt', 'Shift', 'Meta', 'AltGraph', 'CapsLock', 'NumLock', 'ScrollLock', 'Fn', 'Dead']);\n\nfunction keyToken(e: KeyboardEvent): string | null {\n  const k = e.key;\n  if (!k || MODIFIER_KEYS.has(k)) return null;\n  const mapped = KEY_TOKEN_MAP[k];\n  if (mapped) return mapped;\n  if (k.length === 1) {\n    const upper = k.toUpperCase();\n    // Letters normalize to uppercase; symbols pass through as typed.\n    return upper;\n  }\n  return k; // 'Enter', 'F2', 'Tab', 'Home', 'End', 'Backspace', …\n}\n\n/**\n * Canonical combo for a keyboard event, or null for a bare modifier\n * press. Meta folds into Ctrl; Shift is dropped for printable symbols\n * because the produced character already encodes it (`?` not `Shift+?`).\n */\nexport function comboFromEvent(e: KeyboardEvent): string | null {\n  const key = keyToken(e);\n  if (!key) return null;\n  const parts: string[] = [];\n  if (e.ctrlKey || e.metaKey) parts.push('Ctrl');\n  if (e.altKey) parts.push('Alt');\n  const printableSymbol = key.length === 1 && key.toUpperCase() === key.toLowerCase();\n  if (e.shiftKey && !printableSymbol) parts.push('Shift');\n  parts.push(key);\n  return parts.join('+');\n}\n\n// --------------------------------------------------------------------\n// Reactive views (help sheet + settings modal)\n// --------------------------------------------------------------------\n\nexport interface ShortcutView {\n  id: string;\n  /** Current (possibly remapped) combo, '' = unbound. */\n  combo: string;\n  /** Non-remappable extra combos (display + reservation only). */\n  fixedCombos: string[];\n  /** Display combos: [combo, ...fixedCombos] minus empties. */\n  keys: string[];\n  labelKey: string;\n  groupKey: string;\n  customizable: boolean;\n  overridden: boolean;\n}\n\n/** Reactive, override-aware view of the registry (registry order). */\nexport function useShortcutList(): ComputedRef<ShortcutView[]> {\n  return computed(() =>\n    SHORTCUT_ACTIONS.map((def) => {\n      const combo = effectiveCombo(def.id);\n      const fixed = def.fixedCombos ?? [];\n      return {\n        id: def.id,\n        combo,\n        fixedCombos: fixed,\n        keys: [combo, ...fixed].filter((c) => !!c),\n        labelKey: def.labelKey,\n        groupKey: def.groupKey,\n        customizable: def.customizable !== false,\n        overridden: overrides.value[def.id] !== undefined,\n      };\n    }),\n  );\n}\n\n// --------------------------------------------------------------------\n// Hint surfaces\n// --------------------------------------------------------------------\n\n/**\n * Is this a Mac-style keyboard? Only affects how a combo is PRINTED —\n * the canonical form folds Meta into Ctrl, so one saved combo works on\n * every platform and only the label differs.\n */\nexport function isMacLike(): boolean {\n  return (\n    typeof navigator !== 'undefined' &&\n    /mac|iphone|ipad|ipod/i.test(navigator.platform || navigator.userAgent || '')\n  );\n}\n\n/** Canonical combo → what a human should see. '' stays ''. */\nexport function comboLabel(combo: string): string {\n  if (!combo) return '';\n  return isMacLike() ? combo.replace(/\\bCtrl\\b/g, '⌘') : combo;\n}\n\n/**\n * Menu action key → registry action id.\n *\n * The right-click menu, the toolbar and the keyboard all name the same verbs,\n * but the menu's `key` and the registry's `id` are separate vocabularies and\n * two of them genuinely differ (`access` is the share dialog, `details` is the\n * inspector). One map, in one place: a second copy is a second chance to\n * forget, and the symptom would be a menu row that silently stops naming its\n * key while every other row keeps working.\n */\nexport const MENU_ACTION_SHORTCUTS: Record<string, string> = {\n  open: 'open',\n  'open-tab': 'open-tab',\n  preview: 'preview',\n  download: 'download',\n  convert: 'convert',\n  access: 'share',\n  details: 'inspector',\n  'copy-id': 'copy-id',\n  'copy-path': 'copy-path',\n  rename: 'rename',\n  cut: 'cut',\n  copy: 'copy',\n  paste: 'paste',\n  star: 'star',\n  tags: 'tags',\n  delete: 'delete',\n  restore: 'restore',\n  'new-folder': 'new-folder',\n  'toggle-hidden': 'toggle-hidden',\n  upload: 'upload',\n  refresh: 'refresh',\n};\n\n/**\n * What a menu row or a toolbar button should print beside its label: the\n * current combo for the verb it triggers, or '' when it has none (unbound, or\n * not a registry action at all — `keep-local`, the E2E entries and so on).\n */\nexport function menuShortcutHint(menuKey: string): string {\n  /* Fall back to the key itself: the toolbar's own buttons (go-up, upload,\n   * refresh…) pass a registry id directly, and an id nothing knows returns ''\n   * rather than throwing. */\n  const id = MENU_ACTION_SHORTCUTS[menuKey] ?? menuKey;\n  return SHORTCUT_ACTIONS.some((a) => a.id === id) ? shortcutHint(id) : '';\n}\n\n/**\n * The one way a hint may name a key.\n *\n * ⚠ Never write a key into a hint by hand — not in a template, not in a\n * locale string. Every combo in this registry is remappable, so a\n * hardcoded \"Ctrl+K\" is true only until someone opens the shortcut\n * settings, and then it is a label that tells the user to press a key\n * that does nothing. Call this instead and interpolate the result;\n * `web/tests/ui/shortcutHints.test.ts` fails the build on a literal.\n *\n * Returns '' when the action is unbound, so a caller can drop the whole\n * segment rather than print an empty key cap.\n */\nexport function shortcutHint(id: string): string {\n  return comboLabel(effectiveCombo(id));\n}\n\n/**\n * Does this event fire the given registry action? For overlays that\n * handle their own keys (the quick-look peek) rather than going through\n * the global binder — without this they keep answering to the DEFAULT\n * key after the user has remapped the action.\n */\nexport function eventMatchesShortcut(e: KeyboardEvent, id: string): boolean {\n  const combo = effectiveCombo(id);\n  if (!combo) return false;\n  const fired = comboFromEvent(e);\n  if (fired === combo) return true;\n  return defOf(id)?.fixedCombos?.includes(fired ?? '') ?? false;\n}\n\n/**\n * @deprecated Legacy static cheat-sheet shape (pre-registry). Kept for\n * API compatibility; use `useShortcutList()` for the live, remap-aware\n * list.\n */\nexport interface ShortcutDef {\n  keys: string[];\n  labelKey: string;\n  groupKey: string;\n}\n\n/** @deprecated See {@link useShortcutList}. Defaults only. */\nexport const SHORTCUTS: ShortcutDef[] = SHORTCUT_ACTIONS.map((def) => ({\n  keys: [def.defaultCombo, ...(def.fixedCombos ?? [])].filter((c) => !!c),\n  labelKey: def.labelKey,\n  groupKey: def.groupKey,\n}));\n\n// --------------------------------------------------------------------\n// Binding\n// --------------------------------------------------------------------\n\nexport function useKeyboardShortcuts(rootEl: Ref<HTMLElement | null>, handlers: ShortcutHandlers) {\n  // combo → action def, rebuilt when overrides change.\n  const comboMap = computed(() => {\n    const m = new Map<string, ShortcutActionDef>();\n    for (const def of SHORTCUT_ACTIONS) {\n      const c = effectiveCombo(def.id);\n      if (c) m.set(c, def);\n    }\n    return m;\n  });\n\n  function onKey(e: KeyboardEvent) {\n    const root = rootEl.value;\n    if (!root) return;\n\n    /* ui-fix — while a context menu is open, global shortcuts stay quiet\n     * (except Esc, which the menu scopes itself). Otherwise e.g. Delete\n     * opens a modal UNDER the menu backdrop and the UI wedges: the\n     * backdrop intercepts every click on the new dialog. */\n    if (e.key !== 'Escape' && document.querySelector('.fe-ctx-backdrop')) return;\n\n    // Skip when the event originates inside a form control — don't\n    // want `Delete` while editing a filename, `/` while typing in the\n    // search box, etc. Escape always goes through so modals can close.\n    const target = e.target as HTMLElement | null;\n    const inForm = !!(\n      target &&\n      (target.tagName === 'INPUT' ||\n        target.tagName === 'TEXTAREA' ||\n        target.tagName === 'SELECT' ||\n        target.isContentEditable)\n    );\n\n    const combo = comboFromEvent(e);\n    if (!combo) return;\n\n    // Backspace keeps its FIXED dual behaviour: delete when something is\n    // selected (file-manager convention), parent-dir navigation otherwise.\n    // Not remappable — the selection-dependent branch doesn't fit the\n    // one-combo-one-action registry model.\n    if (combo === 'Backspace') {\n      if (inForm) return;\n      if (handlers.hasSelection?.() && handlers.onDelete) {\n        e.preventDefault();\n        handlers.onDelete();\n      } else if (handlers.onGoUp) {\n        e.preventDefault();\n        handlers.onGoUp();\n      }\n      return;\n    }\n\n    const def = comboMap.value.get(combo);\n    if (!def) return;\n    if (inForm && !def.inForms) return;\n    // Space on a focused button/link must keep its native activation\n    // (quick-look would otherwise fire alongside the click).\n    if (\n      combo === 'Space' &&\n      target &&\n      typeof target.closest === 'function' &&\n      target.closest('button, a, select, summary, [role=\"button\"], [role=\"menuitem\"]')\n    ) {\n      return;\n    }\n    const fn = handlers[HANDLER_KEY[def.id]] as (() => void) | undefined;\n    if (!fn) return;\n    if (def.prevent !== false) e.preventDefault();\n    fn();\n  }\n\n  onMounted(() => window.addEventListener('keydown', onKey));\n  onBeforeUnmount(() => window.removeEventListener('keydown', onKey));\n}\n","/**\n * Locale message catalogue. The string-table is intentionally tiny — no\n * external i18n library, just a `t(key, vars?)` helper exposed via\n * `useLocale`.\n */\nimport { tr } from './tr';\nimport { en } from './en';\nimport type { LocaleCode } from '../types/ExplorerConfig';\n\nexport const messages: Record<LocaleCode, Record<string, string>> = { tr, en };\n\nexport { tr, en };\nexport { resolveLocale, detectLocale } from './resolve';\n","/** Turkish UI strings. */\nexport const tr: Record<string, string> = {\n  'toolbar.new_folder': 'Yeni klasör',\n  'toolbar.upload': 'Yükle',\n  'toolbar.search': 'Ara',\n  'toolbar.search.placeholder': 'Ada ya da tag: ile ara…',\n  'toolbar.view.list': 'Liste',\n  'toolbar.view.grid': 'Izgara',\n  'toolbar.refresh': 'Yenile',\n  'toolbar.go_up': 'Üst Klasör',\n\n  'ctx.open': 'Aç',\n  'ctx.preview': 'Önizle',\n  'ctx.download': 'İndir',\n  'ctx.convert': 'Dönüştür',\n  'ctx.rename': 'Yeniden adlandır',\n  'ctx.delete': 'Sil',\n  'ctx.delete_perm': 'Kalıcı Olarak Sil',\n  'ctx.restore': 'Geri Getir',\n  'ctx.share': 'Paylaş',\n  'ctx.move': 'Taşı',\n  'ctx.copy': 'Kopyala',\n  'ctx.cut': 'Kes',\n  'ctx.show_hidden': 'Gizli dosyaları göster',\n  'ctx.hide_hidden': 'Gizli dosyaları gizle',\n  'ctx.keep_local': 'Bilgisayarda tut',\n  'ctx.keep_online': 'Yalnızca çevrimiçi tut',\n  'ctx.keep_reveal': 'Yerel klasörü aç',\n  'ctx.keep_inherited': 'Üst klasörle bilgisayarda tutuluyor',\n  'keep.started': 'Bilgisayarda tutulacak — eşitleme başladı',\n  'keep.failed': 'Bilgisayarda tutulamadı',\n  'keep.badge_kept': 'Bilgisayarda',\n  'keep.badge_syncing': 'Eşitleniyor…',\n  'keep.badge_cloud': 'Yalnızca çevrimiçi',\n  'keep.badge_partial': 'İçinde bilgisayarda tutulanlar var',\n  'keep.strip_transfer': '{name} eşitleniyor — {done}/{total} (%{pct})',\n  'keep.strip_inventory': '{name} eşitleniyor — sunucu taranıyor…',\n  'keep.strip_settling': '{name} eşitleniyor — son durum kaydediliyor…',\n  'ctx.paste': 'Yapıştır',\n  'ctx.info': 'Bilgi',\n  'ctx.duplicate': 'Kopyasını Oluştur',\n  'ctx.new_file': 'Yeni dosya',\n\n  'modal.delete.title': 'Silinsin mi?',\n  'modal.delete.message': '{count} öğe çöpe atılacak.',\n  'modal.delete.message_one': '{count} öğe çöpe atılacak.',\n  'modal.delete.confirm': 'Çöpe At',\n  'modal.delete.cancel': 'Vazgeç',\n\n  'modal.rename.title': 'Yeniden adlandır',\n  'modal.rename.save': 'Kaydet',\n  'modal.rename.cancel': 'Vazgeç',\n\n  'modal.newfolder.title': 'Yeni klasör',\n  'modal.newfolder.placeholder': 'Klasör adı',\n  'modal.newfolder.create': 'Oluştur',\n  'modal.newfolder.cancel': 'Vazgeç',\n\n  'modal.share.title': 'Paylaşım Linki',\n  'modal.share.pin': 'PIN koruması',\n  'modal.share.expires': 'Son kullanma',\n  'modal.share.max_downloads': 'İndirme limiti',\n  'modal.share.create': 'Paylaş',\n  'modal.share.cancel': 'Vazgeç',\n  'modal.share.close': 'Kapat',\n  'modal.share.limit_applied': '(sunucu sınırı uygulandı)',\n  'modal.share.copy': 'Kopyala',\n  'modal.share.url_copied': 'Link kopyalandı',\n  'modal.share.pin_copied': 'PIN kopyalandı',\n  'modal.share.cli_copied': 'CLI komutu kopyalandı',\n\n  'upload.progress': 'Yükleniyor',\n  'upload.done': 'Tamamlandı',\n  'upload.error': 'Hata',\n  'upload.failed': '“{name}” yüklenemedi',\n  'upload.aborted': 'İptal edildi',\n  'upload.cancel': 'İptal',\n  'upload.resuming': '“{name}” %{percent} noktasından devam ediyor',\n  'upload.committing': 'Tamamlanıyor',\n  'upload.transferring': 'Depolamaya aktarılıyor',\n\n  'empty.folder': 'Bu klasör boş',\n  'empty.search': 'Sonuç bulunamadı',\n  'loading': 'Yükleniyor…',\n\n  'notFound.title': 'Klasör bulunamadı',\n  'notFound.desc': 'Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.',\n  'notFound.goRoot': 'Kök klasöre dön',\n\n  'col.name': 'Ad',\n  'col.size': 'Boyut',\n  'col.modified': 'Tarih',\n  'col.type': 'Tür',\n\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n\n  'breadcrumb.root': 'Kök',\n  'breadcrumb.copy_path': 'Yolu kopyala',\n  'breadcrumb.go_to_path': 'Yola git',\n  'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n  'ops.copy': 'Kopyalanıyor',\n  'ops.move': 'Taşınıyor',\n  'ops.delete': 'Siliniyor',\n  'ops.queued': 'sırada',\n  'ops.done': 'tamamlandı',\n  'ops.error': 'hata',\n\n  'node.trash': 'Çöp Kutusu',\n  'node.folder': 'Klasör',\n\n  // ——— Zengin önizleyici chrome ———\n  'viewer.open_in_new_tab': 'Yeni sekmede aç',\n  'viewer.loading': 'Yükleniyor…',\n  'viewer.failed_to_load': 'Dosya yüklenemedi',\n  'viewer.peer_not_installed': 'Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.',\n  'viewer.format_unsupported_3d': 'Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.',\n  'viewer.zoom_in': 'Yakınlaştır',\n  'viewer.zoom_out': 'Uzaklaştır',\n  'viewer.fit_width': 'Sayfa genişliğine sığdır',\n  'viewer.next_page': 'Sonraki sayfa',\n  'viewer.prev_page': 'Önceki sayfa',\n  'viewer.page_n_of_m': 'Sayfa {n} / {m}',\n  'viewer.tags': 'Etiketler',\n  'viewer.layers': 'Katmanlar',\n  'viewer.toc': 'İçindekiler',\n  'viewer.font_smaller': 'Yazıyı küçült',\n  'viewer.font_larger': 'Yazıyı büyüt',\n  'viewer.search': 'Ara',\n  'viewer.download': 'İndir',\n  'viewer.saving': 'Kaydediliyor…',\n  'viewer.save': 'Kaydet (Ctrl+S)',\n  'viewer.saved': 'Kaydedildi',\n  'viewer.save_error': 'Hata',\n  'viewer.editor_loading': 'Editör yükleniyor…',\n  'viewer.no_preview': 'Bu dosya tipi için önizleme henüz yok.',\n  'viewer.edit': 'Düzenle',\n  'viewer.close': 'Kapat',\n  'presence.expand': 'İsimleri göster',\n  'presence.collapse': 'Küçült',\n  'viewer.save_annotations': 'Açıklamaları kaydet',\n  'viewer.annotations_on': 'Açıklamalar: açık',\n  'viewer.annotations_off': 'Açıklamalar: kapalı',\n  'viewer.read_only': 'Salt okunur',\n  'viewer.csv_first_row_header': 'İlk satır başlık olsun',\n  'viewer.csv_filter': 'Satır filtrele…',\n  'viewer.epub_prev': 'Önceki',\n  'viewer.epub_next': 'Sonraki',\n  'viewer.drawio.disabled': 'diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL\\'yi ayarlamalı.',\n  'viewer.archive.entries': '{n} dosya',\n  'viewer.archive.entries_one': '{n} dosya',\n  'viewer.archive.empty': 'Arşiv boş.',\n  'viewer.archive.error': 'Arşiv okunamadı.',\n  'viewer.name': 'Ad',\n  'viewer.size': 'Boyut',\n\n  // ——— cila:a — sıralama / tarih grupları / yoğunluk ———\n  'col.sort': 'Sırala',\n  'group.today': 'Bugün',\n  'group.yesterday': 'Dün',\n  'group.this_week': 'Bu Hafta',\n  'group.this_month': 'Bu Ay',\n  'group.no_date': 'Tarihsiz',\n  'toolbar.density.compact': 'Sıkışık görünüm',\n  'toolbar.density.comfortable': 'Rahat görünüm',\n\n  // ——— cila:c — komut paleti + kısayol yardımı + breadcrumb ———\n  'palette.placeholder': 'Dosya, klasör veya komut ara…',\n  'palette.files': 'Dosyalar',\n  'palette.commands': 'Komutlar',\n  'palette.goto': 'Yola git',\n  'palette.empty': 'Sonuç bulunamadı',\n  'palette.hint': '↑↓ gezin · Enter seç · Esc kapat',\n  'cmd.view_toggle': 'Görünümü değiştir (liste ⇄ ızgara)',\n  'cmd.trash': 'Çöp kutusunu aç',\n  'shortcuts.title': 'Klavye Kısayolları',\n  'shortcuts.group.nav': 'Gezinme',\n  'shortcuts.group.selection': 'Seçim',\n  'shortcuts.group.file': 'Dosya işlemleri',\n  'shortcuts.palette': 'Komut paleti',\n  'shortcuts.search': 'Aramaya odaklan',\n  'shortcuts.go_up': 'Üst klasöre çık',\n  'shortcuts.open': 'Seçili öğeyi aç',\n  'shortcuts.close': 'Kapat / vazgeç',\n  'shortcuts.toggle_hidden': 'Gizli dosyaları göster/gizle',\n  'shortcuts.help': 'Bu yardım penceresi',\n  'shortcuts.select_all': 'Tümünü seç',\n  'shortcuts.star': 'Yıldızla / yıldızı kaldır',\n  'shortcuts.rename': 'Yeniden adlandır',\n  'shortcuts.delete': 'Sil',\n  'shortcuts.cut': 'Kes',\n  'shortcuts.copy': 'Kopyala',\n  'shortcuts.paste': 'Yapıştır',\n  'breadcrumb.more': 'Aradaki klasörler',\n\n  // ——— State screens + undo snackbar + connection badge (cila:b) ———\n  'empty.hint': 'Dosyaları buraya sürükleyip bırakın',\n  'empty.upload': 'Dosya yükle',\n  'empty.search.title': 'Aramanla eşleşen dosya yok',\n  'empty.search.hint': 'Farklı bir arama terimi deneyin',\n  'empty.trash.title': 'Çöp kutusu boş',\n  'error.title': 'Liste yüklenemedi',\n  'error.retry': 'Yeniden dene',\n  'toast.undo': 'Geri Al',\n  'toast.undone': 'Geri alındı',\n  'toast.undo_failed': 'Geri alınamadı',\n  'toast.renamed': 'Yeniden adlandırıldı',\n  'toast.moved': 'Taşındı',\n  'toast.trashed': 'Çöpe taşındı',\n  /* i18n:hardcoded — FileExplorer.vue'da düz string olarak duran, hiçbir dilin\n     değiştiremediği bildirim metinleri. */\n  'toast.failed': 'İşlem başarısız',\n  'toast.copied': 'Kopyalandı',\n  'toast.deleted': 'Silindi',\n  'toast.cut': 'Kesildi',\n  'toast.cut_ready': 'Kes → Yapıştır hazır',\n  'toast.copy_ready': 'Kopyala → Yapıştır hazır',\n  'toast.same_folder_cut': 'Aynı klasöre kesilemez',\n  'toast.restored': '{n} öğe geri getirildi',\n  'toast.restored_one': '{n} öğe geri getirildi',\n  'toast.restore_taken': '{n} öğe geri getirilmedi: aynı adla bir şey zaten var. Oradakinin adını değiştirip yeniden deneyin.',\n  'toast.restore_taken_one': '“{name}” geri getirilmedi: aynı adla bir şey zaten var. Oradakinin adını değiştirip yeniden deneyin.',\n  'toast.delete_queued': 'Silme kuyruğa alındı',\n  'toast.trash_retention': 'Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.',\n  'dropzone.hint': 'Dosyaları buraya bırak',\n  'modal.newfolder.invalid': 'Geçersiz karakter',\n  'viewer.office_unconfigured': 'OnlyOffice yapılandırması yok',\n  'viewer.pdf_inline_failed': 'Tarayıcı PDF\\'i inline açamadı.',\n  'viewer.too_large': 'Dosya çok büyük (>1 MB).',\n  'viewer.csv_rows': '{n} satır',\n  'viewer.csv_rows_one': '{n} satır',\n  'presence.others': '{n} kişi',\n  'presence.others_one': '{n} kişi',\n  'conn.offline': 'Canlı bağlantı yok — değişiklikler gecikebilir',\n  'conn.tooltip': 'Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.',\n\n  /* === bul:s3 === */\n  'palette.everywhere': 'Her yerde',\n  'palette.searching': 'Aranıyor…',\n  'palette.saved': 'Kayıtlı aramalar',\n  'palette.save': 'Aramayı kaydet',\n  'palette.saved.delete': 'Kayıtlı aramayı sil',\n  'search.in_content': 'İçerikte',\n\n  /* === bag:b4 === */\n  'toolbar.more': 'Diğer işlemler',\n  'toolbar.search.close': 'Aramayı kapat',\n  'sheet.menu': 'İşlemler',\n  'sheet.close': 'Kapat',\n\n  /* === koru:k1 === */\n  'toolbar.inspector': 'Ayrıntılar',\n  'ctx.details': 'Ayrıntılar',\n  /* yildiz:s1 — yıldızlamak bir eylem, menüde de öyle görünür. */\n  'ctx.star': 'Yıldızla',\n  'ctx.unstar': 'Yıldızı kaldır',\n  'star.failed': 'Yıldız değiştirilemedi',\n  'shortcuts.inspector': 'Ayrıntılar panelini aç/kapat',\n  'inspector.title': 'Ayrıntılar',\n  'inspector.copy_name': 'Adı kopyala',\n  'inspector.items': '{n} öğe',\n  'inspector.items_one': '{n} öğe',\n  'inspector.type': 'Tür',\n  'inspector.select_hint': 'Ayrıntılarını görmek için bir öğe seçin.',\n  /* pane:p1 — panel SON seçilen şeyi tutar (Burak'ın kararı, 2026-09-13);\n     dolayısıyla bölünmüş pencerenin bakılmayan yarısındaki bir öğeyi\n     anlatıyor olabilir. Bu satır hangisi olduğunu ve nerede durduğunu söyler. */\n  'inspector.held': 'Son seçilen — {where} içinde',\n  'inspector.close': 'Kapat',\n  'inspector.section.general': 'Genel',\n  'inspector.section.tags': 'Etiketler',\n  /* etiket:t1 — TagPicker'ın kendi çerçevesi. 2026-09-13'e kadar bu üçü\n     katalogdan bağımsız olarak İngilizce basılıyordu; `tags.open` ise çipin\n     yeni \"bu etiketi taşıyan her şeyi göster\" kapısı. */\n  'tags.open': 'Etiketi aç: {tag}',\n  'tags.add': '+ Etiket ekle',\n  'tags.name': 'Etiket adı',\n  'tags.remove': 'Etiketi kaldır',\n  'inspector.section.versions': 'Sürümler',\n  'inspector.section.permissions': 'İzinler',\n  'inspector.section.shares': 'Paylaşımlar',\n  'inspector.path': 'Yol',\n  'inspector.size': 'Boyut',\n  'inspector.modified': 'Değiştirilme',\n  'inspector.mime': 'MIME türü',\n  'inspector.etag': 'ETag',\n  'inspector.nodeId': 'Düğüm kimliği',\n  'inspector.copy': 'Kopyala',\n  'inspector.copied': 'Kopyalandı',\n  'inspector.error': 'Yüklenemedi',\n  'inspector.items_summary': '{n} öğe, toplam {size}',\n  'inspector.items_summary_one': '{n} öğe, toplam {size}',\n  'inspector.folder_items': '{n} öğe',\n  'inspector.folder_items_one': '{n} öğe',\n  'inspector.versions.empty': 'Sürüm geçmişi yok',\n  'inspector.versions.v': 'Sürüm {n}',\n  'inspector.versions.restore': 'Geri yükle',\n  'inspector.versions.restore_confirm': 'Bu sürüm geri yüklensin mi?',\n  'inspector.versions.snapshot_current': 'Önce şimdiki halin sürümünü al',\n  'inspector.versions.confirm': 'Onayla',\n  'inspector.versions.cancel': 'Vazgeç',\n  'inspector.versions.take_snapshot': 'Şimdiki halin sürümünü al',\n  'inspector.versions.restored': 'Sürüm geri yüklendi',\n  'inspector.versions.snapshotted': 'Sürüm alındı',\n  'inspector.versions.unsupported': 'Sunucu bu işlemi desteklemiyor',\n  'inspector.perm.none': 'Erişim yok',\n  'inspector.perm.viewer': 'Görüntüleyen',\n  'inspector.perm.editor': 'Düzenleyen',\n  'inspector.perm.owner': 'Sahip',\n  'inspector.perm.manage': 'İzinleri yönet',\n  'inspector.shares.empty': 'Paylaşım linki yok',\n  'inspector.shares.copy': 'Linki kopyala',\n\n  /* wiring:c1 — tema galerisi */\n  'theme.menu': 'Tema',\n  'theme.title': 'Tema Galerisi',\n  'theme.hint': 'Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.',\n  'theme.mode.label': 'Görünüm',\n  'theme.mode.light': 'Gündüz',\n  'theme.mode.dark': 'Gece',\n  'theme.mode.auto': 'Otomatik',\n  'theme.reset': 'Varsayılana dön',\n  'theme.close': 'Kapat',\n  'theme.selected': 'Seçili',\n  'theme.name.default': 'Varsayılan',\n  'theme.name.night': 'Gece Mavisi',\n  'theme.name.forest': 'Orman',\n  'theme.name.amber': 'Kehribar',\n  'theme.name.lilac': 'Leylak',\n  'theme.name.contrast': 'Yüksek Kontrast',\n  'theme.name.gray': 'Yumuşak Gri',\n  'theme.name.terminal': 'Terminal Yeşili',\n  /* === zaman:z3 — saat dilimi seçici (gömme penceresi + web ayarları) === */\n  'tz.menu': 'Saat dilimi',\n  'tz.title': 'Saat dilimi',\n  'tz.label': 'Tarihleri şu saatle göster',\n  'tz.search': 'Şehir, ülke ya da saat farkı arayın — “İstanbul” veya “GMT+3” deneyin',\n  'tz.default.device': 'Bu cihazın saat dilimini kullan ({zone})',\n  'tz.default.account': 'Hesabın saat dilimini kullan ({zone})',\n  'tz.default.host': 'Bu sitenin varsayılanını kullan ({zone})',\n  'tz.no_match': '“{query}” ile eşleşen saat dilimi yok. Bir şehir, bir ülke ya da GMT+3 gibi bir fark deneyin.',\n  'tz.more': '{n} kayıt daha var — listeyi daraltmak için yazmayı sürdürün.',\n  'tz.hint': 'Yalnızca bu tarayıcıda saklanır. Her tarih tek bir an olarak saklanır ve burada seçtiğiniz saatle gösterilir.',\n  'tz.now': '{zone} bölgesinde şu an: {time}',\n  /* === wiring:c2 — özelleştirilebilir kısayollar + hızlı bakış === */\n  'shortcuts.quicklook': 'Hızlı bakış',\n  'shortcuts.customize': 'Özelleştir',\n  'shortcuts.settings.menu': 'Kısayollar',\n  'shortcuts.settings.title': 'Kısayol Ayarları',\n  'shortcuts.settings.hint': 'Bir kısayolu değiştirmek için \"Değiştir\"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',\n  'shortcuts.settings.change': 'Değiştir',\n  'shortcuts.settings.capture': 'Tuşlara basın… (Esc iptal)',\n  'shortcuts.settings.reset': 'Varsayılana dön',\n  'shortcuts.settings.reset_all': 'Tümünü sıfırla',\n  'shortcuts.settings.unbound': 'Atanmadı',\n  'shortcuts.settings.fixed': 'Sabit',\n  'shortcuts.settings.customized': 'Özelleştirildi',\n  'shortcuts.settings.conflict': 'kombinasyonu \"{name}\" kısayolunda kullanılıyor.',\n  'shortcuts.settings.conflict_fixed': 'kombinasyonu \"{name}\" sabit kısayoluna ayrılmış — kullanılamaz.',\n  'shortcuts.settings.conflict_take': 'Eskisini boşa çıkar ve ata',\n  'shortcuts.settings.conflict_cancel': 'Vazgeç',\n  'quicklook.hint_close': 'kapat',\n  'quicklook.hint_nav': 'önceki/sonraki',\n  'quicklook.hint_open': 'aç',\n  /* === /wiring:c2 === */\n  /* === wiring:c3 — işlem merkezi === */\n  'opc.title': 'İşlemler',\n  'opc.aria_badge': '{n} işlem — işlem merkezini aç/kapat',\n  'opc.aria_badge_one': '{n} işlem — işlem merkezini aç/kapat',\n  'opc.close': 'Kapat',\n  'opc.active': 'Sürüyor',\n  'opc.history': 'Geçmiş',\n  'opc.clear': 'Temizle',\n  'opc.empty': 'İşlem yok',\n  'opc.cancel': 'İptal',\n  'opc.retry': 'Yeniden dene',\n  'opc.dismiss': 'Kapat',\n  'opc.queued': 'Sırada',\n  'opc.percent': '%{n}',\n  'opc.status.running': 'Sürüyor',\n  'opc.status.done': 'Bitti',\n  'opc.status.error': 'Hata',\n  'opc.status.aborted': 'İptal edildi',\n  'opc.kind.upload': 'Yükleme',\n  'opc.kind.copy': 'Kopyalama',\n  'opc.kind.move': 'Taşıma',\n  'opc.kind.delete': 'Silme',\n  'opc.kind.convert': 'Dönüştürme',\n  'opc.kind.archive': 'Arşiv',\n  /* === wiring:c4 — onboarding turu + erişilebilirlik + hata kartı === */\n  'tour.aria': 'Tanıtım turu',\n  'tour.restart': 'Turu tekrar başlat',\n  'tour.skip': 'Turu atla',\n  'tour.back': 'Geri',\n  'tour.next': 'İleri',\n  'tour.done': 'Bitti',\n  'tour.progress': '{n} / {m}',\n  'tour.step.nav.title': 'Depolar ve görünümler',\n  'tour.step.nav.desc':\n    'Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu hep bu panelde durur; altında da depoların ve bağlantıların. Sol üst köşedeki düğme paneli ince bir şeride indirir ve geri açar.',\n  'tour.step.nav.desc_closed':\n    'Bu düğme gezinti panelini açar: Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu; altında da depoların ve bağlantıların.',\n  'tour.step.new.title': 'Yeni bir şey ekle',\n  'tour.step.new.desc':\n    'Yeni olan her şey buradan başlar: bu cihazdan dosya yükleyebilir, klasör oluşturabilir ya da birinden dosya isteyebilirsin. Dosyaları pencereye sürükleyip bırakmak da yükler.',\n  'tour.step.new.desc_fab':\n    'Bu düğme bu cihazdan dosya yükler. Dosyaları pencereye sürükleyip bırakmak da çalışır.',\n  'tour.step.search.title': 'Arama',\n  'tour.step.search.desc':\n    'Bu alan deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani \"fatura 2026\" yazdığında fatura_2026.pdf gelir. tag:fatura yazarak etikete göre süzebilirsin. Yanındaki sürgü düğmesi gelişmiş aramayı, {palette} ise komut paletini açar; palet komut da çalıştırır.',\n  'tour.step.crumb.title': 'Bulunduğun yer',\n  'tour.step.crumb.desc':\n    'Bu iz, ekrandaki klasörün adresidir. Adımlardan birine tıklayarak üste çıkabilir, sonuncusunun yanındaki oktan içindeki klasörleri görebilirsin.',\n  'tour.step.filters.title': 'Listeyi daralt',\n  'tour.step.filters.desc':\n    'Tür, Kişiler, Değiştirilme ve Boyut bulunduğun klasörü süzer; yanındaki kutu yazdıkça adlara göre eşleşir, satırın sonundaki denetim ise sıralar.',\n  'tour.step.view.title': 'Görünümü değiştir',\n  'tour.step.view.desc':\n    'Bu klasörün nasıl çizildiğini değiştirir; seçimin hatırlanır.',\n  'tour.step.details.title': 'Ayrıntılar ve paylaşım',\n  'tour.step.details.desc':\n    'Bir dosyayı seçip bu paneli açtığında ayrıntılarını, hareketlerini ve paylaşım bağlantılarını görürsün. Tam menü için dosyaya sağ tıkla ya da satırının sonundaki düğmeyi kullan: oradaki \"Paylaş / İzinler\" ile PIN ve son kullanma süresi verilebilen bir bağlantı oluşturulur.',\n  'tour.step.help.title': 'Kısayollar',\n  'tour.step.help.desc':\n    '{help} tuşu kısayol kartını, {palette} komut paletini açar. Tema ve \"Turu tekrar başlat\" sağ üstteki \"Diğer işlemler\" menüsünde; hesabın ve çıkış ise yanındaki avatarın arkasında.',\n  'error.hint': 'Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.',\n  'error.details': 'Teknik ayrıntılar',\n  'col.star': 'Yıldız',\n  'toolbar.view_label': 'Görünüm',\n  'list.aria': 'Dosya listesi',\n  'grid.aria': 'Dosya ızgarası',\n\n  /* === wiring:d1 — sekmeler + split panel === */\n  'tabs.strip': 'Sekmeler',\n  'tabs.new': 'Yeni sekme',\n  'tabs.close': 'Sekmeyi kapat',\n  'tabs.split': 'Görünümü böl',\n  'tabs.split_off': 'Bölmeyi kapat',\n  'ctx.open_new_tab': 'Yeni sekmede aç',\n  'shortcuts.group.tabs': 'Sekmeler',\n  'shortcuts.tab_new': 'Yeni sekme',\n  'shortcuts.tab_close': 'Sekmeyi kapat',\n  'shortcuts.tab_next': 'Sonraki sekme',\n  'shortcuts.tab_prev': 'Önceki sekme',\n  /* tus:t1 — menü fiilleri */\n  'shortcuts.new_folder': 'Yeni klasör',\n  'shortcuts.upload': 'Dosya yükle',\n  'shortcuts.refresh': 'Listeyi yenile',\n  'shortcuts.download': 'İndir',\n  'shortcuts.preview': 'Önizle',\n  'shortcuts.share': 'Paylaş / izinler',\n  'shortcuts.tags': 'Etiketler',\n  'shortcuts.convert': 'Dönüştür',\n  'shortcuts.open_tab': 'Yeni sekmede aç',\n  'shortcuts.copy_path': 'Yolu kopyala',\n  'shortcuts.copy_id': 'Kimliği kopyala',\n  'shortcuts.restore': 'Çöp kutusundan geri al',\n  'shortcuts.settings.reserved':\n    'tarayıcı tarafından sayfaya ulaşmadan yakalanıyor, burada hiçbir şey yapmaz. Başka bir tuş seçin.',\n  'shortcuts.settings.reserved_badge': 'Yalnız masaüstü uygulamasında',\n  'shortcuts.settings.reserved_title':\n    'Bu kombinasyonu tarayıcının kendisi işliyor. Masaüstü uygulamasında ve kurulu PWA’da çalışır, tarayıcı sekmesinde çalışmaz.',\n  'cmd.tab_new': 'Yeni sekme aç',\n  'cmd.split_toggle': 'Görünümü böl / birleştir',\n  'split.pane': 'İkincil panel',\n  'split.close': 'Yan paneli kapat',\n  'split.error': 'Liste yüklenemedi',\n  'split.retry': 'Yeniden dene',\n  'split.copy_queued': 'Kopyalama kuyruğa alındı',\n  'split.move_queued': 'Taşıma kuyruğa alındı',\n  'toast.move_kept_both': 'Taşıma kuyruğa alındı. Hedefte aynı adla bir öğe vardı, taşınan öğe onun yanına “-copy” ekiyle konacak. Bu taşıma geri alınamaz.',\n  'split.cross_copy': 'Depolar farklı — kopyalama kuyruğa alındı',\n  'dragout.downloading': 'Bırakılan klasöre indiriliyor…',\n  'dragout.not_found': 'Bırakılan yer bulunamadı — dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz',\n  'dragout.done': 'İndirme tamamlandı',\n  'dragout.ready': 'Dosyalar hazır — masaüstüne sürükleyebilirsin',\n  'dragout.preparing': 'Sürükleme için hazırlanıyor…',\n  'split.cross_move': 'Depolar farklı — taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)',\n  /* === /wiring:d1 === */\n  /* wiring:d2 — galeri görünümü */\n  'toolbar.view.gallery': 'Galeri',\n  'gallery.aria': 'Dosya galerisi',\n  /* /wiring:d2 */\n  /* wiring:d3 — Yorumlar (inspector node comments) */\n  'inspector.section.comments': 'Yorumlar',\n  'inspector.comments.empty': 'Henüz yorum yok.',\n  'inspector.comments.placeholder': 'Yorum yaz…',\n  'inspector.comments.send': 'Gönder',\n  'inspector.comments.delete': 'Yorumu sil',\n  /* wiring:e2 — uçtan uca şifreli klasörler */\n  'e2e.create.title': 'Şifreli klasör oluştur',\n  'e2e.create.option': 'Şifreli klasör oluştur…',\n  'e2e.create.pw_label': 'Klasör parolası',\n  'e2e.create.pw_placeholder': 'En az 8 karakter',\n  'e2e.create.pw2_label': 'Parolayı tekrar girin',\n  'e2e.create.warn_title': 'GERİ DÖNÜŞÜ YOK',\n  'e2e.create.warn_body':\n    'Bu klasördeki dosyalar yalnız bu parolayla ya da klasör oluşturulurken bir kez gösterilen kurtarma anahtarıyla açılır. Parola sunucuda TUTULMAZ; kurtarma anahtarının da filex\\'te kopyası kalmaz. İkisini de kaybederseniz içerik sonsuza dek gider.',\n  'e2e.create.ack': 'Anladım: parolayı da kurtarma anahtarını da kaybedersem verilerim kurtarılamaz.',\n  'e2e.create.ack_required': 'Devam etmek için uyarıyı onaylayın.',\n  'e2e.create.pw_short': 'Parola en az 8 karakter olmalı.',\n  'e2e.create.pw_mismatch': 'Parolalar birbirini tutmuyor.',\n  'e2e.create.bad_name': 'Geçersiz klasör adı.',\n  'e2e.create.create': 'Şifreli klasörü oluştur',\n  'e2e.create.busy': 'Oluşturuluyor…',\n  'e2e.create.done': 'Şifreli klasör oluşturuldu',\n  'e2e.create.failed': 'Şifreli klasör oluşturulamadı',\n  'e2e.create.nested': 'Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.',\n  'e2e.locked.title': 'Bu klasör uçtan uca şifreli',\n  'e2e.locked.hint': 'İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.',\n  'e2e.locked.pw_placeholder': 'Klasör parolası',\n  'e2e.locked.unlock': 'Kilidi aç',\n  'e2e.locked.busy': 'Doğrulanıyor…',\n  'e2e.unlock.wrong': 'Parola yanlış.',\n  'e2e.unlock.marker_missing': 'Şifre dosyası (.filex-e2e.json) okunamadı.',\n  /* ikon:emoji — listedeki işaretin erişilebilir adı. Satır eskiden yalnız\n     bir 🔒 basıyordu; onun yerini alan asma kilit kutunun içinde\n     aria-hidden, dolayısıyla adı taşıyan yer bu. */\n  'e2e.badge': 'Şifreli klasör',\n  'e2e.strip.label': 'Şifreli klasör — kilit açık',\n  'e2e.strip.lock': 'Kilitle',\n  'e2e.locked_toast': 'Klasör kilitlendi',\n  'e2e.upload.too_big': '200 MB üstü dosyalar şifreli klasöre yüklenemez (MVP sınırı)',\n  'e2e.upload.locked': 'Önce klasörün kilidini açın',\n  'e2e.decrypting': 'Çözülüyor…',\n  'e2e.decrypt_failed': 'Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).',\n  /* wiring:e2 recovery — kurtarma anahtarı + yönetici escrow'u */\n  'e2e.create.escrow_title': 'Bu sunucunun da bir anahtarı var',\n  'e2e.create.escrow_body':\n    'Bu kurulumda anahtar emaneti (escrow) açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir. Escrow sunucu kurulurken sabitlenir; bir klasör için kapatılamaz.',\n  'e2e.locked.use_recovery': 'Parolayı mı kaybettiniz? Kurtarma anahtarı kullanın',\n  'e2e.recovery.title': 'Kurtarma anahtarınızı saklayın',\n  'e2e.recovery.title_upgraded': 'Kurtarma anahtarınız',\n  'e2e.recovery.lead':\n    'Bu anahtar klasörü parolasız açar. Yalnız bir kez gösterilir — filex bu anahtarı saklamaz ve bir daha gösteremez.',\n  'e2e.recovery.lead_upgraded':\n    'Bu klasörün artık bir kurtarma anahtarı var. Klasörü parolasız açar, yalnız bir kez gösterilir ve filex\\'te kopyası kalmaz.',\n  'e2e.recovery.copy': 'Kopyala',\n  'e2e.recovery.copied': 'Kopyalandı',\n  'e2e.recovery.download': 'Dosya olarak indir',\n  'e2e.recovery.warn_title': 'BUNU PAROLA GİBİ SAKLAYIN',\n  'e2e.recovery.warn_body':\n    'Bu anahtarı eline geçiren herkes klasörü okuyabilir. Parolanızdan ayrı bir yerde tutun — parolanın yanında duran bir anahtar sizi unutmaya karşı korur, başkasına karşı değil.',\n  'e2e.recovery.escrow_title': 'Bu sunucunun da bir anahtarı var',\n  'e2e.recovery.escrow_body':\n    'Bu kurulumda anahtar emaneti açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir.',\n  'e2e.recovery.escrow_kid': 'Emanet anahtarı',\n  'e2e.recovery.ack': 'Bu anahtarı güvenli bir yere kaydettim.',\n  'e2e.recovery.done': 'Tamam',\n  'e2e.recover.title': 'Parolasız kilit açma',\n  'e2e.recover.none':\n    'Bu klasör kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden anahtarı yok. Tek giriş yolu parolası. Bir kez parolayla açın, filex kurtarma anahtarı eklemeyi önerecek.',\n  'e2e.recover.tab_recovery': 'Kurtarma anahtarı',\n  'e2e.recover.tab_escrow': 'Emanet anahtarı',\n  'e2e.recover.recovery_hint': 'Klasör oluşturulurken bir kez gösterilen anahtar.',\n  'e2e.recover.recovery_placeholder': 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX',\n  'e2e.recover.escrow_warn_title': 'Klasörün sahibine haber gidecek',\n  'e2e.recover.escrow_warn_body':\n    'Emanet anahtarıyla açılan klasörün sahibine bildirim gönderilir. Yalnız yetkiniz olduğunda kullanın.',\n  'e2e.recover.escrow_kid': 'Emanet anahtarı',\n  'e2e.recover.escrow_predates':\n    'Bu kurulumun emanet anahtarı var ama bu klasörün yok. Klasör, emanet burada açılmadan önce oluşturulmuş; ana anahtarı emanet kimliğine hiç sarmalanmadı. Emanet anahtarı bu klasörü açmaz. İşletmecinin yapabileceği hiçbir şey bunu değiştirmez — sarmalama için klasörün parolası gerekir ve sunucu onu hiçbir zaman görmedi. Klasörün sahibi verebilir: parolayla kilidi açıp işletmeciye anahtar vermeyi seçebilir. O yapılana kadar parolayı ya da kurtarma anahtarını kullanın.',\n  'e2e.recover.escrow_other_key':\n    'Bu klasör BAŞKA bir kurulumun emanet anahtarını taşıyor. Başka yerde oluşturulup buraya geri yüklenmiş, bu yüzden bu kurulumun emanet anahtarı onu açmaz. Yalnızca sarmalandığı emanet anahtarının özel yarısı açabilir.',\n  'e2e.recover.escrow_placeholder': 'Emanet özel anahtarını yapıştırın (PKCS#8, base64 ya da PEM)',\n  'e2e.recover.bad_format':\n    'Bu bir kurtarma anahtarına benzemiyor. Dörtlü sekiz grup, toplam 32 karakter olmalı.',\n  'e2e.recover.escrow_required': 'Emanet özel anahtarını yapıştırın.',\n  'e2e.recover.wrong_recovery': 'Bu kurtarma anahtarı bu klasörü açmıyor.',\n  'e2e.recover.wrong_escrow':\n    'Bu emanet anahtarı bu klasörü açmıyor. Escrow açılmadan önce oluşturulmuş klasörlerin emanet anahtarı yoktur ve sonradan da eklenemez.',\n  'e2e.recover.bad_escrow_key': 'Bu okunabilir bir özel anahtar değil (PKCS#8, base64 ya da PEM bekleniyor).',\n  'e2e.recover.notify_failed':\n    'Klasör sahibine bildirim gönderilemedi, bu yüzden kilit açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.',\n  'e2e.recover.recovery_done': 'Kurtarma anahtarıyla açıldı',\n  'e2e.recover.escrow_done': 'Emanet anahtarıyla açıldı — klasör sahibine bildirildi',\n  'e2e.recover.unlock': 'Kilidi aç',\n  'e2e.recover.busy': 'Açılıyor…',\n  'e2e.escrowoffer.title': 'İşletmeciye bu klasörün anahtarı verilsin mi?',\n  'e2e.escrowoffer.body':\n    'Bu klasör, burada anahtar emaneti açılmadan önce oluşturulmuş; bu yüzden kurulumun işletmecisi onu açamıyor. Şu anda — parolanız bellekteyken — filex bu klasörü emanet anahtarına sarmalayabilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz; yalnızca anahtar dosyası değişir.',\n  'e2e.escrowoffer.consequence':\n    'Bunun anlamı: işletmeci, parolanız olmadan bu klasöre giren ikinci ve kalıcı bir yol kazanır. O anahtar kullanıldığında size bildirim gelir, ama bu bildirim bir denetim değil yalnızca bir duyurudur.',\n  'e2e.escrowoffer.learn_more': 'Emanet anahtarı neyi yapar, neyi yapamaz',\n  'e2e.escrowoffer.password_label': 'Klasör parolası',\n  'e2e.escrowoffer.password_required': 'Klasör parolasını girin.',\n  'e2e.escrowoffer.wrong_password': 'Bu, bu klasörün parolası değil.',\n  'e2e.escrowoffer.accept': 'İşletmeciye anahtar ver',\n  'e2e.escrowoffer.decline': 'Hayır, bende kalsın',\n  'e2e.escrowoffer.cancel': 'Vazgeç',\n  'e2e.escrowoffer.busy': 'Sarmalanıyor…',\n  'e2e.escrowoffer.done': 'İşletmeci artık bu klasörü emanet anahtarıyla açabilir',\n  'e2e.escrowoffer.declined_toast': 'Sizde kaldı. filex bu klasör için bir daha sormayacak.',\n  'e2e.escrowoffer.decline_failed':\n    'Cevabınız kaydedilemedi, bu yüzden filex bir dahakine yine soracak. Klasörde hiçbir şey değişmedi.',\n  'e2e.escrowoffer.failed': 'İşletmeciye bu klasörün anahtarı verilemedi',\n  'e2e.escrowoffer.strip_action': 'Emanet anahtarı…',\n  'e2e.upgrade.title': 'Bu klasörün kurtarma anahtarı yok',\n  'e2e.upgrade.body':\n    'Kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden tek giriş yolu parolası. Şu anda — ve yalnız şu anda, parola bellekteyken — filex bir tane ekleyebilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz.',\n  'e2e.upgrade.escrow_note':\n    'Not: bu kurulumda anahtar emaneti açık; kurtarma anahtarı eklemek aynı zamanda işletmecinin bu klasörü parolanız olmadan açabilmesi demektir.',\n  'e2e.upgrade.accept': 'Kurtarma anahtarı oluştur',\n  'e2e.upgrade.decline': 'Şimdi değil',\n  'e2e.upgrade.busy': 'Oluşturuluyor…',\n  'e2e.upgrade.failed': 'Bu klasöre kurtarma anahtarı eklenemedi',\n  'e2e.download.failed': 'Şifreli dosya indirilemedi.',\n  /* /wiring:e2 */\n\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  'conn.title': 'Depo bağlantıları',\n  'conn.subtitle': '{host} sunucusunu bir arka uca bağlayın ya da kendi bilgisayarınızı {host} sunucusuna bağlayın.',\n  'conn.close': 'Kapat',\n  'conn.tab.storages': 'Depolar',\n  'conn.tab.connect': 'Nasıl bağlanılır',\n  'conn.loading': 'Yükleniyor…',\n  'conn.visibleOnly': 'bu depoya göz atabilirsiniz',\n  'conn.denied.title': 'Buraya depo ekleyebilen tek kişi yöneticidir',\n  'conn.denied.none': 'Hesabınız dosyalara göz atabilir ama bu sunucunun nereye bağlı olduğunu değiştiremez. Depo eklemek ya da düzenlemek için sunucunun yöneticisine başvurun.',\n  'conn.denied.anonymous': 'Bu sunucuda oturum açmış değilsiniz.',\n  'conn.denied.unreachable': 'Sunucu yanıt vermedi: {error}',\n  'conn.denied.guideHint': 'Zaten görebildiğiniz depolara kendi bilgisayarınızdan bağlanmak için yönetici yetkisi gerekmez.',\n  'conn.denied.guideCta': 'Nasıl bağlanacağımı göster',\n  'conn.list.count': '{n} depo',\n  'conn.list.count_one': '{n} depo',\n  'conn.list.add': 'Depo ekle',\n  'conn.list.empty': 'Henüz yapılandırılmış depo yok. Bir tane ekleyin, dosyalar dosya yöneticisinde görünsün.',\n  'conn.list.edit': 'Düzenle',\n  'conn.list.remove': 'Kaldır',\n  'conn.list.confirm': 'Gerçekten kaldırılsın mı?',\n  'conn.list.readOnly': 'salt okunur',\n  'conn.list.disabled': 'kapalı',\n  'conn.form.newTitle': 'Yeni depo',\n  'conn.form.editTitle': '“{name}” düzenleniyor',\n  'conn.form.name': 'Görünen isim',\n  'conn.form.namePlaceholder': 'fotograflar',\n  'conn.form.nameHelp': 'Bu deponun her yerdeki adı: dosya yöneticisinde, yollarda (isim://klasor) ve WebDAV adreslerinde.',\n  'conn.form.driver': 'Tür',\n  'conn.form.driverLocked': 'Bir deponun türü oluşturulduktan sonra değiştirilemez — yollar zaten ona işaret ediyor.',\n  'conn.form.readOnly': 'Salt okunur (bu depoya hiçbir şey yazılamaz)',\n  'conn.form.enabled': 'Etkin',\n  'conn.form.test': 'Bağlantıyı sına',\n  'conn.form.testing': 'Sınanıyor…',\n  'conn.form.testOk': 'Bağlandı. Kökte {count} öğe var.',\n  'conn.form.testOk_one': 'Bağlandı. Kökte {count} öğe var.',\n  'conn.form.testFail': 'Bağlanılamadı: {error}',\n  'conn.form.save': 'Kaydet',\n  'conn.form.saving': 'Kaydediliyor…',\n  'conn.form.cancel': 'Vazgeç',\n  'conn.form.nameRequired': 'Depoya bir isim verin.',\n  'conn.form.fillRequired': '* ile işaretli alanları doldurun.',\n  'conn.form.required': 'Zorunlu',\n  'conn.form.advanced': 'Gelişmiş ayarlar',\n  'conn.form.noFields': 'Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.',\n  'conn.form.reveal': 'Göster',\n  'conn.form.hide': 'Gizle',\n  'conn.guide.protocol': 'Protokol',\n  'conn.guide.storage': 'Depo',\n  'conn.guide.allStorages': 'Tüm depolar',\n  'conn.guide.copy': 'Kopyala',\n  'conn.guide.copied': 'Kopyalandı',\n  'conn.guide.goodToKnow': 'Bilmekte fayda var',\n  'conn.guide.userPlaceholder': 'eposta@ornek.com',\n  'conn.guide.secretPlaceholder': 'parolaniz-ya-da-token',\n  'conn.guide.fact.url': 'Adres',\n  'conn.guide.fact.urlRootHint': 'Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.',\n  'conn.guide.fact.urlStorageHint': 'Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.',\n  'conn.guide.fact.user': 'Kullanıcı adı',\n  'conn.guide.fact.password': 'Parola',\n  'conn.guide.webdav.summary': 'WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.',\n  'conn.guide.webdav.userHint': 'filex hesabınızın e-posta adresi — görünen adınız değil.',\n  'conn.guide.webdav.passwordHint': 'Hesap parolanız ya da bir API token (Ayarlar → API token). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak token kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.',\n  'conn.guide.webdav.win.s1': 'Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.',\n  'conn.guide.webdav.win.s2': 'Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.',\n  'conn.guide.webdav.win.s3': '“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.',\n  'conn.guide.webdav.win.cmdCaption': 'Komut İstemi (sihirbaz olmadan aynı iş)',\n  'conn.guide.webdav.win.limits': 'Windows’un tam olarak filex hatası gibi görünen üç yerleşik sınırı vardır: aktarımlar ~47,7 MB’ta durur, yaklaşık bin dosyalı klasörler açılmaz (“Disk biçimlendirilmemiş”) ve her iki ayarı değiştirdikten sonra WebClient hizmeti yeniden başlatılmalıdır.',\n  'conn.guide.webdav.win.regCaption': 'Yönetici olarak çalıştırın, sonra sürücüyü yeniden bağlayın',\n  'conn.guide.webdav.win.https': 'HTTPS zorunludur. Windows Basic kimlik bilgilerini yalnızca TLS üzerinden gönderir; düz http:// üzerinde hiçbir açıklama vermeden reddeder. BasicAuthLevel değerini 2 yapmayın — TLS kullanın.',\n  'conn.guide.webdav.win.persist': 'Bağlanan sürücü oturum kapatmayı atlatamaz: Windows 7’den beri Basic kimlik bilgileri Kimlik Bilgisi Yöneticisi’nde saklanamaz ve /persistent:yes bunu değiştirmez. Kendiliğinden geri gelsin istiyorsanız komutu bir oturum açma betiğinden yeniden çalıştırın.',\n  'conn.guide.webdav.win.service': 'Hiç bağlanamıyorsa WebClient hizmetinin çalıştığından emin olun: sc config WebClient start= auto && net start WebClient.',\n  'conn.guide.webdav.mac.s1': 'Finder’da Git → Sunucuya Bağlan… (⌘K) yolunu izleyin.',\n  'conn.guide.webdav.mac.s2': '{url} adresini girip bağlanın.',\n  'conn.guide.webdav.mac.s3': 'Yukarıdaki kullanıcı adı ve parolayla kimliğinizi doğrulayın.',\n  'conn.guide.webdav.mac.note': 'Sürücü Konumlar altında görünür; her depo en üst düzeyde bir klasördür.',\n  'conn.guide.webdav.linux.mountCaption': 'davfs2 ya da masaüstü dosya yöneticisi (GNOME Dosyalar, Dolphin)',\n  'conn.guide.webdav.linux.gvfsComment': 'ya da bu adresi GNOME Dosyalar / Dolphin icine yapistirin',\n  'conn.guide.webdav.linux.locks': 'davfs2 için kilitler kapatılmalıdır. filex WebDAV kilitlerini süreç belleğinde tutar; yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar — davfs2 tersini varsayar ve takılır.',\n  'conn.guide.webdav.rclone.obscureCaption': 'rclone parolayı gizlenmiş biçimde saklar — önce bunu çalıştırıp çıktısını aşağıya yapıştırın',\n  'conn.guide.webdav.rclone.passPlaceholder': '<rclone obscure çıktısı>',\n  'conn.guide.webdav.rclone.useCaption': 'Kullanımı',\n  'conn.guide.webdav.duck.s1': 'Yeni Yer İmi → WebDAV (HTTPS).',\n  'conn.guide.webdav.duck.s2': 'Sunucu {host}, port 443.',\n  'conn.guide.webdav.duck.s3': 'Yol {path}.',\n  'conn.guide.webdav.duck.s4': 'Kullanıcı adı {user}, parola yukarıdaki gibi.',\n  'conn.guide.webdav.note.delete': 'WebDAV üzerinden silme kalıcıdır. Web arayüzü dosyaları filex çöp kutusuna taşır; istemciden silme ise nesneyi doğrudan arka uçtan kaldırır.',\n  'conn.guide.webdav.note.locks': 'Kilitler sunucu belleğinde durur: yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar. Windows ile Office’i memnun etmek için varlar, eşzamanlı düzenlemeyi hakemlemek için değil.',\n  'conn.guide.webdav.note.permissions': 'Web arayüzünde ne görüyorsanız burada da onu görürsünüz. Kök yalnızca açabildiğiniz depoları listeler; yetkiniz dışındaki bir yol 403 değil 404 döner, böylece ağaç neyin var olduğunu sızdırmaz.',\n  'conn.guide.webdav.note.http': 'Bu sunucuya düz http:// ile erişiliyor. Windows kimlik bilgilerinizi hiç göndermez, diğer tüm istemciler ise parolanızı açık metin olarak yollar. Bağlamadan önce filex’i TLS arkasına alın.',\n  // ── S3 ucu: anahtarlar ve rehber ─────────────────────────────────\n  'conn.s3keys.title': 'S3 erişim anahtarları',\n  'conn.s3keys.lead': 'Bir erişim anahtarı, S3 konuşan her istemcinin — rclone, restic, AWS CLI, mc, s3fs, Cyberduck — filex’e bağlanmasını sağlar. Anahtar sizin yetkinizi taşır, bir fazlasını değil.',\n  'conn.s3keys.disabled': 'Bu sunucuda S3 ucu kapalı (FILEX_S3). Burada üretilen anahtar, yönetici ucu tekrar açana kadar bağlanmaz.',\n  'conn.s3keys.cannotMint': 'Erişim anahtarı üretebilecek bir hesapla oturum açmış değilsiniz. Aşağıdaki talimatlar yine geçerli — bir anahtar isteyip yapıştırmanız yeter.',\n  'conn.s3keys.label': 'Ne için? (dizüstü yedeği, CI, …)',\n  'conn.s3keys.defaultLabel': 'erişim anahtarı',\n  'conn.s3keys.everyBucket': 'Görebildiğim tüm kovalar',\n  'conn.s3keys.prefix': 'Kova içindeki klasör (isteğe bağlı)',\n  'conn.s3keys.mint': 'Anahtar oluştur',\n  'conn.s3keys.inheritNote': 'Bir anahtar sahip olduğunuz yetkiyi yalnızca DARALTABİLİR: yetkileriniz, kiracınız, rolünüz. Anahtarı tek bir kovaya ya da klasöre kısıtlamak, bir dizüstü yedeği ile her şeyi okuyabilen bir kimlik arasındaki farktır.',\n  'conn.s3keys.once': 'Gizli anahtarı şimdi kopyalayın — bir daha gösterilmeyecek.',\n  'conn.s3keys.accessKeyID': 'Erişim anahtarı kimliği',\n  'conn.s3keys.secret': 'Gizli anahtar',\n  'conn.s3keys.dismiss': 'Kopyaladım',\n  'conn.s3keys.col.label': 'Etiket',\n  'conn.s3keys.col.key': 'Erişim anahtarı kimliği',\n  'conn.s3keys.col.scope': 'Kapsam',\n  'conn.s3keys.col.lastUsed': 'Son kullanım',\n  'conn.s3keys.scopeAll': 'görebildiğiniz her şey',\n  'conn.s3keys.noLabel': '(etiketsiz)',\n  'conn.s3keys.neverUsed': 'hiç',\n  'conn.s3keys.enable': 'Aç',\n  'conn.s3keys.disable': 'Kapat',\n  'conn.s3keys.revoke': 'İptal et',\n  'conn.s3keys.confirm': 'Emin misiniz?',\n  'conn.s3keys.empty': 'Henüz erişim anahtarı yok.',\n  'conn.guide.s3.summary': 'S3 ucu, S3 konuşan her şeyin — yedekleme, senkron araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.',\n  'conn.guide.s3.keyPlaceholder': 'yukarıdan bir anahtar oluşturun',\n  'conn.guide.s3.secretPlaceholder': 'anahtarı oluştururken bir kez gösterilir',\n  'conn.guide.s3.fact.endpoint': 'Uç adresi',\n  'conn.guide.s3.fact.endpointHint': 'İstemciyi buraya yöneltin, filex’in web adresine değil.',\n  'conn.guide.s3.fact.bucket': 'Kova',\n  'conn.guide.s3.fact.bucketHint': 'Kova = filex deposu. Kovaları istemci değil yönetici oluşturur.',\n  'conn.guide.s3.fact.key': 'Erişim anahtarı kimliği',\n  'conn.guide.s3.fact.keyHint': 'Genel yarısı; her istekte gider.',\n  'conn.guide.s3.fact.secret': 'Gizli anahtar',\n  'conn.guide.s3.fact.secretHint': 'Yalnızca anahtar oluşturulurken bir kez gösterilir. filex bir daha gösteremez — kaybolduysa yeni anahtar üretin.',\n  'conn.guide.s3.fact.region': 'Bölge',\n  'conn.guide.s3.fact.regionHint': 'filex’te bölge yok; hangi değeri verirseniz aynen geri döner. Yine de istemciler bir değer ister.',\n  'conn.guide.s3.fact.addressing': 'Adresleme',\n  'conn.guide.s3.fact.pathStyle': 'yol tabanlı (zorunlu)',\n  'conn.guide.s3.fact.pathStyleHint': 'Bu kurulumda S3’e ayrılmış bir alan adı yok, yani kova.host çözülmez.',\n  'conn.guide.s3.fact.virtualHosted': 'sanal-host ya da yol tabanlı',\n  'conn.guide.s3.fact.virtualHostedHint': 'Bu kurulumun kendi S3 alan adı var, iki adresleme de çalışır.',\n  'conn.guide.s3.rclone.useCaption': 'Kullanımı',\n  'conn.guide.s3.rclone.mtime': 'filex dosyanın değişiklik zamanını taşır (x-amz-meta-mtime); böylece rclone sync ilk turdan sonra oturur, her seferinde her şeyi yeniden yüklemez.',\n  'conn.guide.s3.aws.configureCaption': 'Bir kez ayarlayın',\n  'conn.guide.s3.aws.useCaption': 'Kullanımı',\n  'conn.guide.s3.aws.pathStyle': 'AWS yapılandırmanıza yol tabanlı adreslemeyi ekleyin; yoksa her komut DNS aşamasında düşer.',\n  'conn.guide.s3.restic.envCaption': 'Ortam değişkenleri',\n  'conn.guide.s3.restic.useCaption': 'Yedekle, doğrula, buda',\n  'conn.guide.s3.restic.verified': 'Bu uca karşı ölçüldü: restic check --read-data her pack’i bayt bayt okuyor ve hata bulmuyor.',\n  'conn.guide.s3.mc.aliasCaption': 'Takma adı ekleyin',\n  'conn.guide.s3.mc.useCaption': 'Kullanımı',\n  'conn.guide.s3.s3fs.credsCaption': 'Kimlik dosyası',\n  'conn.guide.s3.s3fs.mountCaption': 'Bağlayın',\n  'conn.guide.s3.s3fs.note': 's3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöpüne gider. Paylaşılan bir klasör için iyi, veritabanı için değil.',\n  'conn.guide.s3.duck.s1': 'Yeni yer imi → Amazon S3.',\n  'conn.guide.s3.duck.s2': 'Sunucu: {host}.',\n  'conn.guide.s3.duck.s3': 'Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.',\n  'conn.guide.s3.duck.s4': 'Yer imini açın; kovalar sizin filex depolarınızdır.',\n  'conn.guide.s3.duck.pathStyle': 'Tercihler → S3 altında \"Use virtual host style\" seçeneğini KAPATIN — bu kurulumda joker S3 alan adı yok.',\n  'conn.guide.s3.sdk.note': 'SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.',\n  'conn.guide.s3.note.buckets': 'Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.',\n  'conn.guide.s3.note.permissions': 'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova \"yasak\" değil \"böyle bir kova yok\" der; böylece uç, neyin var olduğunu sızdırmaz.',\n  'conn.guide.s3.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.s3.note.mtime': 'Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır — bozulmuş bir yükleme saklanmaz, reddedilir.',\n  'conn.guide.s3.note.pathStyle': 'Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.',\n  'conn.guide.s3.note.http': 'Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.',\n  // ── SFTP ucu: anahtarlar ve rehber ───────────────────────────────\n  'conn.sshkeys.title': 'SSH anahtarları',\n  'conn.sshkeys.lead': 'Bir açık anahtar kaydedin; SSH konuşan her istemci — sftp, scp, WinSCP, FileZilla, rclone, sshfs — parolanızı göndermeden bağlansın.',\n  'conn.sshkeys.disabled': 'Bu sunucuda SFTP ucu kapalı (FILEX_SFTP). Burada kaydedilen anahtar, yönetici ucu açana kadar bağlanmaz.',\n  'conn.sshkeys.cannotAdd': 'Anahtar kaydedebilecek bir hesapla oturum açmış değilsiniz.',\n  'conn.sshkeys.paste': '~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın',\n  'conn.sshkeys.name': 'Ad (isteğe bağlı — boşsa anahtarın kendi yorumu kullanılır)',\n  'conn.sshkeys.add': 'Anahtar ekle',\n  'conn.sshkeys.noCopyId': 'ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Giriş yolu bu kutudur.',\n  'conn.sshkeys.col.name': 'Ad',\n  'conn.sshkeys.col.fingerprint': 'Parmak izi',\n  'conn.sshkeys.col.added': 'Eklendi',\n  'conn.sshkeys.col.lastUsed': 'Son kullanım',\n  'conn.sshkeys.noName': '(adsız)',\n  'conn.sshkeys.neverUsed': 'hiç',\n  'conn.sshkeys.enable': 'Aç',\n  'conn.sshkeys.disable': 'Kapat',\n  'conn.sshkeys.remove': 'Sil',\n  'conn.sshkeys.confirm': 'Emin misiniz?',\n  'conn.sshkeys.empty': 'Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla giriş yapar.',\n  'conn.guide.sftp.summary': 'SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.',\n  'conn.guide.sftp.fact.host': 'Sunucu',\n  'conn.guide.sftp.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.sftp.fact.port': 'Port',\n  'conn.guide.sftp.fact.portHint': 'Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.',\n  'conn.guide.sftp.fact.userHint': 'Kısa giriş adınız. Giriş adındaki @ işareti çoğu istemcinin ayar dosyasında tırnaklanmak zorundadır; bu alan tam da onu ortadan kaldırır.',\n  'conn.guide.sftp.fact.auth': 'Giriş yöntemi',\n  'conn.guide.sftp.fact.authKey': 'kayıtlı SSH anahtarınız (ya da parolanız)',\n  'conn.guide.sftp.fact.authPassword': 'hesap parolanız — ya da yukarıdan bir anahtar kaydedin',\n  'conn.guide.sftp.fact.authHint': 'API token da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap anahtar ya da token kullanmalıdır.',\n  'conn.guide.sftp.fact.path': 'Yol',\n  'conn.guide.sftp.fact.pathHint': 'İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.',\n  'conn.guide.sftp.openssh.connectCaption': 'Bağlan, gönder, al',\n  'conn.guide.sftp.openssh.noShell': 'Burada kabuk yok, yalnız SFTP alt sistemi var. `ssh sunucu komut` bilerek reddedilir; scp çalışır çünkü OpenSSH 9 onun için de SFTP konuşur.',\n  'conn.guide.sftp.key.tab': 'Anahtar kurulumu',\n  'conn.guide.sftp.key.s1': 'Bağlanacak makinede bir anahtar çifti üretin (zaten varsa atlayın).',\n  'conn.guide.sftp.key.s2': 'AÇIK yarısını kopyalayın — .pub dosyası, asla diğeri değil.',\n  'conn.guide.sftp.key.s3': 'Yukarıdaki kutuya yapıştırıp bağlanın; o andan sonra parola gönderilmez.',\n  'conn.guide.sftp.key.genCaption': 'Kendi makinenizde',\n  'conn.guide.sftp.key.noCopyId': 'ssh-copy-id filex’e karşı ÇALIŞMAZ: ~/.ssh/authorized_keys dosyasına eklemek için kabuğa ihtiyacı var, filex’te kabuk yok. Anahtarı yukarıdan yapıştırın.',\n  'conn.guide.sftp.winscp.s1': 'Yeni site → Dosya protokolü: SFTP.',\n  'conn.guide.sftp.winscp.s2': 'Sunucu adı: {host}, port: {port}.',\n  'conn.guide.sftp.winscp.s3': 'Kullanıcı adı: {user}. Anahtar için: Gelişmiş → SSH → Kimlik Doğrulama → özel anahtar dosyası.',\n  'conn.guide.sftp.winscp.s4': 'WinSCP .ppk biçiminde özel anahtar ister — OpenSSH anahtarını kendi aracıyla (Araçlar → PuTTYgen) bir kez dönüştürün.',\n  'conn.guide.sftp.filezilla.s1': 'Dosya → Site Yöneticisi → Yeni site, Protokol: SFTP.',\n  'conn.guide.sftp.filezilla.s2': 'Sunucu: {host}, port: {port}.',\n  'conn.guide.sftp.filezilla.s3': 'Kullanıcı: {user}. Giriş türü: parola için Normal, anahtar için Anahtar dosyası.',\n  'conn.guide.sftp.rclone.useCaption': 'Kullanımı',\n  'conn.guide.sftp.sshfs.mountCaption': 'Bağla ve çöz',\n  'conn.guide.sftp.sshfs.note': 'Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.',\n  'conn.guide.sftp.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',\n  'conn.guide.sftp.note.permissions': 'İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.',\n  'conn.guide.sftp.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.sftp.note.totp': 'Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir anahtar kaydedin ya da parola yerine API token kullanın.',\n  'conn.guide.sftp.note.disabled': 'Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  // ── FTPS ─────────────────────────────────────────────────────────\n  'conn.guide.ftps.summary': 'FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.',\n  'conn.guide.ftps.fact.host': 'Sunucu',\n  'conn.guide.ftps.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.ftps.fact.port': 'Port',\n  'conn.guide.ftps.fact.portHint': 'Kontrol kanalı. Veri, aşağıdaki pasif aralıktan ayrı bir porttan akar.',\n  'conn.guide.ftps.fact.mode': 'Şifreleme',\n  'conn.guide.ftps.fact.modeValue': 'FTPS — açık (explicit) TLS, zorunlu',\n  'conn.guide.ftps.fact.modeHint': 'Düz FTP, parola okunmadan reddedilir. \"Require explicit FTP over TLS\" seçin; \"plain FTP\" ya da \"implicit\" asla.',\n  'conn.guide.ftps.fact.userHint': 'Kısa giriş adınız ya da e-postanız. Parola yerine API token da geçer ve tek başına iptal edilebilir.',\n  'conn.guide.ftps.fact.passwordHint': 'Hesap parolanız ya da bir API token. İki adımlı doğrulaması açık hesap token kullanmalıdır — FTP\\'nin kodu soracak bir yolu yok.',\n  'conn.guide.ftps.fact.pasv': 'Pasif portlar',\n  'conn.guide.ftps.fact.pasvHint': 'Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR — FTP\\'nin klasik arızası budur.',\n  'conn.guide.ftps.filezilla.s1': 'Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.',\n  'conn.guide.ftps.filezilla.s2': 'Sunucu: {host}, port: {port}.',\n  'conn.guide.ftps.filezilla.s3': 'Şifreleme: \"Require explicit FTP over TLS\". Giriş türü: Normal, kullanıcı: {user}.',\n  'conn.guide.ftps.filezilla.s4': 'Aktarım ayarları → Pasif. Bu sunucu aktif modu reddeder.',\n  'conn.guide.ftps.winscp.s1': 'Yeni site → Dosya protokolü: FTP, Şifreleme: TLS/SSL Explicit encryption.',\n  'conn.guide.ftps.winscp.s2': 'Sunucu adı: {host}, port: {port}.',\n  'conn.guide.ftps.winscp.s3': 'Kullanıcı adı: {user}, parola yukarıdaki.',\n  'conn.guide.ftps.curl.caption': 'Gönder ve al',\n  'conn.guide.ftps.curl.sslReqd': '--ssl-reqd isteğe bağlı değil: curl\\'ün düz metne geri düşmek yerine TLS\\'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.',\n  'conn.guide.ftps.lftp.caption': 'Bağlan',\n  'conn.guide.ftps.lftp.protectData': 'ssl-protect-data yalnız girişi değil DOSYAYI da şifreler. Olmazsa lftp TLS ile giriş yapar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.',\n  'conn.guide.ftps.rclone.useCaption': 'Kullanımı',\n  'conn.guide.ftps.printer.tab': 'Tarayıcı / yazıcı',\n  'conn.guide.ftps.printer.s1': 'Cihazın tara-ve-FTP\\'ye-gönder ayarlarında: sunucu {host}, port {port}.',\n  'conn.guide.ftps.printer.s2': 'Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API token üretin — başka hiçbir şeyi değiştirmeden iptal edilebilir.',\n  'conn.guide.ftps.printer.s3': 'Yol: {path} — ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.',\n  'conn.guide.ftps.printer.s4': '\"SSL/TLS\" ya da \"FTPS explicit\" seçeneğini AÇIN ve PASİF modu seçin.',\n  'conn.guide.ftps.printer.noTLS': 'Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.',\n  'conn.guide.ftps.note.tls': 'TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.',\n  'conn.guide.ftps.note.passive': 'Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.',\n  'conn.guide.ftps.note.storages': 'Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.',\n  'conn.guide.ftps.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.ftps.note.prefer': 'İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.',\n  'conn.guide.ftps.note.selfSigned': 'Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.',\n  'conn.guide.ftps.note.disabled': 'Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  // ── NFS ──────────────────────────────────────────────────────────\n  'conn.nfs.title': 'NFS export\\'ları',\n  'conn.nfs.lead': 'Bir export, ağınızdaki bir makinenin filex\\'i sürücü olarak bağlamasını sağlar — medya oynatıcı, derleme sunucusu, yedek kutusu.',\n  'conn.nfs.pathIsSecret': '⚠ Export yolu PAROLANIN TA KENDİSİDİR. NFS, Kerberos olmadan istemciye kim olduğunu soramaz; bu yüzden filex yola 32 rastgele bayt koyar: yolu bilen sizin adınıza bağlanır. Bağlama satırını bir kimlik bilgisi gibi saklayın — /etc/fstab çoğu sistemde herkes tarafından okunabilir.',\n  'conn.nfs.disabled': 'Bu sunucuda NFS ucu kapalı (FILEX_NFS). Burada oluşturulan export, yönetici ucu açana kadar bağlanmaz.',\n  'conn.nfs.cannotMint': 'Export oluşturabilecek bir hesapla oturum açmış değilsiniz.',\n  'conn.nfs.label': 'Ne için? (medya oynatıcı, yedek kutusu, …)',\n  'conn.nfs.defaultLabel': 'nfs export',\n  'conn.nfs.everyStorage': 'Görebildiğim tüm depolar',\n  'conn.nfs.prefix': 'Depo içindeki klasör (isteğe bağlı)',\n  'conn.nfs.allowCidrs': 'İzinli adresler, örn. 192.168.1.0/24 (isteğe bağlı)',\n  'conn.nfs.readOnly': 'Salt okunur',\n  'conn.nfs.readOnlyHint': 'Bir makine için güvenli varsayılan salt okunurdur: sizin yetkiniz ne olursa olsun bu bağlantı üzerinden her yazmayı reddeder. Adres listesi daha da daraltır — listenin dışından gelen bağlanamaz.',\n  'conn.nfs.mint': 'Export oluştur',\n  'conn.nfs.once': 'Şimdi kopyalayın — yol yalnızca bir kez gösterilir ve geri alınamaz.',\n  'conn.nfs.dismiss': 'Kopyaladım',\n  'conn.nfs.col.label': 'Etiket',\n  'conn.nfs.col.scope': 'Kapsam',\n  'conn.nfs.col.mode': 'Mod',\n  'conn.nfs.col.lastUsed': 'Son bağlanma',\n  'conn.nfs.scopeAll': 'görebildiğiniz her şey',\n  'conn.nfs.modeRead': 'salt okunur',\n  'conn.nfs.modeWrite': 'okuma/yazma',\n  'conn.nfs.noLabel': '(etiketsiz)',\n  'conn.nfs.neverUsed': 'hiç',\n  'conn.nfs.enable': 'Aç',\n  'conn.nfs.disable': 'Kapat',\n  'conn.nfs.revoke': 'İptal et',\n  'conn.nfs.confirm': 'Emin misiniz?',\n  'conn.nfs.empty': 'Henüz export yok.',\n  'conn.guide.nfs.summary': 'NFS, filex\\'i kendi ağınızdaki bir makinede sürücü olarak bağlar — NAS protokolü, onu bekleyen cihazlar için.',\n  'conn.guide.nfs.pathPlaceholder': 'yukarıdan bir export oluşturun',\n  'conn.guide.nfs.fact.host': 'Sunucu',\n  'conn.guide.nfs.fact.hostHint': 'Web uygulamasıyla aynı makine, kendine ait bir portta.',\n  'conn.guide.nfs.fact.port': 'Port',\n  'conn.guide.nfs.fact.portHint': 'Hem port= hem mountport= buna ayarlanmalı; filex mount ve NFS servislerini tek portta veriyor.',\n  'conn.guide.nfs.fact.export': 'Export yolu',\n  'conn.guide.nfs.fact.exportHint': 'Kimlik bilgisi budur. Export oluşturulurken bir kez gösterilir ve hash\\'li saklanır — filex bir daha gösteremez.',\n  'conn.guide.nfs.fact.options': 'Bağlama seçenekleri',\n  'conn.guide.nfs.fact.optionsHint': 'nolock, çünkü filex NFS kilit yöneticisini çalıştırmıyor; nfsvers=3, çünkü bu sunucunun konuştuğu sürüm bu.',\n  'conn.guide.nfs.linux.mountCaption': 'Bağla',\n  'conn.guide.nfs.linux.fstabSecret': 'Bu yolu içeren bir /etc/fstab satırı, herkesin okuyabildiği bir dosyadaki paroladır. Ortamınızda önemliyse kimlik korumalı automount kullanın ya da bağlamayı yalnız root\\'un okuyabildiği bir unit dosyasında tutun.',\n  'conn.guide.nfs.mac.mountCaption': 'Bağla',\n  'conn.guide.nfs.mac.resvport': 'macOS resvport ister: istemcisi ayrıcalıklı bir kaynak portta ısrar eder ve olmadan bağlantıyı reddeder.',\n  'conn.guide.nfs.win.s1': 'Windows Özellikleri\\'nden \"Services for NFS\" → \"Client for NFS\" bileşenini açın (yalnız Pro ve Enterprise; Home\\'da yok).',\n  'conn.guide.nfs.win.s2': 'Komut İstemi\\'ni yönetici olarak açın.',\n  'conn.guide.nfs.win.s3': 'Aşağıdaki komutla export\\'u bir sürücü harfine bağlayın.',\n  'conn.guide.nfs.win.cmdCaption': 'Z: sürücüsüne bağla',\n  'conn.guide.nfs.win.port': 'Windows\\'un mount servisinin portunu söyleme imkânı yok; yalnızca standart 2049 portundaki bir NFS sunucusuna erişebilir. Bu sunucu başka bir porttaysa SFTP\\'yi ya da filex masaüstü uygulamasını kullanın.',\n  'conn.guide.nfs.nas.tab': 'NAS / medya oynatıcı',\n  'conn.guide.nfs.nas.s1': 'Cihazın NFS ayarlarında: sunucu {host}, port {port} (ayrı ayrı soruyorsa hem NFS hem mount portunu ayarlayın).',\n  'conn.guide.nfs.nas.s2': 'Uzak yol: yukarıdaki export yolu, birebir.',\n  'conn.guide.nfs.nas.s3': 'NFS sürüm 3, kilitleme kapalı. Cihazın gerçekten yazması gerekmiyorsa export\\'u salt okunur oluşturun.',\n  'conn.guide.nfs.note.unencrypted': 'NFSv3 şifreli değildir. Trafiği okuyabilen dosyalarınızı görür, yolu öğrenen bağlanabilir. Ev/ofis ağında ya da VPN üzerinden kullanın — internet üzerinden asla.',\n  'conn.guide.nfs.note.pathIsSecret': 'Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.',\n  'conn.guide.nfs.note.noPortmapper': '111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.',\n  'conn.guide.nfs.note.uid': 'İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex\\'teki erişiminizden gelir.',\n  'conn.guide.nfs.note.trash': 'Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.nfs.note.revoke': 'İptal anında değil, bir sonraki istekte etkili olur: NFS\\'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.',\n  'conn.guide.nfs.note.disabled': 'Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.',\n  'conn.tokens.title': 'API jetonları',\n  'conn.tokens.lead': 'FTPS, WebDAV ve filex mount hesap parolanız yerine bir jetonla giriş yapar. Buradan üretin — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.',\n  'conn.tokens.mint': 'Jeton oluştur',\n  'conn.tokens.once': 'Şimdi kopyalayın — yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.',\n  'conn.tokens.dismiss': 'Kopyaladım',\n  'conn.tokens.cannotMint': 'Bu oturum jeton üretemiyor. Kendi hesabınızla giriş yapıp oluşturun.',\n  'conn.tokens.empty': 'Henüz jeton yok.',\n  'conn.tokens.neverUsed': 'hiç',\n  'conn.tokens.revoke': 'İptal et',\n  'conn.tokens.confirm': 'Emin misin?',\n  'conn.tokens.col.label': 'Ad',\n  'conn.tokens.col.scopes': 'Yetkisi',\n  'conn.tokens.col.used': 'Son kullanım',\n  'conn.tokens.revokeHint': 'İptal, yalnız bir sonraki girişi değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.',\n  'conn.guide.mount.summary': 'filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar — tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.',\n  'conn.guide.mount.fact.url': 'Sunucu adresi',\n  'conn.guide.mount.fact.urlHint': 'Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.',\n  'conn.guide.mount.fact.token': 'API jetonu',\n  'conn.guide.mount.fact.tokenPlaceholder': 'Jetonlar bölümünden oluşturun',\n  'conn.guide.mount.fact.tokenHint': 'Parolanız değil, jeton — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.',\n  'conn.guide.mount.fact.remote': 'Neyi bağlayacağınız',\n  'conn.guide.mount.fact.remoteHint': '--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu — ya da onun içindeki bir klasörü — adlandırırsanız yalnızca o bağlanır.',\n  'conn.guide.mount.linux.mountCaption': 'Bağlayın',\n  'conn.guide.mount.linux.umountCaption': 'Ayırın',\n  'conn.guide.mount.linux.umountWarn': 'Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.',\n  'conn.guide.mount.linux.systemdCaption': 'Girişte otomatik bağlansın (systemd kullanıcı birimi)',\n  'conn.guide.mount.win.winfsp': \"Windows'ta bir kez WinFsp kurulması gerekiyor — ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.\",\n  'conn.guide.mount.win.mountCaption': 'Sürücü olarak bağlayın',\n  'conn.guide.mount.win.freeLetter': 'BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.',\n  'conn.guide.mount.win.stop': 'O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.',\n  'conn.guide.mount.mac.unsupported': \"filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.\",\n  'conn.guide.mount.mac.alternatives': \"macOS'ta filex masaüstü uygulamasını klasör senkronuyla kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.\",\n  'conn.guide.mount.note.notASync': 'Bu bir senkronizasyon değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör senkronunu kullanın.',\n  'conn.guide.mount.note.reachable': 'Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır — çünkü altında aynı API vardır. İzinleriniz, depolarınız ve çok kiracılı bir sunucuda kiracınız da birlikte gelir.',\n  'conn.guide.mount.note.wholeFileWrites': 'Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.',\n  'conn.guide.mount.note.trash': 'Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.',\n  'conn.guide.mount.note.revoke': 'Bir bağlantıyı durdurmak için jetonu iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.',\n  'storages.driver.ftp': 'FTP / FTPS',\n  'storages.driver.local': 'Yerel dosya sistemi',\n  'storages.driver.s3': 'S3 / Hetzner / MinIO',\n  'storages.driver.sftp': 'SFTP',\n  'storages.driver.smb': 'SMB / CIFS (NAS)',\n  'storages.driver.webdav': 'WebDAV',\n  'storages.fieldHelp.smbShare':\n    \"Sunucu adı olmadan yalnızca paylaşım adı: `\\\\\\\\nas\\\\media` değil, `media`.\",\n  'storages.fieldHelp.smbDomain':\n    'Yalnızca Windows etki alanı hesabı için. NAS kullanıyorsanız boş bırakın.',\n  'storages.fieldHelp.smbRoot':\n    'Paylaşımın içindeki alt klasör. Paylaşımın tamamı için boş bırakın.',\n  'storages.fields.share': 'Paylaşım',\n  'storages.fields.domain': 'Etki alanı / çalışma grubu',\n  'storages.fields.dialTimeout': 'Bağlanma zaman aşımı (saniye)',\n  'storages.fieldHelp.disablePresign': 'Varsayılan olarak açık: yüklemeler ve herkese açık paylaşım bağlantılarındaki indirmeler filex üzerinden akar; kova endpoint\\'inin tarayıcıdan erişilebilir olması gerekmez (yalnız yerel ağdaki MinIO doğrudan çalışır). Yalnızca endpoint kullanıcıların tarayıcısından erişilebiliyorsa (AWS, herkese açık MinIO) ve tarayıcının kovayla doğrudan konuşmasını istiyorsanız kapatın — çok büyük dosyalarda daha hızlıdır, ama depo SDK\\'nın imzaladığı URL\\'leri kabul etmelidir (Ceph RGW / bazı Hetzner kurulumları SignatureDoesNotMatch döner).',\n  'storages.fieldHelp.endpoint': 'AWS S3 için boş bırakın. S3 uyumlu diğer tüm depolar kendi endpoint\\'ini ister.',\n  'storages.fieldHelp.hostKey': 'authorized_keys / known_hosts satır biçiminde tek bir açık anahtar.',\n  'storages.fieldHelp.insecureSkipHostKey': 'Her sunucu anahtarını kabul eder. Yalnızca geçici sunucular için.',\n  'storages.fieldHelp.keyPath': 'Sunucudaki anahtar dosyasının yolu; depo başlarken okunur. PEM alanı boşken kullanılır.',\n  'storages.fieldHelp.knownHosts': 'Katı sunucu anahtarı denetimi için OpenSSH known_hosts yolu. Varsayılan, ~/.filex/known_hosts içinde ilk bağlantıda güven.',\n  'storages.fieldHelp.passive': 'Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.',\n  'storages.fieldHelp.path': 'Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.',\n  'storages.fieldHelp.pathStyle': 'AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.',\n  'storages.fieldHelp.prefix': 'Bucket içindeki alt klasör. Zorunlu: filex bucket kökünün sahipliğini asla almaz.',\n  'storages.fieldHelp.region': 'Boş bırakılırsa \"auto\" kullanılır.',\n  'storages.fieldHelp.root': 'Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.',\n  'storages.fieldHelp.sftpAuth': 'Parola ya da özel anahtardan biri zorunludur.',\n  'storages.fieldHelp.tls': 'Düz FTP kimlik bilgilerini açık metin gönderir — sunucu destekliyorsa açın.',\n  'storages.fields.accessKey': 'Access key',\n  'storages.fields.basePath': 'Temel yol',\n  'storages.fields.bucket': 'Bucket',\n  'storages.fields.disablePresign': 'İmzalı URL\\'leri kapat',\n  'storages.fields.endpoint': 'Endpoint',\n  'storages.fields.host': 'Sunucu',\n  'storages.fields.hostKey': 'Sabitlenmiş sunucu anahtarı',\n  'storages.fields.insecureSkipHostKey': 'Sunucu anahtarı doğrulamasını atla (güvensiz)',\n  'storages.fields.keyPath': 'Özel anahtar dosyası',\n  'storages.fields.knownHosts': 'known_hosts dosyası',\n  'storages.fields.name': 'Görünen isim',\n  'storages.fields.namePlaceholder': 'Kişisel fotoğraflar',\n  'storages.fields.passive': 'Pasif mod (PASV)',\n  'storages.fields.password': 'Parola',\n  'storages.fields.path': 'Dizin yolu',\n  'storages.fields.pathStyle': 'Path-style URL kullan (Hetzner, MinIO)',\n  'storages.fields.port': 'Port',\n  'storages.fields.prefix': 'Önek (prefix)',\n  'storages.fields.privateKey': 'Özel anahtar (PEM)',\n  'storages.fields.rbac': 'Öğe bazlı erişim denetimi (RBAC)',\n  'storages.fields.rbacHint': 'Açıkken admin olmayanlar yalnızca izin panelinden kendilerine verilen dosya/klasörleri görür. Kapalıyken depo tüm kullanıcılara açıktır (yetki role göre).',\n  'storages.fields.readOnly': 'Salt okunur mount',\n  'storages.fields.region': 'Bölge',\n  'storages.fields.root': 'Temel yol',\n  'storages.fields.secretKey': 'Secret key',\n  'storages.fields.tls': 'FTPS (açık AUTH TLS)',\n  'storages.fields.url': 'Temel URL',\n  'storages.fields.user': 'Kullanıcı',\n\n\n  /* === gezinti:g1 — gezinti paneli (SideNav) === */\n  'sidenav.title': 'Gezinti',\n  'sidenav.views': 'Görünümler',\n  'sidenav.storages': 'Depolar',\n  'sidenav.home': 'Ana sayfa',\n  'sidenav.myfiles': 'Dosyalarım',\n  'sidenav.recent': 'Son kullanılanlar',\n  'sidenav.starred': 'Yıldızlılar',\n  'sidenav.shared': 'Benimle paylaşılanlar',\n  'sidenav.trash': 'Çöp Kutusu',\n  'sidenav.collapse': 'Gezintiyi daralt',\n  'sidenav.expand': 'Gezintiyi genişlet',\n  'sidenav.close': 'Gezintiyi kapat',\n  // ⚠ aç/kapat çifti ÇEKMECENİN, daralt/genişlet çifti yerleşik PANELİN —\n  // ikisi birbirinin yerine kullanılamaz; bkz. en.ts'teki not ve Toolbar.vue\n  // içindeki `navToggleLabel`. 560px altında panel listenin üzerine gelen bir\n  // çekmecedir: raya inmez, hiç ekranda değildir; \"genişlet\" olmayan bir\n  // genişliği büyütmeyi vaat ederdi.\n  'sidenav.open': 'Gezintiyi aç',\n  'sidenav.storage.shared': 'Paylaşılan',\n  'sidenav.storage.readOnly': 'Salt okunur',\n  // ⚠ `toolbar.nav` KALDIRILDI, yerine bir şey konmadı — bkz. en.ts'teki not.\n  // Paneli daraltan tek denetimin etiketiydi; önce \"Gezinti\" (panelin adı,\n  // düğmenin ne yaptığını söylemiyor), sonra \"Gezintiyi göster/gizle\" (sabit\n  // geçici çözüm). Gerçek düzeltme yukarıdaki dört `sidenav.*` fiili:\n  // etiket `navOpen`'a bağlı, daraltacaksa \"daralt\", genişletecekse\n  // \"genişlet\" yazıyor.\n  'node.home': 'Ana sayfa',\n  'node.recent': 'Son kullanılanlar',\n  'node.starred': 'Yıldızlılar',\n  'node.shared': 'Benimle paylaşılanlar',\n  'empty.recent.title': 'Henüz hiçbir şey açılmadı',\n  'empty.recent.hint': 'Açtığın dosyalar burada görünür',\n  'empty.starred.title': 'Henüz yıldızlı dosya yok',\n  'empty.starred.hint': 'Bir dosyayı yıldızla, burada bulasın',\n  'empty.shared.title': 'Seninle henüz bir şey paylaşılmadı',\n  'empty.shared.hint': 'Başkalarının paylaştığı klasör ve dosyalar burada görünür',\n  /* etiket:t1 */\n  'sidenav.tags': 'Etiketler',\n  'sidenav.tags.empty': 'Henüz etiket yok — bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsin.',\n  'sidenav.tags.more': '{count} tane daha göster',\n  'sidenav.tags.less': 'Daha az göster',\n  'empty.tag.title': '“{tag}” etiketli hiçbir şey yok',\n  'empty.tag.hint': 'Bir dosyaya sağ tıklayıp Etiketler’i seç, burada görünsün',\n  'sidenav.connections': 'Bağlantılar',\n  'sidenav.connect': 'Nasıl bağlanılır',\n  'sidenav.apikeys': 'API anahtarları',\n  'overlay.close': 'Kapat',\n  'conn.tokens.scopes': 'İzinler',\n  'conn.tokens.root': 'Tek bir klasörle sınırla (isteğe bağlı)',\n  'conn.tokens.rootPlaceholder': 'depo://klasör',\n  'conn.tokens.expiry': 'Geçerlilik (gün)',\n  'conn.tokens.expiryNever': 'süresiz',\n  'conn.tokens.defaultName': 'API anahtarı {date}',\n  'conn.tokens.namePlaceholder': 'Ad — ör. yedekleme betiği',\n  'conn.tokens.capNote': 'Tavan hesabın ve yetkilerin — sahip olduğundan fazlasını istemek reddedilir, verilmez.',\n  /* === /gezinti:g1 === */\n\n  /* === surucu:d1 — kabuk (GitHub #14); artık `uiProfile: 'drive'` ile\n     gelen bir seçenek değil, her profilde çizilir === */\n  'drive.new': 'Yeni',\n  'drive.new.upload': 'Dosya yükle',\n  'drive.new.folder': 'Yeni klasör',\n  'drive.new.request': 'Dosya iste',\n  'drive.new.document': 'Yeni belge',\n\n  /* === belge:n1 — \"Yeni belge\": + Yeni altındaki seçici ==================\n     Tür adları BURADA durmuyor. Her kutucuk sözcüklerini lib/fileIcons\n     `typeLabelFor`den okur — listedeki Tür sütununun okuduğu tablonun\n     aynısı — böylece \".docx\" iki yerde de aynı adla anılır ve yeni bir tür\n     için hiç dizge gerekmez. Aşağıda yalnız bu pencerenin kendi metni var. */\n  'newdoc.title': 'Yeni belge',\n  'newdoc.type.label': 'Belge türü',\n  'newdoc.group.document': 'Belgeler',\n  'newdoc.group.text': 'Metin ve kod',\n  'newdoc.group.diagram': 'Çizimler',\n  'newdoc.withheld.onlyoffice': 'Ofis belgeleri için bir belge sunucusu (OnlyOffice) gerekir; burada tanımlı değil.',\n  'newdoc.withheld.drawio': 'Çizimler için drawio servisi gerekir; burada tanımlı değil.',\n  'newdoc.empty.title': 'Kullanılabilir belge türü yok',\n  'newdoc.empty.body': 'Bu sunucu, bu uygulamanın oluşturabileceği bir tür sunmadı.',\n  'newdoc.empty.blocked': 'Bu sunucunun oluşturabildiği her tür, burada tanımlı olmayan bir düzenleyici servisine bağlı.',\n  'newdoc.name': 'Ad',\n  'newdoc.name.placeholder': 'Belge adı',\n  'newdoc.untitled': 'Adsız',\n  'newdoc.err.slash': 'Ad eğik çizgi içeremez.',\n  'newdoc.err.exists': '{name} burada zaten var. Başka bir ad seçin.',\n  'newdoc.location': 'Konum',\n  'newdoc.location.none': 'Bir klasör seçin',\n  'newdoc.location.change': 'Değiştir',\n  'newdoc.location.noaccess': 'Bu klasöre kaydedemezsiniz.',\n  'newdoc.create': 'Oluştur',\n  'newdoc.creating': 'Oluşturuluyor…',\n  'newdoc.cancel': 'Vazgeç',\n  'drive.search.placeholder': '{scope} deposunda ara',\n  'drive.search.placeholder_all': 'Tüm depolarda ara',\n  'drive.search.hint_title': 'Her yerde ara ve komut çalıştır ({combo})',\n  'drive.storage.used': '{total} alanın {used} kadarı dolu',\n  'drive.storage.used_unlimited': '{used} kullanılıyor',\n  'drive.storage.label': 'Depolama',\n  /* === gorunum:v3-shell — Ana sayfa görünümü (kabuğun içindeki genel bakış)\n   * Bölüm başlıkları `sidenav.storages` / `sidenav.recent` / `sidenav.starred`,\n   * boş durumlar da `empty.recent.*` / `empty.starred.*` — bilerek: Ana\n   * sayfadaki \"Son kullanılanlar\" başlığı ile yanındaki panel satırı aynı\n   * şeydir, ikisine ayrı metin yazmak onları çeviri çeviri birbirinden\n   * ayırmanın yoludur. Aşağıda yalnızca başka hiçbir yerde olmayanlar var. */\n  'home.title': 'Ana sayfa',\n  'home.storages.empty': 'Henüz depo yok',\n  'home.storages.hint': 'Depo, filex’in okuyup yazdığı sürücüdür — depoları yönetici ekler.',\n  'drive.section.folders': 'Klasörler',\n  'drive.section.files': 'Dosyalar',\n  'filter.aria': 'Süzgeçler',\n  'filter.type': 'Tür',\n  'filter.type.any': 'Her tür',\n  'filter.type.folder': 'Klasörler',\n  'filter.type.document': 'Belgeler',\n  'filter.type.spreadsheet': 'Hesap tabloları',\n  'filter.type.presentation': 'Sunumlar',\n  'filter.type.pdf': 'PDF’ler',\n  'filter.type.image': 'Görseller',\n  'filter.type.video': 'Videolar',\n  'filter.type.audio': 'Ses dosyaları',\n  'filter.type.archive': 'Arşivler',\n  'filter.type.code': 'Kod',\n  'filter.modified': 'Değiştirilme',\n  'filter.modified.any': 'Her zaman',\n  'filter.modified.today': 'Bugün',\n  'filter.modified.7d': 'Son 7 gün',\n  'filter.modified.30d': 'Son 30 gün',\n  'filter.modified.year': 'Bu yıl',\n  'filter.size': 'Boyut',\n  'filter.size.any': 'Her boyut',\n  'filter.size.lt1': '1 MB altı',\n  'filter.size.1to10': '1 - 10 MB',\n  'filter.size.10to100': '10 - 100 MB',\n  'filter.size.gt100': '100 MB üstü',\n  /* surucu:d1-actions — filtre satırının sonundaki ⋮ menüsü. Yalnızca menünün\n     KENDİ adı yeni: içindeki her satır o eylemin zaten sahip olduğu metni\n     kullanır (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`,\n     `shortcuts.select_all`, `selection.clear`) — bir komutu yeniden adlandıran\n     menü, okuyucuya aynı şeyi iki kez öğretir. */\n  'filter.actions': 'Liste işlemleri',\n  'filter.clear': 'Süzgeçleri temizle',\n  'filter.empty.title': 'Bu süzgeçlere uyan bir şey yok',\n  'filter.empty.hint': 'Bir süzgeci kaldır ya da yukarıdaki alandan her yerde ara.',\n  'filter.count': '{total} öğeden {shown} tanesi',\n  'inspector.tab.details': 'Ayrıntılar',\n  'inspector.tab.activity': 'Etkinlik',\n  'inspector.people': 'Erişimi olan kişiler',\n  'inspector.people.you': 'Sen',\n  'inspector.people.inherited': 'üst klasörden',\n  'inspector.people.empty': 'Yalnızca sen ve aşağıdaki bağlantıya sahip olanlar.',\n  'inspector.people.manage': 'Erişimi yönet',\n  'inspector.link': 'Paylaşım bağlantısı',\n  'inspector.link.none': 'Paylaşılmadı',\n  'inspector.link.create': 'Bağlantı oluştur',\n  'inspector.link.copy': 'Bağlantıyı kopyala',\n  'inspector.activity.empty': 'Bu öğe için henüz etkinlik kaydı yok.',\n  'inspector.activity.hint': 'Sürümler dosya değiştikçe, yorumlar ise insanlar yazdıkça birikir.',\n  'inspector.activity.version': '{n}. sürüm kaydedildi',\n  'inspector.activity.comment': '{who} yorum yaptı',\n  'inspector.activity.select': 'Etkinliğini görmek için bir dosya ya da klasör seç.',\n  /* === /surucu:d1 === */\n  /* i18n:hardcoded — dönüştürme kutusunda hiç anahtar yoktu: her etiket,\n     kimsenin geçirmediği isteğe bağlı bir `t` prop'unun arkasındaki düz\n     Türkçe metindi. */\n  'convert.title': 'Dönüştür',\n  'convert.loading': 'Dönüştürücü yükleniyor…',\n  'convert.done': 'Dönüştürüldü ve klasöre yüklendi.',\n  'convert.close': 'Kapat',\n  'convert.from': 'Kaynak',\n  'convert.search_format': 'Hedef format ara (pdf, mp4, png…)',\n  'convert.no_format': 'Eşleşen format yok.',\n  'convert.unsupported_input': 'Bu dosya tipi için kaynak format bulunamadı.',\n  'convert.converting': 'Dönüştürülüyor…',\n  'convert.convert': 'Dönüştür',\n  /* === gorunum:v1-chrome — filtre satırındaki ad kutusu === */\n  'filter.find': 'Bu klasörde filtrele…',\n  /* surucu:d1-scope — satırların bir klasörün içeriği olmadığı yerlerde aynı\n     kutu. Neyi daralttığını söylemek zorunda: depo listesinde \"bu klasör\" hiçbir\n     şeyi adlandırmaz, Ana sayfada ise üç bloğu birden adlandırırdı. */\n  'filter.find.storages': 'Depolarda filtrele…',\n  'filter.find.home': 'Ana sayfada filtrele…',\n  /* === gorunum:v1-viewer — tam ekran görüntüleyicinin kendi çerçevesi === */\n  'viewer.share': 'Paylaş',\n  'viewer.nav_prev': 'Önceki dosya',\n  'viewer.nav_next': 'Sonraki dosya',\n  /* Üst çubuğun künye satırındaki sayaç: \"246,3 KB • 9 Eyl 2026 • 1 / 9\". */\n  'viewer.counter': '{i} / {n}',\n  'viewer.zoom_reset': 'Yakınlaştırmayı sıfırla',\n  'viewer.fullscreen': 'Tam ekran',\n  'viewer.exit_fullscreen': 'Tam ekrandan çık',\n  'viewer.md_placeholder': '# Markdown buraya…',\n  /* === gorunum:v1-selbar — filtre satırının yerini alan seçim çubuğu === */\n  'selection.count': '{n} seçildi',\n  'selection.clear': 'Seçimi temizle',\n  /* === gorunum:v1-preview — türün adı, kelimeyle =======================\n     Tür sütunu eskiden uzantıyı büyük harfle yazıyordu; artık bunları\n     yazıyor. Hangisinin seçileceğine `lib/fileIcons.ts` karar verir\n     (`typeLabelKey`) — bir türü adlandıran yalnız iki yer var: o tablo ve bu\n     liste. Eşleşmeyen her şey yine büyük harfli uzantıya düşer. `Klasör`\n     burada DEĞİL: o `node.folder`, grid kartının alt yazısı zaten onu basar. */\n  'ftype.typescript': 'TypeScript',\n  'ftype.javascript': 'JavaScript',\n  'ftype.vue': 'Vue bileşeni',\n  'ftype.python': 'Python',\n  'ftype.go': 'Go',\n  'ftype.rust': 'Rust',\n  'ftype.php': 'PHP',\n  'ftype.ruby': 'Ruby',\n  'ftype.java': 'Java',\n  'ftype.kotlin': 'Kotlin',\n  'ftype.swift': 'Swift',\n  'ftype.c': 'C kaynağı',\n  'ftype.cpp': 'C++ kaynağı',\n  'ftype.csharp': 'C# kaynağı',\n  'ftype.stylesheet': 'Stil dosyası',\n  'ftype.html': 'HTML belgesi',\n  'ftype.json': 'JSON verisi',\n  'ftype.yaml': 'YAML',\n  'ftype.xml': 'XML',\n  'ftype.toml': 'TOML',\n  'ftype.sql': 'SQL',\n  'ftype.shell': 'Kabuk betiği',\n  'ftype.powershell': 'PowerShell betiği',\n  'ftype.markdown': 'Markdown',\n  'ftype.plaintext': 'Düz metin',\n  'ftype.log': 'Günlük dosyası',\n  'ftype.config': 'Ayar dosyası',\n  'ftype.sheet': 'Hesap tablosu',\n  'ftype.figma': 'Figma tasarımı',\n  'ftype.design': 'Tasarım dosyası',\n  'ftype.image': 'Görsel',\n  'ftype.video': 'Video',\n  'ftype.audio': 'Ses',\n  'ftype.pdf': 'PDF belgesi',\n  'ftype.document': 'Belge',\n  'ftype.slides': 'Sunum',\n  'ftype.archive': 'Arşiv',\n  'ftype.code': 'Kod',\n  /* === gorunum:v1-advsearch — Gelişmiş arama penceresi ===================\n   * İki `filter.*` anahtarı kardeşlerinin yanında değil burada: paylaşılan\n   * birleşimlere pencerenin eklediği yeni üyeler (`modified: 'around'`,\n   * `size: 'range'`). Filtre satırı bunları hiç seçmez ama biri oraya\n   * ulaşırsa `chipLabel` ham anahtarı yazardı. */\n  'filter.modified.around': 'Bir tarihin çevresinde',\n  'filter.size.range': 'Özel aralık',\n\n  'advsearch.open': 'Gelişmiş arama',\n  'advsearch.title': 'Gelişmiş arama',\n  'advsearch.subtitle': 'Dosyaları ada, içeriğe, yola ya da etikete göre bulun.',\n  'advsearch.close': 'Kapat',\n  'advsearch.content.heading': 'İçerik araması',\n  'advsearch.viewall': 'Tüm sonuçları gör',\n  'advsearch.where.any_short': 'Her yerde',\n  'advsearch.where.here_short': 'Yalnız burada',\n  'advsearch.where.skip_short': 'Burayı atla',\n  'advsearch.server.legend': 'Sunucunun aradığı',\n  'advsearch.client.legend': 'Gelen sonuçları daralt',\n  'advsearch.query.label': 'Kelimeler',\n  'advsearch.query.placeholder': 'Adın bir parçası ya da dosyanın içindeki kelimeler',\n  'advsearch.scope.label': 'Nerede arasın',\n  'advsearch.scope.name': 'Ad ve yol',\n  'advsearch.scope.content': 'Dosya içeriği',\n  'advsearch.scope.all': 'İkisi de',\n  'advsearch.scope.hint':\n    'İçerik, dizinden aranır; dizin metin türü dosyaların ilk 200 KB’ını kapsar.',\n  'advsearch.people.name_only':\n    'Sahip, gelen satırlardan okunur; sahip bilgisi taşıyan satırları da yalnız ad araması döndürür.',\n  'advsearch.scope.name_only':\n    'Burada yalnız ad ve yol: içerik sonucu gezgine hangi depodan geldiği bilgisi olmadan ulaşır, bu yüzden içerik araması yalnız tek depolu kurulumlarda sunulur.',\n  'advsearch.tags.label': 'Etiketler',\n  'advsearch.tags.placeholder': 'fatura, üç aylık rapor',\n  'advsearch.tags.exclude': 'Şu etiketler hariç',\n  'advsearch.tags.exclude_placeholder': 'arşiv',\n  'advsearch.tags.hint':\n    'Virgülle ayırın. Etiket daraltır: birden çok etiket hepsini birden taşıyan dosyalar demektir, hiç kullanılmamış bir etiket ise hiçbir şey döndürmez.',\n  'advsearch.where.label': 'Klasör',\n  'advsearch.where.any': 'Bu deponun her yerinde',\n  'advsearch.where.here': 'Yalnız {folder} içinde',\n  'advsearch.where.skip': '{folder} dışındaki her yerde',\n  'advsearch.around.label': 'Şu kadar içinde',\n  'advsearch.around.date': 'Tarih ve saat',\n  'advsearch.around.h1': '1 saat',\n  'advsearch.around.d1': '1 gün',\n  'advsearch.around.w1': '1 hafta',\n  'advsearch.size.range_label': 'Şunun arasında',\n  'advsearch.size.from': 'En az',\n  'advsearch.size.to': 'En çok',\n  'advsearch.count.idle': 'Bir şeyler yazın ya da etiket seçin.',\n  'advsearch.count.counting': 'Sayılıyor…',\n  'advsearch.count.result': '{n} eşleşen öğe',\n  'advsearch.count.capped': 'Sonuçların ilk sayfasında {n} eşleşen öğe',\n  'advsearch.count.result_one': '1 eşleşen öğe',\n  'advsearch.count.capped_one': 'Sonuçların ilk sayfasında 1 eşleşen öğe',\n  'advsearch.count.error': 'Sayım çalıştırılamadı.',\n  'advsearch.count.cost':\n    'Sayım bu aramayı çalıştırır. Tür, sahip, tarih, boyut ve klasör sunucuda değil, gelen satırlar üzerinde uygulanır.',\n  'advsearch.wire': 'Gönderilen',\n  'advsearch.reset': 'Sıfırla',\n  'advsearch.cancel': 'Vazgeç',\n  'advsearch.submit': 'Ara',\n\n  /* === gorunum:v2-topbar — sayfanın üst barı kalktı; onun taşıdıklarını\n     artık gezginin kendi başlığı ve kırıntı satırı taşıyor. === */\n  'breadcrumb.subfolders': 'Alt klasörler',\n  'breadcrumb.subfolders.empty': 'Burada alt klasör yok',\n  'header.admin': 'Yönetim paneli',\n  'header.settings': 'Ayarlar',\n  'header.signout': 'Çıkış yap',\n  'ai.assistant': 'AI asistanı',\n  'ai.soon': 'Yakında',\n  'ai.assistant.soon': 'AI asistanı — yakında',\n\n  /* gorunum:v2-share — Paylaş / İzinler penceresinin kendi çerçevesi. İçindeki\n     denetimler eski metinlerini koruyor; buradakiler yeni kabuk: başlık, tek\n     anahtar, \"şu anda kim açabilir\" cümlesi ve her şeyin katlandığı üç adlı\n     bölüm. */\n  'access.title': '\"{name}\" paylaşımı',\n  'access.close': 'Kapat',\n  'access.done': 'Bitti',\n  'access.copy': 'Kopyala',\n  'access.copied': 'Kopyalandı',\n  'access.link.switch': 'Bağlantı paylaşımı',\n  'access.who.private': 'Yalnızca erişimi olan kişiler açabilir.',\n  'access.who.link': 'Bağlantıyı bilen herkes açabilir.',\n  'access.who.pin': \"Bağlantıyı ve PIN'i bilen herkes açabilir.\",\n  'access.who.existing': 'Bağlantı paylaşımı açık — {n} bağlantı var.',\n  'access.who.existing_one': 'Bağlantı paylaşımı açık — {n} bağlantı var.',\n  'access.section.link': 'Bağlantı seçenekleri',\n  'access.section.people': 'Erişimi olanlar',\n  'access.section.drop': 'Dosya iste',\n  'access.sum.pin_on': 'PIN var',\n  'access.sum.pin_off': 'PIN yok',\n  'access.sum.people': '{n} kişi',\n  'access.sum.people_one': '{n} kişi',\n  'access.sum.people_none': 'Henüz kimse yok',\n  'access.sum.drop': '{n} yükleme bağlantısı',\n  'access.sum.drop_one': '{n} yükleme bağlantısı',\n  'access.sum.drop_none': 'Yükleme bağlantısı yok',\n  /* Sahiplik — Sahibi sütunu ve Kişiler çipi. \"Sistem\", filex üzerinden kimsenin\n     koymadığı satırın dürüst karşılığıdır (tarayıcı buldu ya da doğrudan kovaya\n     yazıldı); boşluk değil, gerçek bir cevaptır. */\n  'col.owner': 'Sahibi',\n  'owner.you': 'Siz',\n  'owner.system': 'Sistem',\n  'owner.unknown': 'Bilinmiyor',\n  'owner.external': 'Yükleme bağlantısıyla geldi',\n  'owner.last_actor': 'Son değiştiren: {who}',\n  'filter.people': 'Kişiler',\n  'filter.people.any': 'Herkes',\n  'filter.people.me': 'Siz',\n  'filter.people.system': 'Sistem',\n  'filter.people.someone': 'Başka biri',\n  /* surucu:d1-sort — filtre satırının sağ ucundaki sıralama denetimi. Dört\n     ölçütün adı `col.*`: menü, liste görünümünün sütun başlıklarındaki\n     sözcüklerin aynısını sunar — tek bir sıralamayı süren iki denetim onu\n     farklı adlarla anamaz. */\n  'sort.by': 'Sıralama ölçütü',\n  'sort.asc': 'Artan',\n  'sort.desc': 'Azalan',\n  /* Bir ARAMA SONUCUNUN sırası. Beşinci bir sıralama ölçütü değildir —\n     ekrandaki satırları sunucu sıraladığında denetim, ölçüt adı yerine bunu\n     yazar; böylece yapmadığı bir sıralamayı üstlenmez. `_why` denetimin neden\n     kapalı olduğudur: Burak, denetimin sessizce işlevsizleşmesini değil\n     nedeninin yazılmasını istedi. */\n  'sort.relevance': 'Alaka',\n  'sort.relevance_why':\n    'Arama sonuçları eşleşme yakınlığına göre listelenir. Seçtiğiniz sıralama, aramadan çıkınca geri gelir.',\n  /* === tablo:t1 — tablonun kendi yapılandırması ==========================\n     Sütun genişlikleri ve görünürlüğü EKRANINIZA dair bir tercihtir; bir\n     klasörün hangi görünümle açılacağı ise KLASÖRE dair bir olgudur. İkisi de\n     buradan ayarlanır; `folder_hint` kuralı tek cümlede, tam da ona şaşıracak\n     kişinin okuyabileceği yerde söyler. */\n  'col.location': 'Konum',\n  'cols.menu': 'Sütun seçenekleri',\n  'cols.title': 'Sütunlar',\n  'cols.resize': '{col} sütununu yeniden boyutlandır',\n  'cols.move_left': '{col} sütununu sola taşı',\n  'cols.move_right': '{col} sütununu sağa taşı',\n  'cols.reset': 'Sütunları sıfırla',\n  'cols.folder_title': 'Klasör görünümü',\n  'cols.folder_hint':\n    'Ayarladığınız klasörler kendi görünümünü korur. Son seçiminiz diğer her yerde varsayılan olur.',\n  'cols.forget_folder': 'Bu klasörün görünümünü unut',\n  'cols.apply_all': 'Tüm klasörlere uygula ({count} klasör hatırlanıyor)',\n  /* === tablo:t1 — çöp kutusu bilgi şeridi ================================\n     ⚠ `retention` yalnızca kurulum bize sayıyı SÖYLEDİĞİNDE kullanılır\n     (GET /api/admin/protection). Diğer her durumda `retention_unknown` aynı\n     şeyi, doğrulayamadığımız bir süreyi taahhüt etmeden söyler: yanlış saklama\n     süresi yazan bir şerit, hiç şerit olmamasından kötüdür — insanlar ona\n     bakıp karar verir. */\n  'trash.retention': 'Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.',\n  'trash.retention_one': 'Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.',\n  'trash.retention_unknown':\n    'Çöp kutusundaki öğeler, yöneticinizin belirlediği saklama süresi dolunca kalıcı olarak silinir.',\n  'trash.empty_action': 'Çöp kutusunu boşalt',\n  'trash.empty_confirm_title': 'Çöp kutusu boşaltılsın mı?',\n  'trash.empty_confirm_body_one': 'Bu işlem 1 öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.',\n  'trash.empty_confirm_body':\n    'Bu işlem {count} öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.',\n  'trash.empty_confirm_body_nosize_one': 'Bu işlem 1 öğeyi kalıcı olarak siler. Geri alınamaz.',\n  'trash.empty_confirm_body_nosize': 'Bu işlem {count} öğeyi kalıcı olarak siler. Geri alınamaz.',\n  'trash.emptied': 'Çöp kutusu boşaltıldı',\n  'empty.trash.hint': 'Sildiğiniz dosyalar önce buraya düşer, böylece geri alabilirsiniz.',\n\n  /* tasi:m1 — hedef klasör seçici (modals/DestinationPickerModal.vue) ve\n     üzerine kurulan iki seçim eylemi. */\n  'destpicker.title.move': 'Şuraya taşı',\n  'destpicker.title.copy': 'Şuraya kopyala',\n  'destpicker.title.choose': 'Klasör seç',\n  'destpicker.confirm.move': 'Buraya taşı',\n  'destpicker.confirm.copy': 'Buraya kopyala',\n  'destpicker.confirm.choose': 'Bu klasörü seç',\n  'destpicker.cancel': 'Vazgeç',\n  'destpicker.up': 'Bir üst klasör',\n  'destpicker.crumbs': 'Konum',\n  'destpicker.drives': 'Sürücüler',\n  'destpicker.loading': 'Yükleniyor…',\n  'destpicker.empty': 'Burada alt klasör yok',\n  'destpicker.unreadable': 'Bu klasör açılamıyor.',\n  'destpicker.readonly': 'Salt okunur',\n  'destpicker.readonly_here': 'Bu klasöre yazamazsınız.',\n  'destpicker.pick_a_drive': 'Bir klasör seçmek için önce bir depo açın.',\n  'destpicker.target': 'Hedef: {name}',\n  'destpicker.tag.blocked': 'Uygun değil',\n  'destpicker.blocked.self': 'Bir klasör kendi içine taşınamaz.',\n  'destpicker.blocked.descendant': 'Bir klasör kendi alt klasörlerinden birine taşınamaz.',\n\n  'ctx.move_to': 'Şuraya taşı…',\n  'ctx.copy_to': 'Şuraya kopyala…',\n  'ctx.access.one_only': 'Paylaşım aynı anda tek öğe için çalışır.',\n\n  'toast.archive.preparing': 'Arşiv hazırlanıyor…',\n  'toast.archive.started': '{name} indiriliyor ({count} dosya)',\n  'toast.archive.started_one': '{name} indiriliyor ({count} dosya)',\n  'toast.archive.empty': 'İndirilecek bir şey yok — seçimde okunabilir dosya bulunmuyor.',\n  'toast.moved_to': '{name} klasörüne taşındı',\n  'toast.copied_to': '{name} klasörüne kopyalama kuyruğa alındı',\n};\n","/** English UI strings. */\nexport const en: Record<string, string> = {\n  'toolbar.new_folder': 'New folder',\n  'toolbar.upload': 'Upload',\n  'toolbar.search': 'Search',\n  'toolbar.search.placeholder': 'Search by name or tag:…',\n  'toolbar.view.list': 'List',\n  'toolbar.view.grid': 'Grid',\n  'toolbar.refresh': 'Refresh',\n  'toolbar.go_up': 'Up one level',\n\n  'ctx.open': 'Open',\n  'ctx.preview': 'Preview',\n  'ctx.download': 'Download',\n  'ctx.convert': 'Convert',\n  'ctx.rename': 'Rename',\n  'ctx.delete': 'Delete',\n  'ctx.delete_perm': 'Delete Permanently',\n  'ctx.restore': 'Restore',\n  'ctx.share': 'Share',\n  'ctx.move': 'Move',\n  'ctx.copy': 'Copy',\n  'ctx.cut': 'Cut',\n  'ctx.show_hidden': 'Show hidden files',\n  'ctx.hide_hidden': 'Hide hidden files',\n  'ctx.keep_local': 'Keep on this computer',\n  'ctx.keep_online': 'Keep online only',\n  'ctx.keep_reveal': 'Open local folder',\n  'ctx.keep_inherited': 'Kept on this computer with its parent',\n  'keep.started': 'Will be kept on this computer — sync started',\n  'keep.failed': 'Could not keep on this computer',\n  'keep.badge_kept': 'On this computer',\n  'keep.badge_syncing': 'Syncing…',\n  'keep.badge_cloud': 'Online only',\n  'keep.badge_partial': 'Contains items kept on this computer',\n  'keep.strip_transfer': 'Syncing {name} — {done}/{total} ({pct}%)',\n  'keep.strip_inventory': 'Syncing {name} — scanning the server…',\n  'keep.strip_settling': 'Syncing {name} — settling…',\n  'ctx.paste': 'Paste',\n  'ctx.info': 'Info',\n  'ctx.duplicate': 'Duplicate',\n  'ctx.new_file': 'New file',\n\n  'modal.delete.title': 'Delete?',\n  'modal.delete.message': '{count} items will be moved to trash.',\n  'modal.delete.message_one': '1 item will be moved to trash.',\n  'modal.delete.confirm': 'Move to Trash',\n  'modal.delete.cancel': 'Cancel',\n\n  'modal.rename.title': 'Rename',\n  'modal.rename.save': 'Save',\n  'modal.rename.cancel': 'Cancel',\n\n  'modal.newfolder.title': 'New folder',\n  'modal.newfolder.placeholder': 'Folder name',\n  'modal.newfolder.create': 'Create',\n  'modal.newfolder.cancel': 'Cancel',\n\n  'modal.share.title': 'Share Link',\n  'modal.share.pin': 'PIN protected',\n  'modal.share.expires': 'Expires at',\n  'modal.share.max_downloads': 'Download limit',\n  'modal.share.create': 'Share',\n  'modal.share.cancel': 'Cancel',\n  'modal.share.close': 'Close',\n  'modal.share.limit_applied': '(server limit applied)',\n  'modal.share.copy': 'Copy',\n  'modal.share.url_copied': 'Link copied',\n  'modal.share.pin_copied': 'PIN copied',\n  'modal.share.cli_copied': 'CLI command copied',\n\n  'upload.progress': 'Uploading',\n  'upload.done': 'Done',\n  'upload.error': 'Error',\n  'upload.failed': 'Could not upload “{name}”',\n  'upload.aborted': 'Aborted',\n  'upload.cancel': 'Cancel',\n  'upload.resuming': 'Resuming “{name}” from {percent}%',\n  'upload.committing': 'Finishing',\n  'upload.transferring': 'Moving to storage',\n\n  'empty.folder': 'This folder is empty',\n  'empty.search': 'No results',\n  'loading': 'Loading…',\n\n  'notFound.title': 'Folder not found',\n  'notFound.desc': 'This folder does not exist, was moved, or you do not have access to it.',\n  'notFound.goRoot': 'Go to root folder',\n\n  'col.name': 'Name',\n  'col.size': 'Size',\n  'col.modified': 'Modified',\n  'col.type': 'Type',\n\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n\n  'breadcrumb.root': 'Root',\n  'breadcrumb.copy_path': 'Copy path',\n  'breadcrumb.go_to_path': 'Go to path',\n  'breadcrumb.path_placeholder': 'fileman/foo/bar',\n\n  'ops.copy': 'Copying',\n  'ops.move': 'Moving',\n  'ops.delete': 'Deleting',\n  'ops.queued': 'queued',\n  'ops.done': 'done',\n  'ops.error': 'error',\n\n  'node.trash': 'Trash',\n  /* gorunum:v1 — the singular kind, printed under a folder's name on a card\n   * and beside it in the list. The plural section heading is a different\n   * string on purpose. */\n  'node.folder': 'Folder',\n\n  // ——— Rich viewer chrome ———\n  'viewer.open_in_new_tab': 'Open in new tab',\n  'viewer.loading': 'Loading…',\n  'viewer.failed_to_load': 'Failed to load file',\n  'viewer.peer_not_installed': 'Optional viewer library is not installed. Install the peer dependency or use the download button.',\n  'viewer.format_unsupported_3d': 'This 3D format is not supported in the browser preview (model-viewer only reads .glb / .gltf / .usdz). Please download and open with a local tool.',\n  'viewer.zoom_in': 'Zoom in',\n  'viewer.zoom_out': 'Zoom out',\n  'viewer.fit_width': 'Fit width',\n  'viewer.next_page': 'Next page',\n  'viewer.prev_page': 'Previous page',\n  'viewer.page_n_of_m': 'Page {n} of {m}',\n  'viewer.tags': 'Tags',\n  'viewer.layers': 'Layers',\n  'viewer.toc': 'Contents',\n  'viewer.font_smaller': 'Smaller text',\n  'viewer.font_larger': 'Larger text',\n  'viewer.search': 'Search',\n  'viewer.download': 'Download',\n  'viewer.saving': 'Saving…',\n  'viewer.save': 'Save (Ctrl+S)',\n  'viewer.saved': 'Saved',\n  'viewer.save_error': 'Error',\n  'viewer.editor_loading': 'Loading editor…',\n  'viewer.no_preview': 'No preview for this file type yet.',\n  'viewer.edit': 'Edit',\n  'viewer.close': 'Close',\n  'presence.expand': 'Show names',\n  'presence.collapse': 'Collapse',\n  'viewer.save_annotations': 'Save annotations',\n  'viewer.annotations_on': 'Annotations: on',\n  'viewer.annotations_off': 'Annotations: off',\n  'viewer.read_only': 'Read only',\n  'viewer.csv_first_row_header': 'First row as header',\n  'viewer.csv_filter': 'Filter rows…',\n  'viewer.epub_prev': 'Previous',\n  'viewer.epub_next': 'Next',\n  'viewer.drawio.disabled': 'diagrams.net embed is not configured for this filex instance — operator must wire FILEX_DRAWIO_URL to enable the editor.',\n  'viewer.archive.entries': '{n} files',\n  'viewer.archive.entries_one': '1 file',\n  'viewer.archive.empty': 'Archive is empty.',\n  'viewer.archive.error': 'Could not read archive contents.',\n  'viewer.name': 'Name',\n  'viewer.size': 'Size',\n\n  // ——— cila:a — sorting / date groups / density ———\n  'col.sort': 'Sort',\n  'group.today': 'Today',\n  'group.yesterday': 'Yesterday',\n  'group.this_week': 'This Week',\n  'group.this_month': 'This Month',\n  'group.no_date': 'No date',\n  'toolbar.density.compact': 'Compact view',\n  'toolbar.density.comfortable': 'Comfortable view',\n\n  // ——— cila:c — command palette + shortcuts help + breadcrumb ———\n  'palette.placeholder': 'Search files, folders or commands…',\n  'palette.files': 'Files',\n  'palette.commands': 'Commands',\n  'palette.goto': 'Go to path',\n  'palette.empty': 'No results',\n  'palette.hint': '↑↓ navigate · Enter select · Esc close',\n  'cmd.view_toggle': 'Toggle view (list ⇄ grid)',\n  'cmd.trash': 'Open trash',\n  'shortcuts.title': 'Keyboard Shortcuts',\n  'shortcuts.group.nav': 'Navigation',\n  'shortcuts.group.selection': 'Selection',\n  'shortcuts.group.file': 'File operations',\n  'shortcuts.palette': 'Command palette',\n  'shortcuts.search': 'Focus search',\n  'shortcuts.go_up': 'Go up one level',\n  'shortcuts.open': 'Open selected item',\n  'shortcuts.close': 'Close / cancel',\n  'shortcuts.toggle_hidden': 'Show/hide hidden files',\n  'shortcuts.help': 'This help dialog',\n  'shortcuts.select_all': 'Select all',\n  'shortcuts.star': 'Star / unstar',\n  'shortcuts.rename': 'Rename',\n  'shortcuts.delete': 'Delete',\n  'shortcuts.cut': 'Cut',\n  'shortcuts.copy': 'Copy',\n  'shortcuts.paste': 'Paste',\n  'breadcrumb.more': 'Hidden folders',\n\n  // ——— State screens + undo snackbar + connection badge (cila:b) ———\n  'empty.hint': 'Drag and drop files here',\n  'empty.upload': 'Upload files',\n  'empty.search.title': 'No files match your search',\n  'empty.search.hint': 'Try a different search term',\n  'empty.trash.title': 'Trash is empty',\n  'error.title': 'Could not load this folder',\n  'error.retry': 'Try again',\n  'toast.undo': 'Undo',\n  'toast.undone': 'Undone',\n  'toast.undo_failed': 'Could not undo',\n  'toast.renamed': 'Renamed',\n  'toast.moved': 'Moved',\n  'toast.trashed': 'Moved to trash',\n  /* i18n:hardcoded — toast copy that used to be Turkish string literals in\n     FileExplorer.vue, unreachable by any locale. */\n  'toast.failed': 'Operation failed',\n  'toast.copied': 'Copied',\n  'toast.deleted': 'Deleted',\n  'toast.cut': 'Cut',\n  'toast.cut_ready': 'Cut — ready to paste',\n  'toast.copy_ready': 'Copied — ready to paste',\n  'toast.same_folder_cut': 'Cannot cut into the same folder',\n  'toast.restored': '{n} items restored',\n  'toast.restored_one': '1 item restored',\n  'toast.restore_taken': '{n} items were not restored: something already has their names. Rename what is there, then restore again.',\n  'toast.restore_taken_one': '“{name}” was not restored: something already has that name. Rename what is there, then restore again.',\n  'toast.delete_queued': 'Delete queued',\n  'toast.trash_retention': 'Items in the trash are removed automatically once the retention window ends. Permanent deletion is done from the admin panel.',\n  'dropzone.hint': 'Drop files here',\n  'modal.newfolder.invalid': 'Invalid character',\n  'viewer.office_unconfigured': 'OnlyOffice is not configured',\n  'viewer.pdf_inline_failed': 'Your browser could not display this PDF inline.',\n  'viewer.too_large': 'File is too large (>1 MB).',\n  'viewer.csv_rows': '{n} rows',\n  'viewer.csv_rows_one': '1 row',\n  'presence.others': '{n} people',\n  'presence.others_one': '1 person',\n  'conn.offline': 'No live connection — changes may be delayed',\n  'conn.tooltip': 'Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.',\n\n  /* === bul:s3 === */\n  'palette.everywhere': 'Everywhere',\n  'palette.searching': 'Searching…',\n  'palette.saved': 'Saved searches',\n  'palette.save': 'Save search',\n  'palette.saved.delete': 'Delete saved search',\n  'search.in_content': 'In content',\n\n  /* === bag:b4 === */\n  'toolbar.more': 'More actions',\n  'toolbar.search.close': 'Close search',\n  'sheet.menu': 'Actions',\n  'sheet.close': 'Close',\n\n  /* === koru:k1 === */\n  'toolbar.inspector': 'Details',\n  'ctx.details': 'Details',\n  /* yildiz:s1 — starring is an action, so it has a verb in the menu. */\n  'ctx.star': 'Star',\n  'ctx.unstar': 'Unstar',\n  'star.failed': 'Could not change the star',\n  'shortcuts.inspector': 'Toggle details panel',\n  'inspector.title': 'Details',\n  'inspector.copy_name': 'Copy name',\n  'inspector.items': '{n} items',\n  'inspector.items_one': '1 item',\n  'inspector.type': 'Type',\n  'inspector.select_hint': 'Select an item to see its details.',\n  /* pane:p1 — the panel HOLDS the last selected thing (owner's ruling,\n     2026-09-13), so it can be describing an item in the half of a split\n     window nobody is looking at. This line says which one and where. */\n  'inspector.held': 'Last selected — in {where}',\n  'inspector.close': 'Close',\n  'inspector.section.general': 'General',\n  'inspector.section.tags': 'Tags',\n  /* etiket:t1 — TagPicker's own chrome. It printed these three in English\n     regardless of the catalogue until 2026-09-13; `tags.open` is the chip's new\n     \"show me everything with this tag\". */\n  'tags.open': 'Open tag: {tag}',\n  'tags.add': '+ Add tag',\n  'tags.name': 'Tag name',\n  'tags.remove': 'Remove tag',\n  'inspector.section.versions': 'Versions',\n  'inspector.section.permissions': 'Permissions',\n  'inspector.section.shares': 'Shares',\n  'inspector.path': 'Path',\n  'inspector.size': 'Size',\n  'inspector.modified': 'Modified',\n  'inspector.mime': 'MIME type',\n  'inspector.etag': 'ETag',\n  'inspector.nodeId': 'Node ID',\n  'inspector.copy': 'Copy',\n  'inspector.copied': 'Copied',\n  'inspector.error': 'Could not load',\n  'inspector.items_summary': '{n} items, {size} total',\n  'inspector.items_summary_one': '1 item, {size} total',\n  'inspector.folder_items': '{n} items',\n  'inspector.folder_items_one': '1 item',\n  'inspector.versions.empty': 'No version history',\n  'inspector.versions.v': 'Version {n}',\n  'inspector.versions.restore': 'Restore',\n  'inspector.versions.restore_confirm': 'Restore this version?',\n  'inspector.versions.snapshot_current': 'Snapshot the current state first',\n  'inspector.versions.confirm': 'Confirm',\n  'inspector.versions.cancel': 'Cancel',\n  'inspector.versions.take_snapshot': 'Snapshot current state',\n  'inspector.versions.restored': 'Version restored',\n  'inspector.versions.snapshotted': 'Snapshot taken',\n  'inspector.versions.unsupported': 'The server does not support this operation',\n  'inspector.perm.none': 'No access',\n  'inspector.perm.viewer': 'Viewer',\n  'inspector.perm.editor': 'Editor',\n  'inspector.perm.owner': 'Owner',\n  'inspector.perm.manage': 'Manage permissions',\n  'inspector.shares.empty': 'No share links',\n  'inspector.shares.copy': 'Copy link',\n\n  /* wiring:c1 — theme gallery */\n  'theme.menu': 'Theme',\n  'theme.title': 'Theme Gallery',\n  'theme.hint': 'A theme only changes the colour palette — day or night is the choice above.',\n  'theme.mode.label': 'Appearance',\n  'theme.mode.light': 'Day',\n  'theme.mode.dark': 'Night',\n  'theme.mode.auto': 'Automatic',\n  'theme.reset': 'Reset to default',\n  'theme.close': 'Close',\n  'theme.selected': 'Selected',\n  'theme.name.default': 'Default',\n  'theme.name.night': 'Night Blue',\n  'theme.name.forest': 'Forest',\n  'theme.name.amber': 'Amber',\n  'theme.name.lilac': 'Lilac',\n  'theme.name.contrast': 'High Contrast',\n  'theme.name.gray': 'Soft Gray',\n  'theme.name.terminal': 'Terminal Green',\n  /* === zaman:z3 — the time-zone picker (embed dialog + web settings) === */\n  'tz.menu': 'Time zone',\n  'tz.title': 'Time zone',\n  'tz.label': 'Show dates in',\n  'tz.search': 'Search a city, country or offset — try \"Istanbul\" or \"GMT+3\"',\n  'tz.default.device': \"Use this device's zone ({zone})\",\n  'tz.default.account': \"Use the account's zone ({zone})\",\n  'tz.default.host': \"Use this site's default ({zone})\",\n  'tz.no_match': 'No zone matches “{query}”. Try a city, a country, or an offset like GMT+3.',\n  'tz.more': '{n} more — keep typing to narrow the list.',\n  'tz.hint': 'Saved in this browser only. Every date is stored as one moment in time and shown on the clock you pick here.',\n  'tz.now': 'Right now in {zone}: {time}',\n  /* === wiring:c2 — customizable shortcuts + quick look === */\n  'shortcuts.quicklook': 'Quick look',\n  'shortcuts.customize': 'Customize',\n  'shortcuts.settings.menu': 'Shortcuts',\n  'shortcuts.settings.title': 'Shortcut Settings',\n  'shortcuts.settings.hint': 'To remap a shortcut, press \"Change\" and then the new key combination. Changes are stored in this browser only.',\n  'shortcuts.settings.change': 'Change',\n  'shortcuts.settings.capture': 'Press keys… (Esc cancels)',\n  'shortcuts.settings.reset': 'Reset to default',\n  'shortcuts.settings.reset_all': 'Reset all',\n  'shortcuts.settings.unbound': 'Not set',\n  'shortcuts.settings.fixed': 'Fixed',\n  'shortcuts.settings.customized': 'Customized',\n  'shortcuts.settings.conflict': 'is already used by \"{name}\".',\n  'shortcuts.settings.conflict_fixed': 'is reserved by the fixed shortcut \"{name}\" — it cannot be used.',\n  'shortcuts.settings.conflict_take': 'Unassign old and use here',\n  'shortcuts.settings.conflict_cancel': 'Cancel',\n  'quicklook.hint_close': 'close',\n  'quicklook.hint_nav': 'previous/next',\n  'quicklook.hint_open': 'open',\n  /* === /wiring:c2 === */\n  /* === wiring:c3 — operations center === */\n  'opc.title': 'Operations',\n  'opc.aria_badge': '{n} operations — toggle operations center',\n  'opc.aria_badge_one': '1 operation — toggle operations center',\n  'opc.close': 'Close',\n  'opc.active': 'In progress',\n  'opc.history': 'History',\n  'opc.clear': 'Clear',\n  'opc.empty': 'No operations',\n  'opc.cancel': 'Cancel',\n  'opc.retry': 'Retry',\n  'opc.dismiss': 'Dismiss',\n  'opc.queued': 'Queued',\n  'opc.percent': '{n}%',\n  'opc.status.running': 'In progress',\n  'opc.status.done': 'Done',\n  'opc.status.error': 'Failed',\n  'opc.status.aborted': 'Cancelled',\n  'opc.kind.upload': 'Upload',\n  'opc.kind.copy': 'Copy',\n  'opc.kind.move': 'Move',\n  'opc.kind.delete': 'Delete',\n  'opc.kind.convert': 'Convert',\n  'opc.kind.archive': 'Archive',\n  /* === wiring:c4 — onboarding tour + accessibility + error card === */\n  'tour.aria': 'Onboarding tour',\n  'tour.restart': 'Restart the tour',\n  'tour.skip': 'Skip tour',\n  'tour.back': 'Back',\n  'tour.next': 'Next',\n  'tour.done': 'Done',\n  'tour.progress': '{n} / {m}',\n  'tour.step.nav.title': 'Storages & views',\n  'tour.step.nav.desc':\n    'Home, Shared with me, Recent, Starred and Trash are always in this panel, with your storages and connections underneath. The button in the top-left corner collapses it to a rail and brings it back.',\n  'tour.step.nav.desc_closed':\n    'This button opens the navigation panel: Home, Shared with me, Recent, Starred and Trash, with your storages and connections underneath.',\n  'tour.step.new.title': 'Add something',\n  'tour.step.new.desc':\n    'Everything new starts here — upload from this device, create a folder, or ask somebody else for a file. Dropping files onto the window uploads them as well.',\n  'tour.step.new.desc_fab':\n    'This button uploads files from this device. Dropping files onto the window works as well.',\n  'tour.step.search.title': 'Search',\n  'tour.step.search.desc':\n    'This field searches the whole storage by name — separators and one typo are forgiven, so \"invoice 2026\" finds invoice_2026.pdf. Add tag:invoice to filter by tag. The sliders button opens advanced search, and {palette} opens the command palette, which runs commands too.',\n  'tour.step.crumb.title': 'Where you are',\n  'tour.step.crumb.desc':\n    'This trail is the address of the folder on screen. Click any step to go back up, and the chevron beside the last one lists the folders inside it.',\n  'tour.step.filters.title': 'Narrow the list',\n  'tour.step.filters.desc':\n    'Type, People, Modified and Size filter the folder you are in, the box beside them matches names as you type, and the control at the end of the row sorts.',\n  'tour.step.view.title': 'Switch views',\n  'tour.step.view.desc':\n    'Change how this folder is drawn; your choice is remembered.',\n  'tour.step.details.title': 'Details & sharing',\n  'tour.step.details.desc':\n    'Select a file and open this panel for its details, its activity and its share links. For the full menu, right-click the file or use the button at the end of its row — \"Share / Permissions\" there creates a link with an optional PIN and expiry.',\n  'tour.step.help.title': 'Shortcuts',\n  'tour.step.help.desc':\n    'Press {help} for the shortcut cheat-sheet and {palette} for the command palette. Theme and \"Restart the tour\" are in the \"More actions\" menu at the top right; your account and sign-out are behind the avatar beside it.',\n  'error.hint': 'This may be a temporary network or server problem. Please try again.',\n  'error.details': 'Technical details',\n  'col.star': 'Star',\n  'toolbar.view_label': 'View',\n  'list.aria': 'File list',\n  'grid.aria': 'File grid',\n\n  /* === wiring:d1 — tabs + split pane === */\n  'tabs.strip': 'Tabs',\n  'tabs.new': 'New tab',\n  'tabs.close': 'Close tab',\n  'tabs.split': 'Split view',\n  'tabs.split_off': 'Close split',\n  'ctx.open_new_tab': 'Open in new tab',\n  'shortcuts.group.tabs': 'Tabs',\n  'shortcuts.tab_new': 'New tab',\n  'shortcuts.tab_close': 'Close tab',\n  'shortcuts.tab_next': 'Next tab',\n  'shortcuts.tab_prev': 'Previous tab',\n  /* tus:t1 — the menu verbs */\n  'shortcuts.new_folder': 'New folder',\n  'shortcuts.upload': 'Upload files',\n  'shortcuts.refresh': 'Refresh the listing',\n  'shortcuts.download': 'Download',\n  'shortcuts.preview': 'Preview',\n  'shortcuts.share': 'Share / permissions',\n  'shortcuts.tags': 'Tags',\n  'shortcuts.convert': 'Convert',\n  'shortcuts.open_tab': 'Open in a new tab',\n  'shortcuts.copy_path': 'Copy path',\n  'shortcuts.copy_id': 'Copy id',\n  'shortcuts.restore': 'Restore from trash',\n  'shortcuts.settings.reserved':\n    'is taken by the browser before the page sees it, so it would do nothing here. Pick another key.',\n  'shortcuts.settings.reserved_badge': 'Desktop app only',\n  'shortcuts.settings.reserved_title':\n    'The browser handles this combination itself. It fires in the desktop app and in an installed PWA, not in a browser tab.',\n  'cmd.tab_new': 'Open a new tab',\n  'cmd.split_toggle': 'Toggle split view',\n  'split.pane': 'Secondary pane',\n  'split.close': 'Close the side pane',\n  'split.error': 'Could not load the listing',\n  'split.retry': 'Retry',\n  'split.copy_queued': 'Copy queued',\n  'split.move_queued': 'Move queued',\n  'toast.move_kept_both': 'Move queued. A name was already taken there, so that item will be kept beside the existing one with “-copy” added. This move cannot be undone.',\n  'split.cross_copy': 'Different storages — copy queued instead',\n  'dragout.downloading': 'Downloading into the folder you dropped on…',\n  'dragout.not_found': 'Could not find where it was dropped — a drop onto an application (rather than a folder) cannot be filled in',\n  'dragout.done': 'Download finished',\n  'dragout.ready': 'Files are ready — drag them to your desktop',\n  'dragout.preparing': 'Getting them ready to drag…',\n  'split.cross_move': 'Different storages — move queued (bytes travel, then the original is removed)',\n  /* === /wiring:d1 === */\n  /* wiring:d2 — gallery view */\n  'toolbar.view.gallery': 'Gallery',\n  'gallery.aria': 'File gallery',\n  /* /wiring:d2 */\n  /* wiring:d3 — inspector node comments */\n  'inspector.section.comments': 'Comments',\n  'inspector.comments.empty': 'No comments yet.',\n  'inspector.comments.placeholder': 'Write a comment…',\n  'inspector.comments.send': 'Send',\n  'inspector.comments.delete': 'Delete comment',\n  /* wiring:e2 — end-to-end encrypted folders */\n  'e2e.create.title': 'Create encrypted folder',\n  'e2e.create.option': 'Create encrypted folder…',\n  'e2e.create.pw_label': 'Folder password',\n  'e2e.create.pw_placeholder': 'At least 8 characters',\n  'e2e.create.pw2_label': 'Repeat the password',\n  'e2e.create.warn_title': 'NO WAY BACK',\n  'e2e.create.warn_body':\n    'Files in this folder can only be opened with this password or the recovery key shown once when the folder is created. The password is NEVER stored on the server, and filex keeps no copy of the recovery key either. Lose both and the contents are gone for good.',\n  'e2e.create.ack': 'I understand: if I lose both the password and the recovery key, my data cannot be recovered.',\n  'e2e.create.ack_required': 'Please confirm the warning to continue.',\n  'e2e.create.pw_short': 'Password must be at least 8 characters.',\n  'e2e.create.pw_mismatch': 'Passwords do not match.',\n  'e2e.create.bad_name': 'Invalid folder name.',\n  'e2e.create.create': 'Create encrypted folder',\n  'e2e.create.busy': 'Creating…',\n  'e2e.create.done': 'Encrypted folder created',\n  'e2e.create.failed': 'Could not create the encrypted folder',\n  'e2e.create.nested': 'You cannot create an encrypted folder inside another one.',\n  'e2e.locked.title': 'This folder is end-to-end encrypted',\n  'e2e.locked.hint': 'Enter the folder password to see its contents. The password stays in this tab’s memory only.',\n  'e2e.locked.pw_placeholder': 'Folder password',\n  'e2e.locked.unlock': 'Unlock',\n  'e2e.locked.busy': 'Verifying…',\n  'e2e.unlock.wrong': 'Wrong password.',\n  'e2e.unlock.marker_missing': 'Could not read the key file (.filex-e2e.json).',\n  /* ikon:emoji — the listing marker's accessible name. The row used to print\n     a 🔒 and nothing else; the padlock that replaced it is aria-hidden inside\n     the tile, so the span that carries it says this instead. */\n  'e2e.badge': 'Encrypted folder',\n  'e2e.strip.label': 'Encrypted folder — unlocked',\n  'e2e.strip.lock': 'Lock',\n  'e2e.locked_toast': 'Folder locked',\n  'e2e.upload.too_big': 'Files over 200 MB cannot be uploaded to an encrypted folder (MVP limit)',\n  'e2e.upload.locked': 'Unlock the folder first',\n  'e2e.decrypting': 'Decrypting…',\n  'e2e.decrypt_failed': 'Could not decrypt the file (password changed or file corrupted).',\n  /* wiring:e2 recovery — recovery keys + operator escrow */\n  'e2e.create.escrow_title': 'This server holds a second key',\n  'e2e.create.escrow_body':\n    'Key escrow is enabled on this installation, so its operator can open this folder without your password. Using that key notifies you. Escrow is fixed when the server is installed and cannot be turned off for a folder.',\n  'e2e.locked.use_recovery': 'Lost the password? Use a recovery key',\n  'e2e.recovery.title': 'Save your recovery key',\n  'e2e.recovery.title_upgraded': 'Your recovery key',\n  'e2e.recovery.lead':\n    'This key opens the folder without its password. It is shown once — filex does not store it and cannot show it again.',\n  'e2e.recovery.lead_upgraded':\n    'This folder now has a recovery key. It opens the folder without its password, is shown once, and is not stored by filex.',\n  'e2e.recovery.copy': 'Copy',\n  'e2e.recovery.copied': 'Copied',\n  'e2e.recovery.download': 'Download as a file',\n  'e2e.recovery.warn_title': 'TREAT THIS LIKE A PASSWORD',\n  'e2e.recovery.warn_body':\n    'Anyone holding this key can read the folder. Keep it somewhere separate from the password — a key stored next to the password protects you from forgetting, not from anyone else.',\n  'e2e.recovery.escrow_title': 'This server also holds a key',\n  'e2e.recovery.escrow_body':\n    'Key escrow is enabled here, so the operator of this installation can open this folder without your password. You are notified when that key is used.',\n  'e2e.recovery.escrow_kid': 'Escrow key',\n  'e2e.recovery.ack': 'I have saved this key somewhere safe.',\n  'e2e.recovery.done': 'Done',\n  'e2e.recover.title': 'Unlock without the password',\n  'e2e.recover.none':\n    'This folder was created before recovery keys existed, so it has none. Its password is the only way in. Unlock it with the password once and filex will offer to add a recovery key.',\n  'e2e.recover.tab_recovery': 'Recovery key',\n  'e2e.recover.tab_escrow': 'Escrow key',\n  'e2e.recover.recovery_hint': 'The key shown once when this folder was created.',\n  'e2e.recover.recovery_placeholder': 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX',\n  'e2e.recover.escrow_warn_title': 'The owner will be told',\n  'e2e.recover.escrow_warn_body':\n    'Opening a folder with the escrow key notifies its owner. Use it only when you are entitled to.',\n  'e2e.recover.escrow_kid': 'Escrow key',\n  'e2e.recover.escrow_predates':\n    'This installation has an escrow key, but this folder does not. It was created before escrow was turned on here, so its master key was never wrapped to the escrow identity. The escrow key will not open it. Nothing the operator can do changes that — adding a slot needs this folder\\u2019s password, which the server has never had. The folder\\u2019s owner can grant it: unlock with the password, then choose to give the operator a key. Until they do, use the password or the recovery key.',\n  'e2e.recover.escrow_other_key':\n    'This folder carries an escrow key from a DIFFERENT installation. It was created elsewhere and restored here, so this installation\\u2019s escrow key does not open it. Only the private key belonging to the escrow key it was sealed to can.',\n  'e2e.recover.escrow_placeholder': 'Paste the escrow private key (PKCS#8, base64 or PEM)',\n  'e2e.recover.bad_format':\n    'That does not look like a recovery key. It is 32 characters in eight groups of four.',\n  'e2e.recover.escrow_required': 'Paste the escrow private key.',\n  'e2e.recover.wrong_recovery': 'That recovery key does not open this folder.',\n  'e2e.recover.wrong_escrow':\n    'That escrow key does not open this folder. Folders created before escrow was enabled have no escrow key, and cannot be given one.',\n  'e2e.recover.bad_escrow_key': 'That is not a readable private key (expected PKCS#8, base64 or PEM).',\n  'e2e.recover.notify_failed':\n    'Could not notify the folder owner, so the folder was not unlocked. Escrow use is always announced.',\n  'e2e.recover.recovery_done': 'Unlocked with the recovery key',\n  'e2e.recover.escrow_done': 'Unlocked with the escrow key — the owner has been notified',\n  'e2e.recover.unlock': 'Unlock',\n  'e2e.recover.busy': 'Unlocking…',\n  'e2e.escrowoffer.title': 'Give the operator a key to this folder?',\n  'e2e.escrowoffer.body':\n    'This folder was created before key escrow was turned on here, so the operator of this installation cannot open it. Right now — while your password is in memory — filex can seal this folder to the escrow key. Your files are not re-encrypted or moved; only the key file changes.',\n  'e2e.escrowoffer.consequence':\n    'What this means: the operator gains a second, permanent way into this folder, without your password. You are notified when that key is used, but that notification is an announcement rather than a control.',\n  'e2e.escrowoffer.learn_more': 'What escrow can and cannot do',\n  'e2e.escrowoffer.password_label': 'Folder password',\n  'e2e.escrowoffer.password_required': 'Enter the folder password.',\n  'e2e.escrowoffer.wrong_password': 'That is not this folder\\u2019s password.',\n  'e2e.escrowoffer.accept': 'Give the operator a key',\n  'e2e.escrowoffer.decline': 'No, keep it to myself',\n  'e2e.escrowoffer.cancel': 'Cancel',\n  'e2e.escrowoffer.busy': 'Sealing…',\n  'e2e.escrowoffer.done': 'The operator can now open this folder with the escrow key',\n  'e2e.escrowoffer.declined_toast': 'Kept to yourself. filex will not ask again for this folder.',\n  'e2e.escrowoffer.decline_failed':\n    'Could not record your answer, so filex will ask again next time. Nothing about the folder changed.',\n  'e2e.escrowoffer.failed': 'Could not give the operator a key to this folder',\n  'e2e.escrowoffer.strip_action': 'Escrow key…',\n  'e2e.upgrade.title': 'This folder has no recovery key',\n  'e2e.upgrade.body':\n    'It was created before recovery keys existed, so its password is the only way in. Right now — and only right now, while the password is in memory — filex can add one. Your files are not re-encrypted or moved.',\n  'e2e.upgrade.escrow_note':\n    'Note: this installation has key escrow enabled, so adding a recovery key also lets its operator open this folder without your password.',\n  'e2e.upgrade.accept': 'Create a recovery key',\n  'e2e.upgrade.decline': 'Not now',\n  'e2e.upgrade.busy': 'Creating…',\n  'e2e.upgrade.failed': 'Could not add a recovery key to this folder',\n  'e2e.download.failed': 'Could not download the encrypted file.',\n  /* /wiring:e2 */\n\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  'conn.title': 'Storage connections',\n  'conn.subtitle': 'Connect {host} to a backend, or connect your computer to {host}.',\n  'conn.close': 'Close',\n  'conn.tab.storages': 'Storages',\n  'conn.tab.connect': 'How to connect',\n  'conn.loading': 'Loading…',\n  'conn.visibleOnly': 'you can browse this one',\n  'conn.denied.title': 'Only an administrator can add storages here',\n  'conn.denied.none': 'Your account may browse files but not change what this server is connected to. Ask an administrator of this server to add or edit a storage.',\n  'conn.denied.anonymous': 'You are not signed in on this server.',\n  'conn.denied.unreachable': 'The server did not answer: {error}',\n  'conn.denied.guideHint': 'You do not need administrator rights to connect your own computer to the storages you can already see.',\n  'conn.denied.guideCta': 'Show me how to connect',\n  'conn.list.count': '{n} storages',\n  'conn.list.count_one': '1 storage',\n  'conn.list.add': 'Add a storage',\n  'conn.list.empty': 'No storage is configured yet. Add one and the files show up in the explorer.',\n  'conn.list.edit': 'Edit',\n  'conn.list.remove': 'Remove',\n  'conn.list.confirm': 'Really remove?',\n  'conn.list.readOnly': 'read-only',\n  'conn.list.disabled': 'disabled',\n  'conn.form.newTitle': 'New storage',\n  'conn.form.editTitle': 'Edit “{name}”',\n  'conn.form.name': 'Display name',\n  'conn.form.namePlaceholder': 'photos',\n  'conn.form.nameHelp': 'What this storage is called everywhere: in the explorer, in paths (name://folder) and in WebDAV URLs.',\n  'conn.form.driver': 'Type',\n  'conn.form.driverLocked': 'A storage\\'s type cannot change after it is created — the paths already point at it.',\n  'conn.form.readOnly': 'Read-only (nothing may be written to this storage)',\n  'conn.form.enabled': 'Enabled',\n  'conn.form.test': 'Test connection',\n  'conn.form.testing': 'Testing…',\n  'conn.form.testOk': 'Connected. {count} items at the root.',\n  'conn.form.testOk_one': 'Connected. 1 item at the root.',\n  'conn.form.testFail': 'Could not connect: {error}',\n  'conn.form.save': 'Save',\n  'conn.form.saving': 'Saving…',\n  'conn.form.cancel': 'Cancel',\n  'conn.form.nameRequired': 'Give the storage a name.',\n  'conn.form.fillRequired': 'Fill in the fields marked with *.',\n  'conn.form.required': 'Required',\n  'conn.form.advanced': 'Advanced settings',\n  'conn.form.noFields': 'This server did not describe any settings for this driver.',\n  'conn.form.reveal': 'Show',\n  'conn.form.hide': 'Hide',\n  'conn.guide.protocol': 'Protocol',\n  'conn.guide.storage': 'Storage',\n  'conn.guide.allStorages': 'All storages',\n  'conn.guide.copy': 'Copy',\n  'conn.guide.copied': 'Copied',\n  'conn.guide.goodToKnow': 'Good to know',\n  'conn.guide.userPlaceholder': 'your-email@example.com',\n  'conn.guide.secretPlaceholder': 'your-password-or-token',\n  'conn.guide.fact.url': 'Address',\n  'conn.guide.fact.urlRootHint': 'Every storage you can see appears as a folder under this address.',\n  'conn.guide.fact.urlStorageHint': 'Mounts “{storage}” directly. Drop the last segment to see every storage.',\n  'conn.guide.fact.user': 'Username',\n  'conn.guide.fact.password': 'Password',\n  'conn.guide.webdav.summary': 'WebDAV mounts filex as a drive: Windows Explorer, macOS Finder, Linux, rclone and Cyberduck all speak it, and every change is mirrored back into filex.',\n  'conn.guide.webdav.userHint': 'Your filex account e-mail — not a display name.',\n  'conn.guide.webdav.passwordHint': 'Your account password, or an API token (Settings → API tokens). An account with two-factor authentication MUST use a token: Basic auth has no second-factor slot.',\n  'conn.guide.webdav.win.s1': 'Open File Explorer, right-click This PC and choose “Map network drive…”.',\n  'conn.guide.webdav.win.s2': 'Pick a drive letter and enter {url} as the folder.',\n  'conn.guide.webdav.win.s3': 'Tick “Connect using different credentials” and sign in with the username and password above.',\n  'conn.guide.webdav.win.cmdCaption': 'Command Prompt (same thing, without the wizard)',\n  'conn.guide.webdav.win.limits': 'Windows has three built-in limits that look exactly like filex bugs: transfers stop at ~47.7 MB, folders with about a thousand files refuse to open (“Disk is not formatted”), and the WebClient service must be restarted after changing either.',\n  'conn.guide.webdav.win.regCaption': 'Run as administrator, then reconnect the drive',\n  'conn.guide.webdav.win.https': 'HTTPS is mandatory. Windows sends Basic credentials over TLS only, and over plain http:// it silently refuses with no useful message. Do not set BasicAuthLevel to 2 — use TLS.',\n  'conn.guide.webdav.win.persist': 'The mapped drive does not survive a sign-out: since Windows 7 Basic credentials cannot be stored in Credential Manager, and /persistent:yes does not change that. Re-run the command from a logon script if you need it back automatically.',\n  'conn.guide.webdav.win.service': 'If nothing mounts at all, make sure the WebClient service is running: sc config WebClient start= auto && net start WebClient.',\n  'conn.guide.webdav.mac.s1': 'In Finder choose Go → Connect to Server… (⌘K).',\n  'conn.guide.webdav.mac.s2': 'Enter {url} and connect.',\n  'conn.guide.webdav.mac.s3': 'Authenticate with the username and password above.',\n  'conn.guide.webdav.mac.note': 'The drive appears under Locations; each storage is a top-level folder.',\n  'conn.guide.webdav.linux.mountCaption': 'davfs2, or the desktop file manager (GNOME Files, Dolphin)',\n  'conn.guide.webdav.linux.gvfsComment': 'or paste this address into GNOME Files / Dolphin',\n  'conn.guide.webdav.linux.locks': 'davfs2 needs locking turned off. filex keeps WebDAV locks in process memory, so they do not survive a restart and are not shared between replicas — davfs2 assumes otherwise and hangs.',\n  'conn.guide.webdav.rclone.obscureCaption': 'rclone stores an obscured password — run this first and paste the output below',\n  'conn.guide.webdav.rclone.passPlaceholder': '<output of rclone obscure>',\n  'conn.guide.webdav.rclone.useCaption': 'Using it',\n  'conn.guide.webdav.duck.s1': 'New Bookmark → WebDAV (HTTPS).',\n  'conn.guide.webdav.duck.s2': 'Server {host}, port 443.',\n  'conn.guide.webdav.duck.s3': 'Path {path}.',\n  'conn.guide.webdav.duck.s4': 'Username {user}, password as above.',\n  'conn.guide.webdav.note.delete': 'A WebDAV delete is permanent. The web UI moves files to the filex trash; a client delete removes the object from the backing storage directly.',\n  'conn.guide.webdav.note.locks': 'Locks live in server memory: they do not survive a restart and are not shared between replicas. They exist to satisfy Windows and Office, not to arbitrate concurrent edits.',\n  'conn.guide.webdav.note.permissions': 'You see exactly what you see in the web UI. The root lists only the storages you may open, and a path outside your grants answers 404 rather than 403, so the tree never leaks what exists.',\n  'conn.guide.webdav.note.http': 'This server is reachable over plain http://. Windows will refuse to send your credentials at all, and every other client sends your password in the clear. Put filex behind TLS before mounting it.',\n  // ── S3 endpoint: keys and the guide ──────────────────────────────\n  'conn.s3keys.title': 'S3 access keys',\n  'conn.s3keys.lead': 'An access key lets any S3 client — rclone, restic, the AWS CLI, mc, s3fs, Cyberduck — connect to filex. It carries your own permissions and nothing more.',\n  'conn.s3keys.disabled': 'The S3 endpoint is switched off on this server (FILEX_S3). A key minted here will not connect until an operator turns it back on.',\n  'conn.s3keys.cannotMint': 'You are not signed in with an account that can mint access keys. The instructions below still apply — ask for a key and paste it in.',\n  'conn.s3keys.label': 'What is it for? (laptop backup, CI, …)',\n  'conn.s3keys.defaultLabel': 'access key',\n  'conn.s3keys.everyBucket': 'Every bucket I can see',\n  'conn.s3keys.prefix': 'Folder inside the bucket (optional)',\n  'conn.s3keys.mint': 'Create key',\n  'conn.s3keys.inheritNote': 'A key can only ever narrow what you already have: your grants, your tenant, your role. Confining it to one bucket or folder is the difference between a laptop backup and a credential that can read everything.',\n  'conn.s3keys.once': 'Copy the secret now — this is the only time it is shown.',\n  'conn.s3keys.accessKeyID': 'Access key ID',\n  'conn.s3keys.secret': 'Secret key',\n  'conn.s3keys.dismiss': 'I have copied it',\n  'conn.s3keys.col.label': 'Label',\n  'conn.s3keys.col.key': 'Access key ID',\n  'conn.s3keys.col.scope': 'Limited to',\n  'conn.s3keys.col.lastUsed': 'Last used',\n  'conn.s3keys.scopeAll': 'everything you can see',\n  'conn.s3keys.noLabel': '(no label)',\n  'conn.s3keys.neverUsed': 'never',\n  'conn.s3keys.enable': 'Enable',\n  'conn.s3keys.disable': 'Disable',\n  'conn.s3keys.revoke': 'Revoke',\n  'conn.s3keys.confirm': 'Sure?',\n  'conn.s3keys.empty': 'No access keys yet.',\n  'conn.guide.s3.summary': 'The S3 endpoint makes filex the destination for anything that speaks S3 — backups, sync tools, SDKs — using the storages you already have.',\n  'conn.guide.s3.keyPlaceholder': 'create a key above',\n  'conn.guide.s3.secretPlaceholder': 'shown once, when you create the key',\n  'conn.guide.s3.fact.endpoint': 'Endpoint',\n  'conn.guide.s3.fact.endpointHint': 'Point the client here, not at the web address of filex.',\n  'conn.guide.s3.fact.bucket': 'Bucket',\n  'conn.guide.s3.fact.bucketHint': 'A bucket is a filex storage. Buckets are created by an administrator, not by the client.',\n  'conn.guide.s3.fact.key': 'Access key ID',\n  'conn.guide.s3.fact.keyHint': 'The public half. It travels in every request.',\n  'conn.guide.s3.fact.secret': 'Secret key',\n  'conn.guide.s3.fact.secretHint': 'Shown once, when the key is created. filex cannot show it again — create a new key if it is lost.',\n  'conn.guide.s3.fact.region': 'Region',\n  'conn.guide.s3.fact.regionHint': 'filex has no regions; any value works and is echoed back. Clients still insist on one.',\n  'conn.guide.s3.fact.addressing': 'Addressing',\n  'conn.guide.s3.fact.pathStyle': 'path-style (required)',\n  'conn.guide.s3.fact.pathStyleHint': 'There is no dedicated S3 host on this install, so bucket.host does not resolve.',\n  'conn.guide.s3.fact.virtualHosted': 'virtual-hosted or path-style',\n  'conn.guide.s3.fact.virtualHostedHint': 'This install has its own S3 host, so both styles work.',\n  'conn.guide.s3.rclone.useCaption': 'Use it',\n  'conn.guide.s3.rclone.mtime': 'filex carries the file modification time (x-amz-meta-mtime), so rclone sync settles after the first run instead of re-uploading everything.',\n  'conn.guide.s3.aws.configureCaption': 'Configure once',\n  'conn.guide.s3.aws.useCaption': 'Use it',\n  'conn.guide.s3.aws.pathStyle': 'Add path addressing to your AWS config, or every command fails at DNS.',\n  'conn.guide.s3.restic.envCaption': 'Environment',\n  'conn.guide.s3.restic.useCaption': 'Back up, verify, prune',\n  'conn.guide.s3.restic.verified': 'Verified against this endpoint: restic check --read-data reads every pack byte for byte and reports no errors.',\n  'conn.guide.s3.mc.aliasCaption': 'Add the alias',\n  'conn.guide.s3.mc.useCaption': 'Use it',\n  'conn.guide.s3.s3fs.credsCaption': 'Credentials file',\n  'conn.guide.s3.s3fs.mountCaption': 'Mount it',\n  'conn.guide.s3.s3fs.note': 'Editing a file over s3fs rewrites the whole object, and a delete goes to the filex trash. Good for a shared folder, not for a database.',\n  'conn.guide.s3.duck.s1': 'New bookmark → Amazon S3.',\n  'conn.guide.s3.duck.s2': 'Server: {host}.',\n  'conn.guide.s3.duck.s3': 'Access key ID: {key}, secret as above.',\n  'conn.guide.s3.duck.s4': 'Open the bookmark; the buckets are your filex storages.',\n  'conn.guide.s3.duck.pathStyle': 'In Preferences → S3, turn OFF \"Use virtual host style\" — this install has no wildcard S3 host.',\n  'conn.guide.s3.sdk.note': 'Any SigV4 client works the same way: endpoint, key, secret, and path addressing when this install has no S3 host of its own.',\n  'conn.guide.s3.note.buckets': 'A bucket is a filex storage. A client can create folders and objects inside one, but not the bucket itself — that needs a driver and a path, which an S3 request cannot express.',\n  'conn.guide.s3.note.permissions': 'The key sees exactly what you see. A bucket you may not open answers \"no such bucket\" rather than \"forbidden\", so the endpoint never reveals what exists.',\n  'conn.guide.s3.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.s3.note.mtime': 'Uploads carry their modification time, and the checksums clients send (Content-MD5, x-amz-checksum-*) are verified — a corrupted upload is refused rather than stored.',\n  'conn.guide.s3.note.pathStyle': 'This install has no dedicated S3 host, so clients must be told to use path-style addressing. Without it a current SDK fails at DNS with an error that names neither filex nor the cause.',\n  'conn.guide.s3.note.http': 'This endpoint is plain http://. Signatures still protect the request, but the objects travel in the clear. Put filex behind TLS before pointing a backup at it.',\n  // ── SFTP endpoint: keys and the guide ────────────────────────────\n  'conn.sshkeys.title': 'SSH keys',\n  'conn.sshkeys.lead': 'Register a public key and every SSH client — sftp, scp, WinSCP, FileZilla, rclone, sshfs — can connect without sending your password.',\n  'conn.sshkeys.disabled': 'The SFTP endpoint is switched off on this server (FILEX_SFTP). A key registered here will not connect until an operator turns it back on.',\n  'conn.sshkeys.cannotAdd': 'You are not signed in with an account that can register keys.',\n  'conn.sshkeys.paste': 'Paste the contents of ~/.ssh/id_ed25519.pub',\n  'conn.sshkeys.name': 'Name (optional — the key comment is used otherwise)',\n  'conn.sshkeys.add': 'Add key',\n  'conn.sshkeys.noCopyId': 'ssh-copy-id cannot work here: it appends to ~/.ssh/authorized_keys over a shell, and filex has none. This box is the way in.',\n  'conn.sshkeys.col.name': 'Name',\n  'conn.sshkeys.col.fingerprint': 'Fingerprint',\n  'conn.sshkeys.col.added': 'Added',\n  'conn.sshkeys.col.lastUsed': 'Last used',\n  'conn.sshkeys.noName': '(no name)',\n  'conn.sshkeys.neverUsed': 'never',\n  'conn.sshkeys.enable': 'Enable',\n  'conn.sshkeys.disable': 'Disable',\n  'conn.sshkeys.remove': 'Remove',\n  'conn.sshkeys.confirm': 'Sure?',\n  'conn.sshkeys.empty': 'No keys yet. Without one, clients sign in with your account password.',\n  'conn.guide.sftp.summary': 'SFTP makes filex reachable by anything that already speaks SSH — a backup job, a scanner, WinSCP, rclone, or a mounted folder.',\n  'conn.guide.sftp.fact.host': 'Host',\n  'conn.guide.sftp.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.sftp.fact.port': 'Port',\n  'conn.guide.sftp.fact.portHint': 'Not 22 and not 443: SFTP is raw TCP and cannot go through the web proxy.',\n  'conn.guide.sftp.fact.userHint': 'Your short login name. An @ in a login has to be quoted in most client config files, which is what this avoids.',\n  'conn.guide.sftp.fact.auth': 'Sign in with',\n  'conn.guide.sftp.fact.authKey': 'your registered SSH key (or your password)',\n  'conn.guide.sftp.fact.authPassword': 'your account password — or register a key above',\n  'conn.guide.sftp.fact.authHint': 'An API token works as a password too, and is revocable on its own. An account with two-factor sign-in must use a key or a token.',\n  'conn.guide.sftp.fact.path': 'Path',\n  'conn.guide.sftp.fact.pathHint': 'The first folder is a storage; the root lists the ones you may open.',\n  'conn.guide.sftp.openssh.connectCaption': 'Connect, put, get',\n  'conn.guide.sftp.openssh.noShell': 'There is no shell here — only the SFTP subsystem. `ssh host command` is refused on purpose, and scp works because OpenSSH 9 speaks SFTP for it.',\n  'conn.guide.sftp.key.tab': 'Set up a key',\n  'conn.guide.sftp.key.s1': 'Generate a key pair on the machine that will connect (skip if you already have one).',\n  'conn.guide.sftp.key.s2': 'Copy the PUBLIC half — the .pub file, never the other one.',\n  'conn.guide.sftp.key.s3': 'Paste it into the box above and connect; no password is sent from then on.',\n  'conn.guide.sftp.key.genCaption': 'On your own machine',\n  'conn.guide.sftp.key.noCopyId': 'ssh-copy-id will NOT work against filex: it needs a shell to append to ~/.ssh/authorized_keys, and there is none. Paste the key above instead.',\n  'conn.guide.sftp.winscp.s1': 'New site → File protocol: SFTP.',\n  'conn.guide.sftp.winscp.s2': 'Host name: {host}, port: {port}.',\n  'conn.guide.sftp.winscp.s3': 'User name: {user}. For a key: Advanced → SSH → Authentication → private key file.',\n  'conn.guide.sftp.winscp.s4': 'WinSCP needs a .ppk private key — use its own tool (Tools → PuTTYgen) to convert an OpenSSH key once.',\n  'conn.guide.sftp.filezilla.s1': 'File → Site Manager → New site, Protocol: SFTP.',\n  'conn.guide.sftp.filezilla.s2': 'Host: {host}, port: {port}.',\n  'conn.guide.sftp.filezilla.s3': 'User: {user}. Logon type: Normal for a password, or Key file for a key.',\n  'conn.guide.sftp.rclone.useCaption': 'Use it',\n  'conn.guide.sftp.sshfs.mountCaption': 'Mount and unmount',\n  'conn.guide.sftp.sshfs.note': 'A mounted folder rewrites the whole file on every save. Good for documents, not for a database or a video you are editing in place.',\n  'conn.guide.sftp.note.storages': 'The root is not a home directory: it lists the storages you may open, and the first path segment names one.',\n  'conn.guide.sftp.note.permissions': 'The permission bits your client draws come from your access level here, so a file shown as read-only really is one for you.',\n  'conn.guide.sftp.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.sftp.note.totp': 'If your account has two-factor sign-in, the password will not work here — SSH has no way to ask for the code. Register a key, or use an API token as the password.',\n  'conn.guide.sftp.note.disabled': 'The SFTP endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  // ── FTPS ─────────────────────────────────────────────────────────\n  'conn.guide.ftps.summary': 'FTPS is here for the equipment that only ever learned FTP — scan-to-folder printers, EDI counterparties, older lab and industrial software. Always over TLS.',\n  'conn.guide.ftps.fact.host': 'Host',\n  'conn.guide.ftps.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.ftps.fact.port': 'Port',\n  'conn.guide.ftps.fact.portHint': 'The control channel. Data moves on a separate port from the passive range below.',\n  'conn.guide.ftps.fact.mode': 'Encryption',\n  'conn.guide.ftps.fact.modeValue': 'FTPS — explicit TLS (AUTH TLS), required',\n  'conn.guide.ftps.fact.modeHint': 'Plain FTP is refused before the password is read. Choose \"Require explicit FTP over TLS\", never \"plain FTP\" and never \"implicit\".',\n  'conn.guide.ftps.fact.userHint': 'Your short login name, or your e-mail. An API token works as the password too and can be revoked on its own.',\n  'conn.guide.ftps.fact.passwordHint': 'Your account password, or an API token. An account with two-factor sign-in must use a token — FTP has no way to ask for the code.',\n  'conn.guide.ftps.fact.pasv': 'Passive ports',\n  'conn.guide.ftps.fact.pasvHint': 'Data connections land here. If your firewall blocks this range the transfer HANGS with no error on either side — that is the classic FTP failure.',\n  'conn.guide.ftps.filezilla.s1': 'File → Site Manager → New site, Protocol: FTP.',\n  'conn.guide.ftps.filezilla.s2': 'Host: {host}, port: {port}.',\n  'conn.guide.ftps.filezilla.s3': 'Encryption: \"Require explicit FTP over TLS\". Logon type: Normal, user: {user}.',\n  'conn.guide.ftps.filezilla.s4': 'Transfer settings → Passive. Active mode is refused by this server.',\n  'conn.guide.ftps.winscp.s1': 'New site → File protocol: FTP, Encryption: TLS/SSL Explicit encryption.',\n  'conn.guide.ftps.winscp.s2': 'Host name: {host}, port: {port}.',\n  'conn.guide.ftps.winscp.s3': 'User name: {user}, password as above.',\n  'conn.guide.ftps.curl.caption': 'Upload and download',\n  'conn.guide.ftps.curl.sslReqd': '--ssl-reqd is not optional: it makes curl REQUIRE TLS instead of falling back to plaintext. This server refuses plaintext anyway, but the habit protects you against the servers that do not.',\n  'conn.guide.ftps.lftp.caption': 'Connect',\n  'conn.guide.ftps.lftp.protectData': 'ssl-protect-data encrypts the FILE as well as the login. Without it lftp logs in over TLS and then sends your file in the clear — which is the FTPS misconfiguration people actually ship.',\n  'conn.guide.ftps.rclone.useCaption': 'Use it',\n  'conn.guide.ftps.printer.tab': 'Scanner / printer',\n  'conn.guide.ftps.printer.s1': 'In the device\\'s scan-to-FTP settings: server {host}, port {port}.',\n  'conn.guide.ftps.printer.s2': 'User: {user}, password as above. Create an API token for the device rather than using your own password — it can be revoked without changing anything else.',\n  'conn.guide.ftps.printer.s3': 'Path: {path} — or a folder inside it that you created first. The device cannot create a storage.',\n  'conn.guide.ftps.printer.s4': 'Turn ON \"SSL/TLS\" or \"FTPS explicit\", and PASSIVE mode.',\n  'conn.guide.ftps.printer.noTLS': 'Plenty of scan-to-FTP firmware cannot do TLS at all. This server will not talk to such a device, and that is deliberate — the alternative is your documents and your password crossing the office network in the clear.',\n  'conn.guide.ftps.note.tls': 'TLS is mandatory and there is no switch to turn it off. Plain FTP sends your password in the clear and your file after it.',\n  'conn.guide.ftps.note.passive': 'Passive mode only. Active mode has the server dial back to the client, which does not survive NAT and is blocked by most firewalls.',\n  'conn.guide.ftps.note.storages': 'The root is not a home directory: it lists the storages you may open, and the first path segment names one.',\n  'conn.guide.ftps.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.ftps.note.prefer': 'If the client can speak SFTP, prefer it: one connection, one port, no passive-mode surprises.',\n  'conn.guide.ftps.note.selfSigned': 'This server is using a self-signed certificate. It encrypts the channel but proves nothing about who is on the other end — most clients will ask you to accept it once. Supply a real certificate for anything that matters.',\n  'conn.guide.ftps.note.disabled': 'The FTPS endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  // ── NFS ──────────────────────────────────────────────────────────\n  'conn.nfs.title': 'NFS exports',\n  'conn.nfs.lead': 'An export lets a machine on your network mount filex as a drive — a media player, a build server, a backup box.',\n  'conn.nfs.pathIsSecret': '⚠ The export path IS the password. NFS cannot ask a client who it is without Kerberos, so filex puts 32 random bytes in the path instead: whoever knows it can mount as you. Treat the mount line like a credential — /etc/fstab is world-readable on most systems.',\n  'conn.nfs.disabled': 'The NFS endpoint is switched off on this server (FILEX_NFS). An export created here will not mount until an operator turns it back on.',\n  'conn.nfs.cannotMint': 'You are not signed in with an account that can create exports.',\n  'conn.nfs.label': 'What is it for? (media player, backup box, …)',\n  'conn.nfs.defaultLabel': 'nfs export',\n  'conn.nfs.everyStorage': 'Every storage I can see',\n  'conn.nfs.prefix': 'Folder inside the storage (optional)',\n  'conn.nfs.allowCidrs': 'Allowed addresses, e.g. 192.168.1.0/24 (optional)',\n  'conn.nfs.readOnly': 'Read-only',\n  'conn.nfs.readOnlyHint': 'Read-only is the safer default for a machine: it refuses every write through this mount whatever your own permissions are. An address list narrows it further — outside it, the mount is refused.',\n  'conn.nfs.mint': 'Create export',\n  'conn.nfs.once': 'Copy this now — the path is shown only once and cannot be recovered.',\n  'conn.nfs.dismiss': 'I have copied it',\n  'conn.nfs.col.label': 'Label',\n  'conn.nfs.col.scope': 'Limited to',\n  'conn.nfs.col.mode': 'Mode',\n  'conn.nfs.col.lastUsed': 'Last mounted',\n  'conn.nfs.scopeAll': 'everything you can see',\n  'conn.nfs.modeRead': 'read-only',\n  'conn.nfs.modeWrite': 'read/write',\n  'conn.nfs.noLabel': '(no label)',\n  'conn.nfs.neverUsed': 'never',\n  'conn.nfs.enable': 'Enable',\n  'conn.nfs.disable': 'Disable',\n  'conn.nfs.revoke': 'Revoke',\n  'conn.nfs.confirm': 'Sure?',\n  'conn.nfs.empty': 'No exports yet.',\n  'conn.guide.nfs.summary': 'NFS mounts filex as a drive on a machine in your own network — the NAS protocol, for the devices that expect one.',\n  'conn.guide.nfs.pathPlaceholder': 'create an export above',\n  'conn.guide.nfs.fact.host': 'Host',\n  'conn.guide.nfs.fact.hostHint': 'The same machine as the web app, on a port of its own.',\n  'conn.guide.nfs.fact.port': 'Port',\n  'conn.guide.nfs.fact.portHint': 'Both port= and mountport= must be set to this; filex serves the mount and NFS services on one port.',\n  'conn.guide.nfs.fact.export': 'Export path',\n  'conn.guide.nfs.fact.exportHint': 'This is the credential. It is shown once, when you create the export, and is stored hashed — filex cannot show it again.',\n  'conn.guide.nfs.fact.options': 'Mount options',\n  'conn.guide.nfs.fact.optionsHint': 'nolock because filex does not run the NFS lock manager; nfsvers=3 because that is what this server speaks.',\n  'conn.guide.nfs.linux.mountCaption': 'Mount it',\n  'conn.guide.nfs.linux.fstabSecret': 'An /etc/fstab line containing this path is a password in a world-readable file. Use a credentials-protected automount, or keep the mount in a root-only unit, if that matters where you are.',\n  'conn.guide.nfs.mac.mountCaption': 'Mount it',\n  'conn.guide.nfs.mac.resvport': 'macOS needs resvport: its client insists on a privileged source port and refuses the mount without it.',\n  'conn.guide.nfs.win.s1': 'Turn on \"Services for NFS\" → \"Client for NFS\" in Windows Features (Pro and Enterprise only; Home does not have it).',\n  'conn.guide.nfs.win.s2': 'Open a Command Prompt as administrator.',\n  'conn.guide.nfs.win.s3': 'Map the export to a drive letter with the command below.',\n  'conn.guide.nfs.win.cmdCaption': 'Map it to Z:',\n  'conn.guide.nfs.win.port': 'Windows has no way to say which port the mount service is on, so it can only reach an NFS server on the standard port 2049. If this server is on another port, use SFTP or the filex desktop app instead.',\n  'conn.guide.nfs.nas.tab': 'NAS / media player',\n  'conn.guide.nfs.nas.s1': 'In the device\\'s NFS settings: server {host}, port {port} (set both the NFS and the mount port if it asks for them separately).',\n  'conn.guide.nfs.nas.s2': 'Remote path: the export path above, exactly as shown.',\n  'conn.guide.nfs.nas.s3': 'NFS version 3, no locking. Create the export read-only unless the device genuinely needs to write.',\n  'conn.guide.nfs.note.unencrypted': 'NFSv3 is not encrypted. Anyone who can read the traffic sees your files, and anyone who learns the path can mount them. Use it on a home or office network, or over a VPN — never across the internet.',\n  'conn.guide.nfs.note.pathIsSecret': 'The export path is the whole credential. Revoke it from the list above if it leaks; there is nothing else to change.',\n  'conn.guide.nfs.note.noPortmapper': 'There is no portmapper on port 111, so a client that is not told the port cannot find the server. That is why every command here carries port= and mountport=.',\n  'conn.guide.nfs.note.uid': 'The user and group ids your client sends are ignored: the mount already knows whose it is. The permissions you see come from your access in filex.',\n  'conn.guide.nfs.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.nfs.note.revoke': 'Revoking takes effect on the next request, not instantly: NFS has no session to end, so a client with the mount open sees its next operation fail.',\n  'conn.guide.nfs.note.disabled': 'The NFS endpoint is switched off on this server. These instructions will work once an operator enables it.',\n  'conn.tokens.title': 'API tokens',\n  'conn.tokens.lead': 'FTPS, WebDAV and filex mount all sign in with a token instead of your account password. Mint one here — it can be revoked on its own, and an account with two-factor sign-in cannot use its password on these at all.',\n  'conn.tokens.mint': 'Create token',\n  'conn.tokens.once': 'Copy it now — this is the only time it is shown. Only a hash is stored, so it cannot be shown again.',\n  'conn.tokens.dismiss': 'I have copied it',\n  'conn.tokens.cannotMint': 'This session cannot create tokens. Sign in with your own account to make one.',\n  'conn.tokens.empty': 'No tokens yet.',\n  'conn.tokens.neverUsed': 'never',\n  'conn.tokens.revoke': 'Revoke',\n  'conn.tokens.confirm': 'Sure?',\n  'conn.tokens.col.label': 'Name',\n  'conn.tokens.col.scopes': 'Can do',\n  'conn.tokens.col.used': 'Last used',\n  'conn.tokens.revokeHint': 'Revoking stops a connection that is already open, not just the next sign-in: an SFTP or FTPS session is cut and a mount stops working within about half a minute.',\n  'conn.guide.mount.summary': 'filex mount attaches a remote filex server to a folder on this machine, over the same HTTPS the browser uses. It is the only one of these that works from anywhere — no LAN, no extra server, no third-party client.',\n  'conn.guide.mount.fact.url': 'Server URL',\n  'conn.guide.mount.fact.urlHint': 'The same address you use in the browser. Nothing else has to be reachable.',\n  'conn.guide.mount.fact.token': 'API token',\n  'conn.guide.mount.fact.tokenPlaceholder': 'create one under Tokens',\n  'conn.guide.mount.fact.tokenHint': 'A token, not your password — it can be revoked on its own, and an account with 2FA cannot use its password here at all.',\n  'conn.guide.mount.fact.remote': 'What to mount',\n  'conn.guide.mount.fact.remoteHint': 'Leave --remote off to see every storage as a folder, or name one storage — or a folder inside it — to mount just that.',\n  'conn.guide.mount.linux.mountCaption': 'Mount it',\n  'conn.guide.mount.linux.umountCaption': 'Unmount it',\n  'conn.guide.mount.linux.umountWarn': 'Unmount with fusermount, not by killing the process. A mount whose process died without detaching leaves a folder where every ls hangs until somebody runs fusermount by hand.',\n  'conn.guide.mount.linux.systemdCaption': 'Mount it at login (systemd user unit)',\n  'conn.guide.mount.win.winfsp': 'Windows needs WinFsp installed once — it is free and open source: https://winfsp.dev. Nothing else, and no administrator rights after that.',\n  'conn.guide.mount.win.mountCaption': 'Mount it as a drive',\n  'conn.guide.mount.win.freeLetter': 'Pick a drive letter that is FREE. The letter is created by the mount, not attached to something that already exists, and pointing it at one that is in use fails with a message that does not say so.',\n  'conn.guide.mount.win.stop': 'Stop it with Ctrl-C in that window. The drive disappears and nothing is left behind on this machine.',\n  'conn.guide.mount.mac.unsupported': 'filex mount does not work on macOS. It needs macFUSE, whose licence does not allow a program like filex to install it for you, and whose Go binding needs a C compiler filex deliberately does not require. The command refuses here rather than appearing to work and doing nothing.',\n  'conn.guide.mount.mac.alternatives': 'On macOS, use the filex desktop app with folder sync (keeps the files on disk), or SFTP with a client that mounts drives.',\n  'conn.guide.mount.note.notASync': 'This is not a sync. Nothing is copied to this machine except a small read cache, so a mount opens one file out of a hundred thousand without downloading the rest. If you want the files when you are offline, use folder sync instead.',\n  'conn.guide.mount.note.reachable': 'It reaches the server through whatever proxy or tunnel the browser goes through, because underneath it is the same API. Your permissions, your storages and — on a multi-tenant server — your tenant come with it.',\n  'conn.guide.mount.note.wholeFileWrites': 'A file you write through the mount is uploaded when the program closes it, not while it is being written. Editing a very large file in place is slower here than a local disk; copying it in and out is not.',\n  'conn.guide.mount.note.trash': 'A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.',\n  'conn.guide.mount.note.revoke': 'Revoke the token to stop a mount. It stops serving within half a minute, even if the mount is still attached.',\n  'storages.driver.ftp': 'FTP / FTPS',\n  'storages.driver.local': 'Local filesystem',\n  'storages.driver.s3': 'S3 / Hetzner / MinIO',\n  'storages.driver.sftp': 'SFTP',\n  'storages.driver.smb': 'SMB / CIFS (NAS)',\n  'storages.driver.webdav': 'WebDAV',\n  'storages.fieldHelp.smbShare': 'The share name alone, without the server: `media`, not `\\\\\\\\nas\\\\media`.',\n  'storages.fieldHelp.smbDomain': 'Only for a Windows domain account. Leave empty for a NAS.',\n  'storages.fieldHelp.smbRoot': 'Sub-folder inside the share. Leave empty for the whole share.',\n  'storages.fields.share': 'Share',\n  'storages.fields.domain': 'Domain / workgroup',\n  'storages.fields.dialTimeout': 'Connect timeout (seconds)',\n  'storages.fieldHelp.disablePresign': 'On by default: uploads and the downloads behind public share links stream through filex, so the bucket endpoint never has to be reachable from a browser (a LAN-only MinIO just works). Turn it off only when the endpoint is reachable from your users\\' browsers (AWS, a public MinIO) and you want them to talk to the bucket directly — faster for very large files, and the store must accept SDK-signed URLs (Ceph RGW / some Hetzner setups answer SignatureDoesNotMatch).',\n  'storages.fieldHelp.endpoint': 'Leave empty for AWS S3. Any S3-compatible store needs its endpoint.',\n  'storages.fieldHelp.hostKey': 'A single public key in authorized_keys / known_hosts line form.',\n  'storages.fieldHelp.insecureSkipHostKey': 'Accepts any host key. Only for throwaway hosts.',\n  'storages.fieldHelp.keyPath': 'Path to a key file on the server, read when the storage starts. Used when the PEM field is empty.',\n  'storages.fieldHelp.knownHosts': 'OpenSSH known_hosts path for strict host-key checking. Default is trust-on-first-use in ~/.filex/known_hosts.',\n  'storages.fieldHelp.passive': 'Off switches to active mode, which needs the server to dial back into this host.',\n  'storages.fieldHelp.path': 'Directory on the server. It is created if missing; filex never mounts /.',\n  'storages.fieldHelp.pathStyle': 'On for every non-AWS store. It is turned on automatically when an endpoint is set and this was never touched.',\n  'storages.fieldHelp.prefix': 'Sub-folder inside the bucket. Required: filex never takes ownership of the bucket root.',\n  'storages.fieldHelp.region': 'Defaults to \"auto\" when left empty.',\n  'storages.fieldHelp.root': 'Sub-folder on the backend. Required: filex never mounts the account root.',\n  'storages.fieldHelp.sftpAuth': 'Either a password or a private key is required.',\n  'storages.fieldHelp.tls': 'Plain FTP sends credentials in the clear — turn this on whenever the server supports it.',\n  'storages.fields.accessKey': 'Access key',\n  'storages.fields.basePath': 'Base path',\n  'storages.fields.bucket': 'Bucket',\n  'storages.fields.disablePresign': 'Disable presigned URLs',\n  'storages.fields.endpoint': 'Endpoint',\n  'storages.fields.host': 'Host',\n  'storages.fields.hostKey': 'Pinned host key',\n  'storages.fields.insecureSkipHostKey': 'Skip host-key verification (insecure)',\n  'storages.fields.keyPath': 'Private key file',\n  'storages.fields.knownHosts': 'known_hosts file',\n  'storages.fields.name': 'Display name',\n  'storages.fields.namePlaceholder': 'Personal photos',\n  'storages.fields.passive': 'Passive mode (PASV)',\n  'storages.fields.password': 'Password',\n  'storages.fields.path': 'Filesystem path',\n  'storages.fields.pathStyle': 'Use path-style URLs (Hetzner, MinIO)',\n  'storages.fields.port': 'Port',\n  'storages.fields.prefix': 'Prefix',\n  'storages.fields.privateKey': 'Private key (PEM)',\n  'storages.fields.rbac': 'Per-item access control (RBAC)',\n  'storages.fields.rbacHint': 'When on, non-admins see only files/folders explicitly granted to them via the permissions panel. When off, the storage is open to all users (capability by role).',\n  'storages.fields.readOnly': 'Read-only mount',\n  'storages.fields.region': 'Region',\n  'storages.fields.root': 'Base path',\n  'storages.fields.secretKey': 'Secret key',\n  'storages.fields.tls': 'FTPS (explicit AUTH TLS)',\n  'storages.fields.url': 'Base URL',\n  'storages.fields.user': 'User',\n\n\n  /* === gezinti:g1 — navigation panel (SideNav) === */\n  'sidenav.title': 'Navigation',\n  'sidenav.views': 'Views',\n  'sidenav.storages': 'Storages',\n  'sidenav.home': 'Home',\n  'sidenav.myfiles': 'My files',\n  'sidenav.recent': 'Recent',\n  'sidenav.starred': 'Starred',\n  'sidenav.shared': 'Shared with me',\n  'sidenav.trash': 'Trash',\n  'sidenav.collapse': 'Collapse navigation',\n  'sidenav.expand': 'Expand navigation',\n  'sidenav.close': 'Close navigation',\n  // ⚠ `open`/`close` are the DRAWER's pair, `expand`/`collapse` the docked\n  // panel's, and they are not interchangeable — see the note on\n  // `navToggleLabel` in Toolbar.vue. Below 560px the panel is a drawer over\n  // the listing: it is not narrowed to a rail, it is not on screen at all, so\n  // \"expand\" would promise a width change to something that has no width.\n  'sidenav.open': 'Open navigation',\n  'sidenav.storage.shared': 'Shared',\n  'sidenav.storage.readOnly': 'Read-only',\n  // ⚠ `toolbar.nav` is GONE, and nothing replaced it. It was the one label on\n  // the panel's collapse control, first as the noun \"Navigation\" — which names\n  // the panel and never says the button does anything to it, so the owner\n  // could not find how to collapse the panel (2026-09-13: \"yan menüyü kısıp\n  // açabilir olalım ya bence\") — and then as the static stopgap \"Show or hide\n  // navigation\". The four `sidenav.*` verbs above are the real fix: the label\n  // is bound to `navOpen`, so it says *collapse* when it will collapse and\n  // *expand* when it will expand.\n  'node.home': 'Home',\n  'node.recent': 'Recent',\n  'node.starred': 'Starred',\n  'node.shared': 'Shared with me',\n  'empty.recent.title': 'Nothing opened yet',\n  'empty.recent.hint': 'Files you open show up here',\n  'empty.starred.title': 'Nothing starred yet',\n  'empty.starred.hint': 'Star a file to find it here',\n  'empty.shared.title': 'Nothing has been shared with you',\n  'empty.shared.hint': 'Folders and files other people share appear here',\n  /* etiket:t1 */\n  'sidenav.tags': 'Tags',\n  'sidenav.tags.empty': 'No tags yet — add one from a file’s right-click menu.',\n  'sidenav.tags.more': 'Show {count} more',\n  'sidenav.tags.less': 'Show fewer',\n  'empty.tag.title': 'Nothing is tagged “{tag}”',\n  'empty.tag.hint': 'Right-click a file and choose Tags to put it here',\n  'sidenav.connections': 'Connections',\n  'sidenav.connect': 'How to connect',\n  'sidenav.apikeys': 'API keys',\n  'overlay.close': 'Close',\n  'conn.tokens.scopes': 'Permissions',\n  'conn.tokens.root': 'Limit to one folder (optional)',\n  'conn.tokens.rootPlaceholder': 'storage://folder',\n  'conn.tokens.expiry': 'Expires in (days)',\n  'conn.tokens.expiryNever': 'never',\n  'conn.tokens.defaultName': 'API key {date}',\n  'conn.tokens.namePlaceholder': 'Name — e.g. backup script',\n  'conn.tokens.capNote': 'Your account and its permissions are the ceiling — asking for more than you have is refused, not granted.',\n  /* === /gezinti:g1 === */\n\n  /* === surucu:d1 — the shell (GitHub #14); every profile, no longer a\n     `uiProfile: 'drive'` opt-in === */\n  'drive.new': 'New',\n  'drive.new.upload': 'Upload files',\n  'drive.new.folder': 'New folder',\n  'drive.new.request': 'Request files',\n  'drive.new.document': 'New document',\n\n  /* === belge:n1 — \"New document\": the picker under + New =================\n     Type names are NOT listed here. A tile reads its words from\n     lib/fileIcons `typeLabelFor`, the same table the listing's Type column\n     uses, so \".docx\" is called the same thing in both places and a new type\n     needs no string at all. Only this dialog's own chrome lives below. */\n  'newdoc.title': 'New document',\n  'newdoc.type.label': 'Document type',\n  'newdoc.group.document': 'Documents',\n  'newdoc.group.text': 'Text and code',\n  'newdoc.group.diagram': 'Diagrams',\n  'newdoc.withheld.onlyoffice': 'Office documents need a document server (OnlyOffice), which is not configured here.',\n  'newdoc.withheld.drawio': 'Diagrams need a drawio service, which is not configured here.',\n  'newdoc.empty.title': 'No document types are available',\n  'newdoc.empty.body': 'This server did not offer any type this app can create.',\n  'newdoc.empty.blocked': 'Every type this server can create needs an editor service that is not configured here.',\n  'newdoc.name': 'Name',\n  'newdoc.name.placeholder': 'Document name',\n  'newdoc.untitled': 'Untitled',\n  'newdoc.err.slash': 'A name cannot contain a slash.',\n  'newdoc.err.exists': '{name} is already here. Choose another name.',\n  'newdoc.location': 'Location',\n  'newdoc.location.none': 'Choose a folder',\n  'newdoc.location.change': 'Change',\n  'newdoc.location.noaccess': 'You cannot save into this folder.',\n  'newdoc.create': 'Create',\n  'newdoc.creating': 'Creating…',\n  'newdoc.cancel': 'Cancel',\n  // ⚠ The top search field searches the WHOLE storage (and every storage at\n  // the root) — never only the open folder. The scope named here is therefore\n  // the storage, not the folder; \"Filter in this folder…\" (FilterBar) is the\n  // folder-scoped one. It used to say \"Search in Photos\" for a folder called\n  // Photos, which was a lie (2026-09-19).\n  'drive.search.placeholder': 'Search in {scope}',\n  'drive.search.placeholder_all': 'Search all storages',\n  'drive.search.hint_title': 'Search everywhere and run commands ({combo})',\n  'drive.storage.used': '{used} of {total} used',\n  'drive.storage.used_unlimited': '{used} used',\n  'drive.storage.label': 'Storage',\n  /* === gorunum:v3-shell — the Home view (the overview, inside the shell) ==\n   * The section headings are `sidenav.storages` / `sidenav.recent` /\n   * `sidenav.starred` and the two empty states are `empty.recent.*` /\n   * `empty.starred.*`, on purpose: the block headed \"Recent\" on Home and the\n   * panel row labelled \"Recent\" beside it are the same thing, and a second\n   * string for it is how the two drift apart one translation at a time. Only\n   * what exists nowhere else is below. */\n  'home.title': 'Home',\n  'home.storages.empty': 'No storages yet',\n  'home.storages.hint': 'A storage is a drive filex reads and writes — an administrator adds them.',\n  'drive.section.folders': 'Folders',\n  'drive.section.files': 'Files',\n  'filter.aria': 'Filters',\n  'filter.type': 'Type',\n  'filter.type.any': 'Any type',\n  'filter.type.folder': 'Folders',\n  'filter.type.document': 'Documents',\n  'filter.type.spreadsheet': 'Spreadsheets',\n  'filter.type.presentation': 'Presentations',\n  'filter.type.pdf': 'PDFs',\n  'filter.type.image': 'Images',\n  'filter.type.video': 'Videos',\n  'filter.type.audio': 'Audio',\n  'filter.type.archive': 'Archives',\n  'filter.type.code': 'Code',\n  'filter.modified': 'Modified',\n  'filter.modified.any': 'Any time',\n  'filter.modified.today': 'Today',\n  'filter.modified.7d': 'Last 7 days',\n  'filter.modified.30d': 'Last 30 days',\n  'filter.modified.year': 'This year',\n  'filter.size': 'Size',\n  'filter.size.any': 'Any size',\n  'filter.size.lt1': 'Under 1 MB',\n  'filter.size.1to10': '1 - 10 MB',\n  'filter.size.10to100': '10 - 100 MB',\n  'filter.size.gt100': 'Over 100 MB',\n  /* surucu:d1-actions — the ⋮ menu at the end of the filter row. Only its own\n     NAME is new: every row inside it reuses the string that verb already has\n     (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`, `shortcuts.select_all`,\n     `selection.clear`), because a menu that renames a command is a menu the\n     reader has to learn twice. */\n  'filter.actions': 'Listing actions',\n  'filter.clear': 'Clear filters',\n  'filter.empty.title': 'Nothing here matches those filters',\n  'filter.empty.hint': 'Clear a filter, or search everywhere with the field above.',\n  'filter.count': '{shown} of {total}',\n  'inspector.tab.details': 'Details',\n  'inspector.tab.activity': 'Activity',\n  'inspector.people': 'People with access',\n  'inspector.people.you': 'You',\n  'inspector.people.inherited': 'from a parent folder',\n  'inspector.people.empty': 'Only you, and anyone with a link below.',\n  'inspector.people.manage': 'Manage access',\n  'inspector.link': 'Shared link',\n  'inspector.link.none': 'Not shared',\n  'inspector.link.create': 'Create link',\n  'inspector.link.copy': 'Copy link',\n  'inspector.activity.empty': 'No activity recorded for this item yet.',\n  'inspector.activity.hint': 'Versions are written when a file changes; comments are written by people.',\n  'inspector.activity.version': 'Version {n} saved',\n  'inspector.activity.comment': 'Comment by {who}',\n  'inspector.activity.select': 'Select a file or folder to see its activity.',\n  /* === /surucu:d1 === */\n  /* i18n:hardcoded — the convert modal shipped with no keys at all: every\n     label was a Turkish literal behind an optional `t` prop nobody passed. */\n  'convert.title': 'Convert',\n  'convert.loading': 'Loading the converter…',\n  'convert.done': 'Converted and uploaded to this folder.',\n  'convert.close': 'Close',\n  'convert.from': 'Source',\n  'convert.search_format': 'Search a target format (pdf, mp4, png…)',\n  'convert.no_format': 'No matching format.',\n  'convert.unsupported_input': 'This file type has no source format the converter can read.',\n  'convert.converting': 'Converting…',\n  'convert.convert': 'Convert',\n  /* === gorunum:v1-chrome — the filter row's name box === */\n  'filter.find': 'Filter in this folder…',\n  /* surucu:d1-scope — the same box where the rows are not a folder's contents.\n     It has to say what it narrows: at the drive list \"this folder\" names\n     nothing, and on Home it would name three blocks at once. */\n  'filter.find.storages': 'Filter storages…',\n  'filter.find.home': 'Filter Home…',\n  /* === gorunum:v1-viewer — the full-bleed overlay's own chrome === */\n  'viewer.share': 'Share',\n  'viewer.nav_prev': 'Previous file',\n  'viewer.nav_next': 'Next file',\n  /* The counter in the top bar's meta line: \"246.3 KB • Sep 9, 2026 • 1 of 9\". */\n  'viewer.counter': '{i} of {n}',\n  'viewer.zoom_reset': 'Reset zoom',\n  'viewer.fullscreen': 'Full screen',\n  'viewer.exit_fullscreen': 'Exit full screen',\n  'viewer.md_placeholder': '# Markdown here…',\n  /* === gorunum:v1-selbar — the selection bar that replaces the filter row === */\n  'selection.count': '{n} selected',\n  'selection.clear': 'Clear selection',\n  /* === gorunum:v1-preview — the kind, said in words ======================\n     The Type column used to print the extension in caps. These are what it\n     prints instead; the table that picks one is in `lib/fileIcons.ts`\n     (`typeLabelKey`), so this list and that one are the only two places a\n     kind is named. Anything unmapped still falls back to the uppercased\n     extension — these names improve on that fallback, they do not replace\n     it. `Folder` is NOT here: it is `node.folder`, which the grid card's\n     caption already prints. */\n  'ftype.typescript': 'TypeScript',\n  'ftype.javascript': 'JavaScript',\n  'ftype.vue': 'Vue component',\n  'ftype.python': 'Python',\n  'ftype.go': 'Go',\n  'ftype.rust': 'Rust',\n  'ftype.php': 'PHP',\n  'ftype.ruby': 'Ruby',\n  'ftype.java': 'Java',\n  'ftype.kotlin': 'Kotlin',\n  'ftype.swift': 'Swift',\n  'ftype.c': 'C source',\n  'ftype.cpp': 'C++ source',\n  'ftype.csharp': 'C# source',\n  'ftype.stylesheet': 'Stylesheet',\n  'ftype.html': 'HTML document',\n  'ftype.json': 'JSON data',\n  'ftype.yaml': 'YAML',\n  'ftype.xml': 'XML',\n  'ftype.toml': 'TOML',\n  'ftype.sql': 'SQL',\n  'ftype.shell': 'Shell script',\n  'ftype.powershell': 'PowerShell script',\n  'ftype.markdown': 'Markdown',\n  'ftype.plaintext': 'Plain text',\n  'ftype.log': 'Log file',\n  'ftype.config': 'Configuration',\n  'ftype.sheet': 'Spreadsheet',\n  'ftype.figma': 'Figma design',\n  'ftype.design': 'Design file',\n  'ftype.image': 'Image',\n  'ftype.video': 'Video',\n  'ftype.audio': 'Audio',\n  'ftype.pdf': 'PDF document',\n  'ftype.document': 'Document',\n  'ftype.slides': 'Presentation',\n  'ftype.archive': 'Archive',\n  'ftype.code': 'Code',\n  /* === gorunum:v1-advsearch — the Advanced search dialog ==================\n   * Two `filter.*` keys are added here rather than beside their siblings\n   * because they are new members of shared unions the dialog introduced\n   * (`modified: 'around'`, `size: 'range'`); the filter row never selects\n   * them, but `chipLabel` would print the raw key if one ever reached it. */\n  'filter.modified.around': 'Around a date',\n  'filter.size.range': 'Custom range',\n\n  'advsearch.open': 'Advanced search',\n  'advsearch.title': 'Advanced search',\n  'advsearch.subtitle': 'Find files by name, content, path, or tags.',\n  'advsearch.close': 'Close',\n  'advsearch.content.heading': 'Content search',\n  'advsearch.viewall': 'View all results',\n  'advsearch.where.any_short': 'Anywhere',\n  'advsearch.where.here_short': 'Only here',\n  'advsearch.where.skip_short': 'Skip this',\n  'advsearch.server.legend': 'What the server searches',\n  'advsearch.client.legend': 'Narrow the results that come back',\n  'advsearch.query.label': 'Words',\n  'advsearch.query.placeholder': 'Part of a name, or words inside a file',\n  'advsearch.scope.label': 'Look in',\n  'advsearch.scope.name': 'Names and paths',\n  'advsearch.scope.content': 'File contents',\n  'advsearch.scope.all': 'Both',\n  'advsearch.scope.hint':\n    'Contents are searched from the index, which covers text-like files up to 200 KB.',\n  'advsearch.people.name_only':\n    'Owner is read off the rows that come back, and only a name search returns rows that carry one.',\n  'advsearch.scope.name_only':\n    'Only names and paths here: a content hit reaches the explorer without the drive it came from, so content search is offered on single-storage deployments only.',\n  'advsearch.tags.label': 'Tags',\n  'advsearch.tags.placeholder': 'invoice, quarterly report',\n  'advsearch.tags.exclude': 'Without tags',\n  'advsearch.tags.exclude_placeholder': 'archive',\n  'advsearch.tags.hint':\n    'Separate with commas. Tags narrow: several tags means files carrying all of them, and a tag nobody has applied returns nothing.',\n  'advsearch.where.label': 'Folder',\n  'advsearch.where.any': 'Anywhere in this storage',\n  'advsearch.where.here': 'Only in {folder}',\n  'advsearch.where.skip': 'Everywhere except {folder}',\n  'advsearch.around.label': 'Within',\n  'advsearch.around.date': 'Date and time',\n  'advsearch.around.h1': '1 hour',\n  'advsearch.around.d1': '1 day',\n  'advsearch.around.w1': '1 week',\n  'advsearch.size.range_label': 'Between',\n  'advsearch.size.from': 'From',\n  'advsearch.size.to': 'To',\n  'advsearch.count.idle': 'Type something, or pick a tag.',\n  'advsearch.count.counting': 'Counting…',\n  'advsearch.count.result': '{n} matching items',\n  'advsearch.count.capped': '{n} matching items in the first page of hits',\n  'advsearch.count.result_one': '1 matching item',\n  'advsearch.count.capped_one': '1 matching item in the first page of hits',\n  'advsearch.count.error': 'The count could not be run.',\n  'advsearch.count.cost':\n    'The count runs this search. Type, owner, date, size and folder are applied to the rows that come back, not by the server.',\n  'advsearch.wire': 'Sent as',\n  'advsearch.reset': 'Reset',\n  'advsearch.cancel': 'Cancel',\n  'advsearch.submit': 'Search',\n\n  /* === gorunum:v2-topbar — the page bar is gone; the explorer's own header\n     and breadcrumb row carry what it used to. === */\n  'breadcrumb.subfolders': 'Subfolders',\n  'breadcrumb.subfolders.empty': 'No subfolders here',\n  'header.admin': 'Admin panel',\n  'header.settings': 'Settings',\n  'header.signout': 'Sign out',\n  'ai.assistant': 'AI assistant',\n  'ai.soon': 'Coming soon',\n  'ai.assistant.soon': 'AI assistant — coming soon',\n\n  /* gorunum:v2-share — the Share / Permissions dialog's own chrome. The\n     controls inside it keep the strings they already had; these are the new\n     shell: the title, the one switch, the sentence that says who can open the\n     item right now, and the three named sections it all folds into. */\n  'access.title': 'Share \"{name}\"',\n  'access.close': 'Close',\n  'access.done': 'Done',\n  'access.copy': 'Copy',\n  'access.copied': 'Copied',\n  'access.link.switch': 'Link sharing',\n  'access.who.private': 'Only people with access can open it.',\n  'access.who.link': 'Anyone with the link can open it.',\n  'access.who.pin': 'Anyone with the link and the PIN can open it.',\n  'access.who.existing': 'Link sharing is on — {n} links already exist.',\n  'access.who.existing_one': 'Link sharing is on — 1 link already exists.',\n  'access.section.link': 'Link options',\n  'access.section.people': 'People with access',\n  'access.section.drop': 'Request files',\n  'access.sum.pin_on': 'PIN on',\n  'access.sum.pin_off': 'No PIN',\n  'access.sum.people': '{n} people',\n  'access.sum.people_one': '1 person',\n  'access.sum.people_none': 'No one yet',\n  'access.sum.drop': '{n} upload links',\n  'access.sum.drop_one': '1 upload link',\n  'access.sum.drop_none': 'No upload link',\n  /* Ownership — the Owner column and the People chip. \"System\" is the honest\n     word for a row nobody put here through filex (the scanner found it, or it\n     was written straight into the bucket); it is a real answer, not a blank. */\n  'col.owner': 'Owner',\n  'owner.you': 'You',\n  'owner.system': 'System',\n  'owner.unknown': 'Unknown',\n  'owner.external': 'Uploaded through an upload link',\n  'owner.last_actor': 'Last changed by {who}',\n  'filter.people': 'People',\n  'filter.people.any': 'Anyone',\n  'filter.people.me': 'You',\n  'filter.people.system': 'System',\n  'filter.people.someone': 'Someone else',\n  /* surucu:d1-sort — the listing sort control at the trailing edge of the\n     filter row. The four key names are `col.*`: the menu offers exactly the\n     words the list view's own column headers carry, so the two controls that\n     drive one sort cannot name it differently. */\n  'sort.by': 'Sort by',\n  'sort.asc': 'Ascending',\n  'sort.desc': 'Descending',\n  /* The order a SEARCH RESULT is in. It is not a fifth sort key — it is what\n     the control prints instead of a key while the rows on screen were ranked\n     by the server, so the button stops claiming a sort it is not performing.\n     `_why` is the reason the control is closed, and the owner asked for the\n     reason to be written rather than for the control to go quietly inert. */\n  'sort.relevance': 'Relevance',\n  'sort.relevance_why':\n    'Search results are listed by how well they match. Your sort comes back when you leave the search.',\n  /* === tablo:t1 — the table's own configuration ==========================\n     Column widths and visibility are a preference about YOUR SCREEN; the view\n     a folder opens in is a fact about the FOLDER. Both are set from here, and\n     `folder_hint` is the rule in one sentence, written where the person who is\n     about to be surprised by it can read it. */\n  'col.location': 'Location',\n  'cols.menu': 'Column options',\n  'cols.title': 'Columns',\n  'cols.resize': 'Resize {col}',\n  'cols.move_left': 'Move {col} left',\n  'cols.move_right': 'Move {col} right',\n  'cols.reset': 'Reset columns',\n  'cols.folder_title': 'Folder view',\n  'cols.folder_hint':\n    'Folders you set up keep their own view. Your last choice is the default everywhere else.',\n  'cols.forget_folder': \"Forget this folder's view\",\n  'cols.apply_all': 'Apply to all folders ({count} remembered)',\n  /* === tablo:t1 — the trash banner ======================================\n     ⚠ `retention` is only used when the deployment has TOLD us the number\n     (GET /api/admin/protection). Everywhere else `retention_unknown` says the\n     same thing without naming a period we cannot verify: a banner that states\n     the wrong retention is worse than no banner, because people act on it. */\n  'trash.retention': 'Items in the trash are permanently deleted after {days} days.',\n  'trash.retention_one': 'Items in the trash are permanently deleted after 1 day.',\n  'trash.retention_unknown':\n    'Items in the trash are permanently deleted after a retention period set by your administrator.',\n  'trash.empty_action': 'Empty trash',\n  'trash.empty_confirm_title': 'Empty the trash?',\n  'trash.empty_confirm_body_one': 'This permanently deletes 1 item ({size}). It cannot be undone.',\n  'trash.empty_confirm_body':\n    'This permanently deletes {count} items ({size}). It cannot be undone.',\n  'trash.empty_confirm_body_nosize_one': 'This permanently deletes 1 item. It cannot be undone.',\n  'trash.empty_confirm_body_nosize': 'This permanently deletes {count} items. It cannot be undone.',\n  'trash.emptied': 'Trash emptied',\n  'empty.trash.hint': 'Files you delete land here first, so you can put them back.',\n\n  /* tasi:m1 — the destination picker (modals/DestinationPickerModal.vue) and\n     the two selection verbs built on it. */\n  'destpicker.title.move': 'Move to',\n  'destpicker.title.copy': 'Copy to',\n  'destpicker.title.choose': 'Choose a folder',\n  'destpicker.confirm.move': 'Move here',\n  'destpicker.confirm.copy': 'Copy here',\n  'destpicker.confirm.choose': 'Choose this folder',\n  'destpicker.cancel': 'Cancel',\n  'destpicker.up': 'Up one level',\n  'destpicker.crumbs': 'Location',\n  'destpicker.drives': 'Drives',\n  'destpicker.loading': 'Loading…',\n  'destpicker.empty': 'No subfolders here',\n  'destpicker.unreadable': 'This folder cannot be opened.',\n  'destpicker.readonly': 'Read-only',\n  'destpicker.readonly_here': 'You cannot write into this folder.',\n  'destpicker.pick_a_drive': 'Open a storage to choose a folder inside it.',\n  'destpicker.target': 'Destination: {name}',\n  'destpicker.tag.blocked': 'Not allowed',\n  'destpicker.blocked.self': 'A folder cannot be moved into itself.',\n  'destpicker.blocked.descendant': 'A folder cannot be moved into one of its own subfolders.',\n\n  'ctx.move_to': 'Move to…',\n  'ctx.copy_to': 'Copy to…',\n  'ctx.access.one_only': 'Sharing works on one item at a time.',\n\n  'toast.archive.preparing': 'Preparing the archive…',\n  'toast.archive.started': 'Downloading {name} ({count} files)',\n  'toast.archive.started_one': 'Downloading {name} (1 file)',\n  'toast.archive.empty': 'Nothing to download — the selection contains no readable file.',\n  'toast.moved_to': 'Moved to {name}',\n  'toast.copied_to': 'Copy to {name} queued',\n};\n","/**\n * timezone.ts — whose clock an instant is read on.\n *\n * A timestamp is an instant. `last_modified` is the same number for everybody\n * on the planet; what differs is the clock it is read against. The owner's\n * rule, verbatim: *\"ben 03'te video yükledim, GMT 0 eleman o videonun yüklenme\n * saatini kendi zaman diliminde görecek.\"* So the instant stays untouched on\n * the wire and the READER picks the clock.\n *\n * ⚠⚠ WHICH reader is a question with several answers, and this module is the\n * ONE place they are ranked. Before it, the admin web app followed the account\n * and an embedded `<filex-explorer>` on another origin followed the browser —\n * a person who chose Tokyo saw Tokyo in one and their laptop's zone in the\n * other, for the same file. That disagreement is the bug this exists to end,\n * so every surface resolves through `resolveTimeZone()` and nothing else\n * decides.\n *\n * The owner's ruling (2026-09-14): three tiers — the embedder, then the\n * account behind the key when it IS a person's key, then the browser — plus a\n * setting inside the embed, kept in the browser, because an embed has no\n * user-settings dialog. Where that setting ranks is `TIME_ZONE_TIERS` below,\n * and the reasoning is on it.\n *\n * Scope: page-level, deliberately. The clock belongs to the person looking at\n * the page, and there is one of them. Host and account zones are REGISTERED by\n * whoever knows them (an explorer instance, the web app's auth store) under an\n * owner key, so an explorer that unmounts takes its zones with it instead of\n * leaving them behind for the next one. Two explorers on one page that\n * disagree about a host zone, or hold different people's tokens, resolve to\n * the most recently written value for both — one viewer, one clock.\n *\n * The same-tab `filex:timezone` event survives from the previous design and for\n * the same reason: the admin app and a `<filex-explorer>` web component on one\n * page can be two different BUNDLES, i.e. two copies of this module, and a ref\n * in one says nothing to the other. The event crosses that gap for the one tier\n * that is shared state by nature — the browser's.\n */\n\nimport { computed, ref, type InjectionKey, type Ref } from 'vue';\n\n/* ── the order ────────────────────────────────────────────────────────── */\n\n/**\n * The places a zone can come from.\n *\n *   viewer  — the person looking at this page picked one in THIS browser\n *             (the explorer's \"⋯\" → Time zone). localStorage, per origin.\n *   host    — the embedder set `config.timeZone` on the explorer.\n *   account — the account behind the credential, from `GET /api/auth/me`, and\n *             ONLY when that credential is a person's (a cookie session or\n *             their own API key). An `app` token is shared by every visitor of\n *             the embed that holds it, so its owner's zone is nobody's clock\n *             and the tier is skipped.\n *   device  — the browser's own zone, resolved live by `Intl`.\n */\nexport type TimeZoneTier = 'viewer' | 'host' | 'account' | 'device';\n\n/**\n * ⚠⚠ THE order. First tier holding a valid zone wins; `device` always holds\n * one. Flipping a ranking is a change to this array and to nothing else — the\n * resolver, the explorer, the web app and the embed's own dialog all read it\n * (pinned by web/tests/lib/timeZoneTiers.test.ts).\n *\n * `viewer` is on top, above the embedder the owner numbered \"1\", and that is a\n * judgement rather than a transcription:\n *\n *   - A host's `config.timeZone` is a DEFAULT it chooses for everybody who\n *     visits, written before any of them arrived. A viewer's pick is a\n *     decision one person made on purpose, afterwards, in a control that\n *     exists for nothing else. If the host outranked it, every host that sets\n *     a zone would ship an embed whose Time zone control visibly does nothing\n *     — and a control that saves, reads back and changes nothing is worse than\n *     no control.\n *   - The explorer already ranks the same two things this way for the theme\n *     mode: `config.theme` is what `'host'` (never chosen) resolves to, and\n *     the first click in the gallery pins the viewer's own choice above it\n *     (FileExplorer.vue, `themeMode`). One product, one answer to \"does the\n *     host or the person decide how this looks\".\n *   - The pick is cheap to undo: the picker's first row is \"use the default\",\n *     and that row names the zone and the tier it falls back to.\n *\n * Below the viewer, the owner's own numbering stands as given.\n */\nexport const TIME_ZONE_TIERS: readonly TimeZoneTier[] = Object.freeze([\n  'viewer',\n  'host',\n  'account',\n  'device',\n] as TimeZoneTier[]);\n\n/** A value per tier. Empty, missing or engine-rejected means \"no opinion\". */\nexport type TimeZoneSources = Partial<Record<Exclude<TimeZoneTier, 'device'>, string | null>>;\n\nexport interface ResolvedTimeZone {\n  /** The zone to hand `Intl`; `undefined` = the device, resolved live. */\n  zone: string | undefined;\n  /** Which tier it came from. */\n  tier: TimeZoneTier;\n}\n\n/**\n * Walk `TIME_ZONE_TIERS` and return the first tier with a usable zone.\n *\n * Pure — the reactive state below feeds it, and so can a test, or a surface\n * that needs to say what a default WOULD be (the embed's dialog asks it with\n * the viewer tier blanked, to label its \"use the default\" row).\n */\nexport function resolveTimeZone(sources: TimeZoneSources): ResolvedTimeZone {\n  for (const tier of TIME_ZONE_TIERS) {\n    if (tier === 'device') break;\n    const v = sources[tier];\n    if (typeof v === 'string' && v && isValidTimeZone(v)) return { zone: v, tier };\n  }\n  return { zone: undefined, tier: 'device' };\n}\n\n/* ── storage keys ─────────────────────────────────────────────────────── */\n\n/**\n * localStorage key of the VIEWER tier — the embed's own setting.\n *\n * ⚠ Not `filex.timezone`. That key already holds the web app's copy of the\n * ACCOUNT's zone in every browser that has opened the admin app, and reading\n * it as a viewer choice would rank a stale cache above the account forever: a\n * zone changed in another browser would never arrive in this one.\n */\nexport const TIMEZONE_VIEWER_LS_KEY = 'filex.timezone.viewer';\n\n/**\n * localStorage key of the web app's copy of the ACCOUNT tier, so the first\n * paint after a reload is already right instead of flashing the device's zone\n * until `/api/auth/me` lands. Written only by a host that opts in\n * (`setAccountTimeZone(…, { remember: true })`) — an embed on a shared origin\n * must not inherit the zone of whoever last signed in to something else there.\n */\nexport const TIMEZONE_ACCOUNT_LS_KEY = 'filex.timezone';\n\n/* ── the engine ───────────────────────────────────────────────────────── */\n\n/**\n * A short, boring fallback list for engines without\n * `Intl.supportedValuesOf` (Safari < 15.4, older embedded WebViews). Not a\n * world atlas: enough to cover the zones this product's users are actually\n * in, plus UTC as the neutral reference every ops conversation falls back to.\n */\nconst FALLBACK_ZONES = [\n  'UTC',\n  'Europe/Istanbul',\n  'Europe/London',\n  'Europe/Berlin',\n  'Europe/Paris',\n  'Europe/Madrid',\n  'Europe/Moscow',\n  'America/New_York',\n  'America/Chicago',\n  'America/Denver',\n  'America/Los_Angeles',\n  'America/Sao_Paulo',\n  'Africa/Cairo',\n  'Africa/Lagos',\n  'Asia/Dubai',\n  'Asia/Karachi',\n  'Asia/Kolkata',\n  'Asia/Shanghai',\n  'Asia/Tokyo',\n  'Asia/Seoul',\n  'Asia/Singapore',\n  'Australia/Sydney',\n  'Pacific/Auckland',\n];\n\n/** The zone this browser is in right now, asked fresh every time. */\nexport function deviceTimeZone(): string {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n  } catch {\n    return 'UTC';\n  }\n}\n\n/**\n * True when the engine accepts `tz` as an IANA zone.\n *\n * ⚠ The check is a real formatter construction, not a lookup in the list\n * below: `supportedValuesOf` is the engine's *canonical* set and does not\n * contain the aliases it nonetheless accepts (`Asia/Istanbul`,\n * `US/Pacific`, …). The value may have come from another device, another\n * browser, a host page or a hand-edited account row.\n */\nexport function isValidTimeZone(tz: string): boolean {\n  if (!tz) return false;\n  try {\n    new Intl.DateTimeFormat('en-US', { timeZone: tz });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** Every zone the engine knows, sorted; the fallback list when it knows none. */\nexport function supportedTimeZones(): string[] {\n  try {\n    const fn = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n      .supportedValuesOf;\n    if (typeof fn === 'function') {\n      const list = fn('timeZone');\n      if (Array.isArray(list) && list.length) {\n        // UTC is missing from the canonical list on some engines (it is\n        // spelled Etc/UTC there) and it is the one zone an operator asks for\n        // by name, so it is guaranteed a row rather than left to chance.\n        return list.includes('UTC') ? [...list] : ['UTC', ...list];\n      }\n    }\n  } catch {\n    /* fall through */\n  }\n  return [...FALLBACK_ZONES];\n}\n\n/**\n * Which calendar day an instant falls on, in `zone`, as a day count since the\n * epoch. Comparable and subtractable — `a - b === 1` means \"the day before\".\n *\n * Why not `new Date(ms).getDate()`: that is the DEVICE's calendar, and the\n * date a listing groups by has to be the same date it prints in the cell four\n * pixels away. A file touched at 01:00 in Istanbul belongs under \"Yesterday\"\n * for a viewer reading UTC and under \"Today\" for one reading Istanbul.\n *\n * `en-CA` is not a locale choice, it is the shortest route to ISO `Y-M-D` out\n * of `Intl`; the parts are re-assembled through `Date.UTC` so the arithmetic\n * happens on a calendar with no offsets in it at all.\n */\nexport function zonedDayNumber(d: Date, zone?: string): number {\n  const tz = zone ?? activeTimeZone();\n  try {\n    const parts = new Intl.DateTimeFormat('en-CA', {\n      timeZone: tz,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    }).formatToParts(d);\n    const get = (type: string) => Number(parts.find((p) => p.type === type)?.value);\n    const y = get('year');\n    const m = get('month');\n    const day = get('day');\n    if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(day)) {\n      throw new Error('unparsable');\n    }\n    return Math.floor(Date.UTC(y, m - 1, day) / 86_400_000);\n  } catch {\n    // Engine refused the zone (or formatToParts) — the device's calendar is a\n    // worse answer than the right one but a much better answer than none.\n    return Math.floor(\n      Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()) / 86_400_000,\n    );\n  }\n}\n\n/* ── the state ────────────────────────────────────────────────────────── */\n\nfunction readValid(key: string): string {\n  try {\n    const v = localStorage.getItem(key);\n    return v && isValidTimeZone(v) ? v : '';\n  } catch {\n    return '';\n  }\n}\n\nfunction writeOrClear(key: string, value: string): void {\n  try {\n    if (value) localStorage.setItem(key, value);\n    else localStorage.removeItem(key);\n  } catch {\n    /* private mode / blocked site data — the in-memory state still moved, so\n       this page is correct; only the next reload forgets. */\n  }\n}\n\nconst hasWindow = typeof window !== 'undefined';\n\n/** Tier `viewer`. `''` = no choice made in this browser. Read at module load\n *  so the value is right on the FIRST paint after a reload. */\nconst viewerZone: Ref<string> = ref(hasWindow ? readValid(TIMEZONE_VIEWER_LS_KEY) : '');\n\ninterface OwnedZone {\n  owner: symbol;\n  zone: string;\n}\n\n/**\n * A tier fed by several owners. The newest WRITE wins; re-stating an unchanged\n * value keeps its place, so a watcher that fires again cannot jump the queue\n * over a genuinely newer answer.\n */\nfunction ownedTier() {\n  const entries = ref<OwnedZone[]>([]);\n  return {\n    set(owner: symbol, zone: string | null): void {\n      const cur = entries.value.find((e) => e.owner === owner);\n      if (zone === null) {\n        if (cur) entries.value = entries.value.filter((e) => e !== cur);\n        return;\n      }\n      if (cur && cur.zone === zone) return;\n      entries.value = [...entries.value.filter((e) => e.owner !== owner), { owner, zone }];\n    },\n    of(owner: symbol): string | null {\n      return entries.value.find((e) => e.owner === owner)?.zone ?? null;\n    },\n    current(): string {\n      const list = entries.value;\n      return list.length ? list[list.length - 1].zone : '';\n    },\n    /** The newest answer among the owners `pick` accepts. */\n    currentWhere(pick: (owner: symbol) => boolean): string {\n      const list = entries.value.filter((e) => pick(e.owner));\n      return list.length ? list[list.length - 1].zone : '';\n    },\n  };\n}\n\nconst hostTier = ownedTier();\nconst accountTier = ownedTier();\n/** Owners whose account entry is the localStorage copy, and follows it. */\nconst rememberingOwners = new Set<symbol>();\n\nconst resolved = computed<ResolvedTimeZone>(() =>\n  resolveTimeZone({\n    viewer: viewerZone.value,\n    host: hostTier.current(),\n    account: accountTier.current(),\n  }),\n);\n\n/**\n * The zone to hand `Intl` — the resolved one. Reactive: reading it inside a\n * render or a computed subscribes that surface to every tier.\n *\n * `undefined` is returned for the device rather than the resolved name, so the\n * formatter takes `Intl`'s own live answer (a laptop carried across an ocean\n * keeps telling the truth without anybody re-saving anything).\n */\nexport function activeTimeZone(): string | undefined {\n  return resolved.value.zone;\n}\n\n/** The resolved zone AND the tier it came from. Reactive. */\nexport function resolvedTimeZone(): ResolvedTimeZone {\n  return resolved.value;\n}\n\n/**\n * The owner key an explorer PROVIDES to its components, so the dates they\n * print resolve against that explorer's own tiers (useLocale injects it).\n */\nexport const EXPLORER_CLOCK: InjectionKey<symbol> = Symbol('filex-explorer-clock');\n\n/**\n * What the tiers hold for ONE explorer.\n *\n * ⚠⚠ The page-wide tiers answer with the NEWEST write, which is right for a\n * surface outside every explorer and wrong inside one: two explorers on one\n * page with different `config.timeZone` both printed the zone of whichever\n * mounted last. The host tier is by definition one explorer's setting, so an\n * explorer reads only its own. Its account tier is its own too; the only other\n * account it may inherit is the one a HOST APP remembered for the person\n * signed in (the admin app's session, `remember: true`) — never a sibling\n * explorer's, which may belong to a different key altogether. The viewer tier\n * is this browser's, shared by everything on the page.\n *\n * `owner` undefined is the page-wide answer, unchanged.\n */\nexport function timeZoneSourcesFor(owner: symbol | undefined): Required<TimeZoneSources> {\n  if (!owner) return timeZoneSources();\n  return {\n    viewer: viewerZone.value,\n    host: hostTier.of(owner) ?? '',\n    account: accountTier.of(owner) ?? accountTier.currentWhere((o) => rememberingOwners.has(o)),\n  };\n}\n\n/** resolvedTimeZone for ONE explorer (see timeZoneSourcesFor). Reactive. */\nexport function resolvedTimeZoneFor(owner: symbol | undefined): ResolvedTimeZone {\n  return owner ? resolveTimeZone(timeZoneSourcesFor(owner)) : resolved.value;\n}\n\n/** activeTimeZone for ONE explorer (see timeZoneSourcesFor). Reactive. */\nexport function activeTimeZoneFor(owner: symbol | undefined): string | undefined {\n  return resolvedTimeZoneFor(owner).zone;\n}\n\n/** What each tier currently holds (`''` = nothing). Reactive. */\nexport function timeZoneSources(): Required<TimeZoneSources> {\n  return {\n    viewer: viewerZone.value,\n    host: hostTier.current(),\n    account: accountTier.current(),\n  };\n}\n\n/** Tier `viewer`, as stored in this browser. `''` = no choice. Reactive. */\nexport function viewerTimeZone(): string {\n  return viewerZone.value;\n}\n\n/** Set (or, with `''`, clear) the viewer's own choice in this browser. */\nexport function setViewerTimeZone(tz: string): void {\n  const valid = tz && isValidTimeZone(tz) ? tz : '';\n  viewerZone.value = valid;\n  writeOrClear(TIMEZONE_VIEWER_LS_KEY, valid);\n  // A window never receives its own `storage` event, and a second bundle on\n  // this page holds a different copy of this module. Say it out loud.\n  try {\n    window.dispatchEvent(new CustomEvent('filex:timezone', { detail: valid }));\n  } catch {\n    /* non-DOM environment, or an engine without the CustomEvent constructor */\n  }\n}\n\n/**\n * Tier `host`: the zone `owner` (an explorer instance) was configured with.\n * `''`/`null`/an engine-rejected id withdraws it — an explorer with no\n * `config.timeZone` has no opinion, and must not hide another one's.\n */\nexport function setHostTimeZone(owner: symbol, tz: string | null | undefined): void {\n  hostTier.set(owner, tz && isValidTimeZone(tz) ? tz : null);\n}\n\n/**\n * Tier `account`: what `owner` learned about the account behind its\n * credential.\n *\n * `''` is an answer — \"this person has not chosen a zone\" — and is recorded,\n * so it overrides an older answer from the same page. `null`/`undefined` means\n * \"I have no account to speak for\" (an `app` token, a failed lookup) and\n * withdraws the entry. A zone the engine rejects is recorded as `''`: the\n * account did say something, and it was not usable.\n *\n * `remember` mirrors the value into `TIMEZONE_ACCOUNT_LS_KEY` for the next\n * first paint, and makes this owner follow that key when another tab changes\n * it. For the admin web app, whose session is always a person.\n */\nexport function setAccountTimeZone(\n  owner: symbol,\n  tz: string | null | undefined,\n  opts: { remember?: boolean } = {},\n): void {\n  if (tz === null || tz === undefined) {\n    accountTier.set(owner, null);\n    return;\n  }\n  const valid = tz && isValidTimeZone(tz) ? tz : '';\n  accountTier.set(owner, valid);\n  if (opts.remember) {\n    rememberingOwners.add(owner);\n    writeOrClear(TIMEZONE_ACCOUNT_LS_KEY, valid);\n  }\n}\n\n/** The account zone `owner` last recorded (`null` = none recorded). Reactive. */\nexport function accountTimeZoneOf(owner: symbol): string | null {\n  return accountTier.of(owner);\n}\n\n/** The account zone remembered in this browser by the last session. */\nexport function rememberedAccountTimeZone(): string {\n  return hasWindow ? readValid(TIMEZONE_ACCOUNT_LS_KEY) : '';\n}\n\n/** Withdraw everything `owner` registered — call it on unmount. */\nexport function releaseTimeZoneOwner(owner: symbol): void {\n  hostTier.set(owner, null);\n  accountTier.set(owner, null);\n  rememberingOwners.delete(owner);\n}\n\nif (hasWindow) {\n  try {\n    window.addEventListener('storage', (e) => {\n      // `key === null` is a whole-storage clear, which is also news.\n      if (e.key === null || e.key === TIMEZONE_VIEWER_LS_KEY) {\n        viewerZone.value = readValid(TIMEZONE_VIEWER_LS_KEY);\n      }\n      if (e.key === null || e.key === TIMEZONE_ACCOUNT_LS_KEY) {\n        const v = readValid(TIMEZONE_ACCOUNT_LS_KEY);\n        for (const owner of rememberingOwners) accountTier.set(owner, v);\n      }\n    });\n    window.addEventListener('filex:timezone', (e) => {\n      // ⚠ From the event's own detail, not re-read from storage: in a private\n      // window storage refuses the write, and re-reading would undo — in this\n      // very bundle — the choice that was just made.\n      const d = (e as CustomEvent).detail;\n      viewerZone.value =\n        typeof d === 'string' ? (d && isValidTimeZone(d) ? d : '') : readValid(TIMEZONE_VIEWER_LS_KEY);\n    });\n  } catch {\n    /* non-DOM environment */\n  }\n}\n","/**\n * useLocale — tr/en string table with a tiny `t()` helper, and the three\n * things every surface in this product has to agree about: which BCP-47 tag\n * the viewer's language means, what a byte count reads as, and what an\n * instant reads as.\n *\n * No i18n library — the catalogue is small enough to ship inline (see\n * src/locales).\n *\n * ⚠ The four exports ABOVE the composable are module-level on purpose. A\n * plain module (`lib/shareTtl`), the admin app's own helpers\n * (`web/src/lib/format`) and a share message that has to read like the one\n * the server sends all need these same rules, and none of them can call a\n * composable. Before this they each wrote their own, and the copies did not\n * agree:\n *\n *   - three locale → tag mappings. This file said `en-US`, `InspectorPanel`\n *     said `en-GB`, `lib/shareTtl` said `en-GB`. `en-GB` renders a medium\n *     date as \"12 Sep 2026, 15:25\" and `en-US` as \"Sep 12, 2026, 3:25 PM\", so\n *     one file's timestamp read two ways depending on which panel you were\n *     looking at.\n *   - four byte formatters, two of them disagreeing about the base.\n *   - and an `InspectorPanel.formatDate()` that passed NO time zone at all,\n *     so the details panel printed the BROWSER's clock beside a listing row\n *     printing the viewer's chosen one.\n */\n\nimport { computed, getCurrentInstance, inject, type Ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { messages } from '../locales';\nimport { EXPLORER_CLOCK, activeTimeZoneFor, deviceTimeZone } from '../lib/timezone';\n\n/* ── the tag ──────────────────────────────────────────────────────────── */\n\n/** The BCP-47 tag a catalogue code means. ONE mapping, for every surface. */\nexport function localeTag(code: LocaleCode | string | undefined): string {\n  return code === 'tr' ? 'tr-TR' : 'en-US';\n}\n\n/* ── bytes ────────────────────────────────────────────────────────────── */\n\nexport type ByteUnitKey =\n  | 'unit.bytes'\n  | 'unit.kb'\n  | 'unit.mb'\n  | 'unit.gb'\n  | 'unit.tb'\n  | 'unit.pb';\n\nconst BYTE_UNIT_KEYS: ByteUnitKey[] = [\n  'unit.bytes',\n  'unit.kb',\n  'unit.mb',\n  'unit.gb',\n  'unit.tb',\n  'unit.pb',\n];\n\n/** The catalogue's own English values, for callers with no `t()` to hand. */\nconst BYTE_UNIT_EN: Record<ByteUnitKey, string> = {\n  'unit.bytes': 'B',\n  'unit.kb': 'KB',\n  'unit.mb': 'MB',\n  'unit.gb': 'GB',\n  'unit.tb': 'TB',\n  'unit.pb': 'PB',\n};\n\nexport interface ByteSizeOptions {\n  /** Resolve a unit key to its label. Default: the English short forms. */\n  unit?: (key: ByteUnitKey) => string;\n  /**\n   * Tag for the NUMBER itself — decimal separator and grouping. `null` (the\n   * default) is the C locale: a dot, no grouping, deterministic. Pass the\n   * viewer's tag on any surface a person reads, so Turkish gets \"1,43 MB\".\n   */\n  numberLocale?: string | null;\n  /**\n   * 1000 (the default) or 1024. See the note on `formatByteSize` — 1024 is\n   * for mirroring some OTHER system's arithmetic, never a style choice.\n   */\n  base?: 1000 | 1024;\n  /** `fixed1` always shows one decimal above B, like the server's humanSize(). */\n  digits?: 'auto' | 'fixed1';\n  /** What \"no size at all\" renders as. */\n  empty?: string;\n}\n\n/**\n * A byte count as a string — the ONE implementation.\n *\n * There were four: this file (1024, i18n units), `web/src/lib/format`\n * (1000, English units), `SideNav` (1024, hardcoded English units, next to a\n * quota line that `HomeView` rendered through the shared one), and\n * `Trash.vue` (1024, in a file already importing the admin helpers). A quota\n * of 10 GB read \"10 GB\" in the admin panel, \"9.3 GB\" in the side nav and\n * \"9.31 GB\" on the home screen — three spellings of one number.\n *\n * ⚠⚠ THE BASE IS 1000, and that is a decision, not an accident:\n *\n *   - \"KB\" / \"MB\" / \"GB\" are SI prefixes and mean powers of 1000. Rendering\n *     1024-arithmetic under those letters is simply mislabelled; being right\n *     at 1024 would mean printing KiB/MiB/GiB everywhere instead.\n *   - Both places in this product that CONVERT between a unit and bytes are\n *     already decimal, and both say so in a comment: the per-user quota input\n *     (`web/src/views/UserEdit.vue`, `GB = 1_000_000_000`) and the usage/cost\n *     path (`backend/internal/usage/b2.go`: \"B2 bills in decimal GB, not GiB\n *     — using 1024³ here would quietly overstate every upload by 7%\").\n *   - So decimal is the only base under which a quota typed as \"10 GB\" reads\n *     back as \"10 GB\" and a stored volume matches the invoice beside it.\n *\n * `base: 1024` exists for exactly one reason: mirroring a number some other\n * program already printed. Today that is the share message, which has to read\n * like `humanSize()` in backend/internal/api/handlers/mail_templates.go.\n * That is an argument to this function, not a fifth copy of it.\n */\nexport function formatByteSize(\n  bytes: number | null | undefined,\n  opts: ByteSizeOptions = {},\n): string {\n  const empty = opts.empty ?? '—';\n  if (bytes == null || !Number.isFinite(bytes) || bytes < 0) return empty;\n\n  const base = opts.base ?? 1000;\n  const label = opts.unit ?? ((k: ByteUnitKey) => BYTE_UNIT_EN[k]);\n\n  let idx = 0;\n  let value = bytes;\n  while (value >= base && idx < BYTE_UNIT_KEYS.length - 1) {\n    value /= base;\n    idx += 1;\n  }\n\n  // Whole bytes are never fractional; above that, two digits while the\n  // number is small enough for them to mean something, one after that.\n  const digits = idx === 0 ? 0 : opts.digits === 'fixed1' ? 1 : value < 10 ? 2 : 1;\n\n  let num: string;\n  if (opts.numberLocale == null) {\n    num = value.toFixed(digits);\n  } else {\n    const fmt = numberFormatter(opts.numberLocale, digits, opts.digits === 'fixed1' ? digits : 0);\n    num = fmt ? fmt.format(value) : value.toFixed(digits);\n  }\n  return `${num} ${label(BYTE_UNIT_KEYS[idx])}`;\n}\n\n/**\n * ⚠ Cached. This runs once per row per repaint in a listing, and constructing\n * an `Intl.NumberFormat` is the expensive part of it — the old copy in this\n * file used `toFixed` and paid nothing, so switching to a locale-aware number\n * without a cache would be a visible cost on a folder with a few thousand\n * files. There are three or four distinct keys in a session.\n */\nconst nfCache = new Map<string, Intl.NumberFormat | null>();\nfunction numberFormatter(tag: string, max: number, min: number): Intl.NumberFormat | null {\n  const key = `${tag}|${max}|${min}`;\n  if (!nfCache.has(key)) {\n    try {\n      nfCache.set(key, new Intl.NumberFormat(tag, {\n        maximumFractionDigits: max,\n        minimumFractionDigits: min,\n      }));\n    } catch {\n      nfCache.set(key, null);\n    }\n  }\n  return nfCache.get(key) ?? null;\n}\n\n/* ── instants ─────────────────────────────────────────────────────────── */\n\nconst dtfCache = new Map<string, Intl.DateTimeFormat>();\n\n/**\n * A formatter for `tag` in the VIEWER's zone.\n *\n * ⚠ The cache key names the device zone when the viewer follows the device:\n * `Intl` resolves `timeZone: undefined` at CONSTRUCTION and freezes it, so a\n * cache keyed only on \"device\" would keep answering in whatever zone the tab\n * was opened in. Reading `activeTimeZone()` on every call is also what keeps\n * a template that formats a date reactive to the preference changing.\n */\nfunction zonedFormatter(\n  tag: string,\n  opts: Intl.DateTimeFormatOptions,\n  owner?: symbol,\n): Intl.DateTimeFormat {\n  const zone = activeTimeZoneFor(owner);\n  const key = `${tag}|${zone ?? `device:${deviceTimeZone()}`}|${JSON.stringify(opts)}`;\n  let fmt = dtfCache.get(key);\n  if (!fmt) {\n    fmt = new Intl.DateTimeFormat(tag, { ...opts, timeZone: zone });\n    dtfCache.set(key, fmt);\n  }\n  return fmt;\n}\n\n/**\n * Render an instant for a human: the viewer's language AND the viewer's\n * chosen clock, together, in one call. Every date on every surface goes\n * through here — that is the whole point of it being here.\n */\nexport function formatInstant(\n  d: Date,\n  code: LocaleCode | string | undefined,\n  opts: Intl.DateTimeFormatOptions,\n  /** The explorer whose clock applies (EXPLORER_CLOCK); omitted = page-wide. */\n  owner?: symbol,\n): string {\n  try {\n    return zonedFormatter(localeTag(code), opts, owner).format(d);\n  } catch {\n    return d.toISOString();\n  }\n}\n\n/** Seconds or milliseconds — the backend has sent both. Normalised once. */\nfunction toDate(ms: number | undefined | null): Date | null {\n  if (!ms) return null;\n  const d = new Date(ms * (ms < 1e12 ? 1000 : 1));\n  return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/* ── counted messages ─────────────────────────────────────────────────── */\n\n/**\n * The variables that COUNT something, in the order they are asked. The first\n * one a call passes decides the form of the sentence.\n */\nexport const COUNT_VARS = ['count', 'n', 'days'] as const;\n\n/**\n * Which catalogue key a counted message reads: `key_one` when the count is\n * exactly one and the catalogue has that form, otherwise `key`.\n *\n * ⚠⚠ ONE rule, here, for every counted string in the package. The catalogue\n * is a flat table with no plural machinery, so a `{n} items` message printed\n * \"1 items\" — measured in the details panel's header on a folder with one\n * file (v0.41.0 screenshot pass, 2026-09-14). Two call sites had already\n * worked around it by choosing a `_one` key by hand (the advanced-search count\n * and the empty-trash confirmation); every other counted message had not, and\n * a few hedged with \"item(s)\". A rule each caller has to remember is a rule\n * the next caller forgets, so `t()` applies it and the catalogue only has to\n * SAY the singular.\n *\n * ⚠ Turkish does not inflect a noun after a number (\"1 öğe\", \"5 öğe\"), so its\n * `_one` entries read exactly like the plain ones. They exist for key parity,\n * not because the language needs them. `web/tests/i18n/corePlurals.test.ts`\n * fails an English counted message that has no singular.\n */\nexport function countedKey(\n  key: string,\n  vars: Record<string, string | number>,\n  has: (key: string) => boolean,\n): string {\n  const counter = COUNT_VARS.find((v) => v in vars);\n  if (counter === undefined || Number(vars[counter]) !== 1) return key;\n  const one = `${key}_one`;\n  return has(one) ? one : key;\n}\n\nexport function useLocale(localeRef: Ref<LocaleCode> | (() => LocaleCode)) {\n  const code = (): LocaleCode =>\n    typeof localeRef === 'function' ? localeRef() : localeRef.value;\n\n  const lookup = computed(() => messages[code()] ?? messages.en);\n\n  // The explorer this component sits in, whose clock its dates are read on\n  // (lib/timezone, timeZoneSourcesFor). Outside a component, or outside any\n  // explorer, the page-wide answer.\n  const clock = getCurrentInstance() ? inject(EXPLORER_CLOCK, undefined) : undefined;\n\n  function t(key: string, vars: Record<string, string | number> = {}): string {\n    const table = lookup.value;\n    const raw = table[countedKey(key, vars, (k) => k in table)] ?? key;\n    return Object.entries(vars).reduce(\n      (acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)),\n      raw,\n    );\n  }\n\n  /** A byte count in the viewer's language and number format. */\n  function formatSize(bytes: number | undefined | null): string {\n    // A real zero (empty file / empty folder) is information, not absence —\n    // `formatByteSize` renders it \"0 B\" rather than the em dash.\n    return formatByteSize(bytes, {\n      unit: (key) => t(key),\n      numberLocale: localeTag(code()),\n    });\n  }\n\n  /**\n   * Render a FileNode's basename with locale-aware overrides:\n   *   - `.trash` directory → \"Çöp Kutusu\" / \"Trash\"\n   *   - Trash entries are stored as `<Ymd-His>-<rand>__<original>` so\n   *     listings inside .trash/ would otherwise show timestamps. Strip\n   *     that prefix so the user sees the original basename.\n   */\n  function nodeDisplayName(node: { basename: string }): string {\n    if (node.basename === '.trash') return t('node.trash');\n    const m = node.basename.match(/^\\d{8}-\\d{6}-[A-Za-z0-9]+__(.+)$/);\n    if (m) return m[1];\n    return node.basename;\n  }\n\n  /**\n   * gorunum:v1 — one date format for the whole explorer.\n   *\n   * There were two: the grid drew \"Sep 12, 2026\" from the explorer's own\n   * locale tag and the list drew \"12.09.2026 15:25:04\" from\n   * `toLocaleString()`, i.e. from the BROWSER's locale. Two views of the same\n   * folder, side by side in the same product, disagreeing about what day a\n   * file was touched and in whose language. The epoch normalisation is the\n   * same in both (the backend has sent seconds and milliseconds) and is kept\n   * here so a third caller cannot get it wrong.\n   *\n   * `time: true` is the listing's variant — a column wide enough to carry the\n   * clock, which is the one place the hour actually helps. It is also what\n   * the details panel shows, so the panel and the row it describes print the\n   * same characters.\n   *\n   * zaman:z1 — and the clock is the VIEWER's, from `lib/timezone`. The instant\n   * on the wire is not touched; only which zone it is read against. Before\n   * this, every date here was drawn in the browser's own zone, so a file\n   * uploaded at 03:00 Istanbul read \"03:00\" to a colleague on GMT as well —\n   * same digits, different instant. `undefined` (the default) still means the\n   * device's zone, resolved live by Intl rather than frozen at first run.\n   */\n  function formatDate(ms: number | undefined | null, opts: { time?: boolean } = {}): string {\n    const d = toDate(ms);\n    if (!d) return '';\n    const date = formatInstant(\n      d,\n      code(),\n      {\n        month: 'short',\n        day: 'numeric',\n        year: 'numeric',\n      },\n      clock,\n    );\n    if (!opts.time) return date;\n    return `${date}, ${formatInstant(d, code(), { hour: 'numeric', minute: '2-digit' }, clock)}`;\n  }\n\n  /**\n   * The whole truth, for a tooltip: full date, seconds, the zone's name AND\n   * its IANA id.\n   *\n   * The listing's cell is short by necessity (\"Sep 12, 2026, 3:14 AM\") and a\n   * short date is exactly where the zone question bites — it looks like a\n   * fact and it is a fact *about a clock nobody named*. Hovering says which.\n   * The id is appended to the zone's display name because the display name\n   * alone is ambiguous in the direction that matters here: half the world's\n   * zones render as \"GMT+3\".\n   */\n  function formatDateFull(ms: number | undefined | null): string {\n    const d = toDate(ms);\n    if (!d) return '';\n    const zone = activeTimeZoneFor(clock) ?? deviceTimeZone();\n    const stamp = formatInstant(d, code(), { dateStyle: 'full', timeStyle: 'long' }, clock);\n    return `${stamp} (${zone})`;\n  }\n\n  /**\n   * \"September 2026\" — the header over a listing's date group.\n   *\n   * Here rather than in the view that draws it: the header answers \"what\n   * month is this row from\", and it has to answer it on the same clock the\n   * cell four pixels away prints. `ListView` built its own `Intl` formatter\n   * for this, which is how the two came to be able to disagree.\n   */\n  function formatMonthYear(value: number | Date | undefined | null): string {\n    const d = value instanceof Date ? value : toDate(value);\n    if (!d) return '';\n    return formatInstant(d, code(), { month: 'long', year: 'numeric' }, clock);\n  }\n\n  /**\n   * `YYYY-MM` in the viewer's zone — a bucket id, not a label.\n   *\n   * `en-CA` is not a locale choice, it is the shortest route to ISO order out\n   * of `Intl`; same trick as `lib/timezone.zonedDayNumber`, and for the same\n   * reason: the month a row is grouped under must be the month its own cell\n   * prints, which the DEVICE's calendar cannot tell you.\n   */\n  function zonedYearMonth(value: number | Date | undefined | null): string {\n    const d = value instanceof Date ? value : toDate(value);\n    if (!d) return '';\n    try {\n      return zonedFormatter('en-CA', { year: 'numeric', month: '2-digit' }, clock).format(d);\n    } catch {\n      return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;\n    }\n  }\n\n  return {\n    t,\n    formatSize,\n    formatDate,\n    formatDateFull,\n    formatMonthYear,\n    zonedYearMonth,\n    /**\n     * zaman:z1 — the wire's `last_modified` as a `Date`, or null.\n     *\n     * Handed out because \"seconds or milliseconds\" is a fact about the WIRE,\n     * not about formatting, and every caller that needs the instant itself\n     * (rather than a string) was otherwise re-typing `v * (v < 1e12 ? 1000 :\n     * 1)`. ListView had the third copy and used it to group rows by day — so\n     * the grouping and the cell four pixels away were reading the same number\n     * through two different converters.\n     */\n    toDate,\n    nodeDisplayName,\n  };\n}\n","/**\n * usePendingOps — track async copy/move/delete operations.\n *\n * Backend POST /files/{copy,move,delete} returns `{op}` immediately\n * (status='pending') and the actual S3 work runs in a worker. The\n * client polls `/files/ops` every 2s while there's anything still\n * pending or running so the user gets live feedback (\"3/5 copied\").\n *\n * Polling is reference-counted: callers `register(op)` after starting a\n * new op; an interval ticks while the registered set has any non-\n * terminal entries. Terminal ops (done/error) stay in the local cache\n * for `RETAIN_MS` so the UI can flash a final state before they fade\n * out, then a sweep removes them.\n */\n\nimport { computed, ref, onBeforeUnmount } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { FileApi } from './useFileApi';\n\nexport interface PendingOp {\n  id: number;\n  op_type: 'copy' | 'move' | 'delete';\n  status: 'pending' | 'running' | 'done' | 'error';\n  progress_total: number;\n  progress_done: number;\n  /** Running cross-storage transfer's bytes (issue #27); absent otherwise. */\n  bytes_total?: number;\n  bytes_done?: number;\n  target_path: string | null;\n  source_dir: string | null;\n  source_count: number;\n  error_message: string | null;\n  started_at: string | null;\n  finished_at: string | null;\n  created_at: string | null;\n}\n\nconst POLL_MS = 2000;\nconst RETAIN_MS = 8000;\n\n/**\n * normalizeOp maps the backend ops row (`{kind,total,done,failed,error,dest,\n * status:'ok'|'failed'|'partial'|…}`) onto the PendingOp contract the tray\n * renders (`{op_type,progress_total,progress_done,error_message,status:'done'|\n * 'error'|…}`). Without this the tray showed \"undefined/undefined\" for a\n * running op (progress_* were undefined) and never treated an 'ok'/'failed'\n * row as terminal. Tolerant of an already-normalized shape (idempotent).\n */\nfunction normalizeOp(raw: Record<string, unknown>): PendingOp {\n  const num = (...vals: unknown[]): number => {\n    for (const v of vals) if (typeof v === 'number') return v;\n    return 0;\n  };\n  const str = (...vals: unknown[]): string | null => {\n    for (const v of vals) if (typeof v === 'string' && v !== '') return v;\n    return null;\n  };\n  const rawStatus = String(raw.status ?? 'pending');\n  const status: PendingOp['status'] =\n    rawStatus === 'ok' || rawStatus === 'done'\n      ? 'done'\n      : rawStatus === 'failed' || rawStatus === 'partial' || rawStatus === 'error'\n        ? 'error'\n        : rawStatus === 'running'\n          ? 'running'\n          : 'pending';\n  const sources = Array.isArray(raw.sources) ? raw.sources : [];\n  const opType = str(raw.op_type, raw.kind) ?? 'delete';\n  return {\n    id: num(raw.id),\n    op_type: (opType === 'copy' || opType === 'move' ? opType : 'delete') as PendingOp['op_type'],\n    status,\n    progress_total: num(raw.progress_total, raw.total, sources.length),\n    progress_done: num(raw.progress_done, raw.done),\n    bytes_total: num(raw.bytes_total),\n    bytes_done: num(raw.bytes_done),\n    target_path: str(raw.target_path, raw.dest),\n    source_dir: str(raw.source_dir),\n    source_count: num(raw.source_count, sources.length),\n    error_message: str(raw.error_message, raw.error),\n    started_at: str(raw.started_at),\n    finished_at: str(raw.finished_at),\n    created_at: str(raw.created_at),\n  };\n}\n\nexport interface UsePendingOpsOptions {\n  /** Called once an op flips into a terminal state (done|error). */\n  onSettled?: (op: PendingOp) => void;\n}\n\nexport function usePendingOps(\n  config: ExplorerConfig,\n  api: FileApi,\n  opts: UsePendingOpsOptions = {},\n) {\n  void config; // kept for future per-instance config knobs\n  const ops = ref<PendingOp[]>([]);\n  const announced = new Set<number>();\n  const settledAt = new Map<number, number>();\n  // First poll after mount returns the server's recent-history window\n  // (last 5 min of done/error rows). Mark them announced silently and\n  // skip the callback so we don't double-fire toasts on F5.\n  let firstPollDone = false;\n\n  const hasActive = computed(() =>\n    ops.value.some((o) => o.status === 'pending' || o.status === 'running'),\n  );\n\n  let timer: ReturnType<typeof setInterval> | undefined;\n\n  function startPolling() {\n    if (timer) return;\n    if (!api.endpoints.opsList) return;\n    timer = setInterval(() => {\n      void poll();\n    }, POLL_MS);\n    // Kick a poll right away.\n    void poll();\n  }\n\n  function stopPolling() {\n    if (timer) {\n      clearInterval(timer);\n      timer = undefined;\n    }\n  }\n\n  async function poll(): Promise<void> {\n    if (!api.endpoints.opsList) return;\n    try {\n      const res = await api.jsonFetch<{ ops: Record<string, unknown>[] }>(api.endpoints.opsList);\n      const incoming = (res.ops || []).map(normalizeOp);\n\n      for (const op of incoming) {\n        if ((op.status === 'done' || op.status === 'error') && !announced.has(op.id)) {\n          announced.add(op.id);\n          settledAt.set(op.id, Date.now());\n          if (firstPollDone) {\n            opts.onSettled?.(op);\n          }\n        }\n      }\n\n      // Filter incoming: pending/running always; settled only if user\n      // is currently seeing them in the local tray.\n      const localIds = new Set(ops.value.map((o) => o.id));\n      const visibleIncoming = incoming.filter((op) => {\n        if (op.status === 'pending' || op.status === 'running') return true;\n        if (!firstPollDone) return false;\n        return localIds.has(op.id);\n      });\n\n      const visibleIds = new Set(visibleIncoming.map((o) => o.id));\n      const local = ops.value.filter((o) => !visibleIds.has(o.id));\n      const merged = [...visibleIncoming, ...local];\n\n      firstPollDone = true;\n\n      // Sweep: drop terminal ops past RETAIN_MS.\n      const now = Date.now();\n      const after = merged.filter((o) => {\n        if (o.status === 'pending' || o.status === 'running') return true;\n        const at = settledAt.get(o.id);\n        return at !== undefined && now - at < RETAIN_MS;\n      });\n      ops.value = after;\n\n      if (!hasActive.value && after.length === 0) {\n        stopPolling();\n      }\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.warn('[usePendingOps] poll failed:', err);\n    }\n  }\n\n  function register(raw: PendingOp | Record<string, unknown>): void {\n    const op = normalizeOp(raw as Record<string, unknown>);\n    const exists = ops.value.some((o) => o.id === op.id);\n    if (!exists) {\n      ops.value = [op, ...ops.value];\n    }\n    startPolling();\n  }\n\n  function dismiss(id: number): void {\n    ops.value = ops.value.filter((o) => o.id !== id);\n    settledAt.delete(id);\n  }\n\n  onBeforeUnmount(() => {\n    stopPolling();\n  });\n\n  return {\n    ops,\n    hasActive,\n    register,\n    dismiss,\n    poll,\n    startPolling,\n    stopPolling,\n  };\n}\n","// Realtime (WebSocket) client for filex live collaboration, bundled into the\n// core explorer so EVERY consumer — the native panel AND the vendored\n// webcomponent embedded in host apps — gets live folder updates + presence.\n//\n// Auth: the browser's native WebSocket can't set an Authorization header and,\n// when embedded, connects cross-origin to fm.example.com. So instead of a header we\n// fetch a short-lived, single-use TICKET through the host's normal API (which\n// injects the real token server-side) and open `wss://…/api/ws?ticket=<t>`.\n// The durable token never reaches the browser.\n//\n// Degradation: if the ticket or the socket is unavailable (old backend, blocked\n// upgrade, unsupported env), `onFallback(true)` fires so the consumer can fall\n// back to plain API polling. The page always keeps working — every send is\n// guarded, connect() is wrapped, reconnects are capped.\n\nexport interface PresenceUser {\n  id: number;\n  /** Stable identity key from the server (user id + optional per-end-user\n   *  presence key). Distinguishes end users sharing one proxy token — use it\n   *  for list keys and colours instead of `id`. */\n  uid?: string;\n  name: string;\n  file?: string;\n  /** Profile picture (a small data: URI, or a URL) for this person, when their\n   *  filex account has one. Absent → the strip draws initials, as it always\n   *  did. Set from the ACCOUNT, so a session, the desktop app and any API key\n   *  minted under the same user all show the same face. */\n  avatar?: string;\n}\n\nexport interface ChangeMessage {\n  type: 'change';\n  path: string;\n  action: string; // create | delete | rename | move | upload | modify\n  name?: string;\n  new_name?: string;\n}\n\nexport interface PresenceMessage {\n  type: 'presence';\n  path: string;\n  users: PresenceUser[];\n}\n\nexport interface WsTicket {\n  ticket: string;\n  ws_url: string;\n}\n\nexport interface RealtimeHandlers {\n  onChange?: (msg: ChangeMessage) => void;\n  onPresence?: (msg: PresenceMessage) => void;\n  onStatus?: (connected: boolean) => void;\n  /** Fires true when the live socket is unavailable (consumer should poll),\n   *  false when a live socket is (re)established. */\n  onFallback?: (active: boolean) => void;\n}\n\nexport interface RealtimeOptions {\n  /** Fetch a fresh ticket (single-use) via the host API. null → no live socket. */\n  getTicket: () => Promise<WsTicket | null>;\n  handlers: RealtimeHandlers;\n}\n\nconst PING_INTERVAL_MS = 25_000;\nconst MAX_BACKOFF_MS = 15_000;\nconst MAX_RETRIES = 6;\n\nexport class RealtimeClient {\n  private ws: WebSocket | null = null;\n  private opts: RealtimeOptions;\n  private closed = false;\n  private connecting = false;\n  private retries = 0;\n  private fallback = false;\n  private pingTimer: ReturnType<typeof setInterval> | null = null;\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n  // Last-known intent, replayed on (re)connect.\n  private currentPath: string | null = null;\n  private currentFocus: string | null = null;\n\n  constructor(opts: RealtimeOptions) {\n    this.opts = opts;\n    void this.connect();\n  }\n\n  /** Subscribe to a folder (\"<adapter>://<dir>\"). Swaps the active room and\n   *  resets focus. Passing null unsubscribes (drive list / trash have no room). */\n  subscribe(path: string | null): void {\n    this.currentPath = path;\n    this.currentFocus = null;\n    if (path) this.send({ type: 'subscribe', path });\n  }\n\n  /** Report the file the user is focused on (or null to clear). */\n  setFocus(file: string | null): void {\n    this.currentFocus = file;\n    this.send({ type: 'focus', file });\n  }\n\n  /** Tear down permanently — call on unmount. */\n  close(): void {\n    this.closed = true;\n    this.clearTimers();\n    this.dropSocket();\n  }\n\n  private async connect(): Promise<void> {\n    if (this.closed || this.connecting || this.ws) return;\n    this.connecting = true;\n    let ticket: WsTicket | null = null;\n    try {\n      ticket = await this.opts.getTicket();\n    } catch {\n      ticket = null;\n    }\n    this.connecting = false;\n    if (this.closed) return;\n    if (!ticket || !ticket.ticket || !ticket.ws_url) {\n      this.fail();\n      return;\n    }\n\n    const sep = ticket.ws_url.includes('?') ? '&' : '?';\n    let ws: WebSocket;\n    try {\n      ws = new WebSocket(`${ticket.ws_url}${sep}ticket=${encodeURIComponent(ticket.ticket)}`);\n    } catch {\n      this.fail();\n      return;\n    }\n    this.ws = ws;\n\n    ws.onopen = () => {\n      this.retries = 0;\n      this.setFallback(false);\n      this.opts.handlers.onStatus?.(true);\n      if (this.currentPath) this.send({ type: 'subscribe', path: this.currentPath });\n      if (this.currentFocus !== null) this.send({ type: 'focus', file: this.currentFocus });\n      this.startPing();\n    };\n\n    ws.onmessage = (ev: MessageEvent) => {\n      let msg: unknown;\n      try {\n        msg = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n      } catch {\n        return;\n      }\n      const m = msg as { type?: string };\n      if (m?.type === 'change') this.opts.handlers.onChange?.(msg as ChangeMessage);\n      else if (m?.type === 'presence') this.opts.handlers.onPresence?.(msg as PresenceMessage);\n      // pong / error frames are intentionally ignored by the UI.\n    };\n\n    ws.onerror = () => {\n      // onclose fires next; reconnect is handled there.\n    };\n\n    ws.onclose = () => {\n      this.stopPing();\n      this.ws = null;\n      this.opts.handlers.onStatus?.(false);\n      this.fail();\n    };\n  }\n\n  // fail schedules a capped reconnect; after MAX_RETRIES it gives up on the live\n  // socket and flips to fallback (polling) mode.\n  private fail(): void {\n    if (this.closed || this.reconnectTimer) return;\n    if (this.retries >= MAX_RETRIES) {\n      this.setFallback(true);\n      return;\n    }\n    const delay = Math.min(1000 * 2 ** this.retries, MAX_BACKOFF_MS);\n    this.retries += 1;\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = null;\n      void this.connect();\n    }, delay);\n  }\n\n  private setFallback(active: boolean): void {\n    if (this.fallback === active) return;\n    this.fallback = active;\n    this.opts.handlers.onFallback?.(active);\n  }\n\n  private send(obj: unknown): void {\n    const ws = this.ws;\n    if (!ws || ws.readyState !== WebSocket.OPEN) return;\n    try {\n      ws.send(JSON.stringify(obj));\n    } catch {\n      /* a failed send just means a missed live update */\n    }\n  }\n\n  private startPing(): void {\n    this.stopPing();\n    this.pingTimer = setInterval(() => this.send({ type: 'ping' }), PING_INTERVAL_MS);\n  }\n\n  private stopPing(): void {\n    if (this.pingTimer) {\n      clearInterval(this.pingTimer);\n      this.pingTimer = null;\n    }\n  }\n\n  private dropSocket(): void {\n    if (this.ws) {\n      try {\n        this.ws.onclose = null; // suppress reconnect\n        this.ws.close();\n      } catch {\n        /* ignore */\n      }\n      this.ws = null;\n    }\n  }\n\n  private clearTimers(): void {\n    this.stopPing();\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer);\n      this.reconnectTimer = null;\n    }\n  }\n}\n","// burstDebounce: a trailing debounce that cannot be starved.\n//\n// The explorer re-lists a folder when a change frame says it changed, debounced\n// so a burst of frames costs one listing instead of N. A PLAIN trailing\n// debounce has a failure mode that only shows up under a sustained stream:\n// every frame clears the pending timer, so while frames keep arriving closer\n// together than `wait`, the reload never happens at all. That is not \"one\n// reload instead of many\" — it is zero, and the person watching the folder sees\n// nothing change until the job that is writing the files finishes.\n//\n// Measured in a real browser on 2026-09-06 against a 5 000-file zip extraction\n// (frames roughly every 40 ms for 195 s): the folder's first re-listing came\n// 114 s in, with a 40 s gap after it.\n//\n// `maxWait` is the ceiling: however long the stream goes on, the call happens\n// at most `maxWait` after the FIRST frame of the run, and the run then starts\n// again. A quiet folder is untouched — one frame still calls `wait` later.\nexport interface BurstDebounceOptions {\n  /** Quiet period after the last call before firing. */\n  wait: number;\n  /** Ceiling from the first call of a run. Must be >= wait to mean anything. */\n  maxWait: number;\n  /** Clock, injectable for tests. */\n  now?: () => number;\n}\n\nexport interface BurstDebounced {\n  (): void;\n  /** Drop any pending call (unmount). */\n  cancel(): void;\n}\n\nexport function burstDebounce(fn: () => void, opts: BurstDebounceOptions): BurstDebounced {\n  const now = opts.now ?? (() => Date.now());\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  let runStartedAt: number | null = null;\n\n  const call = () => {\n    const t = now();\n    if (runStartedAt === null) runStartedAt = t;\n    // Never later than the ceiling, never sooner than 0.\n    const untilCeiling = runStartedAt + opts.maxWait - t;\n    const delay = Math.max(0, Math.min(opts.wait, untilCeiling));\n    if (timer) clearTimeout(timer);\n    timer = setTimeout(() => {\n      timer = null;\n      runStartedAt = null;\n      fn();\n    }, delay);\n  };\n  call.cancel = () => {\n    if (timer) clearTimeout(timer);\n    timer = null;\n    runStartedAt = null;\n  };\n  return call;\n}\n","// useRealtime wires the folder-scoped live-collaboration layer (RealtimeClient)\n// into the explorer: it turns change events into a debounced soft reload, tracks\n// per-folder presence, and — when no live socket is available — falls back to\n// plain API polling so embedded/offline consumers still get near-live updates.\n//\n// The explorer calls start()/stop() on mount/unmount, subscribe() on folder\n// navigation, and setFocus() on selection; it binds presenceUsers into the UI.\n\nimport { ref, type Ref } from 'vue';\nimport { RealtimeClient, type PresenceUser, type PresenceMessage } from '../lib/realtime';\nimport { burstDebounce } from '../lib/burstDebounce';\n\nconst RELOAD_DEBOUNCE_MS = 200;\n// Ceiling on how long a run of change frames may postpone the reload it is\n// waiting for — see burstDebounce for the starvation this exists to stop.\n// Measured in a real browser on 2026-09-06, watching a folder while a\n// 5 000-file zip was extracted into it: the first re-listing came 114 s into\n// the job, and there was a 40 s gap in the middle.\nconst RELOAD_MAX_WAIT_MS = 2_000;\nconst POLL_INTERVAL_MS = 12_000;\n\nexport interface RealtimeApi {\n  wsTicket: () => Promise<{ ticket: string; ws_url: string } | null>;\n}\n\nexport function useRealtime(api: RealtimeApi, opts: { reload: () => void }) {\n  const presenceUsers: Ref<PresenceUser[]> = ref([]);\n  const connected = ref(false);\n  // True while the live socket is unavailable and the polling fallback is\n  // active — the explorer surfaces a small \"no live connection\" badge from it.\n  // Stays false during ordinary reconnect attempts, so brief blips don't flash\n  // the badge; only a genuinely given-up socket (RealtimeClient onFallback)\n  // flips it.\n  const degraded = ref(false);\n\n  let client: RealtimeClient | null = null;\n  let pendingSubscribe: string | null = null;\n  const debouncedReload = burstDebounce(() => opts.reload(), {\n    wait: RELOAD_DEBOUNCE_MS,\n    maxWait: RELOAD_MAX_WAIT_MS,\n  });\n  let pollTimer: ReturnType<typeof setInterval> | null = null;\n\n  function onPresence(msg: PresenceMessage): void {\n    // Ignore late frames for a folder we've already navigated away from.\n    if (pendingSubscribe && msg.path && msg.path !== pendingSubscribe) return;\n    presenceUsers.value = Array.isArray(msg.users) ? msg.users : [];\n  }\n\n  function onFallback(active: boolean): void {\n    degraded.value = active;\n    if (active) {\n      // No live socket → poll the listing; presence isn't available here.\n      presenceUsers.value = [];\n      if (!pollTimer) pollTimer = setInterval(() => opts.reload(), POLL_INTERVAL_MS);\n    } else if (pollTimer) {\n      clearInterval(pollTimer);\n      pollTimer = null;\n    }\n  }\n\n  function start(): void {\n    if (client) return;\n    client = new RealtimeClient({\n      getTicket: () => api.wsTicket(),\n      handlers: {\n        onChange: debouncedReload,\n        onPresence,\n        onFallback,\n        onStatus: (c) => {\n          connected.value = c;\n        },\n      },\n    });\n  }\n\n  function subscribe(wire: string | null): void {\n    presenceUsers.value = []; // drop the previous folder's roster immediately\n    pendingSubscribe = wire;\n    client?.subscribe(wire);\n  }\n\n  function setFocus(file: string | null): void {\n    client?.setFocus(file);\n  }\n\n  function stop(): void {\n    debouncedReload.cancel();\n    if (pollTimer) {\n      clearInterval(pollTimer);\n      pollTimer = null;\n    }\n    client?.close();\n    client = null;\n    degraded.value = false;\n  }\n\n  return { presenceUsers, connected, degraded, start, subscribe, setFocus, stop };\n}\n","// useThumbs — authenticated thumbnail loader for the grid view.\n//\n// The backend emits `thumb_url` as a ROOT-RELATIVE path (\"/api/files/thumb/{id}\").\n// A plain `<img src>` only works for the native same-origin SPA: an embedded\n// webcomponent resolves it against the HOST page's origin (work.example.com → 404)\n// and, even with the URL fixed, `<img>` cannot carry the bearer header a\n// proxied host (fishapp PWA) requires. So thumbs are fetched through the same\n// auth machinery as every API call (headers + credentials), cached as object\n// URLs, and handed to the grid; a failed fetch falls back to the file icon.\n\nimport { ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\n\ninterface ThumbApiSlice {\n  authHeaders: (extra?: Record<string, string>) => Promise<Record<string, string>>;\n  credentialsMode: () => RequestCredentials;\n}\n\n/** Cap the object-URL cache; beyond it oldest entries are revoked. Thumbs are\n *  small (~KBs) so this is generous while still bounding a long session. */\nconst MAX_CACHED = 500;\n\nexport function useThumbs(apiBase: string | undefined, api: ThumbApiSlice) {\n  const urls = ref<Record<string, string>>({});\n  const order: string[] = [];\n  const failed = new Set<string>();\n  const pending = new Set<string>();\n\n  function resolveUrl(raw: string): string {\n    if (/^https?:\\/\\//i.test(raw)) return raw;\n    const base = (apiBase || '').replace(/\\/+$/, '');\n    return base && raw.startsWith('/') ? base + raw : raw;\n  }\n\n  /** Reactive: returns the loaded object URL for the node's thumb, kicking off\n   *  the fetch on first sight. null = not (yet) available → show the icon. */\n  function src(n: FileNode): string | null {\n    const raw = n.thumb_url;\n    if (!raw) return null;\n    const got = urls.value[raw];\n    if (got) return got;\n    if (!failed.has(raw) && !pending.has(raw)) void load(raw);\n    return null;\n  }\n\n  async function load(raw: string): Promise<void> {\n    pending.add(raw);\n    try {\n      const res = await fetch(resolveUrl(raw), {\n        headers: await api.authHeaders({ Accept: '*/*' }),\n        credentials: api.credentialsMode(),\n      });\n      if (!res.ok) throw new Error(String(res.status));\n      const blob = await res.blob();\n      if (order.length >= MAX_CACHED) {\n        const evict = order.shift();\n        if (evict && urls.value[evict]) {\n          URL.revokeObjectURL(urls.value[evict]);\n          const next = { ...urls.value };\n          delete next[evict];\n          urls.value = next;\n        }\n      }\n      order.push(raw);\n      urls.value = { ...urls.value, [raw]: URL.createObjectURL(blob) };\n    } catch {\n      // 404 (thumb evicted server-side) or auth hiccup — icon fallback, and we\n      // don't retry within this session to avoid hammering.\n      failed.add(raw);\n    } finally {\n      pending.delete(raw);\n    }\n  }\n\n  return { src };\n}\n","/**\n * useMonacoLoader — fire-and-forget Monaco preloader.\n *\n * The preview/edit flow wants Monaco when available (best-in-class\n * editor) and highlight.js for read-only syntax colour as a graceful\n * fallback. Monaco is heavy (~5 MB), so we kick off the dynamic import\n * at module-init time — by the time the user clicks \"edit\" on a code\n * file (typically several seconds in), the chunk is already cached.\n *\n *   - `monacoPromise`     resolves to the Monaco namespace, or `null`\n *                         if the package is not installed (peer\n *                         missing) / load fails.\n *   - `highlightPromise`  resolves to the highlight.js export, or\n *                         `null` similarly.\n *   - `getMonaco()`       returns the cached module synchronously\n *                         (after `await monacoPromise`) so a click\n *                         handler doesn't re-trigger the import.\n *\n * Both modules are externalized in the bundler config — the consumer\n * either declares them as direct deps (Monaco UX) or doesn't (the\n * highlight.js read-only path takes over). No build-time hard dep here.\n */\n\nlet monacoPromise: Promise<unknown | null> | null = null;\nlet highlightPromise: Promise<unknown | null> | null = null;\nlet monacoCached: unknown | null = null;\nlet highlightCached: unknown | null = null;\n\n/**\n * Kick off the Monaco import the first time someone calls\n * `preloadEditor()` (typically the FileExplorer onMounted hook). Cheap\n * to call repeatedly — only the first call actually triggers the\n * dynamic import.\n */\nexport function preloadEditor(): void {\n  if (!monacoPromise) {\n    monacoPromise = import(/* @vite-ignore */ 'monaco-editor')\n      .then((mod) => {\n        monacoCached = (mod as { default?: unknown }).default ?? mod;\n        return monacoCached;\n      })\n      .catch(() => {\n        monacoCached = null;\n        return null;\n      });\n  }\n  if (!highlightPromise) {\n    highlightPromise = import(/* @vite-ignore */ 'highlight.js/lib/common')\n      .then((mod) => {\n        highlightCached = (mod as { default?: unknown }).default ?? mod;\n        return highlightCached;\n      })\n      .catch(() => {\n        highlightCached = null;\n        return null;\n      });\n  }\n}\n\n/**\n * Resolve Monaco. If preload hasn't been kicked off yet, this triggers\n * it (and pays the load cost on the spot). Returns `null` when the\n * package isn't installed.\n */\nexport async function ensureMonaco(): Promise<unknown | null> {\n  if (!monacoPromise) preloadEditor();\n  return monacoPromise!;\n}\n\nexport async function ensureHighlight(): Promise<unknown | null> {\n  if (!highlightPromise) preloadEditor();\n  return highlightPromise!;\n}\n\n/** Synchronous cached lookup — null if Monaco not yet ready or absent. */\nexport function getMonaco(): unknown | null {\n  return monacoCached;\n}\n\nexport function getHighlight(): unknown | null {\n  return highlightCached;\n}\n\n/**\n * Composable wrapper — components that want reactive \"is Monaco ready\n * yet?\" semantics can read the resolved promise. The implementation is\n * intentionally tiny: components don't need anything fancier than\n * `await ensureMonaco()` inside the click handler.\n */\nexport function useMonacoLoader() {\n  preloadEditor();\n  return {\n    ensureMonaco,\n    ensureHighlight,\n    getMonaco,\n    getHighlight,\n  };\n}\n","<script setup lang=\"ts\">\n// One person's circle in the presence strip: their profile picture when the\n// account has one, their initials when it does not.\n//\n// It is its own component because the strip draws the same circle twice (the\n// compact overlapping row and the expanded name chips). Written inline in both\n// places, the photo would sooner or later appear in one and not the other —\n// which is exactly the kind of split this codebase keeps paying for.\n\nimport { computed, ref } from 'vue';\nimport type { PresenceUser } from '../lib/realtime';\n\nconst props = defineProps<{\n  user: PresenceUser;\n  /** Tooltip; omitted in contexts where the surrounding chip already names the\n   *  person. */\n  title?: string;\n}>();\n\n// Only sources a browser will actually render. The value comes off the socket\n// (an account's stored avatar, or one a trusted host proxy stamped for its own\n// end user), so anything unexpected stays initials instead of a broken frame.\nconst src = computed(() => {\n  const v = (props.user.avatar ?? '').trim();\n  return /^(data:image\\/|https?:\\/\\/|\\/)/.test(v) ? v : '';\n});\n\n// A picture that fails to load falls back to initials rather than an empty hole.\nconst failed = ref(false);\nconst showPhoto = computed(() => !!src.value && !failed.value);\n\nconst initials = computed(() => {\n  const parts = props.user.name.trim().split(/\\s+/).filter(Boolean);\n  if (parts.length === 0) return '?';\n  if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n  return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n});\n\n// Deterministic hue per identity so the same person keeps the same colour.\n// Behind a photo it is only the ring/backdrop, so it stays either way.\nconst hue = computed(() => {\n  const s = props.user.uid ?? String(props.user.id);\n  let h = 0;\n  for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;\n  return h % 360;\n});\n</script>\n\n<template>\n  <span\n    class=\"fx-presence-avatar\"\n    :class=\"{ 'fx-presence-avatar--photo': showPhoto }\"\n    :style=\"{ backgroundColor: `hsl(${hue} 60% 45%)` }\"\n    :title=\"title\"\n  >\n    <img v-if=\"showPhoto\" class=\"fx-presence-photo\" :src=\"src\" :alt=\"user.name\" @error=\"failed = true\" />\n    <template v-else>{{ initials }}</template>\n    <span v-if=\"user.file\" class=\"fx-presence-dot\" aria-hidden=\"true\"></span>\n  </span>\n</template>\n","<script setup lang=\"ts\">\n// PresenceBar — compact avatar strip showing who else is viewing the current\n// folder, and (as a small badge) which file each person is focused on. The\n// server already excludes the recipient from the roster (presence answers\n// \"who ELSE is here\"); the optional selfId filter remains as a belt-and-braces\n// for older backends. Purely presentational; the live data comes from the\n// realtime presence stream.\n\nimport { computed, ref } from 'vue';\nimport type { PresenceUser } from '../lib/realtime';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport PresenceAvatar from './PresenceAvatar.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  users: PresenceUser[];\n  selfId?: number | null;\n  locale?: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => resolveLocale(props.locale));\n\nconst others = computed(() =>\n  (props.users ?? []).filter((u) => props.selfId == null || u.id !== props.selfId),\n);\n\n// Compact (avatar strip) ⇄ expanded (scrollable name chips). With many users\n// the strip collapses to \"+N\", so the expanded mode is how you actually READ\n// who is here; the choice sticks for the session via localStorage.\nconst EXPAND_KEY = 'filex.presence.expanded';\nconst expanded = ref<boolean>((() => {\n  try {\n    return localStorage.getItem(EXPAND_KEY) === '1';\n  } catch {\n    return false;\n  }\n})());\nfunction toggleExpanded(): void {\n  expanded.value = !expanded.value;\n  try {\n    localStorage.setItem(EXPAND_KEY, expanded.value ? '1' : '0');\n  } catch {\n    /* private mode — session-only */\n  }\n}\n\n// Stable key per identity: end users behind one shared proxy token have the\n// same numeric id but distinct server-issued uids.\nfunction keyOf(u: PresenceUser): string {\n  return u.uid ?? String(u.id);\n}\n\n// The circle itself (photo or initials, colour, focus dot) lives in\n// PresenceAvatar so the compact strip and the expanded chips cannot drift.\n\nfunction label(u: PresenceUser): string {\n  return u.file ? `${u.name} · ${u.file}` : u.name;\n}\n</script>\n\n<template>\n  <div v-if=\"others.length\" class=\"fx-presence\" :class=\"{ 'fx-presence--wide': expanded }\">\n    <!-- Expanded: every user as an avatar+name chip in a horizontally\n         scrollable row — names stay fully readable however many join. -->\n    <div v-if=\"expanded\" class=\"fx-presence-chips\">\n      <span\n        v-for=\"u in others\"\n        :key=\"keyOf(u)\"\n        class=\"fx-presence-chip\"\n        :title=\"label(u)\"\n      >\n        <PresenceAvatar :user=\"u\" />\n        <span class=\"fx-presence-chip-name\">{{ u.name }}</span>\n        <span v-if=\"u.file\" class=\"fx-presence-chip-file\">· {{ u.file }}</span>\n      </span>\n    </div>\n\n    <!-- Compact: the classic overlapping avatar strip. -->\n    <template v-else>\n      <div class=\"fx-presence-avatars\" :title=\"others.map(label).join(', ')\">\n        <PresenceAvatar\n          v-for=\"u in others.slice(0, 5)\"\n          :key=\"keyOf(u)\"\n          :user=\"u\"\n          :title=\"label(u)\"\n        />\n        <span v-if=\"others.length > 5\" class=\"fx-presence-more\">+{{ others.length - 5 }}</span>\n      </div>\n      <span class=\"fx-presence-text\" :title=\"others.map(label).join(', ')\">\n        {{ others.length === 1 ? others[0].name : t('presence.others', { n: others.length }) }}\n        <template v-if=\"others.length === 1 && others[0].file\">\n          · <span class=\"fx-presence-file\">{{ others[0].file }}</span>\n        </template>\n      </span>\n    </template>\n\n    <button\n      type=\"button\"\n      class=\"fx-presence-toggle\"\n      :title=\"expanded ? t('presence.collapse') : t('presence.expand')\"\n      :aria-expanded=\"expanded\"\n      @click=\"toggleExpanded\"\n    >{{ expanded ? '‹' : '›' }}</button>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.fx-presence {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.5rem;\n  max-width: 100%;\n}\n.fx-presence-avatars {\n  display: inline-flex;\n  align-items: center;\n}\n.fx-presence-avatar {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 1.5rem;\n  height: 1.5rem;\n  margin-left: -0.4rem;\n  border-radius: 9999px;\n  border: 2px solid var(--fx-presence-ring, #ffffff);\n  color: #fff;\n  font-size: 0.6rem;\n  font-weight: 600;\n  line-height: 1;\n  user-select: none;\n}\n.fx-presence-avatar:first-child {\n  margin-left: 0;\n}\n/* A photo fills the circle; the identity colour stays as the ring backdrop so\n   a picture with transparency still reads as that person. */\n.fx-presence-avatar--photo {\n  overflow: visible;\n}\n.fx-presence-photo {\n  width: 100%;\n  height: 100%;\n  border-radius: 9999px;\n  object-fit: cover;\n  display: block;\n}\n.fx-presence-dot {\n  position: absolute;\n  right: -1px;\n  bottom: -1px;\n  width: 0.5rem;\n  height: 0.5rem;\n  border-radius: 9999px;\n  background: #22c55e; /* green — actively focused on a file */\n  border: 1.5px solid var(--fx-presence-ring, #ffffff);\n}\n.fx-presence-more {\n  margin-left: 0.15rem;\n  font-size: 0.7rem;\n  color: rgb(113 113 122); /* zinc-500 */\n}\n.fx-presence--wide {\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fx-presence-chips {\n  display: flex;\n  align-items: center;\n  gap: 0.4rem;\n  overflow-x: auto;\n  min-width: 0;\n  padding-bottom: 2px; /* keep the scrollbar off the chips */\n  scrollbar-width: thin;\n}\n.fx-presence-chip {\n  display: inline-flex;\n  align-items: center;\n  gap: 0.35rem;\n  flex: 0 0 auto;\n  padding: 0.15rem 0.5rem 0.15rem 0.2rem;\n  border-radius: 9999px;\n  background: rgb(244 244 245); /* zinc-100 */\n  font-size: 0.75rem;\n  color: rgb(63 63 70); /* zinc-700 */\n  white-space: nowrap;\n}\n.fx-presence-chip .fx-presence-avatar {\n  margin-left: 0;\n}\n.fx-presence-chip-name {\n  font-weight: 500;\n}\n.fx-presence-chip-file {\n  color: rgb(113 113 122); /* zinc-500 */\n  max-width: 12rem;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.fx-presence-toggle {\n  flex: 0 0 auto;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 1.25rem;\n  height: 1.25rem;\n  border: none;\n  border-radius: 9999px;\n  background: transparent;\n  color: rgb(113 113 122); /* zinc-500 */\n  font-size: 0.9rem;\n  line-height: 1;\n  cursor: pointer;\n}\n.fx-presence-toggle:hover {\n  background: rgb(228 228 231); /* zinc-200 */\n  color: rgb(63 63 70);\n}\n.dark .fx-presence-chip {\n  background: rgb(39 39 42); /* zinc-800 */\n  color: rgb(212 212 216); /* zinc-300 */\n}\n.dark .fx-presence-toggle:hover {\n  background: rgb(39 39 42);\n  color: rgb(212 212 216);\n}\n.fx-presence-text {\n  font-size: 0.75rem;\n  color: rgb(113 113 122); /* zinc-500 */\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 14rem;\n}\n.fx-presence-file {\n  color: rgb(82 82 91); /* zinc-600 */\n  font-weight: 500;\n}\n.dark .fx-presence-avatar,\n.dark .fx-presence-dot {\n  --fx-presence-ring: #18181b; /* zinc-900 */\n}\n</style>\n","/**\n * actionIcons — menu/toolbar ACTION key → inline SVG icon mapping.\n *\n * The sibling of `lib/fileIcons.ts`, for the other half of the problem: that\n * module draws what a row IS (a folder, a sheet, an archive), this one draws\n * what a row DOES (open, rename, move to trash).\n *\n * Why it exists: the action rows used to carry emoji (`↗ 👁 ⬇ 🗑 …`). Emoji are\n * not one icon set — they are a dozen sets, rendered by whatever font the OS\n * happens to ship, at whatever weight and colour that font's designer chose.\n * Two rows of the same menu could come out flat-grey and full-colour, one\n * hairline and one bold, and none of them matched the file glyphs drawn four\n * pixels to the left. A stroked set on `currentColor` gives the menu one voice\n * and lets the row's own colour reach the icon — which is how the destructive\n * entry, and only the destructive entry, comes out red.\n *\n * Conventions are `fileIcons.ts`'s, deliberately: static strings (so `v-html`\n * is injecting markup this file wrote, never user input), one cache, 24×24\n * viewBox, 1.6 stroke, round caps/joins, `currentColor`.\n *\n * Adding a key: draw it here. Nothing else has to change — the renderers ask\n * for the icon by the action's own key, so a new action gets its icon the\n * moment its glyph lands in GLYPHS, and an action with no glyph renders\n * nothing (the caller falls back to whatever `icon` string it was handed, so\n * an embedder's custom emoji still shows).\n */\n\n/* Shared fragments — the arrow/tray pair reads as one family when download and\n * upload sit two rows apart. */\nconst TRAY = '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/>';\nconst EYE =\n  '<path d=\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\"/>' +\n  '<circle cx=\"12\" cy=\"12\" r=\"3\"/>';\nconst STAR_PATH =\n  'M12 3.6l2.6 5.3 5.85.85-4.23 4.12 1 5.83L12 16.97l-5.22 2.73 1-5.83L3.55 9.75l5.85-.85z';\n/* The push-pin, shared by the two \"keep on this device\" states. */\nconst PIN =\n  '<path d=\"M8 3.5h8\"/>' +\n  '<path d=\"M9.6 3.5v6.1L7.2 12.3v1.7h9.6v-1.7L14.4 9.6V3.5\"/>' +\n  '<path d=\"M12 14v6.5\"/>';\n/* A window/panel with one edge split off — nav and inspector are the same\n * shape mirrored, which is exactly what the two panels are. */\nconst PANEL = '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/>';\n/* The bin. `delete` moves a thing INTO it and `open-trash` opens it; those are\n * two actions on one object, so they are one drawing (Drive and Finder draw\n * them the same way too). */\nconst BIN =\n  '<path d=\"M4 6.5h16\"/>' +\n  '<path d=\"M9.5 6.5V4.9a1.4 1.4 0 0 1 1.4-1.4h2.2a1.4 1.4 0 0 1 1.4 1.4v1.6\"/>' +\n  '<path d=\"M6.6 6.5l.85 12.1a2 2 0 0 0 2 1.9h5.1a2 2 0 0 0 2-1.9l.85-12.1\"/>' +\n  '<path d=\"M10.3 10.3v6.4\"/><path d=\"M13.7 10.3v6.4\"/>';\n/* The ribbon a saved search hangs on — `bookmark` is the saved thing,\n * `save-search` is the same ribbon with the \"add\" plus in it. */\nconst BOOKMARK =\n  '<path d=\"M6.8 3.5h10.4a1.6 1.6 0 0 1 1.6 1.6v15.4l-6.8-3.9-6.8 3.9V5.1A1.6 1.6 0 0 1 6.8 3.5z\"/>';\n\nconst GLYPHS: Record<string, string> = {\n  /* ── opening ─────────────────────────────────────────────────────────── */\n  open:\n    '<path d=\"M14 3.5h6.5V10\"/>' +\n    '<path d=\"M20.5 3.5L12 12\"/>' +\n    '<path d=\"M18 13.5v5a2 2 0 0 1-2 2H5.5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h5\"/>',\n  'open-tab':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<path d=\"M3 9.5h18\"/>' +\n    '<path d=\"M9.5 4.5v5\"/>',\n  preview: EYE,\n  download: TRAY + '<path d=\"M12 4v11.5\"/><path d=\"M7.5 11L12 15.5 16.5 11\"/>',\n  upload:\n    '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/>' +\n    '<path d=\"M12 15.5V4\"/><path d=\"M7.5 8.5L12 4l4.5 4.5\"/>',\n  convert:\n    '<path d=\"M4 8.5h13\"/><path d=\"M13.5 5L17 8.5 13.5 12\"/>' +\n    '<path d=\"M20 15.5H7\"/><path d=\"M10.5 12L7 15.5 10.5 19\"/>',\n  /* \"Paylaş / İzinler\" — the three-node share, not a chain link: this row\n     opens permissions as well as a link, and people are the subject. */\n  access:\n    '<circle cx=\"17.5\" cy=\"6\" r=\"2.5\"/>' +\n    '<circle cx=\"6.5\" cy=\"12\" r=\"2.5\"/>' +\n    '<circle cx=\"17.5\" cy=\"18\" r=\"2.5\"/>' +\n    '<path d=\"M8.75 10.8l6.5-3.6\"/><path d=\"M8.75 13.2l6.5 3.6\"/>',\n  details:\n    '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>' +\n    '<path d=\"M12 11.2v5.6\"/>' +\n    '<circle cx=\"12\" cy=\"7.7\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* ── identity / clipboard ────────────────────────────────────────────── */\n  'copy-id':\n    '<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2.5\"/>' +\n    '<circle cx=\"8.5\" cy=\"10.8\" r=\"2\"/>' +\n    '<path d=\"M5.3 16.2c.5-1.5 1.75-2.4 3.2-2.4s2.7.9 3.2 2.4\"/>' +\n    '<path d=\"M14.8 10h4.2\"/><path d=\"M14.8 13.6h4.2\"/>',\n  /* A clipboard carrying a path separator — this copies the location, not the\n     thing that lives at it. */\n  'copy-path':\n    '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/>' +\n    '<rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/>' +\n    '<path d=\"M10 11.2l2.4 2.4-2.4 2.4\"/>',\n  rename: '<path d=\"M4 20l.9-4.1 11-11a2.05 2.05 0 0 1 2.9 2.9l-11 11z\"/><path d=\"M14 7l3 3\"/>',\n  cut:\n    '<circle cx=\"6.5\" cy=\"17.5\" r=\"2.5\"/>' +\n    '<circle cx=\"6.5\" cy=\"6.5\" r=\"2.5\"/>' +\n    '<path d=\"M8.6 8.3L19 19\"/><path d=\"M8.6 15.7L19 5\"/>',\n  copy:\n    '<rect x=\"9\" y=\"9\" width=\"11.5\" height=\"11.5\" rx=\"2\"/>' +\n    '<path d=\"M15 6v-.5a2 2 0 0 0-2-2H5.5a2 2 0 0 0-2 2V13a2 2 0 0 0 2 2H6\"/>',\n  paste:\n    '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/>' +\n    '<rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/>',\n  /* ── metadata ────────────────────────────────────────────────────────── */\n  /* star = \"not starred yet, do it\" (outline); unstar = the state you are in\n     (filled). The renderer picks between them by name, see FileExplorer. */\n  star: `<path d=\"${STAR_PATH}\"/>`,\n  unstar: `<path d=\"${STAR_PATH}\" fill=\"currentColor\"/>`,\n  tags:\n    '<path d=\"M3.5 11.4V5.2a1.7 1.7 0 0 1 1.7-1.7h6.2a1.7 1.7 0 0 1 1.2.5l7.2 7.2a1.7 1.7 0 0 1 0 2.4l-6.2 6.2a1.7 1.7 0 0 1-2.4 0L4 12.6a1.7 1.7 0 0 1-.5-1.2z\"/>' +\n    '<circle cx=\"8\" cy=\"8\" r=\"1.3\"/>',\n  /* ── destructive / recovery ──────────────────────────────────────────── */\n  delete: BIN,\n  'open-trash': BIN,\n  /* The undo arrow, not a rotating one: \"Geri Yükle\" puts a thing back where\n     it was, and that is the gesture people already read as undo. */\n  restore: '<path d=\"M9 6L5 10l4 4\"/><path d=\"M5 10h9a5 5 0 0 1 0 10h-3.5\"/>',\n  /* ── folder-level ────────────────────────────────────────────────────── */\n  'new-folder':\n    '<path d=\"M3 7.5a2 2 0 0 1 2-2h4.2a2 2 0 0 1 1.4.6l1.4 1.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>' +\n    '<path d=\"M12 11.3v5\"/><path d=\"M9.5 13.8h5\"/>',\n  /* belge:n1 — a page with a plus: \"make me a new document of some type\".\n     Keyed by the action's own key, so the menu row carries no icon of its\n     own and no emoji enters the markup. */\n  'new-document':\n    '<path d=\"M13.5 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\"/><path d=\"M13.5 3l5 5\"/>' +\n    '<path d=\"M13.5 3v5h5\"/><path d=\"M17.5 14.5v6\"/><path d=\"M14.5 17.5h6\"/>',\n  refresh: '<path d=\"M20.5 12a8.5 8.5 0 1 1-2.49-6.01\"/><path d=\"M18 1.5V6h-4.5\"/>',\n  /* ── desktop sync (\"keep on this device\") ────────────────────────────── */\n  'keep-local': PIN,\n  'keep-online':\n    '<path d=\"M7 18.5h10a3.5 3.5 0 0 0 0-7 5 5 0 0 0-9.6-1.2A4.2 4.2 0 0 0 7 18.5z\"/>',\n  /* Kept because a parent folder is kept — the pin, with the branch it came\n     down. The row is disabled; the glyph says why. */\n  'keep-inherited': PIN + '<path d=\"M2.5 20.5h3.6a1.6 1.6 0 0 0 1.6-1.6V17\"/>',\n  'keep-reveal':\n    '<path d=\"M2.5 17.5V6.5a2 2 0 0 1 2-2h3.8a2 2 0 0 1 1.4.6l1.4 1.4h4.4a2 2 0 0 1 2 2v1.8\"/>' +\n    '<path d=\"M4 19.5h13.4a2 2 0 0 0 1.9-1.37l2-6A1.4 1.4 0 0 0 20 10.3H9.4a2 2 0 0 0-1.9 1.37L5.5 18\"/>',\n  /* ── view preferences ────────────────────────────────────────────────── */\n  'toggle-hidden':\n    '<path d=\"M3.5 3.5l17 17\"/>' +\n    '<path d=\"M9.9 6A9.6 9.6 0 0 1 12 5.5c6 0 9.5 6.5 9.5 6.5a17.3 17.3 0 0 1-3.35 4.15\"/>' +\n    '<path d=\"M6.55 7.7A17.4 17.4 0 0 0 2.5 12S6 18.5 12 18.5a9.7 9.7 0 0 0 3.95-.85\"/>' +\n    '<path d=\"M10.2 10.3a2.9 2.9 0 0 0 3.9 4.1\"/>',\n  density: '<path d=\"M8.5 8L12 4.5 15.5 8\"/><path d=\"M8.5 16L12 19.5 15.5 16\"/><path d=\"M12 4.5v15\"/>',\n  'view-list':\n    '<path d=\"M8.5 6.5h12\"/><path d=\"M8.5 12h12\"/><path d=\"M8.5 17.5h12\"/>' +\n    '<path d=\"M4 6.5h.01\"/><path d=\"M4 12h.01\"/><path d=\"M4 17.5h.01\"/>',\n  'view-grid':\n    '<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>' +\n    '<rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>',\n  'view-gallery':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<circle cx=\"8.3\" cy=\"9.6\" r=\"1.5\"/>' +\n    '<path d=\"M4.3 17l4.7-4.7 3 3 3-3 5 4.7\"/>',\n  nav: PANEL + '<path d=\"M9.5 4.5v15\"/>',\n  inspector: PANEL + '<path d=\"M14.5 4.5v15\"/>',\n  /* ── explorer settings ───────────────────────────────────────────────── */\n  'shortcut-settings':\n    '<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2.5\"/>' +\n    '<path d=\"M6.5 9.8h.01\"/><path d=\"M10 9.8h.01\"/><path d=\"M13.5 9.8h.01\"/><path d=\"M17 9.8h.01\"/>' +\n    '<path d=\"M6.5 12.9h.01\"/><path d=\"M10 12.9h.01\"/><path d=\"M13.5 12.9h.01\"/><path d=\"M17 12.9h.01\"/>' +\n    '<path d=\"M8.6 15.6h6.8\"/>',\n  /* Light/dark as the thing it actually switches: one disc, half of it inked. */\n  theme:\n    '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>' +\n    '<path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* zaman:z3 — a clock face, for the Time zone row. */\n  timezone: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.2V12l3.2 2\"/>',\n  tour:\n    '<path d=\"M2.5 9L12 4.5 21.5 9 12 13.5z\"/>' +\n    '<path d=\"M6.6 11.1v4.4c0 1.6 2.4 2.9 5.4 2.9s5.4-1.3 5.4-2.9v-4.4\"/>',\n  /* \"Dosya İste\" — the public drop link. A chain, because what this makes is\n     a URL to hand somebody. */\n  'request-files':\n    '<path d=\"M10.2 13.8a4.2 4.2 0 0 0 6.1 0l2.3-2.3a4.3 4.3 0 0 0-6.1-6.1l-1.35 1.35\"/>' +\n    '<path d=\"M13.8 10.2a4.2 4.2 0 0 0-6.1 0l-2.3 2.3a4.3 4.3 0 0 0 6.1 6.1l1.35-1.35\"/>',\n  /* ── toolbar chrome that is not a ContextAction ──────────────────────── */\n  'go-up': '<path d=\"M12 20V5\"/><path d=\"M5.5 11.5L12 5l6.5 6.5\"/>',\n  /* === gorunum:v2-topbar — the breadcrumb row's own controls ============\n     The crumb trail gained the reference shell's three affordances: a home\n     crumb in place of the bare \"/\" root, a chevron on the last crumb that\n     lists what is inside it, and the path editor we already had (its glyph\n     moves here from Breadcrumb.vue so every mark in the row comes from one\n     file). */\n  home:\n    '<path d=\"M3.5 10.6L12 3.5l8.5 7.1\"/>' +\n    '<path d=\"M5.6 9.4V19a1.5 1.5 0 0 0 1.5 1.5h9.8a1.5 1.5 0 0 0 1.5-1.5V9.4\"/>' +\n    '<path d=\"M9.9 20.5v-5.2h4.2v5.2\"/>',\n  subfolders: '<path d=\"M6.8 9.8L12 15l5.2-5.2\"/>',\n  'edit-path': '<path d=\"M4 20h4l10-10a2.1 2.1 0 0 0-3-3L5 17z\"/><path d=\"M14.5 6.5l3 3\"/>',\n  /* === gorunum:v2-topbar — the header's trailing cluster ================\n     The page chrome around the explorer is gone, so the account-level doors\n     are drawn by the header itself (the host fills them through the\n     `header-actions` slot). The glyphs live here so an embedder's cluster\n     comes out the same weight and colour as everything beside it. */\n  admin:\n    '<rect x=\"3\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/>' +\n    '<rect x=\"13.6\" y=\"3.5\" width=\"7.4\" height=\"4.6\" rx=\"1.6\"/>' +\n    '<rect x=\"13.6\" y=\"10.7\" width=\"7.4\" height=\"9.8\" rx=\"1.6\"/>' +\n    '<rect x=\"3\" y=\"13.6\" width=\"7.4\" height=\"6.9\" rx=\"1.6\"/>',\n  /* ⚠ A PERSON, not a cog. The first draft drew the gear as a ringed disc with\n     eight spokes and at 16px it came out as a SUN — sitting in the very row\n     the light/dark toggle had just been removed from, which is the one thing\n     the mark must not be mistaken for (measured at 1440 and 390: it read as a\n     theme switch in both). The account bust is what the reference hangs this\n     menu on, and the tooltip says which settings. */\n  account: '<circle cx=\"12\" cy=\"8.2\" r=\"3.6\"/><path d=\"M4.9 20.3a7.35 7.35 0 0 1 14.2 0\"/>',\n  'sign-out':\n    '<path d=\"M9.5 20.5H6a2 2 0 0 1-2-2v-13a2 2 0 0 1 2-2h3.5\"/>' +\n    '<path d=\"M15.5 16.5L20 12l-4.5-4.5\"/>' +\n    '<path d=\"M20 12H9\"/>',\n  /* The AI assistant, drawn but not yet wired — a spark, the mark every\n     assistant in this class of product wears, so the day it does something\n     the icon does not have to change under people's fingers. */\n  ai:\n    '<path d=\"M12 3.2l1.75 4.3 4.3 1.75-4.3 1.75L12 15.3l-1.75-4.3L5.95 9.25l4.3-1.75z\"/>' +\n    '<path d=\"M18.2 15.1l.8 1.95 1.95.8-1.95.8-.8 1.95-.8-1.95-1.95-.8 1.95-.8z\"/>',\n  /* The notification bell, for the host's header cluster (web/src\n     NotificationBell.vue). ⚠ Drawn HERE, not taken from the app's icon\n     library: it sits in the same row as refresh, the spark and the avatar,\n     and a glyph at a foreign stroke weight in that row is the exact mismatch\n     this set exists to prevent. A dome on a flared rim, the clapper below. */\n  bell:\n    '<path d=\"M6.2 16.6V11a5.8 5.8 0 0 1 11.6 0v5.6l1.7 1.9H4.5z\"/>' +\n    '<path d=\"M10.1 21a2.1 2.1 0 0 0 3.8 0\"/>',\n  /* === /gorunum:v2-topbar === */\n  search: '<circle cx=\"10.8\" cy=\"10.8\" r=\"6.3\"/><path d=\"M15.4 15.4l5.1 5.1\"/>',\n  /* gorunum:v1-advsearch — sliders, not a funnel. A funnel says \"throw rows\n     away\"; this control opens a dialog where you SET things, and two of its\n     three rows are exactly a slider's job (a size range, a time window). */\n  filter:\n    '<path d=\"M4 7.5h4\"/><path d=\"M13 7.5h7\"/><circle cx=\"10.5\" cy=\"7.5\" r=\"2.4\"/>' +\n    '<path d=\"M4 16.5h7\"/><path d=\"M16 16.5h4\"/><circle cx=\"13.5\" cy=\"16.5\" r=\"2.4\"/>',\n  more:\n    '<circle cx=\"5.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>' +\n    '<circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>' +\n    '<circle cx=\"18.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>',\n  close: '<path d=\"M5.5 5.5l13 13\"/><path d=\"M18.5 5.5l-13 13\"/>',\n  /* A share link. Two half-chains, which is what a link IS. The details\n     panel's \"Not shared / Create link\" row used to draw a chain EMOJI\n     there, i.e. whatever glyph the OS happened to ship, full-colour,\n     beside a column of stroked grey ones. */\n  link:\n    '<path d=\"M10 13.5a4.5 4.5 0 0 0 6.8.5l2.7-2.7a4.5 4.5 0 0 0-6.36-6.36L11.6 6.5\"/>' +\n    '<path d=\"M14 10.5a4.5 4.5 0 0 0-6.8-.5l-2.7 2.7a4.5 4.5 0 0 0 6.36 6.36l1.53-1.53\"/>',\n\n  /* === ikon:emoji — the command palette's own rows =======================\n   * The palette printed `{{ it.icon }}` as TEXT: `➜ 📁 ⬆ ▦ 🗑 ⟳ ↑ 🎨 ⌨ 🎓 ⧉ ◫\n   * 💾 🔖`. Thirteen marks from four different type families, in a list whose\n   * neighbours — the context menu it duplicates and the toolbar it launches —\n   * had already moved here. Most of the keys it needed were drawn already\n   * (`tour` is the mortarboard, `shortcut-settings` the keyboard, the three\n   * `view-*` the mode chips); these six are what was genuinely missing. */\n\n  /* \"Go to path\" — the arrow goes INTO the box, the mirror of `sign-out`.\n     A bare arrow would have said \"next\", which this row is not. */\n  goto:\n    '<path d=\"M13.5 4.5h4a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4\"/>' +\n    '<path d=\"M10 8.2L13.8 12 10 15.8\"/>' +\n    '<path d=\"M4.5 12h9.3\"/>',\n  /* A second pane opened beside the first — `nav`/`inspector`'s panel with the\n     divider down the middle, because that is literally what split view is. */\n  split: PANEL + '<path d=\"M12 4.5v15\"/>',\n  /* A new tab: `open-tab`'s window, with the plus in the body rather than on\n     the tab strip (at 16px a plus up there merges into the tab). */\n  'tab-new':\n    '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/>' +\n    '<path d=\"M3 9.5h18\"/>' +\n    '<path d=\"M9.5 4.5v5\"/>' +\n    '<path d=\"M12 12.1v5\"/><path d=\"M9.5 14.6h5\"/>',\n  bookmark: BOOKMARK,\n  'save-search': BOOKMARK + '<path d=\"M12 7.2v5.2\"/><path d=\"M9.4 9.8h5.2\"/>',\n  /* The padlock, for the rows and strips that talk ABOUT encryption (\"create\n     an encrypted folder\", \"this one is unlocked\"). The listing marker is a\n     different drawing on purpose — there the lock is cut out of the folder,\n     because the row still has to read as a folder. */\n  lock:\n    '<rect x=\"4.5\" y=\"10.3\" width=\"15\" height=\"10.2\" rx=\"2.2\"/>' +\n    '<path d=\"M7.9 10.3V7.6a4.1 4.1 0 0 1 8.2 0v2.7\"/>' +\n    '<circle cx=\"12\" cy=\"15.4\" r=\"1.5\"/>',\n\n  /* === ikon:emoji — states the viewers and modals report ================\n   * `✓ ✗ ⚠️ ⏳` in the viewer chrome. The first two are typographic and came\n   * out at whatever weight the UI font had; the last two are colour emoji, so\n   * a fallback screen's 48px mark was the only full-colour thing on a grey\n   * page. `progress` is drawn as an open ring because it is SPUN by CSS\n   * (`@keyframes fe-spin`) — an hourglass cannot say \"still going\". */\n  check: '<path d=\"M4.8 12.6l4.7 4.7L19.2 6.9\"/>',\n  alert:\n    '<path d=\"M10.7 4.6L2.9 18.2a1.5 1.5 0 0 0 1.3 2.25h15.6a1.5 1.5 0 0 0 1.3-2.25L13.3 4.6a1.5 1.5 0 0 0-2.6 0z\"/>' +\n    '<path d=\"M12 9.9v4.3\"/>' +\n    '<circle cx=\"12\" cy=\"17.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  progress: '<path d=\"M20.5 12a8.5 8.5 0 1 1-8.5-8.5\"/>',\n};\n\nconst SVG_CACHE = new Map<string, string>();\n\n/**\n * Inline SVG markup for an action key, or `''` when nothing is drawn for it.\n *\n * The empty string is a contract, not a failure: the caller renders nothing\n * (or falls back to the `icon` string an embedder supplied) rather than a\n * placeholder box, so an unknown key costs a gap and never a broken glyph.\n */\nexport function actionIconSvg(key: string): string {\n  if (!key) return '';\n  const cached = SVG_CACHE.get(key);\n  if (cached !== undefined) return cached;\n  const glyph = GLYPHS[key];\n  const svg = glyph\n    ? '<svg class=\"fe-aicon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" ' +\n      'stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" ' +\n      `aria-hidden=\"true\" focusable=\"false\">${glyph}</svg>`\n    : '';\n  SVG_CACHE.set(key, svg);\n  return svg;\n}\n\n/** Every key this module draws — handy for tests and for a gallery page. */\nexport function actionIconKeys(): string[] {\n  return Object.keys(GLYPHS);\n}\n","<script setup lang=\"ts\">\n/**\n * ContextMenu — Teleport-based menu.\n *\n * Teleported under <body> so no parent (Ionic <ion-page>, Filament's\n * transformed flex containers, panel sidebars, …) can shift the\n * `position: fixed` backdrop off-window.\n */\nimport { ref, computed, onMounted, onBeforeUnmount, nextTick } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport { useLocale } from '../composables/useLocale';\nimport { menuShortcutHint } from '../composables/useKeyboardShortcuts';\nimport { actionIconSvg } from '../lib/actionIcons';\n\nexport interface ContextAction {\n  key: string;\n  label: string;\n  /**\n   * gorunum:v1-icons — OPTIONAL icon override. Rows normally need nothing\n   * here: the glyph is looked up by `key` in lib/actionIcons. Set this to\n   *   • another icon key, when one action has two faces (`star` / `unstar`);\n   *   • any literal string (an emoji), when an embedder wants its own mark —\n   *     an unknown name draws no SVG and the string is printed as-is.\n   */\n  icon?: string;\n  danger?: boolean;\n  disabled?: boolean;\n  /**\n   * tasi:m1 — WHY, in one sentence, for a row that is greyed out.\n   *\n   * ⚠ A disabled control has to explain itself or it is indistinguishable from\n   * a broken one. Sharing works on one item at a time, so \"Paylaş / İzinler\"\n   * greys out above a multi-selection — grey with a reason reads as a rule,\n   * grey without one reads as a bug, and HIDING it (which is what this row did\n   * until 2026-09-13) reads as the feature not existing.\n   *\n   * Rendered as the native `title` on both surfaces. Absent leaves the\n   * tooltip each surface already builds — the label plus its shortcut in the\n   * selection bar, nothing in the menu.\n   */\n  title?: string;\n  hidden?: boolean;\n  divider?: boolean;\n  /**\n   * tus:t1 — registry action id whose key this row should print. Optional:\n   * rows whose `key` already matches the registry (rename, delete, copy…)\n   * are resolved from the shared map and need nothing here.\n   */\n  shortcutId?: string;\n}\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  actions: ContextAction[];\n  /**\n   * Resolved theme. Teleported into <body> we lose the `.fe` parent\n   * that scopes CSS vars, so we tag the backdrop with the current\n   * theme so variables.css can re-apply dark overrides outside the\n   * explorer tree.\n   */\n  theme?: ThemeMode;\n  /**\n   * bag:b4 — bottom-sheet presentation for coarse-pointer (touch)\n   * contexts. When true the menu renders as a full-width sheet sliding\n   * up from the bottom edge (grab handle, ≥44px touch targets; closed\n   * by overlay tap, dragging the handle down, or Esc). The position\n   * passed to show() is ignored. When absent/false the classic anchored\n   * menu renders — desktop right-click behavior is untouched.\n   */\n  sheet?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'select', action: ContextAction, target: FileNode[]): void;\n}>();\n\nconst { t } = useLocale(() => props.locale); // bag:b4 — sheet aria labels need t()\n\n/* tus:t1 — a row's key label. `shortcutId` wins when an embedder sets one;\n * otherwise the row's own key is looked up in the shared menu map. */\nfunction hintFor(a: ContextAction): string {\n  return menuShortcutHint(a.shortcutId ?? a.key);\n}\n\n/* gorunum:v1-icons — the row's glyph. `icon` is consulted FIRST because that\n * is where a two-faced action names its variant (`star` vs `unstar`) and where\n * an embedder puts its own mark; the action's own key is the default. An\n * unrecognised name returns '' and the template falls back to printing the\n * string, so a host that still passes an emoji keeps it. */\nfunction iconFor(a: ContextAction): string {\n  return actionIconSvg(a.icon || a.key);\n}\n\nconst open = ref(false);\nconst x = ref(0);\nconst y = ref(0);\nconst targetNodes = ref<FileNode[]>([]);\nconst menuEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — where the pointer opened the menu; kept separate from x/y so\n * the edge-flip can re-anchor ABOVE/LEFT of the cursor instead of merely\n * clamping (a clamp near the bottom edge used to leave the menu covering\n * the clicked row). */\nlet anchorX = 0;\nlet anchorY = 0;\n/* wiring:c4 — focus restore: whatever had focus before the menu opened gets\n * it back on hide, so keyboard users don't fall back to <body>. */\nlet prevFocus: HTMLElement | null = null;\n\nasync function show(ev: { clientX: number; clientY: number }, nodes: FileNode[]) {\n  prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n  open.value = true;\n  x.value = ev.clientX;\n  y.value = ev.clientY;\n  anchorX = ev.clientX; /* wiring:c4 */\n  anchorY = ev.clientY; /* wiring:c4 */\n  targetNodes.value = nodes;\n  // After the menu renders, clamp it inside the viewport so a click near the\n  // bottom/right edge doesn't push the menu off-screen (it opens down-right\n  // from the cursor by default).\n  await nextTick();\n  if (props.sheet) {\n    // bag:b4 — sheet mode: no anchoring; focus the panel so Esc closes it\n    // without requiring a prior click inside.\n    sheetEl.value?.focus();\n    return;\n  }\n  clampToViewport();\n  focusItem(0); /* wiring:c4 — keyboard nav starts on the first item */\n}\n\nfunction clampToViewport() {\n  const el = menuEl.value;\n  if (!el || typeof window === 'undefined') return;\n  const rect = el.getBoundingClientRect();\n  const margin = 8;\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  /* wiring:c4 — edge flip: overflowing the bottom/right edge re-anchors the\n   * menu above/left of the cursor when there's room; clamping stays as the\n   * fallback for tiny viewports. */\n  if (anchorY + rect.height > vh - margin) {\n    const flipped = anchorY - rect.height;\n    y.value = flipped >= margin ? flipped : Math.max(margin, vh - rect.height - margin);\n  }\n  if (anchorX + rect.width > vw - margin) {\n    const flipped = anchorX - rect.width;\n    x.value = flipped >= margin ? flipped : Math.max(margin, vw - rect.width - margin);\n  }\n}\n\nfunction hide() {\n  open.value = false;\n  /* bag:b4 — reset any in-flight sheet drag so reopening starts clean. */\n  sheetDragging.value = false;\n  sheetDragY.value = 0;\n  /* wiring:c4 — give focus back to the opener (row/card/⋯ button). */\n  prevFocus?.focus?.();\n  prevFocus = null;\n}\n\n/* === wiring:c4 — keyboard navigation (menu + sheet) ===\n * Arrow keys cycle through enabled items, Home/End jump, Enter/Space\n * activate the focused <button> natively, Esc closes (see onKey). Disabled\n * buttons are unfocusable, so the query skips them by construction. */\nfunction menuItems(): HTMLElement[] {\n  const host = props.sheet ? sheetEl.value : menuEl.value;\n  if (!host) return [];\n  return Array.from(\n    host.querySelectorAll<HTMLElement>('.fe-ctx__item:not(:disabled)'),\n  );\n}\n\nfunction focusItem(idx: number) {\n  const items = menuItems();\n  if (items.length === 0) return;\n  const i = ((idx % items.length) + items.length) % items.length;\n  items[i]?.focus();\n}\n\nfunction moveFocus(delta: number) {\n  const items = menuItems();\n  if (items.length === 0) return;\n  const active = document.activeElement as HTMLElement | null;\n  const cur = active ? items.indexOf(active) : -1;\n  if (cur === -1) {\n    focusItem(delta > 0 ? 0 : items.length - 1);\n    return;\n  }\n  focusItem(cur + delta);\n}\n/* === /wiring:c4 === */\n\n/* bag:b4 — sheet drag-to-dismiss. Bound to the grab handle only, so the\n * scrollable item list keeps its native touch scrolling. Dragging past the\n * threshold closes; anything less snaps back. */\nconst sheetEl = ref<HTMLElement | null>(null);\nconst sheetDragging = ref(false);\nconst sheetDragY = ref(0);\nlet sheetDragStart = 0;\n\nfunction onSheetDragStart(e: TouchEvent) {\n  const t0 = e.touches[0];\n  if (!t0) return;\n  sheetDragging.value = true;\n  sheetDragStart = t0.clientY;\n  sheetDragY.value = 0;\n}\nfunction onSheetDragMove(e: TouchEvent) {\n  if (!sheetDragging.value) return;\n  const t0 = e.touches[0];\n  if (!t0) return;\n  sheetDragY.value = Math.max(0, t0.clientY - sheetDragStart);\n}\nfunction onSheetDragEnd() {\n  if (!sheetDragging.value) return;\n  const shouldClose = sheetDragY.value > 72;\n  sheetDragging.value = false;\n  if (shouldClose) {\n    hide();\n  } else {\n    sheetDragY.value = 0;\n  }\n}\nconst sheetStyle = computed(() =>\n  sheetDragY.value > 0\n    ? { transform: `translateY(${sheetDragY.value}px)`, transition: 'none' }\n    : undefined,\n);\n/* /bag:b4 */\n\nfunction pick(a: ContextAction) {\n  if (a.disabled) return;\n  emit('select', a, targetNodes.value);\n  hide();\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (e.key === 'Escape') {\n    // Scoped close: Esc with the menu open closes ONLY the menu — the\n    // explorer's global onClose (which also dismisses modals/toasts)\n    // shouldn't fire underneath.\n    e.stopPropagation();\n    hide();\n    return;\n  }\n  if (e.key === 'Enter' || e.key === ' ') {\n    // Native button activation handles the pick; stop the bubble so the\n    // explorer's global Enter=open shortcut doesn't double-fire and pop\n    // the preview modal on top of the chosen action.\n    e.stopPropagation();\n    return;\n  }\n  /* wiring:c4 — arrow-key navigation; stopPropagation keeps the explorer's\n   * global shortcut handler (Enter=open, Backspace=up…) out of the loop\n   * while the menu is up. */\n  if (e.key === 'ArrowDown') {\n    e.preventDefault();\n    e.stopPropagation();\n    moveFocus(1);\n  } else if (e.key === 'ArrowUp') {\n    e.preventDefault();\n    e.stopPropagation();\n    moveFocus(-1);\n  } else if (e.key === 'Home') {\n    e.preventDefault();\n    focusItem(0);\n  } else if (e.key === 'End') {\n    e.preventDefault();\n    focusItem(-1);\n  } else if (e.key === 'Tab') {\n    // A menu is not a tab-stop container — Tab closes it (WAI-ARIA menu\n    // pattern) instead of tabbing behind the backdrop.\n    e.preventDefault();\n    hide();\n  }\n}\n\n/* wiring:c4 — hidden-entry filtering used to leave orphaned separators\n * (leading/trailing/doubled) when the entries around a divider were hidden\n * by RBAC or selection shape. Collapse them here so every visible divider\n * actually separates two groups. */\nconst visibleActions = computed(() => {\n  const vis = props.actions.filter((a) => !a.hidden);\n  const out: ContextAction[] = [];\n  for (const a of vis) {\n    if (a.divider && (out.length === 0 || out[out.length - 1].divider)) continue;\n    out.push(a);\n  }\n  while (out.length > 0 && out[out.length - 1].divider) out.pop();\n  return out;\n});\n\nconst prefersDark = ref(false);\nlet mq: MediaQueryList | undefined;\nfunction syncPrefersDark(e?: MediaQueryListEvent | MediaQueryList) {\n  prefersDark.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof window === 'undefined') return;\n  mq = window.matchMedia('(prefers-color-scheme: dark)');\n  syncPrefersDark(mq);\n  mq.addEventListener?.('change', syncPrefersDark);\n});\nonBeforeUnmount(() => {\n  mq?.removeEventListener?.('change', syncPrefersDark);\n});\n\nconst themeClass = computed(() => {\n  const t = props.theme || 'auto';\n  return `fe-ctx-backdrop--theme-${t}`;\n});\n\ndefineExpose({ show, hide });\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <transition :name=\"sheet ? 'fe-sheet' : 'fe-ctx'\">\n      <div\n        v-if=\"open\"\n        class=\"fe-ctx-backdrop\"\n        :class=\"[themeClass, { 'fe-ctx-backdrop--sheet': sheet }]\"\n        :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n        @click=\"hide\"\n        @contextmenu.prevent=\"hide\"\n        @keydown=\"onKey\"\n      >\n        <!-- bag:b4 — bottom-sheet variant (coarse pointer / touch) -->\n        <div\n          v-if=\"sheet\"\n          ref=\"sheetEl\"\n          class=\"fe-sheet\"\n          role=\"menu\"\n          :aria-label=\"t('sheet.menu')\"\n          tabindex=\"-1\"\n          :style=\"sheetStyle\"\n          @click.stop\n        >\n          <div\n            class=\"fe-sheet__handle\"\n            role=\"button\"\n            tabindex=\"0\"\n            :aria-label=\"t('sheet.close')\"\n            @click=\"hide\"\n            @keydown.enter.prevent=\"hide\"\n            @touchstart.passive=\"onSheetDragStart\"\n            @touchmove.passive=\"onSheetDragMove\"\n            @touchend=\"onSheetDragEnd\"\n            @touchcancel=\"onSheetDragEnd\"\n          />\n          <div class=\"fe-sheet__items\">\n            <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n              <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n              <button\n                v-else\n                type=\"button\"\n                class=\"fe-ctx__item fe-sheet__item\"\n                :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n                :disabled=\"a.disabled\"\n                :title=\"a.title\"\n                role=\"menuitem\"\n                @click=\"pick(a)\"\n              >\n                <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n                <span v-if=\"iconFor(a)\" class=\"fe-ctx__icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n                <span v-else-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n                <span class=\"fe-ctx__label\">{{ a.label }}</span>\n                <span v-if=\"hintFor(a)\" class=\"fe-ctx__key\" aria-hidden=\"true\">{{ hintFor(a) }}</span>\n              </button>\n            </template>\n          </div>\n        </div>\n        <div\n          v-else\n          ref=\"menuEl\"\n          class=\"fe-ctx\"\n          role=\"menu\"\n          aria-orientation=\"vertical\"\n          :aria-label=\"t('sheet.menu') /* wiring:c4 */\"\n          :style=\"{ top: y + 'px', left: x + 'px' }\"\n          @click.stop\n        >\n          <template v-for=\"(a, i) in visibleActions\" :key=\"a.key || i\">\n            <div v-if=\"a.divider\" class=\"fe-ctx__sep\" role=\"separator\" />\n            <button\n              v-else\n              type=\"button\"\n              class=\"fe-ctx__item\"\n              :class=\"{ 'is-danger': a.danger, 'is-disabled': a.disabled }\"\n              :disabled=\"a.disabled\"\n              :title=\"a.title\"\n              role=\"menuitem\"\n              @click=\"pick(a)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span v-if=\"iconFor(a)\" class=\"fe-ctx__icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n              <span v-else-if=\"a.icon\" class=\"fe-ctx__icon\" aria-hidden=\"true\">{{ a.icon }}</span>\n              <span class=\"fe-ctx__label\">{{ a.label }}</span>\n              <!-- tus:t1 — the key that does this from the keyboard, read from\n                   the registry so a remap reaches it. Empty for a verb with no\n                   binding, and the span then does not render at all. -->\n              <span v-if=\"hintFor(a)\" class=\"fe-ctx__key\" aria-hidden=\"true\">{{ hintFor(a) }}</span>\n            </button>\n          </template>\n        </div>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Toolbar — selection-aware action row.\n *\n * Layout:\n *   - No selection            → [📁 New Folder]    [search | ⬆ ↻]   [☰ ▦]\n *   - Anything selected       → the SELECTION BAR (gorunum:v1-selbar, below):\n *                               a tinted row under the breadcrumb, in the\n *                               filter row's place.\n *\n * Presentational only — all logic (rename, share, …) lives in\n * FileExplorer.vue, which listens for `action` emits.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\n/* gorunum:v2-topbar — ViewSwitcher is no longer mounted here. It lives on the\n * breadcrumb row in EVERY profile now (FileExplorer renders it inside\n * `.fe-subhead__actions`), so the header and the crumb row can no longer end\n * up offering different view modes — which is what two mount points cost. */\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { eventMatchesShortcut, menuShortcutHint, shortcutHint } from '../composables/useKeyboardShortcuts';\n\nexport type SelectionMode = 'none' | 'single-file' | 'single-dir' | 'multi';\n\n/* gorunum:v1-icons — the glyph for a toolbar row. Identical resolution to the\n * context menu's (lib/actionIcons by key, `icon` overriding when a row names a\n * variant or an embedder supplies its own mark), because the toolbar and the\n * menu render the SAME ContextAction[] and must not drift apart visually any\n * more than they may drift apart in content. */\nfunction iconFor(a: ContextAction): string {\n  return actionIconSvg(a.icon || a.key);\n}\n\nconst props = defineProps<{\n  viewMode: ViewMode;\n  searchQuery: string;\n  /**\n   * Tells the toolbar which action set to render (a `.trash/` listing\n   * gets a restore-only menu instead of cut/copy/etc).\n   */\n  trashActive: boolean;\n  /**\n   * The action list to render, supplied by FileExplorer. This is the SAME\n   * list the right-click context menu renders for the current selection, so\n   * the two menus can never drift apart. Dividers/hidden entries are filtered\n   * out here (the toolbar is a flat row).\n   */\n  actions: ContextAction[];\n  /** Current selection metadata — toolbar uses this to pick its mode. */\n  selectionMode?: SelectionMode;\n  /**\n   * gorunum:v1-selbar — how many rows are ticked, for the bar's \"16 selected\".\n   *\n   * Optional, and the bar does not depend on it: when the parent does not pass\n   * one the count is read off the listing itself (`[data-fe-path]` rows carry\n   * `aria-selected`, in all three views). A number handed down here always\n   * wins — it is the selection the parent actually holds, and the DOM is only\n   * a mirror of it.\n   */\n  selectionCount?: number;\n  /**\n   * pane:p1 — WHICH pane the selection belongs to, as its `data-pane` value.\n   *\n   * ⚠⚠ This is not cosmetic and it is not optional once there are two panes.\n   * The bar is teleported into a slot inside the pane it acts on, and both\n   * halves of a split render `.fe__primary > .fe-selbar-slot` — so a\n   * `querySelector` answers in DOCUMENT order and always hands back the LEFT\n   * one. Measured 2026-09-13 before this prop existed: ticking rows in the\n   * right-hand pane raised no bar at all, and the bar standing over the left\n   * pane still described the left pane's older selection.\n   *\n   * Absent (a bare `<Toolbar>` in a test, an embedder with one listing) keeps\n   * the old behaviour: the first `.fe__primary` in the root.\n   */\n  selectionPane?: string;\n  /** True when clipboard has cut/copy items, so we can enable Paste. */\n  pasteEnabled?: boolean;\n  /** True when the universal converter (FILEX_CONVERT_URL) is available. */\n  convertEnabled?: boolean;\n  /**\n   * True when the current dir has a parent the user can step up to.\n   *\n   * ⚠ gorunum:v2-topbar — NOT DRAWN any more, in either layout. \"Up one\n   * level\" and the parent crumb walk to the same folder, and the crumb is\n   * always on screen (the trail collapses to `root › … › parent › current`\n   * and never past it), so the button was the same verb twice. The keyboard\n   * binding and the `go-up` emit are untouched; the prop stays because\n   * embedders pass it and because a header that wants the button back has\n   * everything it needs here.\n   */\n  canGoUp?: boolean;\n  /**\n   * Multi-storage virtual root marker — when true, mutation buttons\n   * (New Folder / Upload / Paste) are hidden because there's no real\n   * backend folder to write to.\n   */\n  atVirtualRoot?: boolean;\n  /**\n   * RBAC: false hides the write affordances (New Folder / Upload / Paste) when\n   * the current user lacks edit on this directory. Undefined = no RBAC gating\n   * (backward-compatible for embedders that don't pass it).\n   */\n  canWrite?: boolean;\n  locale: LocaleCode;\n  /**\n   * bag:b4 — narrow/embed mini mode. When true the toolbar collapses to\n   * [↑?] [🔍] [⬆] [⋯]: secondary actions (New Folder, Refresh, density,\n   * view switcher, selection actions, Paste) move into the \"⋯\" overflow\n   * menu and search expands from an icon to a full-width input. When\n   * absent/false the classic wide layout renders unchanged.\n   */\n  narrow?: boolean;\n  /**\n   * bag:b4 — resolved theme, forwarded to the teleported overflow menu\n   * (which loses the `.fe` variable scope under <body>).\n   */\n  theme?: ThemeMode;\n  /* koru:k1 — inspector (details panel) toggle state, for the pressed style. */\n  inspectorOpen?: boolean;\n  /**\n   * gezinti:g1 — navigation panel state, for the pressed style on the toggle.\n   * The panel has its own collapse control, but a narrow explorer renders it\n   * as a drawer that is off screen when closed, so the only way back to it is\n   * from here.\n   */\n  navOpen?: boolean;\n  /** gezinti:g1 — false when the deployment has no navigation panel; the\n   *  toggle then has nothing to toggle and is not rendered. */\n  navEnabled?: boolean;\n  /**\n   * gezinti:g1 — view modes to offer. Absent = all three (the historical\n   * behaviour). `ExplorerConfig.uiProfile: 'simple'` narrows it to list+grid:\n   * a four-way switcher is one of the things the reporter in #14 named as\n   * \"power user tool\", and gallery is the one nobody outside photos asks for.\n   */\n  viewModes?: ViewMode[];\n  /* === surucu:d1 — the shell ========================================== */\n  /**\n   * ⚠ There is no `shell` prop any more. There used to be one ('classic' vs\n   * 'drive') and it decided which header a surface got; the header below is\n   * now the only one there is, at every width and in every embed. Density,\n   * theme, the shortcut editor, the tour and the other view modes live in the\n   * \"⋯\" menu it renders — nothing was dropped from the build, and a control\n   * that is on screen in one profile and unreachable in another was the\n   * capability split this removed.\n   */\n  /** Folder name for the search field's placeholder (\"Search in Photos\"). */\n  scopeLabel?: string;\n  /* gorunum:v3-shell — the product mark, for a host that cannot fill the\n     `#brand` slot. See ExplorerConfig.brand: a `<filex-explorer>` host cannot,\n     measured, so these are the only door it has. The slot still wins — they are\n     rendered as its FALLBACK content, which is the mechanism for \"use mine if\n     you gave me one\", with no condition to keep in step. */\n  brandName?: string;\n  brandMarkUrl?: string;\n  /**\n   * gorunum:v3-shell — this surface has no listing for the field to narrow, so\n   * Enter hands the query to the command palette instead.\n   *\n   * ⚠ It exists because putting Home inside this header gave Home a search box,\n   * and a box that swallows what you type is worse than no box: measured on the\n   * landing page, typing filtered nothing, showed nothing and re-fetched the two\n   * per-user lists on every keystroke. The palette IS \"search everywhere\" — it\n   * is what the ⌘K chip on this very field already promises — so on a surface\n   * with nothing to filter, that is where the words go.\n   *\n   * ⚠ Gated rather than universal: in a folder, Enter must keep meaning\n   * \"nothing new\", because the debounced input has already run the search.\n   */\n  searchEscalates?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:viewMode', v: ViewMode): void;\n  (e: 'update:searchQuery', v: string): void;\n  /* gorunum:v1-advsearch — the filter affordance inside the search field.\n     Carries the text already typed so the dialog continues this search\n     instead of opening an empty second one, exactly as the ⌘K chip does. */\n  (e: 'open-advanced-search', v: string): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'refresh'): void;\n  (e: 'go-up'): void;\n  (e: 'action', key: string): void;\n  (e: 'open-recents'): void;\n  (e: 'update:density', v: Density): void;\n  (e: 'toggle-inspector'): void /* koru:k1 */;\n  (e: 'toggle-nav'): void /* gezinti:g1 */;\n  (e: 'open-theme'): void /* wiring:c1 — tema galerisi */;\n  (e: 'open-shortcut-settings'): void /* wiring:c2 */;\n  (e: 'open-timezone'): void /* zaman:z3 */;\n  /* surucu:d1 — escalate this query into the command palette (⌘K/Ctrl+K). */\n  (e: 'open-palette', query: string): void;\n}>();\n\n// Density toggle — the toolbar owns the persisted preference; the parent\n// only mirrors the value into a root class so both views pick it up.\nexport type Density = 'comfortable' | 'compact';\nconst DENSITY_LS_KEY = 'filex.density';\nconst density = ref<Density>(\n  (() => {\n    try {\n      return localStorage.getItem(DENSITY_LS_KEY) === 'compact' ? 'compact' : 'comfortable';\n    } catch {\n      return 'comfortable';\n    }\n  })(),\n);\n/**\n * gorunum:v1 — someone else may own this preference too.\n *\n * The web app's user-settings modal writes the same `filex.density` key, and\n * this component read it exactly once at setup — so flipping \"compact file\n * list\" there did nothing until the explorer was mounted again. A `storage`\n * event covers another tab; a same-tab write needs the writer to say so, which\n * is what the custom event is for.\n */\nfunction adoptStoredDensity() {\n  try {\n    const v = localStorage.getItem(DENSITY_LS_KEY) === 'compact' ? 'compact' : 'comfortable';\n    if (v !== density.value) {\n      density.value = v;\n      emit('update:density', v);\n    }\n  } catch {\n    /* storage blocked */\n  }\n}\nfunction onDensityStorage(e: StorageEvent) {\n  if (e.key === null || e.key === DENSITY_LS_KEY) adoptStoredDensity();\n}\n\nonMounted(() => {\n  emit('update:density', density.value);\n  window.addEventListener('storage', onDensityStorage);\n  window.addEventListener('filex:density', adoptStoredDensity);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('storage', onDensityStorage);\n  window.removeEventListener('filex:density', adoptStoredDensity);\n});\n\nfunction toggleDensity() {\n  density.value = density.value === 'compact' ? 'comfortable' : 'compact';\n  try {\n    localStorage.setItem(DENSITY_LS_KEY, density.value);\n  } catch {\n    /* quota */\n  }\n  emit('update:density', density.value);\n}\n\nconst { t } = useLocale(() => props.locale);\n\nconst searchEl = ref<HTMLInputElement | null>(null);\nconst localSearch = ref(props.searchQuery);\n\nwatch(() => props.searchQuery, (v) => {\n  localSearch.value = v;\n});\n\nlet debounce: ReturnType<typeof setTimeout> | undefined;\nfunction onSearchInput(ev: Event) {\n  const v = (ev.target as HTMLInputElement).value;\n  localSearch.value = v;\n  if (debounce) clearTimeout(debounce);\n  debounce = setTimeout(() => emit('update:searchQuery', v), 200);\n}\n\nasync function focusSearch() {\n  /* bag:b4 — the field used to be collapsed behind a magnifier at this width\n     and this had to expand it first. It is on screen in both layouts now, so\n     there is nothing to open; the tick stays because a caller may have just\n     mounted the row. */\n  await nextTick();\n  searchEl.value?.focus();\n  searchEl.value?.select();\n}\n\ndefineExpose({ focusSearch });\n\nconst mode = computed<SelectionMode>(() => props.selectionMode ?? 'none');\n\n// The visible action buttons = the shared list from FileExplorer, minus\n// dividers and hidden entries (the toolbar is a flat row, not a dropdown).\n// Disabled entries render greyed-out. Because this is the SAME list the\n// context menu uses, the two menus are guaranteed to match.\nconst toolbarItems = computed(() => props.actions.filter((a) => !a.divider && !a.hidden));\n\n/* === gorunum:v1-selbar — the selection bar ===========================\n * Measured on the reference shell: the moment anything is ticked the FILTER\n * ROW is replaced by a tinted bar — \"16 selected\", then icon-only actions\n * (download · share · move · copy to · star · delete), then an × that clears\n * the selection. What filex did instead was fill the toolbar's primary row\n * with labelled buttons, one of them a loud red Delete.\n *\n * It is not a second menu. The icons are the SAME `ContextAction[]` the\n * right-click menu renders (`selectionActionList` in FileExplorer, handed here\n * as `actions`), in the order FileExplorer built them; the bar only chooses\n * which of them it can say with a glyph, and everything else — open, preview,\n * rename, tags, paste, the keep-on-device rows — is one click away in the\n * bar's own \"⋯\". Nothing is removed from the build.\n *\n * ⚠ Why the bar is TELEPORTED out of this component: the row it replaces lives\n * under the breadcrumb, inside `.fe__primary`, two boxes below the toolbar.\n * The toolbar is the only component handed the selection, so the bar is\n * RENDERED here and MOUNTED there, into a slot this component inserts right\n * after the breadcrumb wrapper. DOM order then still matches reading order\n * (the bar comes before the listing it acts on), which a `order:` trick on the\n * flex column would have broken for anyone tabbing through the page.\n * ⚠ With no `.fe__primary` to mount into (a bare `<Toolbar>` in a test, an\n * embedder using this component on its own) the Teleport is DISABLED and the\n * bar renders in place, so the actions never disappear.\n */\n\n/** Keys the bar is willing to say with a glyph alone. The reference draws six\n *  — download, share, move, copy to, star, delete — which are filex's\n *  download / access / cut / copy / star / delete; `restore` joins them for a\n *  `.trash/` listing, whose whole vocabulary is restore + delete.\n *  ⚠ A SET, never an order: the bar walks `actions` in the parent's order, so\n *  it cannot end up disagreeing with the right-click menu about what comes\n *  first (filex lesson #67 — one list, two renderers). */\nconst BAR_ICON_KEYS = new Set(['download', 'access', 'cut', 'copy', 'star', 'restore', 'delete']);\n\nconst hasSelection = computed(() => mode.value !== 'none');\n\n/** The row's two halves, in ONE pass over the parent's list so the order is\n *  the parent's. A key is promoted only if it also HAS a glyph — an icon-only\n *  button with no icon is an empty 28px box. */\nconst barSplit = computed(() => {\n  const icons: ContextAction[] = [];\n  const rest: ContextAction[] = [];\n  for (const a of toolbarItems.value) {\n    if (BAR_ICON_KEYS.has(a.key) && iconFor(a)) icons.push(a);\n    else rest.push(a);\n  }\n  return { icons, rest };\n});\n\n/* ── folding (kept from ui-fix, moved onto the bar) ───────────────────\n * Actions that do not fit fold into the \"⋯\" instead of wrapping the row onto\n * a second line. Widths come from a hidden measurement strip that renders the\n * SAME buttons as the visible row — measure a node nobody sees and the\n * arithmetic is about a width nothing has. */\nconst selBarEl = ref<HTMLElement | null>(null);\nconst measureEl = ref<HTMLElement | null>(null);\nconst selMoreBtnEl = ref<HTMLElement | null>(null);\nconst selMoreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst visibleActionCount = ref(Number.MAX_SAFE_INTEGER);\nconst visibleBarItems = computed(() => barSplit.value.icons.slice(0, visibleActionCount.value));\nconst foldedBarItems = computed(() => barSplit.value.icons.slice(visibleActionCount.value));\n/** The bar's \"⋯\": what did not fit, then everything that was never an icon. */\nconst barMenuItems = computed<ContextAction[]>(() => {\n  const folded = foldedBarItems.value;\n  const rest = barSplit.value.rest;\n  if (folded.length && rest.length) {\n    return [...folded, { divider: true, key: 'selbar-sep', label: '' }, ...rest];\n  }\n  return [...folded, ...rest];\n});\nconst SELBAR_MORE_BTN_W = 32;\n\nfunction recalcFold() {\n  const cont = selBarEl.value;\n  const meas = measureEl.value;\n  const all = barSplit.value.icons.length;\n  if (!cont || !meas) {\n    visibleActionCount.value = all;\n    return;\n  }\n  const gap = parseFloat(getComputedStyle(cont).gap) || 4;\n  const widths = (Array.from(meas.children) as HTMLElement[]).map((c) => c.offsetWidth + gap);\n  const total = widths.reduce((s, w) => s + w, 0);\n  const avail = cont.clientWidth;\n  // The \"⋯\" is already on screen whenever something never was an icon, so its\n  // width is not free room; when nothing is folded away yet it still has to be\n  // paid for the moment the first icon folds.\n  const moreW = (selMoreBtnEl.value?.offsetWidth || SELBAR_MORE_BTN_W) + gap;\n  if (total <= avail - (barSplit.value.rest.length ? moreW : 0)) {\n    visibleActionCount.value = widths.length;\n    return;\n  }\n  let used = moreW;\n  let count = 0;\n  for (const w of widths) {\n    if (used + w > avail) break;\n    used += w;\n    count += 1;\n  }\n  visibleActionCount.value = count;\n}\n\nlet foldRo: ResizeObserver | undefined;\nwatch(selBarEl, (el) => {\n  foldRo?.disconnect();\n  foldRo = undefined;\n  if (el && typeof ResizeObserver !== 'undefined') {\n    foldRo = new ResizeObserver(() => recalcFold());\n    foldRo.observe(el);\n  }\n  void nextTick(recalcFold);\n});\nonBeforeUnmount(() => foldRo?.disconnect());\nwatch(\n  () => [toolbarItems.value, props.narrow, props.trashActive, mode.value] as const,\n  () => void nextTick(recalcFold),\n  { deep: false },\n);\n\nfunction openBarMore() {\n  const r = selMoreBtnEl.value?.getBoundingClientRect();\n  selMoreRef.value?.show({ clientX: r ? r.right : 0, clientY: r ? r.bottom + 4 : 0 } as MouseEvent, []);\n}\n\n/* ── where the bar lands ──────────────────────────────────────────────── */\nconst rootEl = ref<HTMLElement | null>(null);\n/** The slot this component mounts the bar into, inside `.fe__primary` — one\n *  row above the filter row, and below both the crumbs and the tab strip.\n *  `shallowRef` on purpose: a DOM node is not state to make reactive. */\nconst selSlot = shallowRef<HTMLElement | null>(null);\n/** True when WE created the slot, so teardown only removes our own node. */\nconst selSlotOwned = ref(false);\n/** The listing's own ground, for the × (see clearSelection). */\nconst selBodyEl = shallowRef<HTMLElement | null>(null);\nconst selPrimaryEl = shallowRef<HTMLElement | null>(null);\n\n/**\n * Which `.fe__primary` this bar belongs to right now.\n *\n * ⚠ `selectionPane` is our own prop and only ever 'main' / 'split', but it is\n * interpolated into a selector, so anything that is not a bare identifier is\n * refused rather than escaped — a selector built from unvetted text is a\n * selector that can be made to match something else.\n */\nfunction findPrimary(): HTMLElement | null {\n  const root = rootEl.value?.closest('.fe');\n  if (!root) return null;\n  const pane = props.selectionPane;\n  if (pane && /^[A-Za-z][\\w-]*$/.test(pane)) {\n    const owned = root.querySelector<HTMLElement>(`.fe__primary[data-pane=\"${pane}\"]`);\n    if (owned) return owned;\n  }\n  return root.querySelector<HTMLElement>('.fe__primary');\n}\n\n/** Let go of the slot we are pointing at, removing it only if we made it. */\nfunction releaseSelSlot() {\n  const prev = selSlot.value;\n  if (prev) {\n    prev.classList.remove('is-active');\n    if (selSlotOwned.value) prev.remove();\n  }\n  selSlot.value = null;\n  selSlotOwned.value = false;\n}\n\n/**\n * Point the teleport at the pane that owns the selection.\n *\n * ⚠⚠ Called on mount AND whenever `selectionPane` changes — the original was a\n * one-shot `onMounted`, and a cached node is the whole bug: with two panes it\n * cached the left one forever, so the right pane could never raise a bar and\n * the left pane's bar described a selection nobody was touching.\n *\n * ⚠ `isConnected` is checked too, not just identity: the split pane is keyed\n * on the active tab, so switching tabs REPLACES its DOM and would otherwise\n * leave the teleport aimed at a detached node — a bar that renders into\n * nothing looks exactly like a bar that was never built.\n */\nfunction resolveSelSlot() {\n  const primary = findPrimary();\n  if (!primary) {\n    releaseSelSlot();\n    selPrimaryEl.value = null;\n    selBodyEl.value = null;\n    return;\n  }\n  if (selPrimaryEl.value === primary && selSlot.value?.isConnected) return;\n  releaseSelSlot();\n  selPrimaryEl.value = primary;\n  selBodyEl.value = primary.querySelector<HTMLElement>(':scope > .fe__body');\n  /* gorunum:v2-topbar — prefer the slot the PARENT rendered.\n   * ⚠ The row the bar has to sit under is now the tab strip, and the strip is\n   * `v-if`'d on there being a tab — which is seeded in FileExplorer's own\n   * onMounted, i.e. after this one. A node inserted here \"after the crumbs\"\n   * would therefore land ABOVE a strip that appears a tick later, and the\n   * selection bar would sit between the crumbs and the tabs for the rest of\n   * the session. So FileExplorer renders `.fe-selbar-slot` itself, in the\n   * right place, declaratively; this fallback is for a bare <Toolbar> in a\n   * test and for an embedder mounting the component on its own. */\n  const existing = primary.querySelector<HTMLElement>(':scope > .fe-selbar-slot');\n  if (existing) {\n    selSlot.value = existing;\n    selSlotOwned.value = false;\n  } else {\n    const slot = document.createElement('div');\n    slot.className = 'fe-selbar-slot';\n    /* ⚠ Two queries, not one comma list: `querySelector` answers in DOCUMENT\n     * order, so a list would hand back the crumb row (which comes first) even\n     * when a tab strip is standing below it. */\n    const head =\n      primary.querySelector<HTMLElement>(':scope > .fe-tabs') ??\n      primary.querySelector<HTMLElement>(':scope > .fe-subhead, :scope > .fe-subhead--plain');\n    if (head) head.insertAdjacentElement('afterend', slot);\n    else primary.prepend(slot);\n    selSlot.value = slot;\n    selSlotOwned.value = true;\n  }\n  syncSlotActive();\n  reobserveSelection();\n}\n\nonMounted(resolveSelSlot);\nonBeforeUnmount(releaseSelSlot);\n\n/** The filter row hides behind `.fe-selbar-slot.is-active ~ .fe-filterbar`\n *  (styles/base.css). A class toggled here rather than `:has()` on the slot:\n *  the state is known in JS, and a rule that depends on a teleport having\n *  landed is a rule that is right only after a repaint.\n *  ⚠ `releaseSelSlot` clears the class off the slot we are leaving, so the\n *  pane we walked away from does not keep its filter row hidden. */\nfunction syncSlotActive() {\n  selSlot.value?.classList.toggle('is-active', hasSelection.value);\n}\nwatch(hasSelection, syncSlotActive, { immediate: true });\n\n/* The bar follows the focus. Re-resolving on `hasSelection` too is what covers\n * a pane that was remounted (a tab switch) while nothing was selected. */\nwatch([() => props.selectionPane, hasSelection], () => resolveSelSlot());\n\n/* ── how many ─────────────────────────────────────────────────────────── */\nconst domSelCount = ref(0);\nlet selMo: MutationObserver | undefined;\nlet selTick = false;\nfunction recountSelection() {\n  const primary = selPrimaryEl.value;\n  if (!primary) return;\n  // `[data-fe-path]` is the row/card in all three views, and `aria-selected`\n  // is the contract they already publish for a screen reader. No view-private\n  // class, and nothing that is not a listing row can match.\n  domSelCount.value = primary.querySelectorAll('[data-fe-path][aria-selected=\"true\"]').length;\n}\nfunction scheduleRecount() {\n  if (selTick) return;\n  selTick = true;\n  const later = (cb: () => void) =>\n    typeof requestAnimationFrame === 'function' ? requestAnimationFrame(cb) : setTimeout(cb, 16);\n  later(() => {\n    selTick = false;\n    recountSelection();\n  });\n}\n/**\n * (Re)attach the row counter to the pane the bar is standing in.\n *\n * ⚠ The observer is torn down and rebuilt rather than left where it was: it\n * watches ONE `.fe__primary`, and after a focus change that is the wrong one —\n * the fallback count would then be the other pane's ticked rows.\n */\nfunction reobserveSelection() {\n  selMo?.disconnect();\n  selMo = undefined;\n  if (!hasSelection.value) {\n    domSelCount.value = 0;\n    return;\n  }\n  recountSelection();\n  if (typeof MutationObserver === 'undefined' || !selPrimaryEl.value) return;\n  selMo = new MutationObserver(scheduleRecount);\n  selMo.observe(selPrimaryEl.value, {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeFilter: ['aria-selected'],\n  });\n}\nwatch(hasSelection, reobserveSelection);\nonBeforeUnmount(() => selMo?.disconnect());\n\n/** Never smaller than what the mode already proves: 'multi' is at least two\n *  rows even in the frame before the listing has been counted. */\nconst selectedCount = computed(() => {\n  if (typeof props.selectionCount === 'number') return props.selectionCount;\n  if (mode.value === 'none') return 0;\n  return Math.max(domSelCount.value, mode.value === 'multi' ? 2 : 1);\n});\nconst selectionLabel = computed(() => t('selection.count', { n: String(selectedCount.value) }));\n\nfunction clearSelection() {\n  /* The gesture the explorer already owns: a click on the listing's empty\n   * ground (`@click.self=\"selection.clear()\"` on `.fe__body`). Dispatched ON\n   * that element, so `event.target === event.currentTarget` and Vue's `.self`\n   * lets it through — the × therefore goes through the SAME clear a user's own\n   * click does instead of a second path that can drift from it.\n   * The emit is for a parent that would rather own the verb: an unhandled key\n   * falls through `dispatchItemAction` without doing anything. */\n  emit('action', 'clear-selection');\n  selBodyEl.value?.dispatchEvent(new MouseEvent('click', { bubbles: true }));\n}\n/* === /gorunum:v1-selbar ============================================== */\n\nfunction fire(key: string) {\n  emit('action', key);\n}\n\n/* === bag:b4 — narrow-mode state: the \"⋯\" overflow menu ===================\n * ⚠ `searchOpen` / `openSearch` / `closeSearch` went with the layout that\n * needed them: at 390px the field is in the row itself now, so there is no\n * collapsed state to expand and no magnifier to press. `.fe-toolbar--searching`\n * in styles/base.css is that state's leftover and matches nothing.\n */\n\n// Coarse-pointer detection — the overflow menu renders as a bottom sheet on\n// touch devices, matching the file context menu.\nconst coarse = ref(false);\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarse(e?: MediaQueryListEvent | MediaQueryList) {\n  coarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof window === 'undefined' || !window.matchMedia) return;\n  coarseMq = window.matchMedia('(pointer: coarse)');\n  syncCoarse(coarseMq);\n  coarseMq.addEventListener?.('change', syncCoarse);\n});\nonBeforeUnmount(() => {\n  coarseMq?.removeEventListener?.('change', syncCoarse);\n});\n\nconst moreBtnEl = ref<HTMLElement | null>(null);\nconst moreRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n\n// Everything the wide toolbar renders as standalone buttons, folded into one\n// action list: folder-level writes (New Folder / Paste), the shared\n// selection actions, then the view utilities (Refresh / density / view mode).\n/* gezinti:g1 — is this view mode on offer? No prop = all of them, so every\n   embedder that predates uiProfile keeps the switcher it had. */\nfunction offersView(v: ViewMode): boolean {\n  return !props.viewModes || props.viewModes.includes(v);\n}\n\n/* surucu:d1 — the tail of the \"⋯\" menu on its own: everything that is a\n * SETTING of the explorer rather than an action on a file. The narrow layout\n * shows it after the write/selection actions (unchanged); the drive header\n * shows only this half, because in that layout the selection actions are\n * already on screen as buttons and a menu that repeats them is a second door\n * to the same room. */\nconst utilityActions = computed<ContextAction[]>(() => {\n  const list: ContextAction[] = [];\n  /* ⚠ Only in the narrow layout, and that is a duplicate being REMOVED rather\n     than a layout rule. The wide header draws a Refresh button in its own\n     trailing cluster, three glyphs to the left of this menu — so listing it\n     here as well was the same verb twice on one row. The narrow header has no\n     Refresh button (the cluster there is AI · \"⋯\" · the host's doors), so at\n     that width the menu is the only door and it stays. Provable from inside\n     this component: the button and this row are drawn by the same file, under\n     the same `narrow` flag. */\n  if (props.narrow) list.push({ key: 'refresh', label: t('toolbar.refresh') });\n  list.push({\n    key: 'density',\n    label:\n      density.value === 'compact'\n        ? t('toolbar.density.comfortable')\n        : t('toolbar.density.compact'),\n  });\n  /* wiring:d2 — narrow-mode ⋯ menu: BOTH inactive views are listed\n     (list/grid/gallery); the old single toggle fell short with three modes. */\n  if (props.viewMode !== 'list' && offersView('list')) list.push({ key: 'view-list', label: t('toolbar.view.list') });\n  if (props.viewMode !== 'grid' && offersView('grid')) list.push({ key: 'view-grid', label: t('toolbar.view.grid') });\n  if (props.viewMode !== 'gallery' && offersView('gallery')) list.push({ key: 'view-gallery', label: t('toolbar.view.gallery') });\n  /* /wiring:d2 */\n  /* ⚠ No navigation row here any more, and nothing replaced it.\n     gezinti:g1 added one because the toolbar's own toggle was hidden while the\n     narrow search field was expanded — and that expanded-search layout no\n     longer exists (see the bag:b4 note at the top of this file). The hamburger\n     in `.fe-toolbar__brand` is drawn at EVERY width and in every embed under\n     exactly the condition this row was pushed under (`navEnabled !== false`),\n     so the row could only ever be a second copy of a button that is always on\n     screen. */\n  /* koru:k1 — inspector toggle also reachable from the narrow overflow menu */\n  list.push({ key: 'inspector', label: t('toolbar.inspector') });\n  /* wiring:c1 — the theme gallery is opened from the ⋯ menu in narrow mode too */\n  list.push({ key: 'theme', label: t('theme.menu') });\n  /* zaman:z3 — the embed's time-zone setting. An embed has no settings dialog,\n     so this menu is its only door; a host with its own settings surface (the\n     filex web app) claims the settings half and drops this row, because its\n     dialog already carries the same picker. */\n  list.push({ key: 'timezone', label: t('tz.menu') });\n  list.push({ key: 'shortcut-settings', label: t('shortcuts.settings.menu') }) /* wiring:c2 */;\n  list.push({ key: 'tour', label: t('tour.restart') }); /* wiring:c4 */\n  return list;\n});\n\n/** The narrow layout's whole menu: the folder/selection verbs first, then\n *  whatever is left of the settings half (which a host may have claimed —\n *  see `publishHeaderMenu`, hence the parameter rather than a closure). */\nfunction narrowActions(util: ContextAction[]): ContextAction[] {\n  const list: ContextAction[] = [];\n  const writable =\n    !props.trashActive && !props.atVirtualRoot && props.canWrite !== false;\n  if (mode.value === 'none' && writable) {\n    list.push({ key: 'new-folder', label: t('toolbar.new_folder') });\n    if (props.pasteEnabled) list.push({ key: 'paste', label: t('ctx.paste') });\n  }\n  /* gorunum:v1-selbar — the selection's verbs are on screen in the selection\n     bar now, and the ones it could not draw are in the bar's own \"⋯\". Listing\n     them here as well would be a second door into the same room — the reason\n     the drive header already carries only the settings half. */\n  if (!hasSelection.value) list.push(...toolbarItems.value);\n  if (!util.length) return list;\n  if (list.length) list.push({ divider: true, key: 'bag-sep', label: '' });\n  list.push(...util);\n  return list;\n}\n\n/* === surucu:d1 — the drive header's search field ======================\n * ONE field, and it is the one the toolbar already had: typing here sets\n * `searchQuery`, which the explorer answers with\n * `?action=search&filter=…` — a real search of the folder you are standing in,\n * exactly as before.\n *\n * The ⌘K chip beside it is the ESCALATION, not a second box: it opens the\n * command palette carrying whatever has been typed, and the palette is where\n * \"everywhere\" lives (the global endpoint, saved searches, and the commands).\n * That is why the hint can sit on this field honestly — Ctrl+K from here does\n * what the hint says, and Ctrl+K from anywhere else still opens the palette\n * as it has since cila:c.\n */\n/* ⚠ Read from the registry, not written here. This chip used to print a\n * hardcoded `⌘ K` / `Ctrl K`, which stopped being true the moment anyone\n * remapped the palette in the shortcut settings — the chip then named a\n * key that did nothing, on the one control whose whole job is to teach\n * that key. */\nconst paletteCombo = computed(() => shortcutHint('palette'));\n\n/* tus:t1 — a button's tooltip names its key. Same source as the right-click\n * menu's key column, so the two can only ever say the same thing, and a verb\n * with no binding gets its plain label back rather than an empty bracket. */\nfunction withKey(label: string, key: string): string {\n  const combo = menuShortcutHint(key);\n  return combo ? `${label} (${combo})` : label;\n}\n\n/* === gezinti:g2 — the collapse control says what it DOES ==================\n *\n * The button's label was `toolbar.nav` — \"Navigation\" / \"Gezinti\", a NOUN\n * naming the panel, which never says the button does anything to it. Measured\n * by the agent that narrowed the panel: the control works at every width; the\n * owner still could not find how to collapse the panel, because nothing on\n * screen said it could be collapsed. A static \"Show or hide navigation\" was\n * the stopgap; this is the fix, and it brings `sidenav.collapse` /\n * `sidenav.expand` back from being orphaned when the in-panel toggle went.\n *\n * ⚠⚠ TWO pairs, because `navOpen` means two different things.\n * `FileExplorer` hands down `isNarrow ? navDrawerOpen : sideNavExpanded`:\n *   · wide  — the panel is always on screen; the toggle moves it between a\n *             full column and a 56px icon rail. It is a WIDTH change, so:\n *             collapse / expand.\n *   · ≤560  — the panel is a DRAWER over the listing behind a scrim, and\n *             \"closed\" means it is not on screen at all. Nothing narrows, so\n *             \"expand\" would promise a width change to something that has no\n *             width; the pair there is open / close (`sidenav.close` is the\n *             string the drawer's own dismiss and its scrim already use, so\n *             the two doors out of the drawer say the same words).\n * Forcing one pair onto both widths would make the label wrong at one of them,\n * which is the failure this whole change is undoing.\n *\n * ⚠ ONE computed, bound to BOTH `title` and `aria-label`, so the tooltip and\n * the screen reader cannot be told two different things (the same rule the AI\n * affordance above is built on).\n *\n * ⚠ `aria-pressed` is left as it was, deliberately. With a state-bound label\n * it is arguably redundant, but the split toggle in TabBar.vue is built the\n * same way (changing label + `aria-pressed`) and changing one without the\n * other is the drift this wave exists to remove — that call belongs to one\n * pass over both, not to this line.\n */\nconst navToggleLabel = computed(() => {\n  if (props.narrow) return props.navOpen ? t('sidenav.close') : t('sidenav.open');\n  return props.navOpen ? t('sidenav.collapse') : t('sidenav.expand');\n});\n\nconst drivePlaceholder = computed(() =>\n  props.scopeLabel\n    ? t('drive.search.placeholder', { scope: props.scopeLabel })\n    : t('drive.search.placeholder_all'),\n);\n\n/** ⌘/Ctrl+K typed INSIDE the field. The global shortcut handler ignores\n *  keystrokes aimed at an input — which is correct, and it would otherwise\n *  make the hint on this very field a lie. */\nfunction onSearchKeydown(ev: KeyboardEvent) {\n  // The registry decides, so the chip beside this field and the key that\n  // actually escalates stay the same key after a remap.\n  if (eventMatchesShortcut(ev, 'palette')) {\n    ev.preventDefault();\n    ev.stopPropagation();\n    emit('open-palette', localSearch.value);\n    return;\n  }\n  /* gorunum:v3-shell — nothing on screen to narrow (Home): Enter means the\n     same thing the chip does. Empty text is left alone — Enter on an empty box\n     opening a palette nobody asked for is a keystroke doing something. */\n  if (props.searchEscalates && ev.key === 'Enter' && localSearch.value) {\n    ev.preventDefault();\n    ev.stopPropagation();\n    emit('open-palette', localSearch.value);\n  }\n}\n\n/* === gorunum:v4-hostmenu — a host may take the settings half over ==========\n *\n * The header can end up with TWO dropdowns side by side: this component's \"⋯\"\n * and whatever the embedder put in `header-actions` (in the filex web app that\n * is the account avatar). Owner's decision, 2026-09-13, verbatim: *\"`...`\n * bölgesini admin dropdown'ının içine alacağız.\"* — one menu in that corner,\n * not two.\n *\n * ⚠ It is a CLAIM, not a prop, and that is the whole design. This component\n * cannot ask \"did my host fill the slot with a menu?\": `$slots['header-actions']`\n * is truthy on every mount, because FileExplorer declares the pass-through\n * template unconditionally (the same trap its own `#brand` comment documents),\n * and a config flag would have to be threaded through a component this file\n * may not edit. So the toolbar ANNOUNCES the rows on a bubbling DOM event and\n * a host that intends to render them says so by setting `claimed` — the\n * `preventDefault()` shape, synchronous, with no registration order to get\n * right. Nobody listening (every embed today) → nothing changes and the \"⋯\"\n * keeps everything it had.\n *\n * ⚠ `composed: true`: the web-component build puts this DOM inside a shadow\n * root, and an uncomposed event stops at its boundary — i.e. the one build\n * where a host is most likely to be listening would never hear it.\n *\n * ⚠ Re-announced on every change, not once on mount: the labels are locale\n * strings and two of them are STATEFUL (\"Compact view\" ⇄ \"Comfortable view\",\n * and which view modes are inactive). A host holding the first list would\n * print yesterday's label for the rest of the session. Re-announcing is also\n * what lets a late listener claim, so the host does not have to win a race\n * with the explorer's mount.\n */\nexport interface HeaderMenuClaim {\n  /** The rows, already localised, in the order this menu would draw them. */\n  items: ContextAction[];\n  /** Run one of them by key — the SAME handler the \"⋯\" uses, so a claimed row\n   *  and an unclaimed one cannot drift apart in what they do. */\n  run: (key: string) => void;\n  /** Set to true by a host that will render `items` itself. */\n  claimed: boolean;\n}\nconst HEADER_MENU_EVENT = 'fe:header-menu';\nconst hostOwnsUtilities = ref(false);\n\nfunction publishHeaderMenu() {\n  const el = rootEl.value;\n  if (!el) return;\n  const detail: HeaderMenuClaim = {\n    items: utilityActions.value.map((a) => ({ ...a })),\n    run: (key: string) => onMoreSelect({ key, label: '' }),\n    claimed: false,\n  };\n  el.dispatchEvent(\n    new CustomEvent(HEADER_MENU_EVENT, { detail, bubbles: true, composed: true }),\n  );\n  hostOwnsUtilities.value = !!detail.claimed;\n}\n\nonMounted(() => void nextTick(publishHeaderMenu));\nwatch(utilityActions, () => void nextTick(publishHeaderMenu), { deep: false });\nonBeforeUnmount(() => {\n  /* ⚠ On `document`, not on our own root: by this point the element may\n     already be detached and a bubbling event from it would reach nobody,\n     leaving the host drawing rows for an explorer that is gone. */\n  if (typeof document === 'undefined') return;\n  document.dispatchEvent(\n    new CustomEvent(HEADER_MENU_EVENT, {\n      detail: { items: [], run: () => {}, claimed: false } as HeaderMenuClaim,\n    }),\n  );\n});\n\n/* surucu:d1 — the wide header renders the selection's actions as buttons (the\n * selection bar), so its \"⋯\" carries only the settings half; the narrow layout\n * renders no action buttons at all and still needs the whole list.\n * gorunum:v4-hostmenu — minus whatever the host took over. At 1440 that empties\n * the list and the \"⋯\" is not drawn at all; at 390 the folder verbs are still\n * this menu's, so it stays and simply loses its settings tail. */\nconst menuActions = computed<ContextAction[]>(() => {\n  const util = hostOwnsUtilities.value ? [] : utilityActions.value;\n  return props.narrow ? narrowActions(util) : util;\n});\n\nfunction openMore() {\n  const r = moreBtnEl.value?.getBoundingClientRect();\n  moreRef.value?.show({ clientX: r ? r.right : 0, clientY: r ? r.bottom + 4 : 0 }, []);\n}\n\nfunction onMoreSelect(a: ContextAction) {\n  switch (a.key) {\n    case 'new-folder':\n      emit('new-folder');\n      break;\n    case 'refresh':\n      emit('refresh');\n      break;\n    case 'density':\n      toggleDensity();\n      break;\n    case 'view-list':\n      emit('update:viewMode', 'list');\n      break;\n    case 'view-grid':\n      emit('update:viewMode', 'grid');\n      break;\n    case 'view-gallery' /* wiring:d2 */:\n      emit('update:viewMode', 'gallery');\n      break;\n    case 'inspector' /* koru:k1 */:\n      emit('toggle-inspector');\n      break;\n    case 'nav' /* gezinti:g1 */:\n      emit('toggle-nav');\n      break;\n    case 'theme' /* wiring:c1 */:\n      emit('open-theme');\n      break;\n    case 'shortcut-settings' /* wiring:c2 */:\n      emit('open-shortcut-settings');\n      break;\n    case 'timezone' /* zaman:z3 */:\n      emit('open-timezone');\n      break;\n    case 'tour' /* wiring:c4 — bubbles to the FileExplorer root listener */:\n      /* ⚠ From the TOOLBAR's root, not from the \"⋯\" button. That button is no\n         longer always on screen — a host that claimed the settings half\n         (gorunum:v4-hostmenu) leaves it unrendered, `moreBtnEl` null, and the\n         optional chain then swallowed the whole restart in silence: the row\n         was clicked, nothing happened, and nothing errored. Measured in a real\n         browser — the row opened the shortcut editor fine and the tour row did\n         nothing at all. The toolbar root is inside `.fe`, which is where the\n         listener lives, so the event still arrives. */\n      rootEl.value?.dispatchEvent(new CustomEvent('fe:tour-restart', { bubbles: true }));\n      break;\n    default:\n      fire(a.key);\n  }\n}\n\n/* === /bag:b4 === */\n</script>\n\n<template>\n  <div\n    ref=\"rootEl\"\n    class=\"fe-toolbar\"\n    :class=\"{\n      'fe-toolbar--narrow': narrow /* bag:b4 */,\n      /* surucu:d1 — ALWAYS on. It is no longer a variant: this is the only\n         header filex has, and the modifier survives as the hook the one\n         visual definition in styles/base.css was written against. Dropping it\n         would mean moving those rules, not deleting a state. */\n      'fe-toolbar--drive': true,\n    }\"\n  >\n    <!-- gorunum:v3-shell — the far-left corner, and it belongs to this row.\n         The collapse control and the product mark used to be somewhere else\n         each: the toggle inside the navigation panel's own header, one row\n         down, and the mark up in a page bar that no longer exists — which left\n         the top-left of every screen empty while the button that opens the\n         panel sat below the line it is supposed to open.\n\n         ⚠ Rendered for EVERY width and every embed, outside the two layout\n         branches, so there is one definition of \"the way back to the panel\"\n         instead of a wide copy and a narrow copy that drift.\n\n         ⚠ The mark itself is a SLOT. This package has no product branding of\n         its own and must not grow any: `<filex-explorer>` inside somebody\n         else's app has no \"filex\" wordmark to show, and an embed that passes\n         nothing renders nothing here — the toggle simply sits at the edge.\n         Hidden at 390px even when a host fills it, where the row is three\n         items wide already. -->\n    <!-- ⚠ Not rendered at all when there is neither a panel to collapse nor a\n         mark to show — a confined embed (`rootPath`, so `sideNav` defaults\n         off) would otherwise reserve the gutter below for an empty box.\n         ⚠ The mark counts in BOTH of its forms: the slot an SFC host fills and\n         the `config.brand` a web-component host has to use instead. Asking only\n         about the slot would have hidden the desktop app's own logo the moment\n         it confined an explorer — the same silent blank corner this whole\n         branch exists to stop. -->\n    <div\n      v-if=\"navEnabled !== false || !!$slots.brand || !!brandName || !!brandMarkUrl\"\n      class=\"fe-toolbar__brand\"\n      :class=\"{\n        'fe-toolbar__brand--gutter': navEnabled !== false,\n        /* gezinti:g3 — the panel collapsed to its rail, so this gutter has to\n           collapse with it. `navOpen === false`, never `!navOpen`: the prop is\n           optional, and an embedder that does not pass it must keep the\n           expanded layout rather than lose its wordmark to a `undefined`. */\n        'fe-toolbar__brand--rail': !narrow && navEnabled !== false && navOpen === false,\n      }\"\n    >\n      <!-- ⚠ `aria-pressed` without the `is-active` styling, and the two are\n           not the same claim. A screen reader has to be told the panel is\n           open; a sighted person can see it, and a permanently highlighted\n           button in the top-left corner reads as \"something is selected here\"\n           on a control nobody selected. The panel's presence IS its state. -->\n      <button\n        v-if=\"navEnabled !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only fe-toolbar__nav\"\n        :aria-pressed=\"!!navOpen\"\n        :title=\"navToggleLabel /* gezinti:g2 — a verb, and the state's verb */\"\n        :aria-label=\"navToggleLabel\"\n        data-testid=\"toolbar-nav\"\n        @click=\"emit('toggle-nav')\"\n      >\n        <svg\n          class=\"fe-ficon\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.8\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M4 7h16M4 12h16M4 17h16\" />\n        </svg>\n      </button>\n      <!-- gezinti:g3 — the mark goes with the gutter. The rail is 56px and the\n           brand's content measures 113px, so it cannot be shown in the\n           collapsed state at any size; the reference does the same thing\n           (measured signed-in: logo and wordmark both gone the moment the\n           panel collapses, `☰` re-centred in the rail, search field slid\n           left). ⚠ `navOpen !== false` — an embedder that passes no state at\n           all keeps its mark. -->\n      <div v-if=\"!narrow && navOpen !== false\" class=\"fe-toolbar__mark\">\n        <slot name=\"brand\">\n          <img v-if=\"brandMarkUrl\" class=\"fe-toolbar__markimg\" :src=\"brandMarkUrl\" alt=\"\" />\n          <span v-if=\"brandName\">{{ brandName }}</span>\n        </slot>\n      </div>\n    </div>\n\n    <!-- === gorunum:v2-topbar — the wide header ==========================\n         ONE header, in the reference shell's shape, for every profile: the\n         search field takes the row and the trailing cluster carries what\n         belongs to the APP rather than to a listing. The page chrome that\n         used to sit above the explorer (wordmark, admin link, sign out,\n         language) is gone, so this row is the only header on the screen.\n\n         ⚠ What LEFT this row, and the single door each one kept — no control\n         was dropped from the build:\n           · navigation collapse → CAME BACK, to `.fe-toolbar__brand` above,\n             at every width. It had gone to the panel's own edge control, which\n             put the button that opens the panel one row BELOW the line it\n             opens and left this corner empty; the panel no longer draws its\n             own (except as the drawer's close button at 390px).\n           · Up one level        → the parent crumb, always drawn (the trail\n             collapses to `root › … › parent › current`, never past it).\n             The keyboard binding is untouched.\n           · New Folder / Upload → the panel's primary block\n             (`sidenav-upload` / `sidenav-new-folder`, or its \"+ New\" menu in\n             the drive profile). They come BACK here when a deployment has no\n             panel at all (`sideNav: false`, or a confined root), because then\n             there is nowhere else for them to live.\n           · density, theme      → user settings, and the \"⋯\" menu below.\n           · Details ⓘ, views    → the breadcrumb row, beside the crumbs.\n         -->\n    <template v-if=\"!narrow\">\n    <div class=\"fe-toolbar__primary\">\n      <!-- No navigation panel in this deployment → no primary block to hold\n           these, so they are the one door and they render here. -->\n      <button\n        v-if=\"navEnabled === false && mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :title=\"withKey(t('toolbar.new_folder'), 'new-folder')\"\n        @click=\"emit('new-folder')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('new-folder')\"></span>\n        <span class=\"fe-btn__label\">{{ t('toolbar.new_folder') }}</span>\n      </button>\n      <button\n        v-if=\"navEnabled === false && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"withKey(t('toolbar.upload'), 'upload')\"\n        :aria-label=\"t('toolbar.upload')\"\n        @click=\"emit('upload')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('upload')\"></span>\n      </button>\n\n      <!-- gorunum:v1-selbar — the selection's actions used to be a row of\n           labelled buttons here (Details / Cut / Copy / Paste / Star / a red\n           filled Delete). They are now the selection bar, under the tab strip,\n           where the reference puts them. -->\n\n      <button\n        v-if=\"pasteEnabled && mode === 'none' && !trashActive && !atVirtualRoot && canWrite !== false\"\n        type=\"button\"\n        class=\"fe-btn\"\n        :title=\"withKey(t('ctx.paste'), 'paste')\"\n        @click=\"fire('paste')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('paste')\"></span>\n        <span class=\"fe-btn__label\">{{ t('ctx.paste') }}</span>\n      </button>\n    </div>\n\n    <div class=\"fe-toolbar__search-group fe-toolbar__search-group--drive\">\n      <!-- gorunum:v1 — ONE search field, in every shell. This used to be two\n           blocks — a bare input in a bordered group for the classic profile\n           and a wide field with the ⌘K chip for the drive one; the same box\n           in two shapes is two products. It carries both class names on\n           purpose: the `fe-drivesearch*` half is the one visual definition\n           (styles/base.css), the `fe-search*` half is the hook the onboarding\n           tour has always looked for.\n           ⚠ The chip prints `shortcutHint('palette')` and the field escalates\n           through `eventMatchesShortcut(ev, 'palette')` — never a literal key\n           (web/tests/ui/shortcutHints.test.ts). -->\n      <div class=\"fe-search fe-drivesearch\" data-testid=\"drive-search\">\n        <svg\n          class=\"fe-ficon fe-drivesearch__glass\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.9\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n          <path d=\"M16 16l4.5 4.5\" />\n        </svg>\n        <input\n          ref=\"searchEl\"\n          type=\"search\"\n          class=\"fe-search__input fe-drivesearch__input\"\n          :placeholder=\"drivePlaceholder\"\n          :value=\"localSearch\"\n          :aria-label=\"t('toolbar.search')\"\n          @input=\"onSearchInput\"\n          @keydown=\"onSearchKeydown\"\n        />\n        <!-- gorunum:v1-advsearch — the filter affordance the header field has\n             always been specced with, beside the palette chip. It opens the\n             advanced dialog carrying whatever is already typed. -->\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__tune\"\n          :title=\"t('advsearch.open')\"\n          :aria-label=\"t('advsearch.open')\"\n          data-testid=\"drive-search-advanced\"\n          @click=\"emit('open-advanced-search', localSearch)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('filter')\"></span>\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__kbd\"\n          :title=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          :aria-label=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          data-testid=\"drive-search-palette\"\n          @click=\"emit('open-palette', localSearch)\"\n        >\n          {{ paletteCombo }}\n        </button>\n      </div>\n    </div>\n\n    <!-- gorunum:v2-topbar — the trailing cluster. Refresh and the \"⋯\" are the\n         explorer's own; the AI mark is drawn but not yet wired; the host's\n         account-level doors arrive through the slot. -->\n    <div class=\"fe-toolbar__tail\">\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"withKey(t('toolbar.refresh'), 'refresh')\"\n        :aria-label=\"t('toolbar.refresh')\"\n        @click=\"emit('refresh')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n      </button>\n      <!-- gorunum:v2-topbar — the AI assistant, announced and not pretending.\n           ⚠ `disabled`, not \"opens an empty panel\": a control that answers a\n           click with nothing is read as broken, and the next thing that\n           happens is a bug report about a feature that was never claimed. It\n           says what it is and that it is not here yet, in both languages, and\n           it will become live in place — the glyph does not move under\n           anybody's finger the day it starts working. -->\n      <span class=\"fe-toolbar__soon-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only fe-toolbar__soon\"\n          disabled\n          :aria-label=\"t('ai.assistant.soon')\"\n          aria-disabled=\"true\"\n          data-testid=\"header-ai\"\n          @click.prevent\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('ai')\"></span>\n        </button>\n        <!-- gorunum:v4-hostmenu — the words, on hover, and nowhere else at\n             rest. Owner's decision, 2026-09-13, verbatim: *\"Coming soon\n             yazısını kaldıralım, üstüne gelince gözüksün.\"*\n             ⚠ `aria-hidden`, and the button keeps `aria-label` with the SAME\n             sentence: hover is a mouse gesture that a touch screen and a\n             keyboard do not have, so the words have to be in the accessible\n             name — and if they were in both, a screen reader would read the\n             sentence twice.\n             ⚠ The native `title` went with the pill. It is not an accessible\n             name (the label above is), it never appears on touch, and leaving\n             it would stack the OS tooltip on top of this one. -->\n        <span\n          class=\"fe-toolbar__soon-tip\"\n          aria-hidden=\"true\"\n          data-testid=\"header-ai-tip\"\n        >{{ t('ai.assistant.soon') }}</span>\n      </span>\n      <!-- Density, theme, the shortcut editor, the tour and the other view\n           modes. Everything the header does not draw is one click away here;\n           nothing is removed from the build. A menu is the one place a\n           duplicate is allowed to live.\n           gorunum:v4-hostmenu — ⚠ not drawn when there is nothing left in it:\n           a host that claimed the settings half (the web app's avatar menu)\n           empties this list at 1440, and a button that opens an empty menu is\n           the \"second control doing the same job\" this pass removes. -->\n      <button\n        v-if=\"menuActions.length > 0\"\n        ref=\"moreBtnEl\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--icon-only\"\n        :title=\"t('toolbar.more')\"\n        :aria-label=\"t('toolbar.more')\"\n        aria-haspopup=\"menu\"\n        data-testid=\"drive-more\"\n        @click=\"openMore\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n      </button>\n      <!-- The host's own doors (admin panel, settings, sign out). Empty in an\n           embed, which is why the cluster is a slot and not a prop: an\n           embedder that has no account chrome renders nothing at all here. -->\n      <slot name=\"header-actions\"></slot>\n    </div>\n    </template>\n\n    <!-- surucu:d1 — narrow layout: [☰] [ search ] [⋯] + the host cluster.\n         ⚠ The ONLY narrow layout now. There used to be a second one that hid\n         search behind a magnifier and expanded it over the row; it was the\n         right trade when the row also carried Up / Upload / actions, and this\n         one does not — \"+ New\" lives in the drawer, upload has the floating\n         button this width already draws (`.fe-fab`), and Up went to the parent\n         crumb. So the field keeps the row, and only the ⌘K chip goes (CSS): a\n         phone cannot press it, and the palette stays in the \"⋯\" menu.\n         gorunum:v2-topbar — the trailing cluster is the wide header's, to the\n         glyph: a control on screen at 1440 and unreachable at 390 is a\n         capability split, not a layout. -->\n    <template v-else>\n      <div class=\"fe-drivesearch\" data-testid=\"drive-search\">\n        <svg\n          class=\"fe-ficon fe-drivesearch__glass\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.9\"\n          stroke-linecap=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n          <path d=\"M16 16l4.5 4.5\" />\n        </svg>\n        <input\n          ref=\"searchEl\"\n          type=\"search\"\n          class=\"fe-drivesearch__input\"\n          :placeholder=\"drivePlaceholder\"\n          :value=\"localSearch\"\n          :aria-label=\"t('toolbar.search')\"\n          @input=\"onSearchInput\"\n          @keydown=\"onSearchKeydown\"\n        />\n        <!-- gorunum:v1-advsearch — the filter affordance the header field has\n             always been specced with, beside the palette chip. It opens the\n             advanced dialog carrying whatever is already typed.\n             ⚠ Added to ALL THREE field blocks on purpose: this file's own note\n             says the same box in two shapes is two products, so a control that\n             existed only in the drive shell would re-open exactly that split. -->\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__tune\"\n          :title=\"t('advsearch.open')\"\n          :aria-label=\"t('advsearch.open')\"\n          data-testid=\"drive-search-advanced\"\n          @click=\"emit('open-advanced-search', localSearch)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('filter')\"></span>\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-drivesearch__kbd\"\n          :title=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          :aria-label=\"t('drive.search.hint_title', { combo: paletteCombo })\"\n          data-testid=\"drive-search-palette\"\n          @click=\"emit('open-palette', localSearch)\"\n        >\n          {{ paletteCombo }}\n        </button>\n      </div>\n      <div class=\"fe-toolbar__tail\">\n        <!-- gorunum:v2-topbar — the same cluster as the wide header. A control\n             that is on screen at 1440 and unreachable at 390 is a capability\n             split, not a layout, so the AI mark and the host's doors come\n             along; only Refresh stays behind (it is in the \"⋯\"). -->\n        <span class=\"fe-toolbar__soon-wrap\">\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--icon-only fe-toolbar__soon\"\n            disabled\n            :aria-label=\"t('ai.assistant.soon')\"\n            aria-disabled=\"true\"\n            data-testid=\"header-ai\"\n            @click.prevent\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('ai')\"></span>\n          </button>\n          <!-- gorunum:v4-hostmenu — the same affordance as the wide header, to\n               the glyph. ⚠ A phone has no hover at all, so here the accessible\n               name is the ONLY door to these words — which is exactly why it\n               carries the whole sentence and not a `title`. -->\n          <span\n            class=\"fe-toolbar__soon-tip\"\n            aria-hidden=\"true\"\n            data-testid=\"header-ai-tip\"\n          >{{ t('ai.assistant.soon') }}</span>\n        </span>\n        <button\n          v-if=\"menuActions.length > 0\"\n          ref=\"moreBtnEl\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only\"\n          :title=\"t('toolbar.more')\"\n          :aria-label=\"t('toolbar.more')\"\n          aria-haspopup=\"menu\"\n          data-testid=\"drive-more\"\n          @click=\"openMore\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n        </button>\n        <slot name=\"header-actions\"></slot>\n      </div>\n    </template>\n\n\n    <!-- The \"⋯\" menu of whichever layout is on screen.\n         ⚠ Rendered unconditionally, outside the three layout branches. It used\n         to live inside the narrow non-drive branch alone, which left both drive\n         layouts (`data-testid=\"drive-more\"`, wide and narrow) with a button\n         whose `moreRef` was null — the click resolved to nothing and the whole\n         settings half of the menu was unreachable in that profile. -->\n    <ContextMenu\n      ref=\"moreRef\"\n      :locale=\"locale\"\n      :theme=\"theme || 'auto'\"\n      :sheet=\"coarse\"\n      :actions=\"menuActions\"\n      @select=\"onMoreSelect\"\n    />\n\n    <!-- === gorunum:v1-selbar — the selection bar ======================\n         Teleported into the slot this component put right after the breadcrumb\n         (see the script block). With no slot to mount into the Teleport is\n         disabled and the bar renders here instead, so a bare <Toolbar> still\n         offers the selection's actions. -->\n    <Teleport :to=\"selSlot || 'body'\" :disabled=\"!selSlot\">\n      <div\n        v-if=\"hasSelection\"\n        class=\"fe-selbar\"\n        :class=\"{ 'fe-selbar--inline': !selSlot }\"\n        role=\"toolbar\"\n        :aria-label=\"selectionLabel\"\n        data-testid=\"selection-bar\"\n      >\n        <span class=\"fe-selbar__count\" role=\"status\" data-testid=\"selection-count\">{{\n          selectionLabel\n        }}</span>\n\n        <div ref=\"selBarEl\" class=\"fe-selbar__actions\">\n          <button\n            v-for=\"a in visibleBarItems\"\n            :key=\"a.key\"\n            type=\"button\"\n            class=\"fe-selbar__btn\"\n            :class=\"{ 'fe-selbar__btn--danger': a.danger, 'is-disabled': a.disabled }\"\n            :disabled=\"a.disabled\"\n            :title=\"a.title || withKey(a.label, a.key) /* tasi:m1 — a greyed\n                   row says WHY it is grey; everything else says what it does\n                   and which key does it */\"\n            :aria-label=\"a.label\"\n            :data-key=\"a.key\"\n            :data-testid=\"`selbar-${a.key}`\"\n            @click=\"fire(a.key)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n          </button>\n\n          <button\n            v-if=\"barMenuItems.length > 0\"\n            ref=\"selMoreBtnEl\"\n            type=\"button\"\n            class=\"fe-selbar__btn\"\n            :title=\"t('toolbar.more')\"\n            :aria-label=\"t('toolbar.more')\"\n            aria-haspopup=\"menu\"\n            data-testid=\"selbar-more\"\n            @click=\"openBarMore\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('more')\"></span>\n          </button>\n\n          <!-- Invisible measuring strip: every icon action is always rendered\n               here, as the SAME button the visible row renders, so the fold\n               arithmetic runs off widths something really has.\n               ⚠ `data-key` is on BOTH copies: which icons are on screen is a\n               function of the viewport (that is what folding means), so a test\n               that wants the list this selection OFFERS has to read it from a\n               strip the fold does not touch. -->\n          <div ref=\"measureEl\" class=\"fe-selbar__measure\" aria-hidden=\"true\">\n            <button\n              v-for=\"a in barSplit.icons\"\n              :key=\"'m-' + a.key\"\n              type=\"button\"\n              class=\"fe-selbar__btn\"\n              :data-key=\"a.key\"\n              tabindex=\"-1\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"iconFor(a)\"></span>\n            </button>\n          </div>\n        </div>\n\n        <button\n          type=\"button\"\n          class=\"fe-selbar__close\"\n          :title=\"t('selection.clear')\"\n          :aria-label=\"t('selection.clear')\"\n          data-testid=\"selection-clear\"\n          @click=\"clearSelection\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </div>\n    </Teleport>\n\n    <ContextMenu\n      ref=\"selMoreRef\"\n      :locale=\"locale\"\n      :theme=\"theme || 'auto'\"\n      :sheet=\"coarse\"\n      :actions=\"barMenuItems\"\n      @select=\"(a) => fire(a.key)\"\n    />\n    <!-- === /gorunum:v1-selbar === -->\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TagPicker — small chip list with add/remove for a node.\n *\n * Reads `GET /api/files/manager/tags?node_id=…` on mount, writes the\n * full new array via `POST /api/files/manager/tags`.\n *\n * Tag colors are deterministic: hash(name) → palette index. Consumers\n * can override with the `palette` prop.\n *\n * === etiket:t1 — THE CHIP IS A DOOR ==================================\n * ⚠⚠ Owner, 2026-09-13: \"taglediğim dosya klasör tag'ine gitmiyor.\" The tag\n * VIEW existed and the panel listed every tag, but from a file there was no way\n * into the one it carries: the chip was a `<span>`, so the only route from\n * \"this file is tagged invoices\" to \"what else is tagged invoices\" was to read\n * the word, find it again in the panel and click it there.\n *\n * ⚠ The name is the button and the × stays its own. Two targets in one chip,\n * neither of which may fire the other's action — a mis-hit here either loses a\n * tag or navigates away from the file you were reading about.\n *\n * ⚠ It navigates from BOTH mounts, the details panel's and the modal the\n * right-click menu opens. One component, one behaviour: a chip that led\n * somewhere in one place and was inert three inches away in another would be\n * the surface-specific split this package exists to avoid. The host closes the\n * modal on the way (it opened it).\n */\nimport { ref, watch, onMounted, computed } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode } from '../types/ExplorerConfig';\n\nconst props = defineProps<{\n  nodeId: number;\n  /**\n   * ⚠ Added 2026-09-13 with the chip's new \"open this tag\" affordance, and it\n   * pulls three OLDER strings out of English with it: this component printed\n   * \"+ Add tag\", \"tag name\" and \"Remove tag\" literally, so a Turkish user\n   * reading \"Etiketler\" as the section heading got three English controls under\n   * it. Optional, defaulting to the catalogue's own default, so an embedder\n   * that never passed one is unaffected.\n   */\n  locale?: LocaleCode;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  /** Optional list of palette swatches; one is picked per tag deterministically. */\n  palette?: string[];\n}>();\n\nconst emit = defineEmits<{\n  (e: 'change', tags: string[]): void;\n  (e: 'error', message: string): void;\n  /** etiket:t1 — \"show me everything tagged this\". The host owns navigation. */\n  (e: 'open', tag: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale ?? 'en');\n\n/** \"Open tag: invoices\" — the chip's title and its accessible name, one value\n *  so the two cannot say different things. */\nfunction openTitle(tag: string): string {\n  return t('tags.open', { tag });\n}\n\nconst tags = ref<string[]>([]);\nconst loading = ref(false);\nconst adding = ref(false);\nconst newTag = ref('');\n\nconst palette = computed(() => props.palette ?? [\n  '#ef4444', '#f59e0b', '#10b981', '#3b82f6',\n  '#8b5cf6', '#ec4899', '#14b8a6', '#f97316',\n]);\n\nfunction colorFor(tag: string): string {\n  let h = 0;\n  for (let i = 0; i < tag.length; i++) h = (h * 31 + tag.charCodeAt(i)) | 0;\n  const arr = palette.value;\n  return arr[Math.abs(h) % arr.length];\n}\n\nasync function buildHeaders(extra: Record<string, string> = {}): Promise<Record<string, string>> {\n  return { ...(await (props.authHeaders ?? (() => ({})))()), ...extra };\n}\n\nasync function load() {\n  loading.value = true;\n  try {\n    const base = props.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/tags?node_id=${props.nodeId}`, {\n      headers: await buildHeaders(),\n      credentials: props.authCredentials ?? 'same-origin',\n    });\n    if (res.ok) {\n      const body = await res.json();\n      tags.value = Array.isArray(body.tags) ? body.tags : [];\n    }\n  } catch (err) {\n    emit('error', err instanceof Error ? err.message : String(err));\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function persist(next: string[]) {\n  const previous = [...tags.value];\n  tags.value = next;\n  try {\n    const base = props.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/tags`, {\n      method: 'POST',\n      headers: await buildHeaders({ 'Content-Type': 'application/json' }),\n      credentials: props.authCredentials ?? 'same-origin',\n      body: JSON.stringify({ node_id: props.nodeId, tags: next }),\n    });\n    if (!res.ok) throw new Error(`tag save failed: ${res.status}`);\n    emit('change', next);\n  } catch (err) {\n    tags.value = previous;\n    emit('error', err instanceof Error ? err.message : String(err));\n  }\n}\n\nfunction add() {\n  const v = newTag.value.trim();\n  if (!v || tags.value.includes(v)) {\n    newTag.value = '';\n    adding.value = false;\n    return;\n  }\n  persist([...tags.value, v]);\n  newTag.value = '';\n  adding.value = false;\n}\n\nfunction remove(tag: string) {\n  persist(tags.value.filter((t) => t !== tag));\n}\n\nonMounted(load);\nwatch(() => props.nodeId, load);\n</script>\n\n<template>\n  <div class=\"filex-tag-picker\" :class=\"{ 'is-loading': loading }\">\n    <span\n      v-for=\"tag in tags\"\n      :key=\"tag\"\n      class=\"filex-tag\"\n      :style=\"{ '--filex-tag-color': colorFor(tag) }\"\n    >\n      <button\n        class=\"filex-tag-open\"\n        type=\"button\"\n        :title=\"openTitle(tag)\"\n        :aria-label=\"openTitle(tag)\"\n        :data-testid=\"`tag-open-${tag}`\"\n        @click=\"emit('open', tag)\"\n      >{{ tag }}</button>\n      <button class=\"filex-tag-x\" type=\"button\" @click=\"remove(tag)\" :aria-label=\"t('tags.remove')\">×</button>\n    </span>\n\n    <form v-if=\"adding\" class=\"filex-tag-add\" @submit.prevent=\"add\">\n      <input\n        v-model=\"newTag\"\n        autofocus\n        :placeholder=\"t('tags.name')\"\n        :aria-label=\"t('tags.name')\"\n        @blur=\"add\"\n        @keydown.escape=\"adding = false; newTag = ''\"\n      />\n    </form>\n    <button v-else class=\"filex-tag-add-btn\" type=\"button\" @click=\"adding = true\">\n      {{ t('tags.add') }}\n    </button>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-tag-picker {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px;\n  align-items: center;\n}\n.filex-tag-picker.is-loading {\n  opacity: 0.6;\n  pointer-events: none;\n}\n.filex-tag {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  border-radius: 999px;\n  padding: 2px 10px;\n  font-size: 12px;\n  font-weight: 500;\n  color: #fff;\n  background: var(--filex-tag-color);\n}\n/* etiket:t1 — the tag's NAME is the door to its view. A bare button: it\n   inherits the chip's own colour and type so the chip still reads as one\n   object, and the underline appears only under the pointer, where the chip has\n   already said it is interactive by changing the cursor. */\n.filex-tag-open {\n  background: transparent;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  color: inherit;\n  font: inherit;\n  line-height: inherit;\n  cursor: pointer;\n}\n.filex-tag-open:hover,\n.filex-tag-open:focus-visible {\n  text-decoration: underline;\n}\n.filex-tag-x {\n  background: transparent;\n  border: none;\n  color: rgba(255, 255, 255, 0.85);\n  cursor: pointer;\n  padding: 0 2px;\n  font-size: 14px;\n  line-height: 1;\n}\n.filex-tag-x:hover {\n  color: #fff;\n}\n.filex-tag-add input {\n  border: 1px solid var(--filex-border, #d1d5db);\n  border-radius: 12px;\n  padding: 2px 10px;\n  font-size: 12px;\n  width: 110px;\n}\n.filex-tag-add-btn {\n  border: 1px dashed var(--filex-border, #d1d5db);\n  background: transparent;\n  border-radius: 999px;\n  padding: 2px 10px;\n  font-size: 12px;\n  color: var(--filex-text-muted, #6b7280);\n  cursor: pointer;\n}\n/* gorunum:v1 — a host override still wins, but the fallback chain now ends at\n   the product blue instead of the old indigo, and it asks the palette first:\n   in a themed context this hover follows --fe-primary (and so goes light blue\n   in dark mode), and only a context with no stylesheet at all — the very case\n   where a fallback is the only thing painting — lands on the literal. */\n.filex-tag-add-btn:hover {\n  border-color: var(--filex-accent, var(--fe-primary, #2f6ceb));\n  color: var(--filex-accent, var(--fe-primary, #2f6ceb));\n}\n</style>\n","/**\n * fileIcons — extension/type → inline SVG icon mapping.\n *\n * Replaces the old emoji maps in GridView/ListView with a minimalist\n * line-icon set. Icons are hand-drawn 24×24 strokes on `currentColor`;\n * each family gets an accent via `--fe-icon-<family>` (variables.css),\n * applied through the `fe-ficon--<family>` class in base.css.\n *\n * Scope: what a listing row IS — its file type, plus the one STATE that\n * changes the picture rather than the caption (an encrypted folder, bottom of\n * this file). What a row DOES is `lib/actionIcons.ts`.\n *\n * ⚠ `.trash` and STORAGE rows used to be the documented exception here, and\n * they were drawn as 💾 and 🗑 by three separate copies of the same line in\n * GridView, GalleryView and ListView. On the multi-storage \"My files\" root —\n * the screen the sidebar now lands everybody on — that made a pixelated\n * floppy disk the first thing on the page, in a shape that changes between\n * Windows, macOS and Linux because it is a system font's idea of the glyph\n * rather than ours. They are families like any other now, so the card, the\n * tile and the row all get one definition (filex lesson #67).\n */\n\nexport type IconFamily =\n  | 'folder'\n  | 'image'\n  | 'video'\n  | 'audio'\n  | 'pdf'\n  | 'doc'\n  | 'sheet'\n  | 'slides'\n  | 'archive'\n  | 'code'\n  | 'text'\n  // Not file types: the two rows a listing can hold that are PLACES rather\n  // than things. They carry no extension, so `iconFamilyFor` recognises them\n  // from the node instead.\n  | 'storage'\n  | 'trash'\n  | 'unknown';\n\nconst EXT_FAMILIES: Record<string, IconFamily> = {};\n\nfunction reg(family: IconFamily, exts: string[]) {\n  for (const e of exts) EXT_FAMILIES[e] = family;\n}\n\nreg('image', ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'heic', 'svg', 'ico', 'tiff', 'tif']);\nreg('video', ['mp4', 'webm', 'mov', 'mkv', 'avi', 'ogv', 'm4v']);\nreg('audio', ['mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac', 'opus']);\nreg('pdf', ['pdf']);\nreg('doc', ['doc', 'docx', 'odt', 'rtf']);\n/* gorunum:v1-preview — `tsv` joins its twin. It was the one tabular extension\n * with no family at all (so: the \"unknown\" glyph, and invisible to the\n * Spreadsheet filter), while the text viewer has read it as a table since\n * v0.5 (`viewers/CsvViewer.vue` branches on `ext === 'tsv'`). */\nreg('sheet', ['xls', 'xlsx', 'ods', 'csv', 'tsv']);\nreg('slides', ['ppt', 'pptx', 'odp']);\nreg('archive', ['zip', 'tar', 'gz', 'bz2', '7z', 'rar', 'xz', 'zst']);\nreg('code', [\n  'js', 'ts', 'jsx', 'tsx', 'mjs', 'cjs', 'vue', 'py', 'go', 'rs', 'php', 'rb',\n  'java', 'kt', 'swift', 'c', 'cpp', 'h', 'hpp', 'cs', 'css', 'scss', 'less',\n  'html', 'htm', 'json', 'yml', 'yaml', 'xml', 'sh', 'bash', 'ps1', 'sql', 'toml',\n]);\nreg('text', ['txt', 'md', 'markdown', 'log', 'ini', 'conf', 'cfg', 'env']);\n\n/**\n * The synthetic \"a storage\" row a listing can carry.\n *\n * The backend never sends `inode/storage`; FileExplorer mints these rows for\n * the multi-storage overview, and they are `type: 'dir'` with no folder behind\n * them — every mutation would 4xx. The test was written out longhand in three\n * view components, which is how a fourth surface came to be written without\n * it, so it is a function now and this file is its one home.\n */\nexport function isStorageRow(node: { mime_type?: string | null }): boolean {\n  return node.mime_type === 'inode/storage';\n}\n\n/** Pick the icon family for a listing node. */\nexport function iconFamilyFor(node: {\n  type?: string;\n  extension?: string | null;\n  mime_type?: string | null;\n  basename?: string | null;\n}): IconFamily {\n  // ⚠ Both of these are also `type: 'dir'`, so they have to be answered\n  // BEFORE the folder branch or they fall through to a plain folder — which\n  // is what `HomeView` still does by asking for `{ type: 'dir' }` by hand.\n  if (isStorageRow(node)) return 'storage';\n  if (node.basename === '.trash') return 'trash';\n  if (node.type === 'dir') return 'folder';\n  const ext = (node.extension || '').toLowerCase();\n  return EXT_FAMILIES[ext] ?? 'unknown';\n}\n\n// Shared fragments. The document families reuse one sheet-with-fold base so\n// the set reads as one system; media families get standalone shapes.\nconst FILE_BASE =\n  '<path d=\"M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z\"/>' +\n  '<path d=\"M13.5 3v5h5\"/>';\n\nconst GLYPHS: Record<IconFamily, string> = {\n  // Folder is the one \"filled\" member — a soft currentColor wash keeps it\n  // visually anchored without breaking the line style.\n  /**\n   * gorunum:v1 — the folder is SOLID, and it is the one glyph that never\n   * gets a tile. A folder is the most common thing in a listing; drawn as an\n   * outline in the same weight as the file glyphs it disappears into them,\n   * and the eye has to read the label to tell a folder from a document. Filled\n   * and in its own colour it is recognisable before the name is read.\n   */\n  folder:\n    '<path d=\"M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5z\" fill=\"currentColor\" stroke=\"none\"/>',\n  image:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n    '<circle cx=\"8.6\" cy=\"10\" r=\"1.6\"/>' +\n    '<path d=\"M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7\"/>',\n  video:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/>' +\n    '<path d=\"M10.2 9.3v5.4l4.8-2.7z\" fill=\"currentColor\" stroke=\"none\"/>',\n  audio:\n    '<path d=\"M9 17.5V7.2l9-2.2v10.4\"/>' +\n    '<circle cx=\"6.8\" cy=\"17.6\" r=\"2.2\"/>' +\n    '<circle cx=\"15.8\" cy=\"15.5\" r=\"2.2\"/>',\n  pdf:\n    FILE_BASE +\n    '<rect x=\"7.5\" y=\"12\" width=\"9\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.14\"/>',\n  doc:\n    FILE_BASE +\n    '<path d=\"M8.5 13h7M8.5 16h7\"/>',\n  sheet:\n    FILE_BASE +\n    '<path d=\"M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18\"/>',\n  slides:\n    FILE_BASE +\n    '<rect x=\"8\" y=\"12.5\" width=\"8\" height=\"5\" rx=\"0.8\"/>',\n  archive:\n    FILE_BASE +\n    '<path d=\"M10 3v1.6M10 6.6v1.6M10 10.2v1.6\"/>' +\n    '<rect x=\"8.6\" y=\"14\" width=\"2.8\" height=\"3.4\" rx=\"0.8\"/>',\n  code:\n    FILE_BASE +\n    '<path d=\"M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5\"/>',\n  text:\n    FILE_BASE +\n    '<path d=\"M8.5 12h7M8.5 15h7M8.5 18h4.5\"/>',\n  // The two-bay drive the sidebar already draws for the same storages, so a\n  // drive is one shape across the panel rather than one per surface.\n  storage:\n    '<rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1.6\"/>' +\n    '<rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1.6\"/>' +\n    '<path d=\"M6.5 8h.01M6.5 16h.01\"/>',\n  trash:\n    '<path d=\"M4 7h16\"/>' +\n    '<path d=\"M9.5 7V5.6A1.6 1.6 0 0 1 11.1 4h1.8a1.6 1.6 0 0 1 1.6 1.6V7\"/>' +\n    '<path d=\"M6.2 7l.85 11.6A1.6 1.6 0 0 0 8.65 20h6.7a1.6 1.6 0 0 0 1.6-1.4L17.8 7\"/>' +\n    '<path d=\"M10.2 10.8v5.6M13.8 10.8v5.6\"/>',\n  unknown:\n    FILE_BASE +\n    '<path d=\"M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4\"/>' +\n    '<circle cx=\"12\" cy=\"18.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n};\n\nconst SVG_CACHE = new Map<IconFamily, string>();\n\n/** Inline SVG markup for a family (safe static strings — v-html friendly). */\nexport function iconSvg(family: IconFamily): string {\n  let svg = SVG_CACHE.get(family);\n  if (!svg) {\n    svg =\n      `<svg class=\"fe-ficon fe-ficon--${family}\" viewBox=\"0 0 24 24\" fill=\"none\" ` +\n      'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n      'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n      `${GLYPHS[family]}</svg>`;\n    SVG_CACHE.set(family, svg);\n  }\n  return svg;\n}\n\n/** Convenience: node → SVG markup in one call. */\nexport function fileIconSvg(node: Parameters<typeof iconFamilyFor>[0]): string {\n  return iconSvg(iconFamilyFor(node));\n}\n\nconst TILE_CACHE = new Map<IconFamily, string>();\n\n/**\n * gorunum:v1 — the listing badge: a filled, rounded square in the family's\n * colour with the glyph knocked out in white.\n *\n * Why not the bare coloured glyph it replaces: at 16px a line drawing in a\n * pale accent is a smudge, and twelve of them down a column read as noise\n * rather than as twelve kinds of file. A solid chip of colour is legible at a\n * glance, holds its shape at any density, and gives the row a consistent left\n * edge whether the file has a thumbnail or not.\n *\n * The folder is the exception and returns its solid glyph untiled — a folder\n * is not a file type, and boxing it makes a listing look like a colour chart.\n */\nexport function iconTile(family: IconFamily): string {\n  if (family === 'folder') {\n    return `<span class=\"fe-ftile fe-ftile--folder\">${iconSvg(family)}</span>`;\n  }\n  let tile = TILE_CACHE.get(family);\n  if (!tile) {\n    tile = `<span class=\"fe-ftile fe-ftile--${family}\">${iconSvg(family)}</span>`;\n    TILE_CACHE.set(family, tile);\n  }\n  return tile;\n}\n\n/** Convenience: node → tile markup in one call. */\nexport function fileIconTile(node: Parameters<typeof iconFamilyFor>[0]): string {\n  return iconTile(iconFamilyFor(node));\n}\n\n/* ======================================================================\n * ikon:emoji — the one listing marker that is a STATE, not a type.\n *\n * An end-to-end encrypted folder (wiring:e2) is a folder like any other; what\n * is special about it is a fact, not a kind, so it cannot be an `IconFamily`\n * — `iconFamilyFor` is the taxonomy `lib/fileFilters` filters by, and moving\n * these rows out of `folder` would quietly drop them from the Folders filter.\n * It lives beside the families instead, as one definition.\n *\n * ⚠ It was three. `specialEmojiFor(n) { if (n.type === 'dir' && n.e2e) return\n * '🔒' }` was copy-pasted verbatim into ListView, GridView and GalleryView —\n * the exact shape of the thing the duplicate-code gate exists to stop, and\n * the second time this file has had to absorb it (the first was `.trash` and\n * the storage row, drawn as 🗑 and 💾 by the same three copies).\n * ====================================================================== */\n\n/** True for a folder that is end-to-end encrypted. */\nexport function isEncryptedFolder(node: { type?: string; e2e?: boolean }): boolean {\n  return node.type === 'dir' && node.e2e === true;\n}\n\n/**\n * The solid folder with a padlock cut OUT of it.\n *\n * One path, `fill-rule=\"evenodd\"`: the shackle and the body are subpaths\n * inside the folder outline, so they become holes and show whatever the tile\n * sits on. That is deliberate — the alternative (drawing the lock in a\n * background colour) picks one background and is wrong on the other two\n * surfaces this tile appears on.\n *\n * ⚠ It replaces a 🔒 that replaced the folder entirely, so the row lost the\n * one thing it had always said: that it is a folder. Both facts are here now,\n * and the callers give the span an `aria-label` for the half a shape cannot\n * carry.\n */\nconst LOCKED_FOLDER =\n  '<path fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\" d=\"' +\n  /* the folder — the same outline as GLYPHS.folder */\n  'M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5z' +\n  /* the shackle: outer arc over, step in, inner arc back, close down the leg */\n  'M9.7 12a2.3 2.3 0 0 1 4.6 0h-1.05a1.25 1.25 0 0 0-2.5 0z' +\n  /* the body */\n  'M9.2 12h5.6a1 1 0 0 1 1 1v3.6a1 1 0 0 1-1 1H9.2a1 1 0 0 1-1-1V13a1 1 0 0 1 1-1z' +\n  '\"/>';\n\nlet LOCKED_FOLDER_TILE = '';\n\n/**\n * Tile markup for an encrypted folder — `fe-ftile--folder`'s own box, so it\n * is the same size, colour and (lack of) chip as every other folder in the\n * column; only the shape differs.\n */\nexport function encryptedFolderTile(): string {\n  if (!LOCKED_FOLDER_TILE) {\n    LOCKED_FOLDER_TILE =\n      '<span class=\"fe-ftile fe-ftile--folder fe-ftile--folder-locked\">' +\n      '<svg class=\"fe-ficon fe-ficon--folder\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n      'stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" ' +\n      'stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n      `${LOCKED_FOLDER}</svg></span>`;\n  }\n  return LOCKED_FOLDER_TILE;\n}\n\n/* ======================================================================\n * gorunum:v1-preview — what the thing IS, said in words.\n *\n * The Type column used to print the raw extension in caps: `TS`, `CSV`,\n * `JPG`. That is not a kind, it is a suffix — it answers \"what did the file\n * get called\" when the question the column asks is \"what is this\". The\n * reference shell prints `TypeScript`, `Spreadsheet`, `Image`.\n *\n * ⚠ ONE table, here, beside the extension → family map it is built on top of\n * (filex lesson #67). Every surface that names a kind — the Type column\n * today, an info panel tomorrow — calls `typeLabelFor` and gets the same\n * answer; a second table beside it would disagree the first week somebody\n * added an extension to only one of them.\n *\n * Three tiers, in order:\n *   1. the extension has a name of its own      →  `ftype.typescript`\n *   2. otherwise its FAMILY has one            →  `ftype.code`, `ftype.image`\n *   3. neither (family `unknown`)              →  the uppercased extension\n *\n * Tier 3 is the deliberate fallback the brief asks for: an unmapped `.zig`\n * reads \"ZIG\", which is at least the truth, rather than an empty cell or a\n * confident lie like \"File\".\n * ====================================================================== */\n\n/** Extension → its own i18n key. Only extensions whose NAME differs from\n *  what the family would say need an entry here. */\nconst EXT_TYPE_KEYS: Record<string, string> = {\n  // Languages the person reading the column thinks of by name.\n  ts: 'ftype.typescript',\n  tsx: 'ftype.typescript',\n  mts: 'ftype.typescript',\n  cts: 'ftype.typescript',\n  js: 'ftype.javascript',\n  jsx: 'ftype.javascript',\n  mjs: 'ftype.javascript',\n  cjs: 'ftype.javascript',\n  vue: 'ftype.vue',\n  py: 'ftype.python',\n  go: 'ftype.go',\n  rs: 'ftype.rust',\n  php: 'ftype.php',\n  rb: 'ftype.ruby',\n  java: 'ftype.java',\n  kt: 'ftype.kotlin',\n  swift: 'ftype.swift',\n  c: 'ftype.c',\n  h: 'ftype.c',\n  cpp: 'ftype.cpp',\n  hpp: 'ftype.cpp',\n  cs: 'ftype.csharp',\n  // Structured text that is code by family but not a language.\n  css: 'ftype.stylesheet',\n  scss: 'ftype.stylesheet',\n  less: 'ftype.stylesheet',\n  html: 'ftype.html',\n  htm: 'ftype.html',\n  json: 'ftype.json',\n  yml: 'ftype.yaml',\n  yaml: 'ftype.yaml',\n  xml: 'ftype.xml',\n  toml: 'ftype.toml',\n  sql: 'ftype.sql',\n  sh: 'ftype.shell',\n  bash: 'ftype.shell',\n  zsh: 'ftype.shell',\n  ps1: 'ftype.powershell',\n  // Plain-text family members that are each their own thing.\n  md: 'ftype.markdown',\n  markdown: 'ftype.markdown',\n  txt: 'ftype.plaintext',\n  log: 'ftype.log',\n  ini: 'ftype.config',\n  conf: 'ftype.config',\n  cfg: 'ftype.config',\n  env: 'ftype.config',\n  // Tabular: a `.csv` IS a spreadsheet to the person looking at the column,\n  // whatever the program that wrote it was.\n  csv: 'ftype.sheet',\n  tsv: 'ftype.sheet',\n  // Design files. No icon family of their own (they fall to `unknown`, which\n  // is a decision for the GLYPH, not for the word) — naming them still beats\n  // printing \"FIG\".\n  fig: 'ftype.figma',\n  sketch: 'ftype.design',\n  xd: 'ftype.design',\n  psd: 'ftype.design',\n  ai: 'ftype.design',\n};\n\n/** Family → i18n key, the second tier. `unknown` is absent on purpose: it is\n *  what sends a node to the uppercased-extension fallback. */\nconst FAMILY_TYPE_KEYS: Partial<Record<IconFamily, string>> = {\n  folder: 'node.folder',\n  image: 'ftype.image',\n  video: 'ftype.video',\n  audio: 'ftype.audio',\n  pdf: 'ftype.pdf',\n  doc: 'ftype.document',\n  sheet: 'ftype.sheet',\n  slides: 'ftype.slides',\n  archive: 'ftype.archive',\n  code: 'ftype.code',\n  text: 'ftype.plaintext',\n};\n\n/**\n * The i18n key naming this node's kind, or null when nothing maps it and the\n * caller should fall back to the extension. Directories answer\n * `node.folder` — the key the grid card's caption already prints, not a\n * second string saying the same word.\n */\nexport function typeLabelKey(node: {\n  type?: string;\n  extension?: string | null;\n}): string | null {\n  if (node.type === 'dir') return 'node.folder';\n  const ext = (node.extension || '').trim().toLowerCase();\n  const own = EXT_TYPE_KEYS[ext];\n  if (own) return own;\n  return FAMILY_TYPE_KEYS[iconFamilyFor(node)] ?? null;\n}\n\n/**\n * The finished words for the Type column and anything else that names a\n * kind: the mapped name, else the uppercased extension, else an em dash.\n *\n * ⚠ The fallback lives HERE rather than at each call site. Two callers each\n * writing `key ? t(key) : ext.toUpperCase()` is two chances to render an\n * empty cell, and the first one to forget the `|| '—'` prints nothing at all\n * for a file with no extension.\n */\nexport function typeLabelFor(\n  node: { type?: string; extension?: string | null },\n  t: (key: string) => string,\n): string {\n  const key = typeLabelKey(node);\n  if (key) return t(key);\n  const ext = (node.extension || '').trim();\n  return ext ? ext.toUpperCase() : '—';\n}\n","/**\n * e2ecrypto — client-side crypto for E2E-encrypted folders (wiring:e2).\n *\n * WebCrypto ONLY — zero dependencies. Design doc: docs/E2E-ENCRYPTION.md.\n *\n * ── Scheme ────────────────────────────────────────────────────────────\n *\n * Every encrypted file wraps its own random DEK under ONE key, the folder\n * master key (FMK), and stores the wrapped copy in its own 97-byte header.\n * The FMK is what a \"key slot\" in the folder marker hands back:\n *\n *   password ─PBKDF2-SHA256(600k, 16B salt)─▶ KEK ─┐\n *   recovery key ─HKDF-SHA256(16B salt)─▶ RKEK ────┼─▶ unwraps the FMK\n *   escrow private key ─RSA-OAEP-256───────────────┘\n *                                                   │\n *   per-file random 32B DEK ◀── AES-GCM-wrapped by the FMK, in the header\n *\n * Adding a recovery path therefore costs one more wrapped copy of a single\n * 32-byte key in the marker — not a re-encrypt of anything. The file format\n * below is UNCHANGED from v1 and stays that way; only the marker grew.\n *\n * ── Marker versions ───────────────────────────────────────────────────\n *\n * v1 (shipped up to 0.30.1) has no slots: the DEK is wrapped directly by\n * the password KEK. Read that as \"the FMK *is* the KEK\". Such folders keep\n * opening with nothing but their password, forever — the v1 read path is a\n * first-class path here, not a migration shim.\n *\n * v2 adds the slots. It comes in two flavours, told apart by `fmk`:\n *   - `fmk: 'wrapped'` — a fresh random FMK, held in `fmk_pw` wrapped under\n *     the password KEK. Every folder created from 0.31 on.\n *   - `fmk: 'kek'`     — a v1 folder that was given recovery keys in place.\n *     Its files were already wrapped under the KEK and are not rewritten, so\n *     the FMK stays defined as \"the password-derived KEK\" and the recovery\n *     slots wrap those raw 32 bytes. The password path is byte-identical to\n *     v1; only the extra slots are new.\n *\n * ── Invariants ────────────────────────────────────────────────────────\n *\n *   - No key, password or recovery key is ever stored, logged or sent to a\n *     server. The FMK lives in an in-memory key ring and dies with the tab.\n *   - `deriveKek` imports non-extractable. Raw KEK bytes are produced ONLY\n *     by `deriveKekBits`, only for a marker whose FMK *is* the KEK\n *     (`upgradeMarkerV1`, and `addEscrowSlot` on a folder it produced), and\n *     only long enough to wrap them into a slot.\n *   - A folder created while escrow was off carries no escrow slot, so the\n *     escrow key cannot open it, and nothing the OPERATOR does changes\n *     that — not enabling escrow, not adopting it, not any admin action or\n *     future version. That is arithmetic, not policy: adding a slot needs\n *     the folder master key, and the server has never held a credential\n *     that produces one.\n *   - The folder's OWNER can, from inside, with the password:\n *     `addEscrowSlot`. That is the only door, it opens from one side only,\n *     and it is the reason `escrowAvailability` says \"not as things stand\"\n *     rather than \"never\".\n *\n * File layout ('filexe2e' magic, fixed 97-byte header) — UNCHANGED in v2:\n *   [0..8)   magic  \"filexe2e\"\n *   [8]      version 0x01\n *   [9..21)  wrapIV  (12B)  — GCM IV of the DEK wrap\n *   [21..69) wrappedDEK (48B = 32B DEK + 16B GCM tag), wrapped by the FMK\n *   [69..81) dataIV  (12B)  — GCM IV of the content\n *   [81..97) reserved (zeros; v2 chunking/metadata)\n *   [97..)   ciphertext (content + 16B GCM tag)\n */\n\nexport const E2E_MARKER_NAME = '.filex-e2e.json';\nexport const E2E_MAGIC = 'filexe2e';\n/** File-header version byte. Unchanged by the recovery work. */\nexport const E2E_VERSION = 1;\n/** Marker schema version written by this build. v1 markers still read. */\nexport const E2E_MARKER_VERSION = 2;\nexport const E2E_DEFAULT_ITERATIONS = 600_000;\nexport const E2E_MIN_ITERATIONS = 600_000;\n/** MVP single-shot in-memory ceiling — larger uploads are refused with a warning. */\nexport const E2E_MAX_FILE_BYTES = 200 * 1024 * 1024;\nexport const E2E_MIN_PASSWORD_LEN = 8;\n/** Entropy of a user recovery key: 20 bytes = 160 bits = exactly 32 base32 chars. */\nexport const E2E_RECOVERY_KEY_BYTES = 20;\n/** The only escrow algorithm this version understands. */\nexport const E2E_ESCROW_ALG = 'RSA-OAEP-256';\n\nconst VERIFY_PLAINTEXT = 'filex-e2e-verify-v1';\nconst MAGIC_BYTES = new TextEncoder().encode(E2E_MAGIC); // 8 bytes\nconst HEADER_LEN = 97;\nconst WRAP_IV_OFF = 9;\nconst WRAPPED_DEK_OFF = 21;\nconst WRAPPED_DEK_LEN = 48;\nconst DATA_IV_OFF = 69;\nconst IV_LEN = 12;\nconst FMK_LEN = 32;\n/** HKDF domain separation for the user recovery key. */\nconst RK_INFO = 'filex-e2e-recovery-v1';\nconst RK_SALT_LEN = 16;\n\n/** How the folder master key is obtained from the password slot. */\nexport type E2eFmkMode = 'kek' | 'wrapped';\n\n/** User-recovery-key slot: HKDF salt + the FMK wrapped under the derived key. */\nexport interface E2eRecoverySlot {\n  salt: string; // base64, 16B HKDF salt\n  blob: string; // base64: 12B IV || AES-GCM(RKEK, FMK)\n}\n\n/** Escrow slot: the FMK encrypted to the installation's escrow public key. */\nexport interface E2eEscrowSlot {\n  /** First 8 bytes of SHA-256(SPKI), hex — names WHICH escrow key this is. */\n  kid: string;\n  alg: string; // E2E_ESCROW_ALG\n  blob: string; // base64: RSA-OAEP-256(escrow public key, FMK)\n}\n\nexport interface E2eMarker {\n  v: number;\n  salt: string; // base64, PBKDF2 salt for the password slot\n  iter: number;\n  verify: string; // base64: 12B IV || AES-GCM ciphertext of VERIFY_PLAINTEXT\n  /** v2 only. Absent on a v1 marker, where the FMK is implicitly the KEK. */\n  fmk?: E2eFmkMode;\n  /** v2 + fmk==='wrapped' only: base64 12B IV || AES-GCM(KEK, FMK). */\n  fmk_pw?: string;\n  /** v2 only, optional: the user recovery key slot. */\n  rk?: E2eRecoverySlot;\n  /** v2 only, optional: the operator escrow slot. */\n  esc?: E2eEscrowSlot;\n  /**\n   * v2 only, optional: an ISO timestamp recording that this folder's owner\n   * was OFFERED an escrow slot and said no.\n   *\n   * It lives in the marker rather than in browser storage because the unit\n   * of the decision is the FOLDER, not the device: the same person opening\n   * the folder from their phone must not be asked again, and a decision\n   * that vanished when someone cleared their site data would be no decision\n   * at all. It travels with the folder through a move, a backup and a\n   * restore, for the same reason the key slots do.\n   *\n   * It holds no key material and hides nothing from the operator — it is a\n   * record of an answer, and its only effect is that filex stops asking.\n   * `addEscrowSlot` clears it, so a decline is reversible by the one person\n   * who can reverse it.\n   */\n  esc_declined?: string;\n}\n\n/** Thrown on wrong password / corrupted ciphertext (GCM tag mismatch). */\nexport class E2eDecryptError extends Error {\n  constructor(msg = 'e2e: decrypt failed') {\n    super(msg);\n    this.name = 'E2eDecryptError';\n  }\n}\n\n// ---------------------------------------------------------------------\n// base64 helpers (no deps)\n// ---------------------------------------------------------------------\n\nexport function bytesToB64(b: Uint8Array): string {\n  let s = '';\n  for (let i = 0; i < b.length; i++) s += String.fromCharCode(b[i]);\n  return btoa(s);\n}\n\nexport function b64ToBytes(s: string): Uint8Array {\n  const raw = atob(s);\n  const out = new Uint8Array(raw.length);\n  for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);\n  return out;\n}\n\n/**\n * Copy into a fresh ArrayBuffer — TS 5.9 BufferSource typing rejects views\n * that may wrap a SharedArrayBuffer, and WebCrypto wants a plain buffer.\n */\nfunction buf(b: Uint8Array): ArrayBuffer {\n  return new Uint8Array(b).buffer as ArrayBuffer;\n}\n\n/** IV || ciphertext, the shape every AES-GCM blob in the marker uses. */\nfunction joinIvCt(iv: Uint8Array, ct: Uint8Array): string {\n  const out = new Uint8Array(iv.length + ct.length);\n  out.set(iv, 0);\n  out.set(ct, iv.length);\n  return bytesToB64(out);\n}\n\nasync function gcmSeal(key: CryptoKey, plain: Uint8Array): Promise<string> {\n  const iv = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(iv) }, key, buf(plain)),\n  );\n  return joinIvCt(iv, ct);\n}\n\n/** Returns null (never throws) on a tag mismatch — i.e. \"wrong key\". */\nasync function gcmOpen(key: CryptoKey, b64: string): Promise<Uint8Array | null> {\n  let raw: Uint8Array;\n  try {\n    raw = b64ToBytes(b64);\n  } catch {\n    return null;\n  }\n  if (raw.length <= IV_LEN) return null;\n  try {\n    const pt = await crypto.subtle.decrypt(\n      { name: 'AES-GCM', iv: buf(raw.slice(0, IV_LEN)) },\n      key,\n      buf(raw.slice(IV_LEN)),\n    );\n    return new Uint8Array(pt);\n  } catch {\n    return null;\n  }\n}\n\n// ---------------------------------------------------------------------\n// Key derivation\n// ---------------------------------------------------------------------\n\n/**\n * Derive the folder KEK from a password. Returns a NON-extractable\n * AES-256-GCM CryptoKey — it can encrypt/decrypt but never be exported,\n * so even a same-origin script can't read the raw key material back.\n */\nexport async function deriveKek(\n  password: string,\n  salt: Uint8Array,\n  iterations: number,\n): Promise<CryptoKey> {\n  const material = await crypto.subtle.importKey(\n    'raw',\n    new TextEncoder().encode(password),\n    'PBKDF2',\n    false,\n    ['deriveKey'],\n  );\n  return crypto.subtle.deriveKey(\n    { name: 'PBKDF2', salt: buf(salt), iterations, hash: 'SHA-256' },\n    material,\n    { name: 'AES-GCM', length: 256 },\n    false, // non-extractable\n    ['encrypt', 'decrypt'],\n  );\n}\n\n/**\n * The same 32 bytes as `deriveKek`, but as raw material.\n *\n * ⚠ Used in exactly one place: upgrading a v1 marker, where the files are\n * already wrapped under the KEK and the recovery slots must therefore hold\n * those very bytes. Nothing else may call this — the steady-state password\n * path uses `deriveKek`, whose key cannot be exported.\n */\nasync function deriveKekBits(\n  password: string,\n  salt: Uint8Array,\n  iterations: number,\n): Promise<Uint8Array> {\n  const material = await crypto.subtle.importKey(\n    'raw',\n    new TextEncoder().encode(password),\n    'PBKDF2',\n    false,\n    ['deriveBits'],\n  );\n  const bits = await crypto.subtle.deriveBits(\n    { name: 'PBKDF2', salt: buf(salt), iterations, hash: 'SHA-256' },\n    material,\n    FMK_LEN * 8,\n  );\n  return new Uint8Array(bits);\n}\n\n/** Import raw 32 bytes as the AES-256-GCM folder master key. */\nasync function importFmk(raw: Uint8Array): Promise<CryptoKey> {\n  return crypto.subtle.importKey('raw', buf(raw), { name: 'AES-GCM' }, false, [\n    'encrypt',\n    'decrypt',\n  ]);\n}\n\n// ---------------------------------------------------------------------\n// User recovery key — 160 bits, Crockford base32, 8 groups of 4\n// ---------------------------------------------------------------------\n\n/** Crockford base32: no I, L, O or U, so it survives being read aloud. */\nconst B32_ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n/**\n * Format 20 raw bytes as the string the user writes down:\n * `XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX` (160 bits, no padding waste).\n */\nexport function formatRecoveryKey(raw: Uint8Array): string {\n  let bits = 0;\n  let acc = 0;\n  let out = '';\n  for (let i = 0; i < raw.length; i++) {\n    acc = (acc << 8) | raw[i];\n    bits += 8;\n    while (bits >= 5) {\n      out += B32_ALPHABET[(acc >>> (bits - 5)) & 31];\n      bits -= 5;\n    }\n  }\n  if (bits > 0) out += B32_ALPHABET[(acc << (5 - bits)) & 31];\n  return (out.match(/.{1,4}/g) || []).join('-');\n}\n\n/** Mint a fresh user recovery key. Shown once, never stored by filex. */\nexport function generateRecoveryKey(): string {\n  return formatRecoveryKey(crypto.getRandomValues(new Uint8Array(E2E_RECOVERY_KEY_BYTES)));\n}\n\n/**\n * Parse a typed-in recovery key back to its 20 bytes, or null when it is not\n * one. Forgiving about how a human retypes it: case, dashes, spaces and the\n * Crockford look-alikes (O to 0, I/L to 1) are all normalised away.\n */\nexport function parseRecoveryKey(s: string): Uint8Array | null {\n  const clean = (s || '')\n    .toUpperCase()\n    .replace(/[\\s-]/g, '')\n    .replace(/O/g, '0')\n    .replace(/[IL]/g, '1');\n  const need = Math.ceil((E2E_RECOVERY_KEY_BYTES * 8) / 5); // 32 chars\n  if (clean.length !== need) return null;\n  const out = new Uint8Array(E2E_RECOVERY_KEY_BYTES);\n  let acc = 0;\n  let bits = 0;\n  let n = 0;\n  for (const ch of clean) {\n    const v = B32_ALPHABET.indexOf(ch);\n    if (v < 0) return null;\n    acc = (acc << 5) | v;\n    bits += 5;\n    if (bits >= 8) {\n      out[n++] = (acc >>> (bits - 8)) & 0xff;\n      bits -= 8;\n    }\n  }\n  return n === E2E_RECOVERY_KEY_BYTES ? out : null;\n}\n\n/** HKDF-SHA256 the recovery key into the AES key that wraps the FMK. */\nasync function deriveRecoveryKek(raw: Uint8Array, salt: Uint8Array): Promise<CryptoKey> {\n  const base = await crypto.subtle.importKey('raw', buf(raw), 'HKDF', false, ['deriveKey']);\n  return crypto.subtle.deriveKey(\n    {\n      name: 'HKDF',\n      hash: 'SHA-256',\n      salt: buf(salt),\n      info: buf(new TextEncoder().encode(RK_INFO)),\n    },\n    base,\n    { name: 'AES-GCM', length: 256 },\n    false,\n    ['encrypt', 'decrypt'],\n  );\n}\n\nasync function sealRecoverySlot(fmk: Uint8Array, recoveryKey: string): Promise<E2eRecoverySlot> {\n  const raw = parseRecoveryKey(recoveryKey);\n  if (!raw) throw new Error('e2e: malformed recovery key');\n  const salt = crypto.getRandomValues(new Uint8Array(RK_SALT_LEN));\n  const rkek = await deriveRecoveryKek(raw, salt);\n  const slot = { salt: bytesToB64(salt), blob: await gcmSeal(rkek, fmk) };\n  raw.fill(0);\n  return slot;\n}\n\n// ---------------------------------------------------------------------\n// Escrow (operator recovery) — RSA-OAEP-256\n// ---------------------------------------------------------------------\n//\n// The server holds the PUBLIC half only, so it can wrap new folders' FMKs to\n// the escrow identity. The private half was handed to the admin at install\n// and is supplied back by hand when it is used. A stolen filex database\n// therefore decrypts nothing.\n\n/** Import the installation escrow public key (base64 SPKI, as the server serves it). */\nexport async function importEscrowPublicKey(spkiB64: string): Promise<CryptoKey> {\n  return crypto.subtle.importKey(\n    'spki',\n    buf(b64ToBytes(spkiB64)),\n    { name: 'RSA-OAEP', hash: 'SHA-256' },\n    true,\n    ['encrypt'],\n  );\n}\n\n/** Import the escrow private key the admin pastes in (base64 PKCS#8, PEM tolerated). */\nexport async function importEscrowPrivateKey(pkcs8B64: string): Promise<CryptoKey> {\n  const clean = (pkcs8B64 || '').replace(/-----[A-Z ]+-----/g, '').replace(/\\s+/g, '');\n  return crypto.subtle.importKey(\n    'pkcs8',\n    buf(b64ToBytes(clean)),\n    { name: 'RSA-OAEP', hash: 'SHA-256' },\n    false,\n    ['decrypt'],\n  );\n}\n\n/**\n * Stable short name for an escrow key: first 8 bytes of SHA-256(SPKI), hex.\n * Written into every escrow slot so a marker says WHICH key opens it, and so\n * the UI can tell \"this server's escrow key\" from \"some other one\".\n */\nexport async function escrowKeyId(spkiB64: string): Promise<string> {\n  const d = new Uint8Array(await crypto.subtle.digest('SHA-256', buf(b64ToBytes(spkiB64))));\n  return Array.from(d.slice(0, 8))\n    .map((x) => x.toString(16).padStart(2, '0'))\n    .join('');\n}\n\nasync function sealEscrowSlot(fmk: Uint8Array, escrowSpkiB64: string): Promise<E2eEscrowSlot> {\n  const pub = await importEscrowPublicKey(escrowSpkiB64);\n  const ct = new Uint8Array(await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, pub, buf(fmk)));\n  return { kid: await escrowKeyId(escrowSpkiB64), alg: E2E_ESCROW_ALG, blob: bytesToB64(ct) };\n}\n\n// ---------------------------------------------------------------------\n// Marker create / parse / verify\n// ---------------------------------------------------------------------\n\n/**\n * Create a v1 folder marker — the pre-0.31 format, with NO recovery of any\n * kind.\n *\n * @deprecated Use `createEncryptedFolder`. Kept exported, and kept producing\n * a genuine v1 marker, so an embedder pinned to the old API keeps creating\n * folders this build can still open rather than half-formed v2 ones.\n */\nexport async function createMarker(\n  password: string,\n  iterations: number = E2E_DEFAULT_ITERATIONS,\n): Promise<{ marker: E2eMarker; kek: CryptoKey }> {\n  const iter = Math.max(E2E_MIN_ITERATIONS, iterations);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(password, salt, iter);\n  const verify = await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT));\n  return { marker: { v: 1, salt: bytesToB64(salt), iter, verify }, kek };\n}\n\nexport interface CreateFolderOptions {\n  iterations?: number;\n  /** Base64 SPKI of the installation escrow key, when escrow is enabled. */\n  escrowPublicKey?: string | null;\n}\n\nexport interface CreatedFolder {\n  marker: E2eMarker;\n  /** The folder master key, ready for encryptFile/decryptFile. */\n  fmk: CryptoKey;\n  /** Show this ONCE. filex never stores it and can never show it again. */\n  recoveryKey: string;\n}\n\n/**\n * Create a v2 encrypted folder: random FMK, wrapped under the password KEK,\n * under a freshly minted user recovery key, and — when the installation has\n * escrow enabled — to the escrow public key.\n */\nexport async function createEncryptedFolder(\n  password: string,\n  opts: CreateFolderOptions = {},\n): Promise<CreatedFolder> {\n  const iter = Math.max(E2E_MIN_ITERATIONS, opts.iterations ?? E2E_DEFAULT_ITERATIONS);\n  const salt = crypto.getRandomValues(new Uint8Array(16));\n  const kek = await deriveKek(password, salt, iter);\n  const rawFmk = crypto.getRandomValues(new Uint8Array(FMK_LEN));\n  const recoveryKey = generateRecoveryKey();\n\n  const marker: E2eMarker = {\n    v: E2E_MARKER_VERSION,\n    salt: bytesToB64(salt),\n    iter,\n    verify: await gcmSeal(kek, new TextEncoder().encode(VERIFY_PLAINTEXT)),\n    fmk: 'wrapped',\n    fmk_pw: await gcmSeal(kek, rawFmk),\n    rk: await sealRecoverySlot(rawFmk, recoveryKey),\n  };\n  if (opts.escrowPublicKey) marker.esc = await sealEscrowSlot(rawFmk, opts.escrowPublicKey);\n\n  const fmk = await importFmk(rawFmk);\n  rawFmk.fill(0);\n  return { marker, fmk, recoveryKey };\n}\n\n/**\n * Give an existing v1 folder recovery keys, in place and without rewriting a\n * single file.\n *\n * The v1 files are wrapped under the password KEK, so the FMK stays defined\n * as \"the KEK\" (`fmk: 'kek'`) and the new slots wrap those raw bytes. The\n * password path afterwards is byte-identical to what it was.\n *\n * ⚠ Requires the password — this is only callable at the one moment filex\n * ever has it. There is no way to give a v1 folder recovery without it.\n * ⚠ When the installation has escrow on, this ALSO hands the operator a key\n * to a folder that did not have one. The caller must say so before asking.\n */\nexport async function upgradeMarkerV1(\n  marker: E2eMarker,\n  password: string,\n  opts: CreateFolderOptions = {},\n): Promise<CreatedFolder> {\n  if (marker.v !== 1) throw new Error('e2e: not a v1 marker');\n  const salt = b64ToBytes(marker.salt);\n  const kek = await deriveKek(password, salt, marker.iter);\n  // Prove the password before touching anything.\n  const ok = await gcmOpen(kek, marker.verify);\n  if (!ok || new TextDecoder().decode(ok) !== VERIFY_PLAINTEXT) {\n    throw new E2eDecryptError('e2e: wrong password');\n  }\n  const rawKek = await deriveKekBits(password, salt, marker.iter);\n  const recoveryKey = generateRecoveryKey();\n  const next: E2eMarker = {\n    v: E2E_MARKER_VERSION,\n    salt: marker.salt,\n    iter: marker.iter,\n    verify: marker.verify,\n    fmk: 'kek',\n    rk: await sealRecoverySlot(rawKek, recoveryKey),\n  };\n  if (opts.escrowPublicKey) next.esc = await sealEscrowSlot(rawKek, opts.escrowPublicKey);\n  rawKek.fill(0);\n  return { marker: next, fmk: kek, recoveryKey };\n}\n\n/**\n * Give an EXISTING v2 folder an escrow slot, in place, using the folder\n * password its owner has just typed.\n *\n * ── Why this exists ─────────────────────────────────────────────────\n *\n * Escrow used to be all-or-nothing at install time, and then adoptable but\n * never retroactive: on any installation that had been running for a while,\n * escrow covered only folders nobody had created yet. On a real deployment\n * the folders that matter already exist, so \"new folders only\" means escrow\n * covers nothing anyone cares about.\n *\n * The server still cannot do this, and that has not changed: adding a slot\n * needs the folder master key, which needs a credential the server has never\n * held. What CAN do it is the browser, at the one moment the password is in\n * memory — exactly where `upgradeMarkerV1` already lives. Same moment, same\n * shape, different slot.\n *\n * ⚠⚠ Accepting hands the operator of this installation a second, permanent\n * way into this folder. It is the folder's owner who decides, from inside,\n * with the password; no configuration change and no admin action can do it\n * for them. The caller MUST say that in those words before calling this —\n * see `e2e.escrowoffer.*` in the locales.\n *\n * ⚠ v2 only. A v1 marker has no slots at all; the path for those is\n * `upgradeMarkerV1`, which already seals an escrow slot when the\n * installation has a key and already discloses it. Two doors into the same\n * room would be two chances to get the disclosure wrong.\n *\n * ⚠ No file is re-encrypted, moved or rewritten. Only `.filex-e2e.json`\n * changes, and only by gaining `esc` (and losing `esc_declined`).\n */\nexport async function addEscrowSlot(\n  marker: E2eMarker,\n  password: string,\n  escrowPublicKey: string,\n): Promise<E2eMarker> {\n  if (marker.v !== 2) throw new Error('e2e: not a v2 marker');\n  if (marker.esc) throw new Error('e2e: this folder already has an escrow slot');\n  if (!escrowPublicKey) throw new Error('e2e: no escrow public key');\n\n  const salt = b64ToBytes(marker.salt);\n  const kek = await deriveKek(password, salt, marker.iter);\n  // Prove the password before touching anything, exactly as the v1 upgrade\n  // does. A wrong password here must not produce a marker at all — half a\n  // marker is a folder nobody can open.\n  const proof = await gcmOpen(kek, marker.verify);\n  if (!proof || new TextDecoder().decode(proof) !== VERIFY_PLAINTEXT) {\n    throw new E2eDecryptError('e2e: wrong password');\n  }\n\n  // The raw FMK, by mode. `wrapped` keeps a random FMK in `fmk_pw`, so the\n  // bytes come back from a GCM open and no extractable KEK is ever derived.\n  // `kek` (a v1 folder upgraded in place) defines the FMK AS the password\n  // key, so those very bytes are what the slot has to wrap — the one case\n  // that needs `deriveKekBits`, for the same reason `upgradeMarkerV1` does.\n  let rawFmk: Uint8Array;\n  if (marker.fmk === 'wrapped') {\n    const opened = marker.fmk_pw ? await gcmOpen(kek, marker.fmk_pw) : null;\n    if (!opened || opened.length !== FMK_LEN) {\n      throw new E2eDecryptError('e2e: could not unwrap the folder master key');\n    }\n    rawFmk = opened;\n  } else {\n    rawFmk = await deriveKekBits(password, salt, marker.iter);\n  }\n\n  const esc = await sealEscrowSlot(rawFmk, escrowPublicKey);\n  rawFmk.fill(0);\n\n  const next: E2eMarker = { ...marker, esc };\n  // A decline that is now moot. Leaving it would make the record say two\n  // contradictory things about the same folder.\n  delete next.esc_declined;\n  return next;\n}\n\n/**\n * Record that this folder's owner was offered an escrow slot and declined.\n *\n * A refusal is a decision, not a delay: without this the offer would come\n * back on every single unlock, which is how people learn to click past\n * security dialogs without reading them. Nothing about the folder's keys\n * changes — the only effect is that filex stops asking.\n *\n * Reversible by `addEscrowSlot`, which is the way back for somebody who\n * says no today and changes their mind next month.\n */\nexport function declineEscrowSlot(marker: E2eMarker, when: string): E2eMarker {\n  return { ...marker, esc_declined: when };\n}\n\n/**\n * Whether this folder's owner should be offered an escrow slot, and whether\n * they have already answered.\n *\n *   'n/a'       nothing to offer: the installation has no escrow key, the\n *               folder already has a slot, or the marker is v1 (whose path\n *               is `upgradeMarkerV1`).\n *   'offer'     the offer applies and no answer has been recorded.\n *   'declined'  the offer applies and the owner said no. Do not ask again;\n *               leave a way back.\n *\n * ⚠ This deliberately does NOT look at whether the folder is unlocked. That\n * is the caller's business, and it matters: the offer may only be shown\n * after an unlock actually succeeded, because accepting needs the password\n * and because asking someone who cannot open the folder to give away a key\n * to it is asking the wrong person.\n */\nexport type EscrowOfferState = 'n/a' | 'offer' | 'declined';\n\nexport function escrowOfferState(\n  m: E2eMarker | null,\n  installationKid: string | null | undefined,\n): EscrowOfferState {\n  if (!installationKid) return 'n/a';\n  if (!m || m.v !== 2 || m.esc) return 'n/a';\n  return m.esc_declined ? 'declined' : 'offer';\n}\n\n/** Parse marker JSON text; returns null when the shape is not a marker we read. */\nexport function parseMarker(text: string): E2eMarker | null {\n  try {\n    const m = JSON.parse(text) as E2eMarker;\n    if (!m || (m.v !== 1 && m.v !== 2)) return null;\n    if (typeof m.salt !== 'string' || typeof m.verify !== 'string') return null;\n    if (typeof m.iter !== 'number' || m.iter < 1) return null;\n    if (m.v === 2) {\n      if (m.fmk !== 'kek' && m.fmk !== 'wrapped') return null;\n      if (m.fmk === 'wrapped' && typeof m.fmk_pw !== 'string') return null;\n    }\n    return m;\n  } catch {\n    return null;\n  }\n}\n\n/** True when the folder has a user recovery key slot. */\nexport function markerHasRecovery(m: E2eMarker | null): boolean {\n  return !!m && m.v === 2 && !!m.rk;\n}\n\n/** True when the folder has an operator escrow slot. */\nexport function markerHasEscrow(m: E2eMarker | null): boolean {\n  return !!m && m.v === 2 && !!m.esc;\n}\n\n/**\n * Why the escrow door is, or is not, on offer for this folder.\n *\n *   'off'        this installation has no escrow key at all.\n *   'available'  the folder is sealed to THIS installation's escrow key.\n *   'predates'   the installation has an escrow key, and this folder has no\n *                escrow slot: it was created before escrow existed here.\n *   'other-key'  the folder carries an escrow slot sealed to a DIFFERENT\n *                key id — it came from another installation, via a restore\n *                or a copied data directory.\n *\n * ⚠ 'predates' exists because escrow can be ADOPTED by an installation\n * that already has folders (FILEX_INSTALLATION_E2E_ESCROW_ADOPT), and\n * adoption is not retroactive: the folder's master key was wrapped to its\n * recovery paths when the folder was created. Before this distinction\n * existed the dialog simply showed no Escrow tab, which is true but says\n * nothing — an admin who knows escrow is on reads a missing tab as a bug,\n * tries the key anyway, and learns the real answer from a failure. The UI\n * has to say it instead.\n *\n * ⚠⚠ 'predates' means \"not as things stand\", NOT \"never\". The folder's\n * owner can add a slot from inside with the password (`addEscrowSlot`,\n * offered at unlock). Any wording built on this state has to leave that\n * door visible, or it tells an operator their escrow key can never reach a\n * folder whose owner could hand it over this afternoon.\n *\n * ⚠ 'other-key' was a quieter lie: the dialog labelled the escrow field\n * with the INSTALLATION's key id whatever the folder's slot said, so a\n * folder restored from another install looked openable by the key the\n * operator has, and was not.\n */\nexport type EscrowAvailability = 'off' | 'available' | 'predates' | 'other-key';\n\nexport function escrowAvailability(\n  m: E2eMarker | null,\n  installationKid: string | null | undefined,\n): EscrowAvailability {\n  if (!installationKid) return 'off';\n  if (!markerHasEscrow(m)) return 'predates';\n  return m!.esc!.kid === installationKid ? 'available' : 'other-key';\n}\n\n/**\n * Check `password` against a folder marker. Resolves to the derived KEK on\n * success, or `null` on a wrong password (GCM tag mismatch on the verify\n * blob). Never talks to any server.\n *\n * ⚠ This returns the KEK, not the FMK. On a v1 folder they are the same key;\n * on a v2 `fmk: 'wrapped'` folder they are not. Use `unlockWithPassword` to\n * get the key that actually decrypts files.\n */\nexport async function verifyPassword(\n  marker: E2eMarker,\n  password: string,\n): Promise<CryptoKey | null> {\n  const kek = await deriveKek(password, b64ToBytes(marker.salt), marker.iter);\n  const pt = await gcmOpen(kek, marker.verify);\n  if (!pt || new TextDecoder().decode(pt) !== VERIFY_PLAINTEXT) return null;\n  return kek;\n}\n\n// ---------------------------------------------------------------------\n// Unlock — the three ways to reach the FMK\n// ---------------------------------------------------------------------\n\n/** Turn a password KEK into the FMK for this marker. */\nasync function fmkFromKek(marker: E2eMarker, kek: CryptoKey): Promise<CryptoKey | null> {\n  // v1, and v2 folders upgraded from v1: the files are wrapped by the KEK.\n  if (marker.v === 1 || marker.fmk === 'kek') return kek;\n  if (!marker.fmk_pw) return null;\n  const raw = await gcmOpen(kek, marker.fmk_pw);\n  if (!raw || raw.length !== FMK_LEN) return null;\n  const fmk = await importFmk(raw);\n  raw.fill(0);\n  return fmk;\n}\n\n/**\n * Unlock with the folder password. Returns the FMK (the key `decryptFile`\n * wants) or null when the password is wrong.\n */\nexport async function unlockWithPassword(\n  marker: E2eMarker,\n  password: string,\n): Promise<CryptoKey | null> {\n  const kek = await verifyPassword(marker, password);\n  if (!kek) return null;\n  return fmkFromKek(marker, kek);\n}\n\n/**\n * Unlock with the user recovery key shown when the folder was created.\n * Returns null for a malformed key, a wrong key, or a folder that has no\n * recovery slot at all — the caller cannot tell those apart, and neither can\n * an attacker.\n */\nexport async function unlockWithRecoveryKey(\n  marker: E2eMarker,\n  recoveryKey: string,\n): Promise<CryptoKey | null> {\n  if (marker.v !== 2 || !marker.rk) return null;\n  const raw = parseRecoveryKey(recoveryKey);\n  if (!raw) return null;\n  let salt: Uint8Array;\n  try {\n    salt = b64ToBytes(marker.rk.salt);\n  } catch {\n    return null;\n  }\n  const rkek = await deriveRecoveryKek(raw, salt);\n  raw.fill(0);\n  const fmkRaw = await gcmOpen(rkek, marker.rk.blob);\n  if (!fmkRaw || fmkRaw.length !== FMK_LEN) return null;\n  const fmk = await importFmk(fmkRaw);\n  fmkRaw.fill(0);\n  return fmk;\n}\n\n/**\n * Unlock with the installation escrow private key.\n *\n * Returns null when the folder has no escrow slot — which is the case for\n * every folder created while escrow was off, and is why escrow cannot be\n * turned on retroactively.\n */\nexport async function unlockWithEscrowKey(\n  marker: E2eMarker,\n  privateKey: CryptoKey,\n): Promise<CryptoKey | null> {\n  if (marker.v !== 2 || !marker.esc || marker.esc.alg !== E2E_ESCROW_ALG) return null;\n  let raw: Uint8Array;\n  try {\n    raw = new Uint8Array(\n      await crypto.subtle.decrypt(\n        { name: 'RSA-OAEP' },\n        privateKey,\n        buf(b64ToBytes(marker.esc.blob)),\n      ),\n    );\n  } catch {\n    return null; // wrong escrow key, or a slot sealed to another installation\n  }\n  if (raw.length !== FMK_LEN) return null;\n  const fmk = await importFmk(raw);\n  raw.fill(0);\n  return fmk;\n}\n\n// ---------------------------------------------------------------------\n// Magic sniff\n// ---------------------------------------------------------------------\n\n/** True when the buffer starts with the 'filexe2e' magic. */\nexport function hasMagic(data: ArrayBuffer | Uint8Array): boolean {\n  const b = data instanceof Uint8Array ? data : new Uint8Array(data);\n  if (b.length < MAGIC_BYTES.length) return false;\n  for (let i = 0; i < MAGIC_BYTES.length; i++) {\n    if (b[i] !== MAGIC_BYTES[i]) return false;\n  }\n  return true;\n}\n\n// ---------------------------------------------------------------------\n// File encrypt / decrypt (one-shot MVP)\n// ---------------------------------------------------------------------\n\n/**\n * Encrypt `content` under the folder master key: mints a fresh DEK, encrypts\n * the content one-shot, wraps the DEK with the FMK and prepends the fixed\n * 'filexe2e' header. Throws when content exceeds E2E_MAX_FILE_BYTES.\n *\n * `fmk` is the key an unlock returned. On a v1 folder that is the password\n * KEK, which is why v1 files keep working untouched.\n */\nexport async function encryptFile(fmk: CryptoKey, content: ArrayBuffer): Promise<ArrayBuffer> {\n  if (content.byteLength > E2E_MAX_FILE_BYTES) {\n    throw new Error('e2e: file exceeds the 200MB single-shot limit');\n  }\n  const rawDek = crypto.getRandomValues(new Uint8Array(32));\n  const dek = await crypto.subtle.importKey('raw', buf(rawDek), { name: 'AES-GCM' }, false, [\n    'encrypt',\n  ]);\n  const wrapIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const dataIV = crypto.getRandomValues(new Uint8Array(IV_LEN));\n  const wrappedDek = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, fmk, buf(rawDek)),\n  );\n  const ct = new Uint8Array(\n    await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buf(dataIV) }, dek, content),\n  );\n  // Zero the raw DEK copy as a hygiene measure (best-effort — GC may have\n  // other copies, but don't leave the obvious one around).\n  rawDek.fill(0);\n\n  const out = new Uint8Array(HEADER_LEN + ct.length);\n  out.set(MAGIC_BYTES, 0);\n  out[8] = E2E_VERSION;\n  out.set(wrapIV, WRAP_IV_OFF);\n  out.set(wrappedDek, WRAPPED_DEK_OFF); // 48 bytes\n  out.set(dataIV, DATA_IV_OFF);\n  // [81..97) reserved zeros\n  out.set(ct, HEADER_LEN);\n  return out.buffer;\n}\n\n/**\n * Decrypt a 'filexe2e' blob with the folder master key. Throws\n * E2eDecryptError on a wrong key / tampered data, and a plain Error when the\n * header is not an e2e file at all.\n */\nexport async function decryptFile(fmk: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\n  const b = new Uint8Array(data);\n  if (!hasMagic(b) || b.length < HEADER_LEN) {\n    throw new Error('e2e: not an encrypted file');\n  }\n  if (b[8] !== E2E_VERSION) {\n    throw new Error(`e2e: unsupported version ${b[8]}`);\n  }\n  const wrapIV = b.slice(WRAP_IV_OFF, WRAP_IV_OFF + IV_LEN);\n  const wrappedDek = b.slice(WRAPPED_DEK_OFF, WRAPPED_DEK_OFF + WRAPPED_DEK_LEN);\n  const dataIV = b.slice(DATA_IV_OFF, DATA_IV_OFF + IV_LEN);\n  let rawDek: ArrayBuffer;\n  try {\n    rawDek = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: buf(wrapIV) }, fmk, buf(wrappedDek));\n  } catch {\n    throw new E2eDecryptError('e2e: DEK unwrap failed (wrong key?)');\n  }\n  const dek = await crypto.subtle.importKey('raw', rawDek, { name: 'AES-GCM' }, false, ['decrypt']);\n  try {\n    return await crypto.subtle.decrypt(\n      { name: 'AES-GCM', iv: buf(dataIV) },\n      dek,\n      buf(b.slice(HEADER_LEN)),\n    );\n  } catch {\n    throw new E2eDecryptError('e2e: content decrypt failed');\n  }\n}\n\n// ---------------------------------------------------------------------\n// In-memory session key ring\n// ---------------------------------------------------------------------\n\n/**\n * Tiny per-explorer key ring: encrypted-folder root (wire path) → FMK.\n * Lives ONLY in memory — \"Lock\" drops the entry, a reload drops all.\n */\nexport function createKeyRing() {\n  const keys = new Map<string, CryptoKey>();\n  return {\n    get(root: string): CryptoKey | undefined {\n      return keys.get(root);\n    },\n    set(root: string, fmk: CryptoKey): void {\n      keys.set(root, fmk);\n    },\n    /** Drop one folder's key (\"Lock\"). */\n    lock(root: string): void {\n      keys.delete(root);\n    },\n    has(root: string): boolean {\n      return keys.has(root);\n    },\n    clear(): void {\n      keys.clear();\n    },\n  };\n}\n\nexport type E2eKeyRing = ReturnType<typeof createKeyRing>;\n","/**\n * listing.ts — shared listing helpers used by BOTH the main panel\n * (FileExplorer.load) and the split-view secondary panel\n * (SecondaryPane.loadPane). SINGLE SOURCE so the two panes can never\n * drift apart: the internal-entry filter and the virtual `.trash` row\n * must be identical in both, otherwise split view shows mismatched rows\n * (the trash row missing on one side → visible row-offset).\n */\nimport { ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport { E2E_MARKER_NAME } from './e2ecrypto';\n\n/** Adapter-strip: `s3-test://fileman/x` → `fileman/x`. */\nexport function stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/**\n * The folder a row sits in, without its storage: `My files://Photos/a.jpg` →\n * `Photos`, and `''` for a row at a storage's root.\n *\n * ⚠⚠ Split on the FIRST `://` (`stripAdapter`), never with a URL-scheme\n * pattern. The list, the grid and the gallery each carried their own copy that\n * stripped `[a-z][a-z0-9+.-]*` followed by `://` — the RFC 3986 shape of a SCHEME, which a\n * storage name is not. A name with a space in it (`My files`, the one the\n * screenshot fixtures use, and a perfectly ordinary thing to call a drive)\n * does not match it, so nothing was stripped, the \"folder\" became\n * `My files://Photos`, and the Location column printed\n * `My files/My files://Photos` — the storage twice and the scheme on show.\n * Measured on Starred, 2026-09-14. An underscore or a leading digit broke it\n * the same way.\n */\nexport function parentDirOf(path: string): string {\n  const rel = stripAdapter(String(path ?? ''));\n  const idx = rel.lastIndexOf('/');\n  return idx === -1 ? '' : rel.slice(0, idx);\n}\n\n/**\n * Hide system/internal entries the user must never see as files:\n * thumbnails, version history, the soft-delete store, keepdir markers,\n * the desktop app's open-with scratch area and the E2E marker. Shared by\n * both panes' listing filters.\n */\nexport function filterInternalEntries(files: FileNode[]): FileNode[] {\n  return (files || []).filter((f) => {\n    if (f.path.includes('.thumbs')) return false;\n    if (f.path.includes('.versions') || f.basename === '.versions') return false;\n    if (f.basename === '.trash') return false;\n    // The desktop app's \"open this document with filex\" scratch area. Real\n    // files live in it for the length of one editing session, but they are the\n    // app's plumbing, not the user's documents -- and a user who has switched\n    // hidden files on is asking to see their OWN dotfiles, not ours. Hidden\n    // absolutely, like .filex-trash and .versions; stale copies are swept by\n    // the desktop app itself, not by hand.\n    if (f.basename === '.filex-open') return false;\n    if (f.basename === '.keepdir') return false;\n    if (f.basename === E2E_MARKER_NAME) return false;\n    return true;\n  });\n}\n\nconst SHOW_HIDDEN_LS_KEY = 'filex.showHidden';\n\nfunction readShowHidden(): boolean {\n  try {\n    return localStorage.getItem(SHOW_HIDDEN_LS_KEY) === '1';\n  } catch {\n    return false; // private mode / no storage → hidden, the safe default\n  }\n}\n\n/**\n * Whether dot-prefixed entries are listed. Off by default, like every other\n * file manager. Shared by both panes so split view can't disagree with itself.\n */\nexport const showHiddenFiles = ref(readShowHidden());\n\nexport function setShowHiddenFiles(v: boolean): void {\n  showHiddenFiles.value = v;\n  try {\n    localStorage.setItem(SHOW_HIDDEN_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* preference just won't persist */\n  }\n}\n\n/**\n * Hide dot-prefixed entries unless the user asked to see them.\n *\n * These are mostly not the user's files at all: a Mac writing over WebDAV\n * leaves a `.DS_Store` in every folder it opens and an AppleDouble `._name`\n * beside every file carrying extended attributes. Finder hides its own litter\n * locally, so seeing it reappear in the web UI reads as corruption.\n *\n * A toggle rather than a blocklist, because they ARE real files: hiding them\n * outright would leave the ones already uploaded unreachable and undeletable.\n */\nexport function filterHiddenEntries(files: FileNode[], showHidden: boolean): FileNode[] {\n  if (showHidden) return files || [];\n  return (files || []).filter((f) => !(f.basename || '').startsWith('.'));\n}\n\n/** filterInternalEntries + filterHiddenEntries — what both panes render. */\nexport function filterListing(files: FileNode[]): FileNode[] {\n  return filterHiddenEntries(filterInternalEntries(files), showHiddenFiles.value);\n}\n\n/** True when `dirname` (adapter-qualified) is the storage root, where the\n *  virtual trash row belongs. */\nexport function isStorageRootDir(dirname: string): boolean {\n  const rel = stripAdapter(dirname);\n  return rel === 'fileman' || rel === '';\n}\n\n/** True when the listing IS the trash view (don't inject the row into itself). */\nexport function isTrashListing(dirname: string): boolean {\n  return stripAdapter(dirname).startsWith('fileman/.trash');\n}\n\n/** The synthetic `.trash` row shown at storage root — rendered as\n *  \"Çöp Kutusu\" / \"Trash\" via the `.trash` basename → locale mapping. */\nexport function makeTrashRow(adapter: string): FileNode {\n  return {\n    type: 'dir',\n    path: `${adapter}://fileman/.trash`,\n    basename: '.trash',\n    extension: '',\n    storage: adapter,\n    visibility: 'private',\n    size: 0,\n    file_size: 0,\n    mime_type: 'inode/directory',\n    extra_metadata: {},\n  } as unknown as FileNode;\n}\n\n/**\n * Inject the virtual `.trash` row at the front of a root listing when\n * enabled. Returns true if a row was added (so the caller can hydrate\n * it). Mutates `files` in place. Single source for both panes.\n *\n * ⚠ `isSearchResult` is not optional politeness — it is the one thing\n * `dirname` cannot tell you. A search answers with the SCOPE it searched, so\n * `?action=search&path=main://&filter=brief` comes back with\n * `dirname: \"main://\"`, identical to the folder listing of the same path\n * (measured). Without this flag the sentinel is unshifted into the search\n * results, and a search for \"brief\" answers with `brief.md` and a folder\n * called Trash that is not a folder, is not a hit, and cannot be searched for.\n * Same family as the `.trash` / `.shared` sentinel bugs fixed in v0.31.0: a\n * virtual row rendered somewhere it has no meaning.\n *\n * Both flags default to `false`, i.e. to the historical behaviour: a caller\n * that never searches and has no panel — which is what an embed with\n * `sideNav: false` is — keeps the row it has always had by saying nothing.\n */\nexport interface TrashRowContext {\n  /**\n   * This listing is the answer to a SEARCH, not the contents of a folder.\n   *\n   * ⚠ The one thing `dirname` cannot tell you: a search answers with the scope\n   * it searched, so `?action=search&path=main://&filter=notes` comes back\n   * carrying `dirname: \"main://\"`, byte-identical to that folder's listing\n   * (measured). Without this the sentinel lands among the hits.\n   */\n  isSearchResult?: boolean;\n  /**\n   * The navigation panel is already offering Trash as a destination.\n   *\n   * ⚠ This row only ever existed because a listing had no other way into the\n   * bin. Once the panel carries a Trash entry that reason is gone and the row\n   * is a second door to the same place — drawn as a 0-byte folder that is not\n   * a folder, sitting among real ones, while the panel's own Trash entry is\n   * three inches to its left. Owner's decision, this release: do not offer the\n   * same door twice.\n   *\n   * ⚠ It is a question about the PANEL, not about the profile. The duplication\n   * is exactly as wrong in `standard` with the panel on as it is in `drive`;\n   * keying it to `uiProfile` would be a rule about the wrong thing.\n   */\n  navOffersTrash?: boolean;\n}\n\nexport function injectTrashRow(\n  files: FileNode[],\n  adapter: string,\n  dirname: string,\n  trashVisible: boolean,\n  ctx: TrashRowContext = {},\n): boolean {\n  // The host's own switch, and still the outer gate: `trashVisible: false`\n  // means no Trash anywhere — no row here, and no entry in the panel either,\n  // so this must be answered before anything about the panel is considered.\n  if (!trashVisible) return false;\n  if (ctx.navOffersTrash) return false;\n  if (ctx.isSearchResult) return false;\n  if (isTrashListing(dirname)) return false;\n  if (!isStorageRootDir(dirname)) return false;\n  files.unshift(makeTrashRow(adapter));\n  return true;\n}\n\n/** Best-effort fill of the trash row's size (total bytes) + date (newest\n *  deletion) from the backend trash listing, so it reads like a real\n *  folder instead of \"— / —\". Non-blocking; mutates the row in place. */\nexport async function hydrateTrashRow(\n  files: FileNode[],\n  storage: string,\n  api: { listTrash: (s?: string) => Promise<{ entries: Array<{ size?: number; deleted_at: string }> }> },\n): Promise<void> {\n  try {\n    const { entries } = await api.listTrash(storage);\n    const row = files.find((f) => f.basename === '.trash');\n    if (!row) return;\n    let total = 0;\n    let newest = 0;\n    for (const e of entries) {\n      total += e.size || 0;\n      const ts = Date.parse(e.deleted_at);\n      if (!Number.isNaN(ts) && ts > newest) newest = ts;\n    }\n    row.size = total;\n    if (newest > 0) row.last_modified = newest;\n  } catch {\n    /* keep the bare row */\n  }\n}\n\n/**\n * Sentinel path segment → locale key, for the virtual views the explorer parks\n * in `dirname` (trash, recent, starred, shared). None has a real folder behind\n * it, so anything that renders a path segment has to translate them or it\n * prints the sentinel.\n *\n * ⚠ ONE map, deliberately. `.trash` predates the other three and its\n * translation was written twice — once in the breadcrumb, once in the tab\n * label. When recent/starred/shared arrived, only the breadcrumb copy was\n * extended, so the tab strip read \".shared\" in front of users (reported\n * 2026-09-04). A second copy of a mapping is a second chance to forget it.\n */\nexport const VIRTUAL_SEGMENTS: Record<string, string> = {\n  /* gorunum:v3-shell — Home is a destination like the rest, so it gets a\n     sentinel like the rest: a restored tab, a reload and a pasted `#.home`\n     all have to reopen the overview instead of asking the backend for a\n     folder called `.home` and landing on \"not found\". */\n  '.home': 'node.home',\n  '.trash': 'node.trash',\n  '.recent': 'node.recent',\n  '.starred': 'node.starred',\n  '.shared': 'node.shared',\n};\n\n/**\n * The tag view's sentinel: `.tag~<name>`, ONE segment, e.g. `.tag~invoices`.\n *\n * Every other virtual view has a fixed label, so a segment→locale-key map is\n * enough for them. A tag's label is the tag itself, so it cannot live in that\n * map — but it must not become a SECOND place that knows about sentinels\n * either, which is exactly how the tab strip came to print `.shared`. Hence\n * `virtualSegmentLabel()` below: the map keeps the static views, this prefix\n * keeps the dynamic one, and every surface that renders a path segment calls\n * the one function that knows both.\n *\n * ⚠ `~` rather than `:` or `/`. `writePersistedPath` runs each segment through\n * `encodeURIComponent`, which leaves `~ - _ . ! * ' ( )` alone and escapes `:`\n * — so `#.tag~invoices` stays readable in the address bar while `.tag:` would\n * show as `#.tag%3Ainvoices`. And one segment rather than two (`.tag/name`)\n * because a two-segment path gives the breadcrumb a clickable `.tag` parent\n * crumb that leads nowhere.\n */\nexport const TAG_SEGMENT_PREFIX = '.tag~';\n\n/** `invoices` → `.tag~invoices`. */\nexport function makeTagSegment(tag: string): string {\n  return `${TAG_SEGMENT_PREFIX}${tag}`;\n}\n\n/** `.tag~invoices` → `invoices`; '' for anything else (incl. a bare `.tag~`). */\nexport function tagOfSegment(segment: string): string {\n  return segment.startsWith(TAG_SEGMENT_PREFIX)\n    ? segment.slice(TAG_SEGMENT_PREFIX.length)\n    : '';\n}\n\n/** True when `path` (user-facing form) IS a tag listing. */\nexport function tagOfPath(path: string): string {\n  const clean = (path || '').replace(/^\\/+|\\/+$/g, '');\n  return tagOfSegment(clean.split('/').pop() || clean);\n}\n\n/** The locale key for a STATIC sentinel segment, or '' otherwise. Prefer\n *  `virtualSegmentLabel` — a tag segment has no locale key to return. */\nexport function virtualSegmentKey(segment: string): string {\n  return VIRTUAL_SEGMENTS[segment] ?? '';\n}\n\n/**\n * What a path segment READS AS: the translated view name for a static\n * sentinel, `#<tag>` for a tag view, '' when it is an ordinary folder (the\n * caller then shows the segment itself).\n *\n * `#` and not the bare name: a lone `invoices` crumb between `/` and nothing\n * is indistinguishable from a folder called invoices. The glyph needs no\n * translation and carries the tag's own name verbatim, which is the point.\n */\nexport function virtualSegmentLabel(segment: string, t: (key: string) => string): string {\n  const key = VIRTUAL_SEGMENTS[segment];\n  if (key) return t(key);\n  const tag = tagOfSegment(segment);\n  return tag ? `#${tag}` : '';\n}\n\n/**\n * True when a USER PATH is one of the virtual views rather than a folder that\n * lives in a storage — `.trash`, `.recent`, `.starred`, `.shared`, `.home`,\n * `.tag~<name>`.\n *\n * ⚠⚠ Why a predicate and not just \"call `virtualSegmentLabel` and see\". The\n * caller that needs this is deciding whether to QUALIFY the path, and\n * qualifying a sentinel destroys it: in multi-storage mode `qualify('.starred')`\n * splits the first segment off as the adapter and answers `.starred://`, so\n * from there on the sentinel is a STORAGE NAME. A storage name is not a path\n * segment, `virtualSegmentLabel` is never asked about it, and the breadcrumb\n * prints `.starred` — which is exactly what the owner saw on 2026-09-13, in\n * every virtual view at once, the night the pane was extracted into\n * `FilePane.vue` and each pane began deriving its own crumb inputs. The\n * resolver was being called the whole time, with an argument that could not\n * match.\n *\n * ⚠ One definition, here beside the map and the tag prefix it asks about, so\n * \"is this a view or a folder?\" cannot be answered two ways: `FileExplorer`'s\n * `virtualViewOf()` (which also names the KIND) is built on this one.\n */\nexport function isVirtualViewPath(path: string): boolean {\n  const clean = String(path ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return false;\n  return !!VIRTUAL_SEGMENTS[clean] || !!tagOfSegment(clean);\n}\n\n/**\n * gorunum:v1 — folders before files, whatever the sort column is.\n *\n * Every file manager a person has used puts directories first, and the reason\n * is not taste: a directory is a place and a file is a thing, and a listing\n * that interleaves them makes the reader check the icon of every row to find\n * out where they can go next. Sorting by size or date interleaves them worst\n * of all, because a folder has neither.\n *\n * Applied as the PRIMARY comparator by both views, so it cannot mean one\n * thing in the list and another in the grid — the two sorts are separate code\n * and this is the rule they have to share (filex lesson #67).\n */\nexport function byFoldersFirst(a: { type?: string }, b: { type?: string }): number {\n  const ad = a.type === 'dir' ? 0 : 1;\n  const bd = b.type === 'dir' ? 0 : 1;\n  return ad - bd;\n}\n","/**\n * sortOrder — THE listing sort: one key, one direction, one comparator, for\n * every surface that draws a folder's contents.\n *\n * ⚠⚠ Why this file exists at all. Before it, the sort lived as two private\n * refs inside `ListView.vue` and the grid had none, so \"sorted by size\" was a\n * fact about one component rather than about the listing: switching grid ⇄\n * list re-ordered the rows under the user, and any second control that wanted\n * to sort would have had to keep its own copy of the answer. That is the exact\n * shape of filex lesson #67 — the grid and the list each holding a private\n * copy of \"folders first\" and drifting apart — one level up.\n *\n * ⚠⚠ …and why it is no longer a module-level SINGLETON. A singleton answers\n * \"what is the sort\" for the whole bundle, which is the right answer only\n * while the bundle draws one listing. The split view draws two, side by side,\n * and the owner's ruling (2026-09-13) is that the second pane is the first\n * pane: it gets the same crumbs, the same filter row, the same view switcher\n * and the same sort control. Two sort CONTROLS over one piece of state is a\n * control that moves the listing the person is not looking at — measured the\n * same day: with the singleton in place, choosing \"Size ↓\" in the right pane\n * re-ordered the left one too.\n *\n * So the state is a STORE (`createSortStore`) and there is one per pane, while\n * everything that is genuinely one answer stays module-level:\n *\n *   · the RULES (`byActiveKey`, `compareNodes`, folders-first, the two click\n *     vocabularies) — written once, closed over each store;\n *   · the LOCALE the `type` key sorts in — one alphabet for the whole bundle;\n *   · the persisted GLOBAL DEFAULT (`filex.list-sort`) — \"the last sort a\n *     person chose\", which is one fact no matter which pane they chose it in.\n *\n * ⚠ Panes find their store by INJECTION (`provideSortStore` / `useSortStore`),\n * not by a prop threaded through every view: `ListView` and `FilterBar` are\n * two levels down and an embedder may mount either on its own. With no\n * provider — a bare `<ListView>` in a test, a host that renders one listing —\n * `useSortStore()` hands back the default store, which IS the old singleton,\n * so nothing that worked before changes.\n *\n * ⚠ Two RULES this file owns, so no caller has to remember them:\n *\n *   1. Folders before files, in every key and BOTH directions. `compareNodes`\n *      applies `byFoldersFirst` as the primary comparator and never multiplies\n *      it by the direction — multiplying would make \"Name ↓\" mean \"files\n *      first\", i.e. the arrow would silently regroup the listing instead of\n *      reversing it. The key only decides the order WITHIN each group.\n *   2. One vocabulary. A column header cycles (`chooseSortKey`: a new key\n *      arrives in its default direction, the active one flips) and a menu item\n *      jumps (`setSort`: a named destination never reverses under you). Both\n *      live here, so the two surfaces reach for the same words instead of each\n *      re-deriving what a click means.\n *\n * ⚠ The persisted shape is the one `ListView` already wrote (`filex.list-sort`,\n * `{key, dir}`), so a user who had sorted a column keeps that sort. The old\n * `key: null` — \"leave the backend's order alone\" — is NOT a key here; see\n * `ListingOrder` below for where that state went and why it could not be one.\n */\nimport { inject, provide, ref, type InjectionKey, type Ref } from 'vue';\n\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { messages } from '../locales';\nimport { typeLabelKey } from './fileIcons';\nimport { byFoldersFirst } from './listing';\n\nexport type SortKey = 'name' | 'type' | 'modified' | 'size';\nexport type SortDir = 'asc' | 'desc';\n\n/**\n * WHERE A LISTING'S ORDER CAME FROM — the third state the old `key: null`\n * used to express, back as a mode rather than as a fourth key.\n *\n *   `sort`      — a folder's contents. The key and the direction below decide\n *                 the order, which is what every control in the UI drives.\n *   `relevance` — a RANKED answer. The server decided the order and it is the\n *                 whole value of the reply; re-applying a key here buries the\n *                 row the person came for.\n *\n * ⚠⚠ Why a mode and not a key. A key is a preference: it is persisted, it is\n * named by a button, and the user picks it. \"Relevance\" is none of those — it\n * is a FACT about the rows in hand, it must not outlive them, and there is no\n * meaningful \"relevance descending\". Making it a fifth member of `SortKey`\n * would have persisted it into the next folder (where nothing is ranked) and\n * put a word in the Sort-by menu that does nothing in nine listings out of\n * ten.\n *\n * ⚠⚠ …and why it is an ARGUMENT and not a field on the store. The store is a\n * pane's preference; this is a property of the ROWS a pane happens to be\n * holding, and one pane can be showing a search while the other shows a\n * folder. Same pane, two navigations, two answers — the caller holding the\n * rows is the only one that knows which it has.\n *\n * Measured, 2026-09-13 (qldemo, query `s`, Name ↑): the server ranked\n * `Documents/server.ts` first and the list drew it fifteenth of seventeen,\n * behind every alphabetically earlier row. The owner's ruling that day:\n * ordinary search and ⌘K stay in relevance order.\n */\nexport type ListingOrder = 'sort' | 'relevance';\n\n/** The four, in the order the menu draws them. One array, so the menu and\n *  `isSortKey` cannot disagree about how many there are. */\nexport const SORT_KEYS: readonly SortKey[] = ['name', 'type', 'modified', 'size'] as const;\n\nconst SORT_LS_KEY = 'filex.list-sort';\n\n/**\n * The order the listing arrives in when nobody has chosen one.\n *\n * ⚠ `name` / ascending, and NOT the reference build's `modified` / descending,\n * deliberately: the backend answers a listing name-ascending already, so this\n * default moves nothing on screen for an existing user — and our list view\n * draws date group headings whenever the key is `modified`, which the\n * reference has no equivalent of. Making `modified` the default would put a\n * heading on the first paint of every folder that nobody asked for. Changing\n * it is this one constant; the consequence is that heading.\n */\nconst DEFAULT_KEY: SortKey = 'name';\n\n/** Dates read newest-first; everything else reads A→Z / smallest-first. */\nexport function defaultSortDir(key: SortKey): SortDir {\n  return key === 'modified' ? 'desc' : 'asc';\n}\n\nfunction isSortKey(v: unknown): v is SortKey {\n  return typeof v === 'string' && (SORT_KEYS as readonly string[]).includes(v);\n}\n\nfunction readStored(): { key: SortKey; dir: SortDir } {\n  const fallback = { key: DEFAULT_KEY, dir: defaultSortDir(DEFAULT_KEY) };\n  if (typeof localStorage === 'undefined') return fallback;\n  try {\n    const raw = localStorage.getItem(SORT_LS_KEY);\n    if (!raw) return fallback;\n    const p = JSON.parse(raw) as { key?: unknown; dir?: unknown };\n    const key = isSortKey(p.key) ? p.key : DEFAULT_KEY;\n    const dir = p.dir === 'asc' || p.dir === 'desc' ? p.dir : defaultSortDir(key);\n    return { key, dir };\n  } catch {\n    return fallback; // private mode / bad JSON\n  }\n}\n\n/**\n * The active locale, for the one comparison that needs words: `type` sorts by\n * the label the Type column PRINTS, so \"Image\" and \"Görsel\" have to fall in\n * their own alphabet's order.\n *\n * ⚠ Module-level and NOT per store, and that is deliberate even now that the\n * key and the direction are per pane: two panes of one window are read by one\n * person in one language. If each store carried its own resolver, the pane\n * whose host forgot to set it would sort by a different alphabet than the pane\n * beside it — the drift this file exists to prevent, in the one field where it\n * would be hardest to see.\n */\nconst localeRef = ref<LocaleCode>('en');\n\nexport function setSortLocale(code: LocaleCode): void {\n  localeRef.value = code;\n}\n\n// ── the comparator ────────────────────────────────────────────────────\n\nfunction modifiedMs(n: FileNode): number | null {\n  const v = n.last_modified;\n  if (!v) return null;\n  return v * (v < 1e12 ? 1000 : 1);\n}\n\nfunction nameCompare(a: FileNode, b: FileNode): number {\n  return (a.basename || '').localeCompare(b.basename || '', undefined, {\n    numeric: true,\n    sensitivity: 'base',\n  });\n}\n\n/** The word the Type column prints for this row — the thing a user sorting by\n *  \"Type\" is looking at. Unmapped kinds fall back to the uppercased extension,\n *  exactly as `typeLabelFor` does, so no row sorts as an empty string. */\nfunction typeLabel(n: FileNode): string {\n  const key = typeLabelKey(n);\n  if (key) {\n    const cat = messages[localeRef.value] ?? messages.en;\n    return cat[key] ?? key;\n  }\n  const ext = (n.extension || '').trim();\n  return ext ? ext.toUpperCase() : '';\n}\n\n/** The active key's own order, direction applied. Folders-first is NOT here —\n *  it is the primary comparator in `compareNodes` and must not be reversed.\n *\n *  ⚠ Written ONCE and closed over each store's refs, rather than copied into\n *  a store factory: the rule is the same in every pane and a per-pane copy of\n *  it is how the grid and the list drifted in the first place. */\nfunction byActiveKey(key: SortKey, dirWord: SortDir, a: FileNode, b: FileNode): number {\n  const dir = dirWord === 'asc' ? 1 : -1;\n  switch (key) {\n    case 'name':\n      return dir * nameCompare(a, b);\n    case 'size':\n      return dir * ((a.size ?? -1) - (b.size ?? -1));\n    case 'type': {\n      const c = typeLabel(a).localeCompare(typeLabel(b), undefined, { sensitivity: 'base' });\n      // ⚠ The tiebreak is name-ASCENDING in both directions, on purpose: every\n      // image in a folder shares one label, so without it a Type sort leaves\n      // whole runs in whatever order the backend happened to answer, and\n      // \"Type ↓\" would scramble them again rather than reverse the groups.\n      return c !== 0 ? dir * c : nameCompare(a, b);\n    }\n    default: {\n      const am = modifiedMs(a);\n      const bm = modifiedMs(b);\n      // Undated rows go last in BOTH directions, so date groups stay clean.\n      if (am == null && bm == null) return 0;\n      if (am == null) return 1;\n      if (bm == null) return -1;\n      return dir * (am - bm);\n    }\n  }\n}\n\n// ── the store ─────────────────────────────────────────────────────────\n\n/**\n * One pane's sort. Everything a surface needs to READ the order, to CHANGE it\n * from either of the two control vocabularies, and to sort rows by it.\n *\n * ⚠ `key` and `dir` are exposed as refs so a `computed` that reads them\n * subscribes to the next change — the property the module-level singleton had\n * and the reason every listing re-sorted itself for free.\n */\nexport interface SortStore {\n  readonly key: Ref<SortKey>;\n  readonly dir: Ref<SortDir>;\n  /** Set both halves outright. `dir` omitted → the key's own default. */\n  setSort(key: SortKey, dir?: SortDir): void;\n  /** Restore a remembered sort WITHOUT recording it as a fresh choice. */\n  applySort(key: SortKey, dir: SortDir): void;\n  /** Same order, other way round. The direction button's whole job. */\n  toggleSortDir(): void;\n  /** A column header click — see `chooseSortKey` below. */\n  chooseSortKey(key: SortKey): void;\n  /** Folders first, then the active key. Subscribes the reader. */\n  compareNodes(a: FileNode, b: FileNode): number;\n  /** THE comparator for a listing, given where its order came from. */\n  compareInOrder(order: ListingOrder): (a: FileNode, b: FileNode) => number;\n  /** The listing, in its order. A COPY. */\n  sortListing(files: FileNode[], order?: ListingOrder): FileNode[];\n}\n\nfunction persist(key: SortKey, dir: SortDir): void {\n  try {\n    localStorage.setItem(SORT_LS_KEY, JSON.stringify({ key, dir }));\n  } catch {\n    /* quota / private mode — the in-memory refs still moved */\n  }\n}\n\n/**\n * A fresh sort store, seeded from the global default.\n *\n * ⚠⚠ Every store WRITES the global default when a person chooses in it, and\n * that is the point rather than an oversight: `filex.list-sort` is defined as\n * \"the last sort a person chose\", and a choice made in the right-hand pane is\n * still a choice. What must not happen — and does not, because the refs are\n * per store — is the OTHER pane moving when it does. Measured 2026-09-13:\n * sorting the split pane by Size left the main pane on Name ↑ and made Size\n * the arrangement the next unconfigured folder opens in.\n */\nexport function createSortStore(): SortStore {\n  const stored = readStored();\n  const key = ref<SortKey>(stored.key);\n  const dir = ref<SortDir>(stored.dir);\n\n  function setSort(k: SortKey, d?: SortDir): void {\n    key.value = k;\n    dir.value = d ?? defaultSortDir(k);\n    persist(key.value, dir.value);\n  }\n\n  /**\n   * tablo:t1 — RESTORE a sort that was already the person's, without recording\n   * it as a fresh choice.\n   *\n   * ⚠⚠ The difference from `setSort` is the whole point and it is not\n   * cosmetic. `filex.list-sort` is the GLOBAL default — \"what a folder I have\n   * never set up opens as\" — and per-folder memory (`lib/viewPrefs`) is\n   * layered on top of it. If applying a folder's remembered sort went through\n   * `setSort`, walking into one folder that is sorted by size would quietly\n   * make Size the default for every folder in the product, and the person\n   * would have no idea which folder did it. Restoring is not choosing; only a\n   * choice writes the default.\n   */\n  function applySort(k: SortKey, d: SortDir): void {\n    key.value = k;\n    dir.value = d;\n  }\n\n  function toggleSortDir(): void {\n    dir.value = dir.value === 'asc' ? 'desc' : 'asc';\n    persist(key.value, dir.value);\n  }\n\n  /**\n   * A COLUMN HEADER click: a new key arrives in its own default direction, the\n   * key already active flips.\n   *\n   * ⚠ Not what the Sort-by menu calls — see `setSort`. A header is a toggle\n   * (click Name twice and you expect Z→A); a menu item is a destination (pick\n   * Name twice and you expect Name, still). Both meanings are written here so\n   * neither surface has to invent one.\n   */\n  function chooseSortKey(k: SortKey): void {\n    if (key.value === k) toggleSortDir();\n    else setSort(k);\n  }\n\n  function compareNodesFn(a: FileNode, b: FileNode): number {\n    return byFoldersFirst(a, b) || byActiveKey(key.value, dir.value, a, b);\n  }\n\n  function compareInOrderFn(order: ListingOrder): (a: FileNode, b: FileNode) => number {\n    return order === 'relevance' ? byFoldersFirst : compareNodesFn;\n  }\n\n  return {\n    key,\n    dir,\n    setSort,\n    applySort,\n    toggleSortDir,\n    chooseSortKey,\n    compareNodes: compareNodesFn,\n    compareInOrder: compareInOrderFn,\n    sortListing: (files: FileNode[], order: ListingOrder = 'sort') =>\n      [...(files || [])].sort(compareInOrderFn(order)),\n  };\n}\n\n/**\n * The store a surface gets when nobody provided one: a bare `<ListView>` in a\n * test, an embedder mounting one listing, and the explorer's own MAIN pane —\n * which keeps using it so that everything already reading the module-level\n * functions below (per-folder view memory, `displayFiles`) is talking about\n * the same state the main pane's controls drive.\n */\nconst defaultStore = createSortStore();\n\nexport const SORT_STORE_KEY: InjectionKey<SortStore> = Symbol('fe-sort-store');\n\n/** Hand this subtree its own sort. Called by the pane component, once. */\nexport function provideSortStore(store: SortStore): void {\n  provide(SORT_STORE_KEY, store);\n}\n\n/**\n * THE store for the surface calling it.\n *\n * ⚠ Must be called during `setup()` (it injects). Surfaces hold the result and\n * read `.key` / `.dir` inside their computeds, which is what subscribes them.\n */\nexport function useSortStore(): SortStore {\n  return inject(SORT_STORE_KEY, defaultStore);\n}\n\n// ── the default store's API, as free functions ────────────────────────\n//\n// Everything below is the module-level API this file shipped with, now a thin\n// pass-through to the default store. Kept — not deprecated — because the sort\n// is genuinely one answer for a host that draws ONE listing, which is every\n// embed except the split view, and because the explorer's per-folder view\n// memory reads and writes exactly this state for its main pane.\n\nexport function activeSortKey(): SortKey {\n  return defaultStore.key.value;\n}\n\nexport function activeSortDir(): SortDir {\n  return defaultStore.dir.value;\n}\n\nexport function setSort(key: SortKey, dir?: SortDir): void {\n  defaultStore.setSort(key, dir);\n}\n\nexport function applySort(key: SortKey, dir: SortDir): void {\n  defaultStore.applySort(key, dir);\n}\n\n/**\n * tablo:t1 — THE GLOBAL DEFAULT: the sort a folder nobody has configured opens\n * in. Re-read from storage rather than mirrored in a second ref, because\n * `setSort` writes there and `applySort` deliberately does not — so the stored\n * value IS \"the last sort a person chose\", which is exactly the definition of\n * the default, and a mirror could only drift from it.\n */\nexport function globalSort(): { key: SortKey; dir: SortDir } {\n  return readStored();\n}\n\nexport function toggleSortDir(): void {\n  defaultStore.toggleSortDir();\n}\n\nexport function chooseSortKey(key: SortKey): void {\n  defaultStore.chooseSortKey(key);\n}\n\n/**\n * The whole rule, in order: folders before files, then the active key.\n *\n * Reading this subscribes the caller to the sort state, so a `computed` built\n * on it re-runs when the key or the direction changes.\n */\nexport function compareNodes(a: FileNode, b: FileNode): number {\n  return defaultStore.compareNodes(a, b);\n}\n\n/**\n * THE comparator for a listing, given where its order came from. Every\n * surface that draws rows asks this one question; none of them re-derives the\n * answer, which is the whole reason this module exists.\n *\n * ⚠⚠ `relevance` is `byFoldersFirst` and NOTHING ELSE — deliberately the\n * exact function `GridView` already sorts by, so the grid needs no knowledge\n * of relevance at all and cannot drift from the list. `web/tests/lib/\n * searchRelevanceOrder.test.ts` asserts that identity; if this ever returns\n * something else, that test goes red and names GridView as the file that has\n * to change in the same commit. Teaching one view about relevance and leaving\n * the other sorting is filex lesson #67 one level up.\n *\n * ⚠ Folders still come FIRST in a ranked set, and that is a decision, not an\n * oversight. Folders-first is not a sort here, it is a GROUPING: the grid\n * draws it as two labelled sections (\"Folders\" / \"Files\"), so a result set\n * that interleaved them would make the grid's own headings false. The ranking\n * is kept in full INSIDE each group — `Array#sort` is stable and this\n * comparator returns 0 for any two rows of the same kind — which is as much\n * relevance as a surface that groups folders can honestly offer. The cost is\n * visible and bounded: a folder that ranked seventh is drawn above the file\n * that ranked first. The alternative costs the grid its sections.\n */\nexport function compareInOrder(order: ListingOrder): (a: FileNode, b: FileNode) => number {\n  return defaultStore.compareInOrder(order);\n}\n\n/**\n * The listing, in its order. A COPY — the caller's array is usually a prop or\n * a computed's source and sorting it in place mutates somebody else's state.\n *\n * `Array#sort` is stable, so rows the comparator calls equal keep the order\n * they arrived in — which is precisely what carries the server's ranking\n * through `relevance` mode.\n *\n * ⚠ `order` defaults to `'sort'`: an omitted argument is how every caller\n * holding an ordinary folder listing asks for the active key, and that is the\n * overwhelming majority of them.\n */\nexport function sortListing(files: FileNode[], order: ListingOrder = 'sort'): FileNode[] {\n  return defaultStore.sortListing(files, order);\n}\n","/**\n * viewPrefs — HOW A FOLDER LOOKS, remembered.\n *\n * Two pieces of state live here, and the split between them is the whole\n * design decision, so it is written down before any code:\n *\n *   1. PER-FOLDER, because it is a fact about the FOLDER. The view mode\n *      (list / grid / gallery) and the sort (key + direction). A photo album\n *      wants a gallery sorted by name; Downloads wants a list sorted by date.\n *      Those are properties of the contents, so they are remembered against\n *      the folder — Windows Explorer's behaviour, and what the owner asked\n *      for: \"x folder'ında son görünüm nasıl kaldı ise öyle görünümde\n *      göstermemiz lazım.\"\n *\n *   2. GLOBAL, because it is a fact about YOUR SCREEN. Column widths and\n *      which columns you hide. The owner's own complaint is the proof: the\n *      Name column is crushed *at 960px*, which is the width of his review\n *      window — not a property of any folder he was standing in. Remembering\n *      a width per folder would mean dragging Name wider in Documents and\n *      finding it narrow again in Photos, forever. \"I never look at Owner\" is\n *      likewise a statement about the person, not about a folder.\n *\n * ⚠⚠ THE RULE, in one sentence, because a rule that cannot be said in one\n * sentence cannot be explained to the person it surprises:\n *\n *     Your last choice becomes the default for every folder you have never\n *     set up, and each folder you DO set up keeps its own — \"Apply to all\n *     folders\" throws the per-folder ones away.\n *\n * That is deliberately not \"per-folder silently wins\". Every change writes\n * BOTH the folder's memory and the global default (`filex.view-mode`,\n * `filex.list-sort`, which already existed and are not replaced here), so the\n * person who switches to List while standing in one folder gets List in every\n * folder they have not deliberately configured. The only surprise left is the\n * folder they configured themselves last week, and that surprise IS the\n * feature. The escape hatch exists for the day it stops being one.\n *\n * ⚠⚠ WHERE IT IS STORED: the DATABASE, against the user, as one JSON\n * document — not `localStorage`, where every other view preference in this\n * product lives. The owner's decision, 2026-09-13: \"tarayıcıya değil db'ye\n * kaydedeceğiz, basit bir json olarak. Oradan çekersek ayarları, tarayıcıda 36\n * user ile girsin yine fark etmez.\"\n *\n * Browser storage is per BROWSER, not per person. On a shared machine — or any\n * browser two accounts sign into one after the other — the second person\n * silently inherits the first person's folder arrangements: no error, nothing\n * to notice, just somebody else's layout. Namespacing the key by account would\n * only narrow that; it could not close it, because the account is not known\n * until a round trip has already happened. On the user row it cannot happen at\n * all, and the arrangements follow the person to the desktop app and to their\n * other machines — which is what \"her user kendi görünümünü görür\" actually\n * asks for.\n *\n * ⚠ This file therefore holds NO transport. The explorer injects one\n * (`attachViewPrefsStore`) the same way `useThumbs` is handed an api, so the\n * module stays testable without a server and an embed with no account degrades\n * to \"remember nothing\" rather than to an error.\n *\n * ⚠ Grouping is NOT a third axis. `ListView` draws date headings exactly when\n * the sort key is `modified`, so \"a time-grouped view in this folder\" — the\n * owner's own example — is already what remembering the sort key delivers.\n * Adding a separate `grouping` field would create a state where the key says\n * one thing and the grouping another, and no view could honestly draw both.\n */\nimport { ref } from 'vue';\n\nimport type { SortDir, SortKey } from './sortOrder';\n\nexport type ViewMode = 'list' | 'grid' | 'gallery';\n\n/**\n * The columns, in the order the list draws them.\n *\n * ⚠⚠ `name` IS one of them now. It used to be excluded here with the note \"it\n * is the flexible column and is never hidden or sized by hand\", and that\n * exclusion is precisely the behaviour the owner rejected: as the only\n * `1fr` track Name absorbed whatever every other column gave up, so narrowing\n * Size made Name grow — \"küçültme yapınca name kısmı büyüyormuş gibi davranıyor\n * — bu davranış yanlış, istersem name'i de kısabilir olmalıyım.\" It has a real\n * width like every other column and a handle of its own.\n *\n * It is still not HIDEABLE and not MOVABLE: it carries the tick, the tile and\n * the row's click target, and every file manager pins it first.\n */\nexport type ColumnId = 'name' | 'type' | 'location' | 'owner' | 'modified' | 'size' | 'star';\n\n// ── per-folder memory ─────────────────────────────────────────────────\n\n/**\n * One folder's remembered setup. Short keys on purpose — this is a map with\n * one entry per folder the person has configured, and the whole map is\n * re-serialised on every write.\n */\nexport interface FolderPrefs {\n  /** view mode */\n  v?: ViewMode;\n  /** sort key */\n  k?: SortKey;\n  /** sort direction */\n  d?: SortDir;\n  /** last used, epoch SECONDS — the LRU clock. */\n  t: number;\n}\n\n/**\n * THE TRANSPORT — injected, so this module knows nothing about fetch, auth or\n * URLs and a test can drive it with two functions.\n *\n * `load` resolves the stored document, or null when there is nobody to store\n * one for (an embed on a shared app token, a public share link). `save` is\n * FIRE AND FORGET on purpose: a view preference is never worth blocking an\n * interface for, and a failed write must leave the change on screen — the next\n * write sends the whole document anyway, so a dropped one heals itself.\n */\nexport interface ViewPrefsTransport {\n  load: () => Promise<unknown>;\n  save: (doc: unknown) => void;\n}\n\nlet transport: ViewPrefsTransport | null = null;\n\n/**\n * Has the document resolved yet?\n *\n * ⚠⚠ Nothing is applied to a folder until it has. This is the whole answer to\n * \"the remembered view arrives after the listing paints and the person sees\n * list view jump to grid\": the fetch is started at mount, in parallel with the\n * first listing, and it is a single small row against a listing that has to\n * walk a storage — so in practice it lands first. Correctness does not depend\n * on that race, though, because a folder whose document has not arrived simply\n * follows the global default and is corrected once, exactly when the answer is\n * known.\n *\n * ⚠ It is also how a caller with NO user degrades cleanly: `load` resolves\n * null, `ready` still becomes true, and every read below answers \"nothing\n * remembered\" forever after. No error, no retry loop, no half state.\n */\nconst ready = ref(false);\n/** True when there is somebody to save for. False = read-only, session-only. */\nconst persistable = ref(false);\n\nexport function viewPrefsReady(): boolean {\n  return ready.value;\n}\n\n/**\n * IS THE MEMORY ON AT ALL — a preference the person turns on, default OFF.\n *\n * Owner's ruling: \"User bunu ayarlardan açabilir olacak isterse.\" Off, every\n * folder follows the global view mode and sort exactly as it did before this\n * module existed, and nobody is surprised by a folder that disagrees with the\n * button they just pressed. On, a folder comes back the way they left it.\n *\n * ⚠ It lives in the same document as the folders themselves, so the switch\n * follows the person between devices like everything else here. The control\n * itself belongs to the host's user-settings modal, which is not this package\n * — the contract is `folderMemoryEnabled()` to read and\n * `setFolderMemoryEnabled()` to write.\n */\nconst memoryOn = ref(false);\n\nexport function folderMemoryEnabled(): boolean {\n  return memoryOn.value;\n}\n\nexport function setFolderMemoryEnabled(on: boolean): void {\n  if (memoryOn.value === on) return;\n  memoryOn.value = on;\n  scheduleSave();\n}\n\ntype FolderMap = Record<string, FolderPrefs>;\n\nfunction nowSec(): number {\n  return Math.floor(Date.now() / 1000);\n}\n\nfunction isViewMode(v: unknown): v is ViewMode {\n  return v === 'list' || v === 'grid' || v === 'gallery';\n}\n\n/** The map, in memory. A ref so a surface that lists the remembered folders\n *  (the column menu's \"Apply to all folders\" / \"Forget this folder\") re-renders\n *  when one is written or dropped. */\nconst folderMap = ref<FolderMap>({});\n\nfunction readFolderMap(raw: unknown): FolderMap {\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n  const out: FolderMap = {};\n  for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n    if (!v || typeof v !== 'object') continue;\n    const e = v as Record<string, unknown>;\n    const t = typeof e.t === 'number' && Number.isFinite(e.t) ? e.t : 0;\n    const entry: FolderPrefs = { t };\n    if (isViewMode(e.v)) entry.v = e.v;\n    if (e.k === 'name' || e.k === 'type' || e.k === 'modified' || e.k === 'size') entry.k = e.k;\n    if (e.d === 'asc' || e.d === 'desc') entry.d = e.d;\n    // An entry that remembers nothing is noise from a half-written document.\n    if (entry.v || entry.k) out[k] = entry;\n  }\n  return out;\n}\n\n/**\n * HOW MANY FOLDERS WE REMEMBER, and how the number was chosen.\n *\n * ⚠⚠ Without a cap this is one entry per folder ever visited, forever — and\n * now that the document lives in a database row rather than in a browser, it is\n * a row that grows without bound for the life of the account, replicated into\n * every backup. The endpoint refuses a document over 128 KB, so left uncapped\n * the failure would eventually be that saving stops working, silently, for the\n * people who use the product most.\n *\n * 300 is derived, not picked: an entry serialises to ~110 bytes (a qualified\n * folder path plus four short fields), so 300 of them is ~33 KB — comfortably\n * inside that limit with room for longer paths than the estimate assumed. And\n * it is far more folders than a person deliberately configures: the map only\n * gains an entry when someone CHANGES a view (see `touchFolder` — merely\n * walking through a folder writes nothing), so in real use the cap is never\n * reached and nothing is ever evicted. It is a ceiling on the pathological\n * case, not a working limit.\n */\nexport const FOLDER_CAP = 300;\n\n/**\n * Drop the least-recently-USED entries until the map fits the cap.\n *\n * ⚠ Used, not written: `touchFolder` bumps `t` when a remembered folder is\n * OPENED as well as when it is changed, so a folder you keep visiting does not\n * age out merely because you have not re-sorted it lately. Evicting by write\n * time would throw away exactly the folders whose memory is working.\n */\nfunction evict(): void {\n  const entries = Object.entries(folderMap.value);\n  if (entries.length <= FOLDER_CAP) return;\n  entries.sort((a, b) => b[1].t - a[1].t); // newest first\n  const kept: FolderMap = {};\n  for (const [k, v] of entries.slice(0, FOLDER_CAP)) kept[k] = v;\n  folderMap.value = kept;\n}\n\n/**\n * THE KEY a folder is remembered under.\n *\n * ⚠⚠ Read filex issue #21 before changing this. A storage's NAME is editable —\n * that is the point of a name — so it is not a stable address; every protocol\n * accepts a storage's immutable `uid` as the first path segment for exactly\n * that reason (`backend/internal/storageref`). This function therefore takes\n * the storage REF the host gave us and does not care which of the two it is:\n * the moment `config.storages[].uid` is populated, keys built here become\n * rename-proof with no change to this file.\n *\n * ⚠ Until then the key carries a storage NAME, and the consequences are worth\n * stating rather than hiding:\n *   · renaming a storage loses its folders' memory (they fall back to the\n *     global default — a mild, self-healing loss, and the LRU ages the orphans\n *     out);\n *   · deleting a storage and creating a new one with the SAME name hands the\n *     new one the old one's remembered views. Rare, bounded to view mode and\n *     sort, and the fix is the one line of plumbing named above.\n * What it does NOT do is collide across storages that exist at the same time,\n * because two live storages cannot share a name.\n *\n * The relative path is normalised so `a/b`, `/a/b/` and `a//b` are one folder.\n */\nexport function folderKey(storageRef: string, relPath: string): string {\n  const ref = String(storageRef ?? '').trim();\n  const rel = String(relPath ?? '')\n    .replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '')\n    .replace(/\\/{2,}/g, '/')\n    .replace(/^\\/+|\\/+$/g, '');\n  if (!ref) return rel;\n  /* ⚠ No trailing slash on a storage ROOT. `thumbfix/` and `thumbfix` would be\n   * two keys for one folder, and the second is the one every caller builds —\n   * measured: the seeded default for `.recent` never fired, because the\n   * explorer asked for `.recent/` and the table is keyed `.recent`. */\n  return rel ? `${ref}/${rel}` : ref;\n}\n\n/**\n * What a folder with NO memory of its own should open as, when the answer is\n * not simply the global default.\n *\n * Only Recent is in here, and it earns it: Recent's whole promise is \"the\n * things you were just in\", so opening it alphabetically buries the file the\n * person came back for. Sorting it by date is also what makes its date\n * headings honest — see the note on grouping in `FileExplorer`.\n *\n * ⚠ A seed, not an override: the moment someone sorts Recent by name, that\n * choice is stored against `.recent` like any other folder's and this table\n * stops being consulted for it.\n */\nconst SEEDED: Record<string, Omit<FolderPrefs, 't'>> = {\n  '.recent': { k: 'modified', d: 'desc' },\n};\n\n/**\n * What this folder is remembered as, or the seed, or nothing.\n *\n * ⚠⚠ The SEED is answered even when the memory is switched off, and the\n * stored map only when it is on. They are two different things wearing one\n * shape: the seed is what Recent sorts by — a property of that view, which the\n * owner asked for directly and which must not hinge on an unrelated preference\n * — while the map is the per-folder memory the preference governs. Putting the\n * gate here rather than at the caller is what keeps every caller from having to\n * remember the distinction.\n */\nexport function folderPrefs(key: string): Omit<FolderPrefs, 't'> | null {\n  if (!key) return null;\n  if (memoryOn.value) {\n    const hit = folderMap.value[key];\n    if (hit) {\n      const { t: _t, ...rest } = hit;\n      void _t;\n      return rest;\n    }\n  }\n  return SEEDED[key] ?? null;\n}\n\n/** True when this folder has a memory the PERSON made (not a seed) — what the\n *  \"Reset this folder\" affordance is gated on. */\nexport function folderIsRemembered(key: string): boolean {\n  return memoryOn.value && !!key && !!folderMap.value[key];\n}\n\n/** How many folders are remembered — the \"Apply to all folders\" copy says so,\n *  because an escape hatch that does not say what it throws away is a trap. */\nexport function rememberedCount(): number {\n  return memoryOn.value ? Object.keys(folderMap.value).length : 0;\n}\n\n/**\n * Remember a change against this folder.\n *\n * ⚠ The ONLY thing that creates an entry. Navigation does not (see\n * `touchFolder`), so the map stays the set of folders somebody deliberately\n * set up rather than a log of everywhere they have ever been — which is both\n * why the cap is never reached in practice and why \"Apply to all folders\" has\n * a small, comprehensible number to report.\n */\nexport function rememberFolder(key: string, patch: Omit<FolderPrefs, 't'>): void {\n  if (!key || !memoryOn.value) return;\n  const prev = folderMap.value[key];\n  folderMap.value = {\n    ...folderMap.value,\n    [key]: { ...(prev ?? {}), ...patch, t: nowSec() },\n  };\n  evict();\n  scheduleSave();\n}\n\n/**\n * Mark a remembered folder as used, for the LRU clock — and ONLY if it is\n * already remembered. Called on navigation.\n *\n * ⚠ The guard is the point. Bumping an absent key would create an entry for\n * every folder anyone ever opens, which is the unbounded growth the cap exists\n * to survive; keeping the guard means the cap is a safety net rather than a\n * working limit.\n */\nexport function touchFolder(key: string): void {\n  if (!key || !memoryOn.value) return;\n  const prev = folderMap.value[key];\n  if (!prev) return;\n  const t = nowSec();\n  if (prev.t === t) return; // same second — nothing to write\n  folderMap.value = { ...folderMap.value, [key]: { ...prev, t } };\n  scheduleSave();\n}\n\n/** Forget one folder: it goes back to following the global default. */\nexport function forgetFolder(key: string): void {\n  if (!key || !folderMap.value[key]) return;\n  const next = { ...folderMap.value };\n  delete next[key];\n  folderMap.value = next;\n  scheduleSave();\n}\n\n/**\n * THE ESCAPE HATCH — \"Apply to all folders\".\n *\n * Forgets every per-folder memory. The caller has already written the current\n * folder's setup to the global default (every change does), so the visible\n * effect is that every folder now opens the way this one does, which is what\n * the words promise.\n */\nexport function forgetAllFolders(): void {\n  folderMap.value = {};\n  scheduleSave();\n}\n\n// ── columns: widths + visibility (global) ─────────────────────────────\n\n\nexport interface ColumnSpec {\n  id: ColumnId;\n  /** Default width in px. */\n  width: number;\n  min: number;\n  max: number;\n  /** Can the person hide it from the header menu? */\n  hideable: boolean;\n  /** Can the person drag its edge? */\n  resizable: boolean;\n}\n\n/**\n * The row's tracks, in shipped order.\n *\n * ⚠ Defaults narrower than the ones they replace (Owner 120 → 104, Modified\n * 170 → 160): those numbers were set at 1440 where there is slack for them,\n * and 170px of Modified is 170px Name does not get at 960.\n *\n * ⚠⚠ There is no `priority` field any more, and its absence is the whole\n * change. It ordered a SHEDDING pass: when the tracks stopped fitting the\n * pane, the least informative column was dropped and the header menu marked it\n * \"no room\". The owner rejected that outright — \"no room demesin, kenara devam\n * eden bir scroll getirsin… genişletildikçe no room olmasın\" — so nothing is\n * dropped for want of room ever again. A table wider than its pane scrolls\n * sideways, which is what a table does.\n */\nexport const COLUMNS: readonly ColumnSpec[] = [\n  /* Name is pinned first and cannot be hidden, but its width is the person's\n     like any other (see the note on ColumnId). */\n  { id: 'name', width: 260, min: 120, max: 900, hideable: false, resizable: true },\n  { id: 'type', width: 88, min: 64, max: 220, hideable: true, resizable: true },\n  { id: 'location', width: 160, min: 80, max: 420, hideable: true, resizable: true },\n  { id: 'owner', width: 104, min: 72, max: 260, hideable: true, resizable: true },\n  { id: 'modified', width: 160, min: 96, max: 300, hideable: true, resizable: true },\n  { id: 'size', width: 88, min: 64, max: 200, hideable: true, resizable: true },\n  /* The star is a control, not a value: there is nothing to size and hiding it\n     is the Starred view's own call (`starEnabled`), not a column preference.\n     It is in this list only so one pass owns every optional track and no\n     stylesheet has to agree with it about which ones exist. */\n  { id: 'star', width: 24, min: 24, max: 24, hideable: false, resizable: false },\n] as const;\n\n/** The two fixed tracks, in px, so the table arithmetic can be exact. */\nexport const FIXED_TRACKS = { check: 28, menu: 28 } as const;\n\n/**\n * THE NAME COLUMN'S HARD FLOOR — how narrow a person may drag it.\n *\n * 120px, which at the list's 13px/500 is the 24px type tile, its 8px gap and\n * about eleven characters. Short, and deliberately so: the owner asked to be\n * able to shrink Name (\"istersem name'i de kısabilir olmalıyım\"), and a floor\n * that refuses at 220 would be the old behaviour wearing a smaller number.\n * Below 120 the cell is the tile and an ellipsis — a column that has stopped\n * being a name column at all — so that is where it stops.\n *\n * ⚠ Not to be confused with `NAME_AUTO`: this is what a DRAG may reach, that\n * is what an untouched table opens at.\n */\nexport const NAME_MIN = 120;\n\n/**\n * What Name opens at when nobody has ever dragged anything.\n *\n * 220px holds roughly 26 characters at 13px/500 — enough for\n * `Quarterly Report Q2.pdf` to read whole, which is the length of a real\n * document name rather than a demo fixture's. The auto pass never goes below\n * it: on a phone it would rather let the table run off the side (it is going\n * to anyway, with six columns on a 390px screen) than open showing eleven\n * characters of every filename.\n */\nexport const NAME_AUTO = 220;\n\ninterface ColsState {\n  w: Partial<Record<ColumnId, number>>;\n  hidden: ColumnId[];\n  /** The person's column order. Absent = the shipped order in `COLUMNS`. */\n  o?: ColumnId[];\n}\n\nfunction specOf(id: ColumnId): ColumnSpec | undefined {\n  return COLUMNS.find((c) => c.id === id);\n}\n\nfunction isColumnId(v: unknown): v is ColumnId {\n  return typeof v === 'string' && COLUMNS.some((c) => c.id === v);\n}\n\nfunction readCols(raw: unknown): ColsState {\n  const fallback: ColsState = { w: {}, hidden: [] };\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return fallback;\n  {\n    const p = raw as { w?: unknown; hidden?: unknown; o?: unknown };\n    const w: Partial<Record<ColumnId, number>> = {};\n    if (p.w && typeof p.w === 'object') {\n      for (const [k, v] of Object.entries(p.w as Record<string, unknown>)) {\n        if (!isColumnId(k) || typeof v !== 'number' || !Number.isFinite(v)) continue;\n        const spec = specOf(k);\n        if (!spec) continue;\n        // ⚠ Clamped on the way IN as well as on the way out: a width stored by\n        // an older build (or hand-edited) outside today's bounds would\n        // otherwise draw a column nobody can reach the edge of, and nothing in\n        // the UI would explain it.\n        w[k] = Math.min(spec.max, Math.max(spec.min, Math.round(v)));\n      }\n    }\n    const hidden = Array.isArray(p.hidden)\n      ? (p.hidden.filter((x) => isColumnId(x) && specOf(x)?.hideable) as ColumnId[])\n      : [];\n    const o = Array.isArray(p.o)\n      ? ([...new Set(p.o.filter(isColumnId))] as ColumnId[])\n      : undefined;\n    return { w, hidden: [...new Set(hidden)], o };\n  }\n}\n\nconst colsState = ref<ColsState>(readCols(null));\n\n/**\n * THE COLUMN ORDER — the person's, reconciled with the columns that exist.\n *\n * ⚠⚠ Reconciled, not trusted. A stored order is a list written by an older\n * build, so it can be missing a column added since and can name one removed\n * since. Returning it as-is would make a new column INVISIBLE to everyone who\n * had ever touched the order — a feature that ships and then does not appear\n * for exactly the users engaged enough to have customised something. So:\n * stored entries that still exist keep their place, and anything the stored\n * list never heard of is inserted at its own shipped index.\n *\n * ⚠ ORDER IS GLOBAL, like width and visibility, and unlike the view mode. Two\n * reasons, and the second is the one that would have bitten:\n *   · it is a reading habit (\"I want Size next to Name\"), not a property of a\n *     folder's contents, which is the line this whole module is drawn on;\n *   · widths are global too, and a per-folder order with global widths would\n *     mean the same six columns at the same six sizes arriving in a different\n *     sequence in every folder — a layout that reads as random rather than as\n *     the person's.\n */\nexport function columnOrder(): ColumnId[] {\n  const stored = colsState.value.o;\n  const known = COLUMNS.map((c) => c.id);\n  if (!stored || stored.length === 0) return known;\n  /* ⚠ Name first, whatever the document says. It is pinned in the table, so an\n     order that claimed otherwise would be a sequence nothing on screen obeys —\n     and a stored order written before Name was a column at all has it appended\n     at the END by the reconciliation below. */\n  const out = stored.filter((id) => known.includes(id) && id !== 'name');\n  out.unshift('name');\n  /* ⚠ A column the stored list never heard of goes to the END, not to its own\n   * shipped index. Measured: inserting at the shipped index walked newcomers\n   * in FRONT of the columns the person had deliberately moved — somebody who\n   * had put Size first would open a later release to find two new columns\n   * ahead of it and their arrangement silently rewritten. Appending leaves the\n   * stored sequence exactly as it was and puts the newcomer where it is\n   * visible without being in the way. */\n  for (const id of known) if (!out.includes(id)) out.push(id);\n  return out;\n}\n\n/** Put `id` at `index` in the order. Everything else closes up behind it. */\nexport function moveColumn(id: ColumnId, index: number): void {\n  const spec = specOf(id);\n  /* The star is not the person's to move: it is a control pinned to the\n     trailing edge beside the row menu, not a value with a place in a sequence. */\n  if (!spec || !spec.hideable) return;\n  const cur = columnOrder();\n  const from = cur.indexOf(id);\n  if (from === -1) return;\n  const next = [...cur];\n  next.splice(from, 1);\n  next.splice(Math.max(0, Math.min(next.length, index)), 0, id);\n  if (next.join() === cur.join()) return;\n  colsState.value = { ...colsState.value, o: next };\n  scheduleSave();\n}\n\n/** One step left or right — what the header menu offers, so the whole gesture\n *  is reachable without a pointer. */\nexport function moveColumnBy(id: ColumnId, delta: -1 | 1): void {\n  const cur = columnOrder().filter((c) => specOf(c)?.hideable);\n  const at = cur.indexOf(id);\n  if (at === -1) return;\n  const to = at + delta;\n  if (to < 0 || to >= cur.length) return;\n  /* Computed against the MOVABLE columns only, then translated back into the\n     full order: stepping \"right\" past the pinned star would look like nothing\n     happening, which reads as a broken button rather than as a boundary. */\n  const neighbour = cur[to];\n  const full = columnOrder();\n  moveColumn(id, full.indexOf(neighbour));\n}\n\n/** Can this column still move that way? The menu greys the ends rather than\n *  offering a button that does nothing. */\nexport function canMoveColumn(id: ColumnId, delta: -1 | 1): boolean {\n  const cur = columnOrder().filter((c) => specOf(c)?.hideable);\n  const at = cur.indexOf(id);\n  if (at === -1) return false;\n  return at + delta >= 0 && at + delta < cur.length;\n}\n\n/** This column's width right now — the person's, or the default. */\nexport function columnWidth(id: ColumnId): number {\n  const spec = specOf(id);\n  if (!spec) return 0;\n  return colsState.value.w[id] ?? spec.width;\n}\n\n/** Set a width, clamped to the column's own bounds. */\nexport function setColumnWidth(id: ColumnId, px: number): void {\n  const spec = specOf(id);\n  if (!spec || !spec.resizable) return;\n  const next = Math.min(spec.max, Math.max(spec.min, Math.round(px)));\n  if (colsState.value.w[id] === next) return;\n  colsState.value = { ...colsState.value, w: { ...colsState.value.w, [id]: next } };\n  scheduleSave();\n}\n\n/**\n * HAS ANYBODY EVER SIZED THIS TABLE — the one bit that separates \"I have never\n * touched this\" from \"I deliberately made Name narrow\".\n *\n * ⚠⚠ Without it the two are indistinguishable and the first resize is undone\n * by the next pane resize: an untouched table is sized to the pane it is in\n * (`tableLayout`), so a person who drags Name to 140 and then opens the\n * inspector gets Name recomputed back to whatever the narrower pane suggests.\n * The stored widths are that bit — the moment they exist, the pane stops\n * having an opinion.\n *\n * ⚠⚠ The bit is NAME's width, not \"the map is empty\", and that is a migration\n * decision rather than a stylistic one. Name was not a column until this\n * change, so every document written before it — including the owner's, which\n * carries `{size: 89, type: 125}` from the layout he rejected — has widths but\n * has never been asked about Name. Reading those as \"configured\" would open\n * his table at Name's shipped 260px, wider than his pane, scrolled sideways on\n * first sight, at a width nobody ever chose. Reading them as \"Name is still\n * auto\" keeps the two numbers he did choose and derives the one he did not.\n * The first drag writes every width at once (`freezeWidths`), so a table\n * somebody has actually sized can never fall back into this branch.\n */\nexport function widthsAreAuto(): boolean {\n  return colsState.value.w.name === undefined;\n}\n\n/**\n * Freeze the widths currently ON SCREEN, for the columns that have none stored.\n *\n * ⚠⚠ Called by the view at the START of a resize gesture, and it has to write\n * EVERY drawn column, not the one being dragged. Writing only the dragged\n * column would leave Name auto — and auto Name takes the slack, so narrowing\n * Size would still widen Name, which is the exact behaviour the owner called\n * wrong. Freezing the whole row first turns the gesture into what it looks\n * like: one column changes, the others stay where they are.\n *\n * Existing entries are never overwritten: the widths handed in are what the\n * person is already looking at, and the stored ones are already that.\n */\nexport function freezeWidths(widths: Partial<Record<ColumnId, number>>): void {\n  const w: Partial<Record<ColumnId, number>> = { ...colsState.value.w };\n  let changed = false;\n  for (const [k, v] of Object.entries(widths)) {\n    if (!isColumnId(k) || typeof v !== 'number' || !Number.isFinite(v)) continue;\n    if (w[k] !== undefined) continue;\n    const spec = specOf(k);\n    if (!spec || !spec.resizable) continue;\n    w[k] = Math.min(spec.max, Math.max(spec.min, Math.round(v)));\n    changed = true;\n  }\n  if (!changed) return;\n  colsState.value = { ...colsState.value, w };\n  scheduleSave();\n}\n\n/** True when the PERSON has hidden this column — the only reason a column is\n *  ever absent now that width sheds nothing (see `tableLayout`). */\nexport function columnHidden(id: ColumnId): boolean {\n  return colsState.value.hidden.includes(id);\n}\n\nexport function setColumnHidden(id: ColumnId, hidden: boolean): void {\n  const spec = specOf(id);\n  if (!spec || !spec.hideable) return;\n  if (columnHidden(id) === hidden) return;\n  const set = new Set(colsState.value.hidden);\n  if (hidden) set.add(id);\n  else set.delete(id);\n  colsState.value = { ...colsState.value, hidden: [...set] };\n  scheduleSave();\n}\n\n/** Back to the shipped widths, order and visibility — one button for all\n *  three, because \"reset the columns\" is one thought. */\nexport function resetColumns(): void {\n  colsState.value = { w: {}, hidden: [] };\n  scheduleSave();\n}\n\n/** True when anything about the columns has been changed by hand — what the\n *  header menu's \"Reset columns\" is gated on. */\nexport function columnsCustomised(): boolean {\n  return (\n    Object.keys(colsState.value.w).length > 0 ||\n    colsState.value.hidden.length > 0 ||\n    (colsState.value.o?.length ?? 0) > 0\n  );\n}\n\n/* ── the document ─────────────────────────────────────────\n *\n * One JSON object, holding everything this module owns:\n *\n *   { \"on\": true,                                   the opt-in switch\n *     \"f\":  { \"<storage>/<rel>\": {v,k,d,t}, … },    per-folder, LRU-capped\n *     \"c\":  { \"w\": {…}, \"hidden\": […], \"o\": […] } } columns, global\n *\n * Short keys because the whole thing is re-serialised on every save and lives\n * in a database column: at the 300-folder cap that is roughly 33 KB, and the\n * endpoint refuses anything over 128 KB.\n */\n\ninterface ViewPrefsDoc {\n  on?: boolean;\n  f?: unknown;\n  c?: unknown;\n  [ns: string]: unknown;\n}\n\n/** The three top-level names this module owns. Everything else in the\n *  document belongs to somebody else and is none of our business. */\nconst OWNED_KEYS = ['on', 'f', 'c'] as const;\n\n/**\n * ⚠⚠ EVERYTHING IN THE DOCUMENT THAT IS NOT OURS, kept verbatim.\n *\n * The endpoint stores an OPAQUE object — `handlers/viewprefs.go` validates it\n * as JSON, bounds its size and does not look inside, precisely so the shape\n * can change without the server changing with it. This module was the half\n * that broke that promise: `currentDoc()` rebuilt `{on, f, c}` from scratch on\n * every save, so a field written by any other feature was gone the next time\n * somebody dragged a column. Measured, and one resize was enough:\n *\n *     loaded: {\"on\":true,\"f\":{},\"c\":{},\"install\":{\"dismissed\":1}}\n *     saved:  {\"on\":true,\"f\":{},\"c\":{\"w\":{\"size\":130},\"hidden\":[]}}\n *\n * No error, nothing on screen, and the feature that lost its value could only\n * discover it by looking. The desktop-app reminder's \"never show me again\" was\n * left in `localStorage` because of this — per browser profile, so a second\n * machine, a private window or cleared site data asked again.\n *\n * ⚠ A `ref`, like everything else here, because a slot's value IS rendered:\n * the desktop-app reminder reads its own key inside a `computed` and has to\n * settle by itself when the document lands a moment after the page does.\n */\nconst foreign = ref<Record<string, unknown>>({});\n\n/** Split a loaded document into \"ours\" and \"everybody else's\". */\nfunction takeForeign(doc: Record<string, unknown>): Record<string, unknown> {\n  const rest: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(doc)) {\n    if ((OWNED_KEYS as readonly string[]).includes(k)) continue;\n    rest[k] = v;\n  }\n  return rest;\n}\n\nfunction currentDoc(): ViewPrefsDoc {\n  /* ⚠ Spread FIRST, so the three keys this module owns always win: a foreign\n   * key called `c` cannot overwrite the column state on its way back out. */\n  return { ...foreign.value, on: memoryOn.value, f: folderMap.value, c: colsState.value };\n}\n\n/* ── namespaced slots: room in the document for somebody else ────────────\n *\n * A feature outside this module keeps a value in the SAME per-user document\n * without reaching into its shape — it gets one top-level key of its own and\n * cannot see or touch anybody else's. That is the whole API surface, on\n * purpose: a general \"write anywhere in the document\" helper is how the next\n * feature ends up owning `c`.\n *\n * ⚠ It is the same document, so it inherits its two properties exactly: it\n * saves only when there is somebody to save FOR (a share link and an app-token\n * embed have no account — `load` answers null and this writes nothing, for\n * ever), and the write is debounced and fire-and-forget. A caller that must\n * work with no account needs a fallback of its own; `web/src/composables/\n * useInstallPrompt.ts` is the worked example.\n */\n\n/** One feature's corner of the document. */\nexport interface ViewPrefsSlot<T> {\n  /** What is stored, or undefined — including before the document lands. */\n  get(): T | undefined;\n  /** Replace it. A no-op when there is nobody to save for. */\n  set(value: T): void;\n  /** Remove the key entirely. */\n  clear(): void;\n  /** Has the document been read yet? Reactive — read it in a `computed`. */\n  ready(): boolean;\n  /** Is there an account behind this session at all? Reactive. */\n  persistable(): boolean;\n}\n\n/**\n * Claim `namespace` as a top-level key in the per-user view-prefs document.\n *\n * ⚠ The three names this module owns are refused outright rather than\n * quietly renamed: a slot called `c` that silently became `c2` would be a\n * value the caller could never read back.\n */\nexport function viewPrefsSlot<T>(namespace: string): ViewPrefsSlot<T> {\n  if (!namespace || (OWNED_KEYS as readonly string[]).includes(namespace)) {\n    throw new Error(`viewPrefsSlot: \"${namespace}\" is reserved by lib/viewPrefs`);\n  }\n  return {\n    get: () => foreign.value[namespace] as T | undefined,\n    set(value: T) {\n      foreign.value = { ...foreign.value, [namespace]: value };\n      scheduleSave();\n    },\n    clear() {\n      if (!(namespace in foreign.value)) return;\n      const next = { ...foreign.value };\n      delete next[namespace];\n      foreign.value = next;\n      scheduleSave();\n    },\n    ready: () => ready.value,\n    persistable: () => persistable.value,\n  };\n}\n\n/**\n * SAVING — debounced, coalesced, fire and forget.\n *\n * ⚠⚠ A view change is a keystroke-rate event once a column can be dragged: a\n * single resize is dozens of `setColumnWidth` calls, one per pointermove. A PUT\n * per change would hammer the server and, worse, race itself — two writes in\n * flight of a document that is replaced wholesale, arriving in whatever order\n * the network chose. Waiting for the gesture to settle and then sending the\n * WHOLE current document makes the last write the true one by construction,\n * and makes a dropped write self-healing: the next save carries everything the\n * lost one did.\n */\nconst SAVE_DEBOUNCE_MS = 800;\nlet saveTimer: ReturnType<typeof setTimeout> | undefined;\nlet saveDirty = false;\n\nfunction scheduleSave(): void {\n  /* ⚠ Not before the document has loaded. A save fired while the fetch is\n   * still in flight would write this session's empty defaults over everything\n   * the person had arranged — the classic \"my settings reset themselves\".\n   * Nothing mutates the state before `ready` except the load itself. */\n  if (!ready.value || !persistable.value || !transport) return;\n  saveDirty = true;\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = setTimeout(flushSave, SAVE_DEBOUNCE_MS);\n}\n\nfunction flushSave(): void {\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = undefined;\n  if (!saveDirty || !transport || !persistable.value) return;\n  saveDirty = false;\n  transport.save(currentDoc());\n}\n\n/**\n * ⚠ A change made in the last moment before a tab closes is inside the\n * debounce window and would simply be lost. `pagehide` is the last event a\n * browser reliably delivers (`beforeunload` never fires on mobile, and\n * `unload` is skipped when a page enters the back/forward cache), so the\n * pending document goes out there — the transport sends it with `keepalive`,\n * which is what lets a request outlive the document that started it.\n */\nif (typeof window !== 'undefined') {\n  window.addEventListener('pagehide', flushSave);\n  window.addEventListener('visibilitychange', () => {\n    if (typeof document !== 'undefined' && document.visibilityState === 'hidden') flushSave();\n  });\n}\n\n/**\n * Hand this module its transport and read the document.\n *\n * Called once per explorer mount. Calling it again is a no-op on purpose: two\n * explorers on one page share this module's state, and the second must not\n * re-fetch over the first.\n */\nexport function attachViewPrefsStore(t: ViewPrefsTransport): void {\n  if (transport) return;\n  transport = t;\n  void (async () => {\n    let doc: unknown = null;\n    try {\n      doc = await t.load();\n    } catch {\n      /* No account, offline, a 500 — all one answer: remember nothing this\n         session and never write, so a transient failure cannot erase what is\n         already stored. */\n      doc = null;\n    }\n    if (doc && typeof doc === 'object' && !Array.isArray(doc)) {\n      const d = doc as ViewPrefsDoc;\n      memoryOn.value = d.on === true;\n      folderMap.value = readFolderMap(d.f);\n      colsState.value = readCols(d.c);\n      /* ⚠ Whatever else was in there travels on untouched. This is the half\n       * that makes the endpoint's \"opaque object\" promise true on the client\n       * as well — see `foreign` above for what it cost while it was false. */\n      foreign.value = takeForeign(d as Record<string, unknown>);\n      persistable.value = true;\n    }\n    ready.value = true;\n  })();\n}\n\n/** Test seam: drop the transport and the state, so one suite cannot leak a\n *  document into the next. Not used by the app. */\nexport function __resetViewPrefs(): void {\n  transport = null;\n  ready.value = false;\n  persistable.value = false;\n  memoryOn.value = false;\n  folderMap.value = {};\n  colsState.value = readCols(null);\n  foreign.value = {};\n  saveDirty = false;\n  if (saveTimer) clearTimeout(saveTimer);\n  saveTimer = undefined;\n}\n\n/** Test seam: send whatever is pending now, without waiting out the debounce. */\nexport function __flushViewPrefs(): void {\n  flushSave();\n}\n\n/** What one table looks like right now: which optional columns are drawn, how\n *  wide every track is, and how wide the table therefore is. */\nexport interface TableLayout {\n  /** The optional columns, in the person's order. Never shortened for width. */\n  visible: ColumnId[];\n  /** Every drawn track's width in px, Name included. */\n  widths: Record<ColumnId, number>;\n  /** The table's own width: every track, every gap, both paddings. */\n  total: number;\n  /** True while these widths are derived from the pane rather than stored. */\n  auto: boolean;\n}\n\n/**\n * THE TABLE'S WIDTHS — one answer, used by the header and by every row.\n *\n * ⚠⚠ This replaces `fitColumns`, and the difference is not a tuning. That pass\n * fitted the columns TO the container and dropped one whenever they stopped\n * fitting; the header menu then told the person there was \"no room\". The owner\n * rejected the whole model, verbatim: \"no room demesin, kenara devam eden bir\n * scroll getirsin… tablo vertical ve horizontal scrollable olarak açılacak,\n * genişletildikçe no room olmasın.\" So:\n *\n *   · nothing is ever dropped for want of room — `visible` is the person's\n *     choice and the caller's candidates, and width has no vote;\n *   · the table's width is the SUM of its columns, so when that exceeds the\n *     pane the table scrolls sideways (the view's job) instead of shrinking;\n *   · Name is an ordinary column with a width of its own, so narrowing Size no\n *     longer widens Name.\n *\n * ⚠ `candidates` is what the CALLER is willing to draw at all: Location is\n * only meaningful where rows come from more than one folder, and the star only\n * where starring is offered. Passing them is how those two facts stay with the\n * component that knows them instead of being re-derived here.\n *\n * ⚠⚠ AUTO vs STORED, which is the only subtle thing left. With nothing stored\n * (`widthsAreAuto`), the widths are derived from the pane so a table nobody has\n * configured opens sensibly at 1440 and at 390 alike: Name asks for `NAME_AUTO`,\n * the other columns give up room toward their own minimums to pay for it, and\n * Name takes any slack that is left. The instant one width is stored — and the\n * view stores ALL of them on the first drag, see `freezeWidths` — the pane\n * stops having an opinion and these are the person's numbers, at every window\n * size, forever. Without that line a resize would be silently undone by the\n * next auto-fit, which is the trap this pair exists to avoid.\n */\nexport function tableLayout(\n  available: number,\n  candidates: readonly ColumnId[],\n  opts: { gap?: number; padding?: number } = {},\n): TableLayout {\n  const gap = opts.gap ?? 8; // --fe-gap-sm\n  const padding = opts.padding ?? 24; // --fe-gap on both sides\n\n  const visible = columnOrder().filter(\n    (id) => id !== 'name' && candidates.includes(id) && !columnHidden(id),\n  );\n\n  const widths = {} as Record<ColumnId, number>;\n  for (const id of visible) widths[id] = columnWidth(id);\n  widths.name = columnWidth('name');\n\n  /* tick + Name + the optional ones + ⋮, so one gap fewer than that. */\n  const chrome =\n    FIXED_TRACKS.check + FIXED_TRACKS.menu + padding + gap * (visible.length + 2);\n  const auto = widthsAreAuto();\n  const nameSpec = specOf('name')!;\n\n  /* A container we cannot measure yet (0 on the first tick, or a test with no\n     layout) keeps the shipped widths — the observer corrects it one frame\n     later, and a table that guessed would flash. */\n  if (auto && available > 0) {\n    const room = available - chrome;\n    let rest = visible.reduce((s, id) => s + widths[id], 0);\n    /* What the other columns may occupy if Name is to open at its comfortable\n       width. Over that, they give up room in proportion to how much each HAS\n       to give, so a 300px Modified yields more than a 24px star (which yields\n       nothing — its min is its max). */\n    const target = room - NAME_AUTO;\n    if (rest > target) {\n      const give = visible.reduce((s, id) => s + (widths[id] - specOf(id)!.min), 0);\n      if (give > 0) {\n        const f = Math.min(1, (rest - target) / give);\n        for (const id of visible) {\n          const spec = specOf(id)!;\n          /* ⚠ `ceil` on the reduction, not `floor`. Rounding the other way\n             leaves the row a pixel or two over the pane and hands an otherwise\n             perfectly fitting table a horizontal scrollbar on first sight —\n             measured at 960, where the arithmetic lands on 712 in a 711px\n             pane. Over-shrinking by a pixel is invisible; Name absorbs it. */\n          widths[id] = Math.max(spec.min, widths[id] - Math.ceil((widths[id] - spec.min) * f));\n        }\n        rest = visible.reduce((s, id) => s + widths[id], 0);\n      }\n    }\n    /* Slack goes to Name, and only to Name. Below `NAME_AUTO` it stops: at\n       that point the table is wider than the pane and scrolls, which beats\n       opening with eleven characters of every filename. */\n    widths.name = Math.round(\n      Math.max(NAME_AUTO, Math.min(nameSpec.max, room - rest)),\n    );\n  }\n\n  const total = chrome + widths.name + visible.reduce((s, id) => s + widths[id], 0);\n  return { visible, widths, total, auto };\n}\n","/**\n * uiProfile — how much of the explorer to draw. Two names, and one rule for\n * everything that is not one of them.\n *\n * ⚠⚠ The profile is a REDUCTION switch, never a LOOK switch. The shell — the\n * header with its one search field, the filter row, \"+ New\", the Folders /\n * Files sections, the info panel's tabs, the storage line — is what filex IS;\n * nothing reads a profile to decide whether to draw it. `'simple'` turns OFF\n * the tab strip, the split pane, the gallery view mode and the panel's\n * \"How to connect\" / \"API keys\" entries, and removes nothing from the build.\n *\n * ⚠⚠ WHY THERE IS A RESOLVER AND NOT A UNION CHECK AT EACH CALL SITE. This\n * value comes from OUTSIDE: a `config` object typed by an embedder who may not\n * use TypeScript at all, or a `ui-profile=\"…\"` attribute on a custom element,\n * which is a string the DOM will hand over unexamined. So \"what does an\n * unrecognised value mean\" is a real question with real users behind it, and\n * it is answered here, once, instead of by whatever each reader's `===` chain\n * happened to fall through to.\n *\n * THE ANSWER: `'simple'` and nothing else turns the reduction on. Every other\n * value — `'standard'`, `undefined`, a typo, a name a later version knows and\n * this one does not — is `'standard'`, the documented default, and a string we\n * did not recognise is said out loud once in the console.\n *\n * ⚠ WHICH RETIRES `'drive'`, deliberately and with its cost stated. It shipped\n * as a third profile in v0.32.0 and became an alias of `'simple'` in v0.40.0;\n * the owner's ruling on 2026-09-13 was to take it out (\"kaldıralım direk\").\n * filex is open source, so an embed somewhere may still be passing it, and\n * what that embed gets is now the FULL explorer rather than the reduced one —\n * it gains the tab strip, the split pane, the gallery mode and the connection\n * guides. That is a visible change in one direction and a one-word fix\n * (`uiProfile: 'simple'`), and it is the honest one: mapping the retired name\n * onto `'simple'` here would be the alias again, wearing a resolver's coat,\n * and it would also mean a plain typo silently REDUCED somebody's UI — a\n * failure that looks like features going missing and points at nothing. The\n * console line names the value so the fix takes a search rather than a bisect.\n */\n\n/** The two profiles. There is no third, and no alias of either. */\nexport type UiProfile = 'standard' | 'simple';\n\n/** Both of them, as data — so a doc, a test and a resolver cannot disagree\n *  about how many there are. */\nexport const UI_PROFILES: readonly UiProfile[] = ['standard', 'simple'] as const;\n\n/** The one this package draws when nobody says otherwise. */\nexport const DEFAULT_UI_PROFILE: UiProfile = 'standard';\n\n/* One line per distinct offending value, not one per render: this is read\n * inside a `computed` that re-runs whenever the config object changes. */\nconst warned = new Set<string>();\n\n/**\n * The profile to draw for whatever the host passed.\n *\n * `undefined` / `null` / `''` are \"nothing was passed\" and resolve to the\n * default in silence. Any OTHER unrecognised value is a mistake worth a line\n * in the console, because it means somebody asked for something by name and\n * got something else.\n */\nexport function resolveUiProfile(value: unknown): UiProfile {\n  if (value === 'simple') return 'simple';\n  if (value === 'standard' || value === undefined || value === null || value === '') {\n    return DEFAULT_UI_PROFILE;\n  }\n  const seen = typeof value === 'string' ? value : String(value);\n  if (!warned.has(seen) && typeof console !== 'undefined') {\n    warned.add(seen);\n    console.warn(\n      `[filex] unknown uiProfile ${JSON.stringify(seen)} — using \"${DEFAULT_UI_PROFILE}\". ` +\n        `Valid values: ${UI_PROFILES.map((p) => `\"${p}\"`).join(', ')}. ` +\n        `(The former \"drive\" profile was removed; pass \"simple\" for the reduced explorer.)`,\n    );\n  }\n  return DEFAULT_UI_PROFILE;\n}\n\n/** Test seam — the console line is once per value per page, so a suite that\n *  asserts on it has to be able to start over. Not used by the app. */\nexport function __resetUiProfileWarnings(): void {\n  warned.clear();\n}\n","<script setup lang=\"ts\">\n/**\n * RecentlyOpened — drop-down/sidebar tray of the user's recently-opened\n * files. Backed by `GET /api/files/manager/recent?limit=20`.\n */\nimport { ref, onMounted, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\n\ninterface RecentNode {\n  id: number;\n  storage_id: number;\n  path: string;\n  name: string;\n  mime?: string;\n  last_opened?: string;\n  /** The raw row carries more (`storage`, `perm`, `read_only`, `type`,\n   *  the mtimes…) — the explorer turns it into a FileNode for the context\n   *  menu with the same converter Recent / Starred / a tag view use. */\n  [k: string]: unknown;\n}\n\nconst props = defineProps<{\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  limit?: number;\n  /** Optional refresh trigger — incrementing this re-fetches. */\n  refreshKey?: number | string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'open', node: RecentNode): void;\n  /** Right-click on a row. The tray does not build a menu of its own — the\n   *  explorer opens the ONE menu every listing row gets (owner: \"CONTEXT\n   *  MENÜ HER YERDE AYNI OLMALI\"), so a file here offers exactly what the\n   *  same file offers in its folder. */\n  (e: 'context', node: RecentNode, ev: MouseEvent): void;\n  (e: 'error', message: string): void;\n}>();\n\nconst items = ref<RecentNode[]>([]);\nconst loading = ref(false);\n\nasync function load() {\n  loading.value = true;\n  try {\n    const headers = await (props.authHeaders ?? (() => ({})))();\n    const base = props.apiBase ?? '';\n    const limit = props.limit ?? 20;\n    const res = await fetch(`${base}/api/files/manager/recent?limit=${limit}`, {\n      headers,\n      credentials: props.authCredentials ?? 'same-origin',\n    });\n    if (res.ok) {\n      const body = await res.json();\n      // ⚠ `nodes` is what the endpoint actually answers with; this read `entries`\n      // only, so the tray was empty on every server that ever served it.\n      items.value = Array.isArray(body.nodes)\n        ? body.nodes\n        : Array.isArray(body.entries)\n          ? body.entries\n          : Array.isArray(body)\n            ? body\n            : [];\n    }\n  } catch (err) {\n    emit('error', err instanceof Error ? err.message : String(err));\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction fmtTime(s?: string): string {\n  if (!s) return '';\n  const t = new Date(s).getTime();\n  if (Number.isNaN(t)) return '';\n  const diff = Date.now() - t;\n  if (diff < 60_000) return 'just now';\n  if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n  if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n  return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nonMounted(load);\nwatch(() => props.refreshKey, load);\n</script>\n\n<template>\n  <div class=\"filex-recent\">\n    <header>\n      <h3>Recently opened</h3>\n      <button\n        class=\"filex-recent-refresh\"\n        type=\"button\"\n        title=\"Refresh\"\n        aria-label=\"Refresh\"\n        @click=\"load\"\n        :disabled=\"loading\"\n      >\n        <!-- ikon:emoji — ↻ was a bare arrow glyph with no label at all, so\n             the only thing naming this button was its shape. Same mark as the\n             toolbar's Refresh now, and it says what it is. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n      </button>\n    </header>\n\n    <ul v-if=\"items.length\">\n      <li v-for=\"n in items\" :key=\"n.id\" data-testid=\"recent-tray-item\" :data-fe-path=\"n.path\">\n        <button\n          type=\"button\"\n          class=\"filex-recent-item\"\n          @click=\"emit('open', n)\"\n          @contextmenu.prevent=\"emit('context', n, $event)\"\n        >\n          <span class=\"filex-recent-name\">{{ n.name }}</span>\n          <span class=\"filex-recent-meta\">{{ fmtTime(n.last_opened) }}</span>\n        </button>\n      </li>\n    </ul>\n    <p v-else-if=\"!loading\" class=\"filex-recent-empty\">Nothing here yet.</p>\n    <p v-else class=\"filex-recent-empty\">Loading…</p>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-recent {\n  background: var(--fe-bg-elev, var(--filex-bg-card, #ffffff));\n  border: 1px solid var(--fe-border, var(--filex-border, #e5e7eb));\n  border-radius: 8px;\n  padding: 12px;\n  font-size: 13px;\n}\n.filex-recent header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 8px;\n}\n.filex-recent h3 {\n  margin: 0;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--fe-text, var(--filex-text, #111827));\n}\n.filex-recent-refresh {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  background: transparent;\n  border: none;\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  cursor: pointer;\n  font-size: 14px;\n  padding: 2px 6px;\n}\n.filex-recent ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-recent-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  background: transparent;\n  border: none;\n  padding: 6px 8px;\n  cursor: pointer;\n  border-radius: 4px;\n  text-align: left;\n}\n.filex-recent-item:hover {\n  background: var(--fe-bg-hover, var(--filex-bg-soft, #f3f4f6));\n}\n.filex-recent-name {\n  color: var(--fe-text, var(--filex-text, #111827));\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.filex-recent-meta {\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  font-size: 11px;\n  margin-left: 8px;\n  flex-shrink: 0;\n}\n.filex-recent-empty {\n  color: var(--fe-text-muted, var(--filex-text-muted, #9ca3af));\n  margin: 4px 0 0;\n}\n</style>\n","/**\n * surucu:d1 — the filter row's model, kept out of the components so the\n * predicate has one definition and can be tested without a DOM.\n *\n * ⚠ EVERY filter here answers from a field the listing row ALREADY carries\n * (`type`, `extension`, `mime_type`, `size`, `last_modified`). That is not a\n * shortcut, it is the constraint: `GET /api/files/manager?action=index` reads\n * no `mime` / `min_size` / `modified_after` / `owner` parameter — it returns\n * the whole directory and ignores anything else you send it (handlers/manager.go\n * `List`, the complete parameter list is `action`, `path`, `filter`, `storage`,\n * `parent`, `cache`). A control wired to a parameter the server does not read\n * looks like it works and quietly changes nothing, which is worse than not\n * shipping it.\n *\n * Because the endpoint has no `limit`/`offset` either, the listing in hand IS\n * the folder — so filtering it client-side is complete for the folder, not a\n * filter over \"the first page\".\n *\n * ⚠ This file used to end \"…and a People/owner filter is not, because\n * `nodes.owner_id` exists for quota accounting and is serialized by nothing\".\n * That was true and is no longer: migration 00038 made ownership a real fact\n * on the row (who put it here, who touched it last, whether it arrived through\n * an anonymous drop link), and the listing projection now carries `owner_id`,\n * `owner_name` and `owner_self` on every row that has an owner. The People\n * filter therefore answers from a field the row ALREADY carries, exactly like\n * the other four — the rule did not bend, the data arrived.\n *\n * ⚠ A row with NO owner key is SYSTEM: nobody put it there through filex. That\n * is the honest word for ownerless and it is a real choice in the pill, not a\n * blank.\n */\nimport type { FileNode } from '../types/FileNode';\nimport { iconFamilyFor, type IconFamily } from './fileIcons';\n\nexport type TypeFilter =\n  | 'any'\n  | 'folder'\n  | 'document'\n  | 'spreadsheet'\n  | 'presentation'\n  | 'pdf'\n  | 'image'\n  | 'video'\n  | 'audio'\n  | 'archive'\n  | 'code';\n\nexport type ModifiedFilter = 'any' | 'today' | '7d' | '30d' | 'year' | 'around';\n\nexport type SizeFilter = 'any' | 'lt1' | '1to10' | '10to100' | 'gt100' | 'range';\n\n/** gorunum:v1-advsearch — how wide \"around\" reaches on each side of the anchor. */\nexport type AroundSpan = 'h1' | 'd1' | 'w1';\n\n/** gorunum:v1-advsearch — what the path choice does to a row outside `pathBase`. */\nexport type PathMode = 'any' | 'here' | 'skip';\n\n/**\n * Who a row belongs to. `any` is the neutral member every pill group needs;\n * `me` is the signed-in account, `system` is an ownerless row, and `u:<id>`\n * names one of the other accounts that actually appear in this listing.\n *\n * ⚠ The account members are NOT a fixed list. Offering every account on the\n * install would put names in the menu that cannot narrow anything here and\n * would leak the user directory into a folder view; `peopleOptions` derives\n * the choices from the rows in hand.\n */\nexport type PeopleFilter = 'any' | 'me' | 'system' | `u:${number}`;\n\nexport interface DriveFilters {\n  type: TypeFilter;\n  modified: ModifiedFilter;\n  size: SizeFilter;\n  /**\n   * gorunum:v1 — \"Filter in this folder…\", the input the filter row carries\n   * beside the chips. A substring of the NAME, matched over the rows in hand.\n   *\n   * ⚠ Not a second search box. The header field runs `action=search` on the\n   * server and REPLACES the listing with hits (`isSearchResult`, results carry\n   * their parent path and can come from subfolders); this one never leaves the\n   * folder you are looking at and never issues a request — it narrows what is\n   * already on screen, the same rows the chips narrow, which is why it belongs\n   * to the same model and not to `searchQuery`.\n   *\n   * Optional so every existing `{ type, modified, size }` literal — embedders\n   * included — still type-checks and behaves exactly as before.\n   */\n  name?: string;\n\n  /* ── gorunum:v1-advsearch — the three the advanced-search dialog adds ─────\n   *\n   * All optional, so every existing `{ type, modified, size }` literal still\n   * type-checks and behaves exactly as it did — the same contract `name` was\n   * added under. They live HERE and not in a second model because the filter\n   * row and the dialog narrow the same rows with the same predicate: two\n   * definitions of \"modified in the last 7 days\" is two products.\n   *\n   * ⚠ They are client-side for the same reason the three above are, and the\n   * reason is stated at the top of this file: the listing and search endpoints\n   * read no date, size or path parameter. What makes them honest is that the\n   * rows in hand are the complete answer for a FOLDER listing; over a SEARCH\n   * result they narrow the hits the server returned, which is capped\n   * (`/api/files/search` limit, the manager search's 250) — so a size range\n   * over a truncated hit list is a filter over what came back, not over the\n   * storage. The dialog says so rather than implying a full scan. */\n\n  /** Anchor for `modified: 'around'`. `YYYY-MM-DD` or `YYYY-MM-DDTHH:mm`,\n   *  read as LOCAL time (a date alone means that day's 00:00 local). */\n  aroundDate?: string;\n  /** Half-width of the `around` window. */\n  aroundSpan?: AroundSpan;\n  /** Inclusive floor for `size: 'range'`, in BYTES. null = open-ended. */\n  sizeMin?: number | null;\n  /** Inclusive ceiling for `size: 'range'`, in BYTES. null = open-ended. */\n  sizeMax?: number | null;\n  /** `here` keeps only rows under `pathBase`; `skip` keeps only rows outside it. */\n  pathMode?: PathMode;\n  /**\n   * Who the row belongs to. Optional, under the same contract as `name` and\n   * the advanced-search three: every existing `{ type, modified, size }`\n   * literal still type-checks and behaves exactly as before.\n   */\n  people?: PeopleFilter;\n\n  /** Adapter-qualified folder the path choice is measured against, e.g.\n   *  `qldemo://Documents`. Captured when the dialog opens, because a search\n   *  rebases the explorer to the storage root and the folder the user meant\n   *  would otherwise be gone by the time the filter runs. */\n  pathBase?: string;\n}\n\nexport const EMPTY_FILTERS: DriveFilters = {\n  type: 'any',\n  modified: 'any',\n  size: 'any',\n  name: '',\n  aroundDate: '',\n  aroundSpan: 'd1',\n  sizeMin: null,\n  sizeMax: null,\n  pathMode: 'any',\n  pathBase: '',\n  people: 'any',\n};\n\n/** Case- and accent-folded, so \"İstanbul\" answers to \"ist\" and \"Ödev\" to \"od\".\n *  ⚠ `toLowerCase()` alone maps `İ` to `i` + a combining dot, which then\n *  matches nothing the user typed; stripping the marks is what makes the two\n *  sides comparable. */\nfunction fold(s: string): string {\n  return s\n    .normalize('NFD')\n    .replace(/\\p{M}+/gu, '')\n    .toLowerCase();\n}\n\n/** The trimmed needle, or '' when the input is empty/whitespace. */\nexport function nameNeedle(f: DriveFilters): string {\n  return (f.name ?? '').trim();\n}\n\n/** gorunum:v1-advsearch — `here`/`skip` only mean something with a base to\n *  measure against; without one the choice is inert and must not count as an\n *  active filter, or the empty state would blame a filter that filters nothing. */\nfunction pathActive(f: DriveFilters): boolean {\n  return (f.pathMode ?? 'any') !== 'any' && !!(f.pathBase ?? '');\n}\n\n/** The People choice, defaulted. Kept in one place so the four call sites\n *  below cannot disagree about what \"no choice\" means. */\nfunction peopleOf(f: DriveFilters): PeopleFilter {\n  return f.people ?? 'any';\n}\n\nexport function filtersActive(f: DriveFilters): boolean {\n  return (\n    f.type !== 'any' ||\n    f.modified !== 'any' ||\n    f.size !== 'any' ||\n    nameNeedle(f) !== '' ||\n    pathActive(f) ||\n    peopleOf(f) !== 'any'\n  );\n}\n\nexport function activeFilterCount(f: DriveFilters): number {\n  return (\n    (f.type !== 'any' ? 1 : 0) +\n    (f.modified !== 'any' ? 1 : 0) +\n    (f.size !== 'any' ? 1 : 0) +\n    (nameNeedle(f) !== '' ? 1 : 0) +\n    (pathActive(f) ? 1 : 0) +\n    (peopleOf(f) !== 'any' ? 1 : 0)\n  );\n}\n\n/** Families a type choice accepts. `iconFamilyFor` is the taxonomy the icons\n *  already use, so a row's filter group and its glyph can never disagree. */\nconst TYPE_FAMILIES: Record<Exclude<TypeFilter, 'any'>, IconFamily[]> = {\n  folder: ['folder'],\n  document: ['doc', 'text'],\n  spreadsheet: ['sheet'],\n  presentation: ['slides'],\n  pdf: ['pdf'],\n  image: ['image'],\n  video: ['video'],\n  audio: ['audio'],\n  archive: ['archive'],\n  code: ['code'],\n};\n\n/** MIME fallback — a file with no extension still has a `mime_type` from the\n *  backend sniffer, and \"IMG_0042\" with no suffix is a real thing people have. */\nconst MIME_PREFIXES: Partial<Record<Exclude<TypeFilter, 'any'>, string[]>> = {\n  image: ['image/'],\n  video: ['video/'],\n  audio: ['audio/'],\n  pdf: ['application/pdf'],\n  document: ['text/plain', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessing'],\n  spreadsheet: ['text/csv', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheet'],\n  presentation: ['application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentation'],\n  archive: ['application/zip', 'application/x-tar', 'application/gzip', 'application/x-7z'],\n};\n\nfunction matchesType(n: FileNode, t: TypeFilter): boolean {\n  if (t === 'any') return true;\n  if (t === 'folder') return n.type === 'dir';\n  if (n.type === 'dir') return false;\n  if (TYPE_FAMILIES[t].includes(iconFamilyFor(n))) return true;\n  const mime = (n.mime_type || '').toLowerCase();\n  return !!mime && (MIME_PREFIXES[t] ?? []).some((p) => mime.startsWith(p));\n}\n\n/** `now` is a parameter so a test can pin the clock instead of sleeping. */\n/** gorunum:v1-advsearch — half-width of each \"around\" window, in ms. */\nconst AROUND_MS: Record<AroundSpan, number> = {\n  h1: 3_600_000,\n  d1: 86_400_000,\n  w1: 7 * 86_400_000,\n};\n\n/**\n * gorunum:v1-advsearch — read the anchor as LOCAL time.\n *\n * ⚠ `Date.parse('2026-09-12')` is UTC by spec while\n * `Date.parse('2026-09-12T00:00')` is local, so a bare date would slide the\n * whole window by the viewer's offset — in Istanbul (UTC+3) a ±1 hour search\n * \"around the 12th\" would have covered 03:00, not midnight. Appending the time\n * makes both forms mean the same clock the user is reading.\n */\nfunction parseAnchor(raw: string | undefined): number | null {\n  const s = (raw ?? '').trim();\n  if (!s) return null;\n  const ms = Date.parse(s.includes('T') ? s : `${s}T00:00`);\n  return Number.isNaN(ms) ? null : ms;\n}\n\nfunction matchesModified(n: FileNode, g: DriveFilters, now: number): boolean {\n  const f = g.modified;\n  if (f === 'any') return true;\n  const ms = typeof n.last_modified === 'number' ? n.last_modified : 0;\n  // No timestamp = no answer. Dropping the row would hide files whose driver\n  // gave us nothing; keeping it would put them in \"Today\". Hiding is the\n  // honest one: the row does not satisfy \"modified today\", it is unknown.\n  if (!ms) return false;\n  if (f === 'around') {\n    const anchor = parseAnchor(g.aroundDate);\n    // No anchor typed yet: \"around nothing\" is not a window, so the choice is\n    // inert rather than empty. Narrowing to zero rows the moment the user\n    // picks the mode — before they have picked a date — reads as a broken\n    // search, not as an unfinished one.\n    if (anchor === null) return true;\n    return Math.abs(ms - anchor) <= AROUND_MS[g.aroundSpan ?? 'd1'];\n  }\n  if (f === 'year') {\n    return new Date(ms).getFullYear() === new Date(now).getFullYear();\n  }\n  if (f === 'today') {\n    const start = new Date(now);\n    start.setHours(0, 0, 0, 0);\n    return ms >= start.getTime();\n  }\n  const days = f === '7d' ? 7 : 30;\n  return ms >= now - days * 86_400_000;\n}\n\nconst MB = 1024 * 1024;\n\nfunction matchesSize(n: FileNode, g: DriveFilters): boolean {\n  const f = g.size;\n  if (f === 'any') return true;\n  // ⚠ Folders drop out of every size choice rather than passing through. A\n  // directory row's `size` is 0 from the projector, so \"under 1 MB\" would\n  // otherwise list every folder in the drive — an answer that looks like a\n  // measurement and is not one.\n  if (n.type === 'dir') return false;\n  const s = typeof n.size === 'number' ? n.size : 0;\n  if (f === 'range') {\n    // Either end may be left open. Both open = \"any size\" wearing another\n    // name, which is exactly what an untouched custom range is.\n    const lo = typeof g.sizeMin === 'number' ? g.sizeMin : null;\n    const hi = typeof g.sizeMax === 'number' ? g.sizeMax : null;\n    if (lo !== null && s < lo) return false;\n    if (hi !== null && s > hi) return false;\n    return true;\n  }\n  if (f === 'lt1') return s < MB;\n  if (f === '1to10') return s >= MB && s < 10 * MB;\n  if (f === '10to100') return s >= 10 * MB && s < 100 * MB;\n  return s >= 100 * MB;\n}\n\n/**\n * gorunum:v1 — the name input's predicate, over a bare STRING.\n *\n * ⚠ Exported over a string rather than over a `FileNode`, because the name box\n * now narrows things that are not nodes: `surucu:d1-scope` puts the same box on\n * the multi-storage root (rows ARE nodes there, synthesized ones) and on Home,\n * whose storage cards are `HomeStorage` records with a `label`. Case- and\n * accent-folding is the part that must not be re-typed — a second `toLowerCase`\n * somewhere else is how \"Ödev\" stops answering to \"od\" on one surface and keeps\n * answering on another.\n */\nexport function nameMatches(name: string, needle: string): boolean {\n  if (!needle) return true;\n  return fold(name || '').includes(fold(needle));\n}\n\n/** The same predicate over a listing row. Folders take part like any other row:\n *  hiding the folder whose name you just typed would be the one result you\n *  meant. */\nfunction matchesName(n: FileNode, needle: string): boolean {\n  return nameMatches(n.basename || '', needle);\n}\n\n/**\n * gorunum:v1-advsearch — \"only in this folder\" / \"skip this folder\".\n *\n * Both sides are answered from `path`, which every search hit already carries\n * adapter-qualified (`qldemo://Documents/report.sql`). The base is compared\n * with a trailing slash so `Documents` cannot claim `Documents-old`, and the\n * folder row itself counts as inside it.\n */\nfunction matchesPath(n: FileNode, g: DriveFilters): boolean {\n  const mode = g.pathMode ?? 'any';\n  const base = (g.pathBase ?? '').replace(/\\/+$/, '');\n  if (mode === 'any' || !base) return true;\n  const p = n.path || '';\n  const inside = p === base || p.startsWith(`${base}/`);\n  return mode === 'here' ? inside : !inside;\n}\n\n/* ── Ownership, read off the row ──────────────────────────────────────────\n *\n * The backend omits every owner key it has nothing to say about, so a SYSTEM\n * row simply has no `owner_id` — which is why these read through the FileNode\n * index signature rather than named fields, the same way `snippet` and\n * `matched` are read in ListView. */\n\n/** The row's owner id, or null for a SYSTEM row (nobody put it here). */\nexport function ownerIdOf(n: FileNode): number | null {\n  const raw = (n as Record<string, unknown>).owner_id;\n  return typeof raw === 'number' && raw > 0 ? raw : null;\n}\n\n/** True when the signed-in account owns this row. Answered by the SERVER\n *  (`owner_self`), because the embeddable core has no idea which filex account\n *  the host's session belongs to. */\nexport function ownedByViewer(n: FileNode): boolean {\n  return (n as Record<string, unknown>).owner_self === true;\n}\n\n/** The owner's display name, or '' for a system row / a name the server could\n *  not resolve. The caller decides what to show instead. */\nexport function ownerNameOf(n: FileNode): string {\n  const raw = (n as Record<string, unknown>).owner_name;\n  return typeof raw === 'string' ? raw : '';\n}\n\n/** True when the row arrived through an anonymous drop link. The OWNER is\n *  still the person who created the link — this only says they did not put it\n *  there themselves. */\nexport function arrivedFromOutside(n: FileNode): boolean {\n  return (n as Record<string, unknown>).external_upload === true;\n}\n\n/** One entry of the People pill. `name` is present only for the `u:<id>`\n *  members — the three fixed ones are named by the locale, not by data. */\nexport interface PeopleOption {\n  value: PeopleFilter;\n  name?: string;\n}\n\n/**\n * The People pill's menu for a given listing: `any`, `me`, `system`, and then\n * every OTHER account that actually owns something on screen, by name.\n *\n * ⚠ `me` and `system` are offered unconditionally, and that is deliberate:\n * a menu whose entries appear and disappear as you navigate is a menu you\n * cannot learn. The per-account entries are the ones that would be inert\n * elsewhere, so they are the ones derived from the rows.\n */\nexport function peopleOptions(files: FileNode[]): PeopleOption[] {\n  const out: PeopleOption[] = [{ value: 'any' }, { value: 'me' }, { value: 'system' }];\n  const seen = new Set<number>();\n  for (const n of files) {\n    const id = ownerIdOf(n);\n    if (id === null || ownedByViewer(n) || seen.has(id)) continue;\n    seen.add(id);\n    out.push({ value: `u:${id}`, name: ownerNameOf(n) });\n  }\n  // Stable, readable order for the derived half; the fixed three stay put.\n  const fixed = out.slice(0, 3);\n  const rest = out\n    .slice(3)\n    .sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '', undefined, { sensitivity: 'base' }));\n  return [...fixed, ...rest];\n}\n\n/** Rows belonging to the chosen person. A folder takes part like any other\n *  row: somebody made it, and \"show me what Ada put here\" that silently keeps\n *  everyone's folders would be answering a different question. */\nfunction matchesPeople(n: FileNode, f: DriveFilters): boolean {\n  const want = peopleOf(f);\n  if (want === 'any') return true;\n  if (want === 'me') return ownedByViewer(n);\n  if (want === 'system') return ownerIdOf(n) === null;\n  const id = Number(want.slice(2));\n  return Number.isFinite(id) && ownerIdOf(n) === id;\n}\n\nexport function applyFilters(\n  files: FileNode[],\n  f: DriveFilters,\n  now: number = Date.now(),\n): FileNode[] {\n  // No active filter → the SAME array reference, so an unfiltered explorer\n  // renders exactly what it rendered before this file existed.\n  if (!filtersActive(f)) return files;\n  const needle = nameNeedle(f);\n  return files.filter(\n    (n) =>\n      matchesType(n, f.type) &&\n      matchesModified(n, f, now) &&\n      matchesSize(n, f) &&\n      matchesName(n, needle) &&\n      matchesPath(n, f) &&\n      matchesPeople(n, f),\n  );\n}\n","<script setup lang=\"ts\">\n/**\n * UploadProgress — renderless upload publisher (wiring:c3).\n *\n * Historically this drew its own floating bottom-right footer. Since the\n * unified operations center it renders NOTHING: it reconciles the host's\n * `jobs` list into the shared useOperations store, and the visible UI is\n * OperationsCenter's badge + panel. The original emit contract is kept —\n * cancel/dismiss (and the new retry) still bubble to the host, which owns\n * the actual upload machinery. Mount it exactly as before; just pass the\n * store via `center`.\n */\nimport { watch } from 'vue';\nimport type { UploadJob } from '../composables/useUploadChunked';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { OperationsStore, OperationStatus } from '../composables/useOperations';\n\nconst props = defineProps<{\n  jobs: UploadJob[];\n  /** Kept for mount compatibility — strings now render in OperationsCenter. */\n  locale: LocaleCode;\n  center: OperationsStore;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'cancel', job: UploadJob): void;\n  (e: 'dismiss', job: UploadJob): void;\n  (e: 'retry', job: UploadJob): void;\n}>();\n\nfunction mapStatus(s: UploadJob['status']): OperationStatus {\n  if (s === 'done') return 'done';\n  if (s === 'error') return 'error';\n  if (s === 'aborted') return 'aborted';\n  // pending | initializing | uploading | committing | transferring — all of\n  // them are still in flight as far as the tray is concerned.\n  return 'running';\n}\n\nwatch(\n  () => props.jobs,\n  (jobs) => {\n    props.center.sync(\n      'upload',\n      jobs.map((j) => ({\n        input: {\n          id: j.id,\n          kind: 'upload' as const,\n          name: j.file.name,\n          percent: j.totalBytes > 0 || j.status === 'done' ? j.percent : null,\n          status: mapStatus(j.status),\n          error: j.error ?? null,\n          uploadedBytes: j.uploadedBytes,\n          totalBytes: j.totalBytes,\n          // Cancellable only while chunks are still moving: once the commit is\n          // accepted the bytes are filex's and the ops worker owns the rest.\n          cancellable: j.status === 'uploading' || j.status === 'initializing',\n          retryable: j.status === 'error',\n        },\n        actions: {\n          cancel: () => emit('cancel', j),\n          dismiss: () => emit('dismiss', j),\n          retry: () => emit('retry', j),\n        },\n      })),\n    );\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <i v-if=\"false\" />\n</template>\n","/**\n * opProgress — the one rule for \"how far along is this queued operation\".\n *\n * Both progress surfaces read it: the explorer's operations center\n * (PendingOpsTray → OperationsCenter) and the admin app's bottom-right tray.\n * Two copies of this rule are how one tray starts saying something the other\n * does not (filex lesson #119).\n *\n * Issue #27: a queued op counts SOURCES, so moving one large file — or one\n * folder of a thousand files — is \"0 of 1\" until the very end. Drawn as a\n * percentage that is a bar frozen at 0% that then vanishes, which the reporter\n * read as stuck. So:\n *\n *   - a running cross-storage transfer reports bytes (`bytes_done` /\n *     `bytes_total`); when the total is known that is the percentage;\n *   - bytes moving with no total yet, or a single source with nothing but a\n *     source count, has NO honest percentage: `null`, and the surface shows\n *     an indeterminate indicator instead of a fake 0%;\n *   - several sources still report per source, as before.\n */\n\nexport interface OpProgressLike {\n  status: string;\n  progress_total: number;\n  progress_done: number;\n  bytes_total?: number;\n  bytes_done?: number;\n}\n\nfunction clampPercent(n: number): number {\n  return Math.max(0, Math.min(100, Math.round(n)));\n}\n\n/** 0–100, or `null` when there is no honest number to draw. */\nexport function opPercent(op: OpProgressLike): number | null {\n  if (op.status === 'done') return 100;\n  const bytesTotal = op.bytes_total ?? 0;\n  const bytesDone = op.bytes_done ?? 0;\n  if (bytesTotal > 0) return clampPercent((bytesDone / bytesTotal) * 100);\n  if (bytesDone > 0) return null;\n  if (op.progress_total <= 1) return null;\n  return clampPercent((op.progress_done / op.progress_total) * 100);\n}\n","<script setup lang=\"ts\">\n/**\n * PendingOpsTray — renderless ops-queue publisher (wiring:c3).\n *\n * Historically a bottom-left toast list for queued copy/move/delete. Since\n * the unified operations center it renders NOTHING: it reconciles the\n * usePendingOps rows into the shared useOperations store; OperationsCenter\n * draws them. Terminal-state lingering (\"done\" flash → history) and sticky\n * errors are handled by the store — note usePendingOps sweeps terminal rows\n * after its RETAIN window, which the store treats as \"move to history\"\n * (errors stay pinned until the user dismisses them).\n *\n * Queue ops are not client-retryable: the normalized PendingOp no longer\n * carries the source list, so a failed op only offers dismiss.\n */\nimport { watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { PendingOp } from '../composables/usePendingOps';\nimport type { OperationsStore, OperationStatus } from '../composables/useOperations';\nimport { opPercent } from '../lib/opProgress';\n\nconst props = defineProps<{\n  ops: PendingOp[];\n  /** Kept for mount compatibility — strings now render in OperationsCenter. */\n  locale: LocaleCode;\n  center: OperationsStore;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'dismiss', id: number): void;\n}>();\n\nfunction mapStatus(op: PendingOp): OperationStatus {\n  if (op.status === 'done') return 'done';\n  if (op.status === 'error') return 'error';\n  return 'running'; // pending | running\n}\n\n/* issue #27 — bytes when a cross-storage transfer reports them, no fake 0%\n * otherwise; the rule is shared with the admin tray (lib/opProgress). */\nconst percentOf = (op: PendingOp): number | null => opPercent(op);\n\nwatch(\n  () => props.ops,\n  (ops) => {\n    props.center.sync(\n      'ops',\n      ops.map((op) => ({\n        input: {\n          id: op.id,\n          kind: op.op_type,\n          name: op.target_path || op.source_dir || '',\n          percent: percentOf(op),\n          status: mapStatus(op),\n          error: op.error_message,\n          queued: op.status === 'pending',\n          doneCount: op.progress_done,\n          totalCount: op.progress_total,\n          cancellable: false,\n          retryable: false,\n        },\n        actions: {\n          dismiss: () => emit('dismiss', op.id),\n        },\n      })),\n    );\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <i v-if=\"false\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * InspectorPanel — koru:k1 details (\"Ayrıntılar\") side panel.\n *\n * Rendered as a flex sibling of `.fe__body` (right side, ~300px). In\n * `fe--narrow` embeds it becomes a full-size overlay with its own close\n * button (Esc handled by FileExplorer's shortcut chain).\n *\n * Sections:\n *   - Genel     : icon/thumb, name, path (copy), size, modified, mime, etag.\n *                 Multi-select → \"N items, total X\" summary; no selection →\n *                 current-folder summary.\n *   - Sürümler  : version history via GET /api/files/versions?node_id=…\n *                 + restore (with optional snapshot-current) + snapshot-now.\n *                 The section hides silently when the backend gates the\n *                 endpoint (401/403) or doesn't ship it (404).\n *   - İzinler   : effective RBAC level badge + \"manage\" (opens the existing\n *                 PermissionsModal through the host). Only when ACL is\n *                 enforced on the storage (perm is a non-empty string).\n *   - Paylaşımlar: existing share links (GET /api/files/share?path=…) with\n *                 copy buttons. Hidden silently when the list call fails\n *                 (viewer-level users get 403 by design).\n *\n * The panel is mounted with v-if by the host — closed state leaves zero DOM.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { FileApi, Grant, NodeVersion } from '../composables/useFileApi';\nimport type { FileNode, ShareInfo } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconTile, typeLabelFor } from '../lib/fileIcons';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport TagPicker from './TagPicker.vue';\n\nconst props = withDefaults(\n  defineProps<{\n  api: FileApi;\n  /** Current selection (empty array → current-folder summary). */\n  nodes: FileNode[];\n  /** Display label of the folder being viewed (for the no-selection state). */\n  dirLabel: string;\n  /** Number of entries in the folder being viewed. */\n  dirCount: number;\n  /** RBAC effective level of the current dir ('' = ACL not enforced). */\n  dirPerm?: string;\n  /**\n   * pane:p1 — non-empty ⇒ `nodes` is the LAST selected thing, not what is\n   * ticked in the pane the person is looking at; the value NAMES where it\n   * lives.\n   *\n   * ⚠ The panel holds its subject on purpose (owner, 2026-09-13: \"son seçilen\n   * şeyi tutsun\"), which means it can be describing a file in the other half of\n   * a split window — so it has to SAY so. Without this line the panel would be\n   * a fact with no address: three sections about `report.pdf` over a listing\n   * with nothing ticked in it, and no way to tell whether that is the file you\n   * just clicked or the one you clicked five minutes ago.\n   */\n  heldIn?: string;\n  locale: LocaleCode;\n  /** Narrow/embed mode → full-size overlay presentation. */\n  narrow?: boolean;\n  /** Authenticated thumbnail resolver (useThumbs.src). Optional. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /* === surucu:d1 — the Drive shell's details panel ===================== */\n  /**\n   * Split the panel into **Details** and **Activity** tabs, and draw the two\n   * sections the mockups add: who has access, and the share link with a\n   * \"Create link\" button. `uiProfile: 'drive'` turns it on; absent/false is\n   * the flat scroll of sections this panel has always been, with no extra\n   * request made.\n   *\n   * ⚠ \"Activity\" is version history + comments, and nothing else, because\n   * nothing else exists: there is no per-file activity endpoint. The audit log\n   * is admin-only, has no path filter, and stores an EMPTY `target_id` for\n   * every file action (auth/audit_middleware.go) — so \"Ayşe renamed this on\n   * Tuesday\" cannot be answered by this server, and a timeline that made it up\n   * would be worse than the two real feeds.\n   */\n  tabs?: boolean;\n  /* === etiket:t1 — the Tags section ==================================\n   *\n   * The three props a self-fetching child in this package takes, passed\n   * straight through to `TagPicker`: it talks to\n   * `/api/files/manager/tags` itself and needs all three to do it.\n   *\n   * ⚠ `authCredentials` is not decoration. A credentialed cross-origin\n   * request cannot be answered with `Access-Control-Allow-Origin: *`, so\n   * an embed served from a different origin to the API loses its tags\n   * without it — the same reason TagPicker's own prop documents.\n   *\n   * All three optional: a host that passes none gets no Tags section\n   * rather than a control that reads nothing. That is the honest failure\n   * for this panel, which hides every section it cannot fill.\n   */\n  /** API origin for the tag routes. `''` is valid — it means \"same origin\". */\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  }>(),\n  {\n    /* ⚠ ON by default, and that is the owner's call of 2026-09-12, not a\n     * taste: the Details/Activity split, \"People with access\" and the share\n     * link row used to arrive only with `uiProfile: 'drive'`, which meant the\n     * screen the owner actually uses — the admin one — was the only screen\n     * that never got them (\"their app and our app will be one to one\";\n     * web/src/views/Explore.vue carries the full quote). The profile string\n     * is gone; this is the last gate that answered to it, so it answers yes.\n     * An embedder that wants the old flat scroll can still pass `:tabs=\"false\"`.\n     */\n    tabs: true,\n    narrow: false,\n    dirPerm: '',\n    thumbSrc: undefined,\n  },\n);\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** surucu:d1 — a share link was minted from the panel. */\n  (e: 'share-created', payload: { path: string; url: string }): void;\n  (e: 'manage-permissions', node: FileNode): void;\n  (e: 'toast', message: string): void;\n  /** Fired after a successful restore/snapshot so the host can reload. */\n  (e: 'changed'): void;\n  /**\n   * etiket:t1 — tags on this node were edited here.\n   *\n   * ⚠ The host drops its cached tag list on this, refreshes the panel's\n   * Tags section and reloads an open tag view — exactly what the\n   * context-menu tag modal already causes. Without the emit the edit\n   * lands on the server and the sidebar keeps showing the list from\n   * before it, which is the kind of staleness nobody notices until they\n   * go looking for the tag they just made.\n   */\n  (e: 'tags-changed', tags: string[]): void;\n  /**\n   * etiket:t1 — a tag chip was clicked: open that tag's view.\n   *\n   * ⚠ Re-emitted rather than handled, like every other navigation this panel\n   * offers. The panel knows a tag's NAME; only the host knows that the tag view\n   * is a `.tag~<name>` sentinel, how to leave whatever view is on screen to get\n   * there, and what that does to the tab strip.\n   */\n  (e: 'open-tag', tag: string): void;\n}>();\n\nconst { t, formatSize, formatDate: formatDateOf, nodeDisplayName } = useLocale(\n  () => props.locale,\n);\n\n// ── selection shape ──────────────────────────────────────────────────\nconst single = computed<FileNode | null>(() =>\n  props.nodes.length === 1 ? props.nodes[0] : null,\n);\nconst isMulti = computed(() => props.nodes.length > 1);\nconst isFile = computed(() => single.value?.type === 'file');\nconst nodeId = computed<number | null>(() =>\n  typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nconst multiTotal = computed(() =>\n  props.nodes.reduce((acc, n) => acc + (typeof n.size === 'number' ? n.size : 0), 0),\n);\nconst etag = computed<string | null>(() => {\n  const v = single.value?.etag;\n  return typeof v === 'string' && v !== '' ? v : null;\n});\nconst thumb = computed<string | null>(() =>\n  single.value && isFile.value && props.thumbSrc ? props.thumbSrc(single.value) : null,\n);\n\n/* === gorunum:v4-dialogs — what the head says =============================\n *\n * The panel used to open with the word \"Details\" and put the item's own name\n * a section lower, under a second heading. The reference shell puts the item\n * in the head — its glyph, its name, and one caption naming what it is — and\n * that is the right way round: the panel is ABOUT the item, and a header that\n * names the panel instead of its subject is a label on the frame.\n *\n * All three fall back cleanly: a multi-selection is counted, no selection at\n * all describes the folder being viewed. Nothing here invents a fact — the\n * caption is the same kind name the listing's Type column prints\n * (`typeLabelFor`) and the same size formatter the rows use.\n * ---------------------------------------------------------------------- */\n\n/** The name in the head: the item, the count, or the folder you are in. */\nconst headName = computed<string>(() => {\n  if (isMulti.value) return t('inspector.items', { n: props.nodes.length });\n  if (single.value) return nodeDisplayName(single.value);\n  return props.dirLabel;\n});\n\n/** The line under it — \"Folder\", \"TypeScript · 4.8 KB\", \"12.4 MB in total\". */\nconst headCaption = computed<string>(() => {\n  if (isMulti.value) return formatSize(multiTotal.value);\n  const n = single.value;\n  if (n) {\n    const kind = typeLabelFor(n, t);\n    if (n.type === 'dir') return kind;\n    const size = typeof n.size === 'number' ? formatSize(n.size) : '';\n    return size ? `${kind} · ${size}` : kind;\n  }\n  return t('inspector.folder_items', { n: props.dirCount });\n});\n\n/**\n * Whether the thumbnail is worth the space it takes.\n *\n * ⚠ `thumbSrc` answers for text files too — the host renders the source and\n * hands back a picture of it — and at panel width that came out as a blank\n * olive rectangle with \"TS\" in the middle of it: a large, prominent block\n * that tells the reader less than the one-word caption already did. A\n * thumbnail earns its place when the file IS a picture; for everything else\n * the type tile and the kind name are the whole of what an image could say.\n */\nconst previewSrc = computed<string | null>(() =>\n  thumb.value && /^(image|video)[/]/.test(String(single.value?.mime_type ?? ''))\n    ? thumb.value\n    : null,\n);\n\n/**\n * The glyph — the LISTING'S tile, not a second drawing of the same idea and\n * not the thumbnail.\n *\n * ⚠ It was the thumbnail first, and that was wrong twice over: the host\n * resolves a thumbnail for text files too, so `app.ts` came out as a 30px\n * smudge of rendered source with no glyph in it at all, and the panel's mark\n * then disagreed with the mark on the row it describes. `fileIconTile` is the\n * same object the row draws, so the head and the row match by construction.\n * The thumbnail is still shown — below, at a size where a picture is a\n * picture.\n */\nconst headIcon = computed<string>(() =>\n  fileIconTile(single.value && !isMulti.value ? single.value : { type: 'dir' }),\n);\n\n/**\n * Whether the Tags section has everything it needs.\n *\n * A node id, because the tag routes are keyed by it (a client-synthesized row\n * — a multi-storage virtual folder — has none), and a host that wired the\n * three props. Missing either, the section is not drawn at all rather than\n * drawn empty: an \"Add tag\" button that cannot save is worse than no button.\n */\nconst canTag = computed(\n  () => nodeId.value != null && props.apiBase !== undefined && !isMulti.value,\n);\n\nfunction shortHash(h: string): string {\n  return h.length > 12 ? `${h.slice(0, 12)}…` : h;\n}\n\n/**\n * zaman:z1 — the panel prints the SAME string the row behind it prints.\n *\n * This used to be a private `formatDate()` that called `toLocaleString` with\n * no `timeZone` at all, so the details panel answered on the BROWSER's clock\n * while the listing cell four pixels away answered on the zone the viewer\n * chose. It also mapped the locale by hand ('en-GB'), so even in one zone the\n * two disagreed about the shape of a date. Both halves live in\n * `useLocale.formatDate` now; `{ time: true }` is the listing's own variant.\n */\nfunction formatDate(ms: number | undefined): string {\n  return formatDateOf(ms, { time: true }) || '—';\n}\n\nfunction formatDateStr(s: string | undefined | null): string {\n  if (!s) return '—';\n  const ms = Date.parse(s);\n  return Number.isNaN(ms) ? s : formatDate(ms);\n}\n\nasync function copyText(text: string): Promise<void> {\n  try {\n    await navigator.clipboard.writeText(text);\n    emit('toast', t('inspector.copied'));\n  } catch {\n    emit('toast', text);\n  }\n}\n\n// ── RBAC (İzinler) ───────────────────────────────────────────────────\n// Effective level for the selected item: its own perm, else the dir's.\n// A non-empty string means ACL is enforced → section shows.\nconst effectivePerm = computed<string>(() => {\n  if (!single.value) return '';\n  // Backends may send '' when ACL is off — widen past the declared union.\n  const own = single.value.perm as string | undefined;\n  if (typeof own === 'string' && own !== '') return own;\n  return props.dirPerm || '';\n});\nconst canManagePerms = computed(\n  () => effectivePerm.value === 'editor' || effectivePerm.value === 'owner',\n);\nfunction permLabel(level: string): string {\n  return t(`inspector.perm.${level}`) === `inspector.perm.${level}`\n    ? level\n    : t(`inspector.perm.${level}`);\n}\n\n// ── versions state ───────────────────────────────────────────────────\ntype SectionState = 'idle' | 'loading' | 'ok' | 'hidden' | 'error';\nconst versionsState = ref<SectionState>('idle');\nconst versions = ref<NodeVersion[]>([]);\nconst confirmVersionId = ref<number | null>(null);\nconst snapshotFirst = ref(true);\nconst versionBusy = ref(false);\n\n// ── shares state ─────────────────────────────────────────────────────\nconst sharesState = ref<SectionState>('idle');\nconst shares = ref<ShareInfo[]>([]);\n\n// Race guard: only the latest refresh may write state.\nlet refreshSeq = 0;\n\nasync function refresh(): Promise<void> {\n  const seq = ++refreshSeq;\n  confirmVersionId.value = null;\n  versions.value = [];\n  shares.value = [];\n\n  // Versions — single file with a backend node id only.\n  if (single.value && isFile.value && nodeId.value != null) {\n    versionsState.value = 'loading';\n    void loadVersions(seq);\n  } else {\n    versionsState.value = 'hidden';\n  }\n\n  // Shares — any single selection (files and folders both shareable).\n  if (single.value) {\n    sharesState.value = 'loading';\n    const path = single.value.path;\n    try {\n      const { shares: list } = await props.api.listShares(path);\n      if (seq !== refreshSeq) return;\n      shares.value = Array.isArray(list) ? list : [];\n      sharesState.value = 'ok';\n    } catch {\n      if (seq !== refreshSeq) return;\n      // 403 = viewer-level user (by design), anything else — auxiliary\n      // info, hide silently rather than alarm.\n      sharesState.value = 'hidden';\n    }\n  } else {\n    sharesState.value = 'hidden';\n  }\n}\n\nasync function loadVersions(seq: number): Promise<void> {\n  const id = nodeId.value;\n  if (id == null) return;\n  try {\n    const list = await props.api.listVersions(id);\n    if (seq !== refreshSeq) return;\n    versions.value = list;\n    versionsState.value = 'ok';\n  } catch (err) {\n    if (seq !== refreshSeq) return;\n    const status = (err as { status?: number }).status;\n    // Gated (401/403) or absent (404) endpoint → section silently hidden.\n    if (status === 401 || status === 403 || status === 404) {\n      versionsState.value = 'hidden';\n    } else {\n      versionsState.value = 'error';\n    }\n  }\n}\n\nfunction askRestore(v: NodeVersion): void {\n  confirmVersionId.value = v.id;\n  snapshotFirst.value = true;\n}\n\nasync function confirmRestore(v: NodeVersion): Promise<void> {\n  const id = nodeId.value;\n  if (id == null || versionBusy.value) return;\n  versionBusy.value = true;\n  try {\n    await props.api.restoreVersion(id, v.id, snapshotFirst.value);\n    emit('toast', t('inspector.versions.restored'));\n    confirmVersionId.value = null;\n    emit('changed');\n    await loadVersions(++refreshSeq);\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    versionBusy.value = false;\n  }\n}\n\nasync function takeSnapshot(): Promise<void> {\n  const id = nodeId.value;\n  if (id == null || versionBusy.value) return;\n  versionBusy.value = true;\n  try {\n    await props.api.snapshotVersion(id);\n    emit('toast', t('inspector.versions.snapshotted'));\n    await loadVersions(++refreshSeq);\n  } catch (err) {\n    const status = (err as { status?: number }).status;\n    // Older backends don't ship POST /versions/snapshot yet.\n    if (status === 404 || status === 405 || status === 501) {\n      emit('toast', t('inspector.versions.unsupported'));\n    } else {\n      emit('toast', (err as Error).message);\n    }\n  } finally {\n    versionBusy.value = false;\n  }\n}\n\n/* === surucu:d1 — tabs, people with access, the share-link row ==========\n *\n * The tab strip is presentation only: every section below is the same section,\n * rendered under Details or under Activity. Nothing is fetched twice, and\n * nothing new is fetched at all unless `tabs` is on.\n */\ntype InspectorTab = 'details' | 'activity';\nconst tab = ref<InspectorTab>('details');\n\n/** People with access — `GET /api/files/permissions?path=…`.\n *\n * ⚠ Owner-gated on the server (handlers/grants.go `requireOwner`), so an\n * editor or a viewer gets a 403 for a file they can perfectly well see. That\n * is the server's call, not something to route around: the section hides,\n * exactly the way the shares list already hides for the same class of caller.\n * What it must NOT do is render an empty \"People with access\" and let the\n * reader conclude that nobody has any.\n */\nconst peopleState = ref<SectionState>('hidden');\nconst people = ref<Grant[]>([]);\nlet peopleSeq = 0;\n\nasync function loadPeople(): Promise<void> {\n  const seq = ++peopleSeq;\n  const node = single.value;\n  if (!props.tabs || !node) {\n    peopleState.value = 'hidden';\n    people.value = [];\n    return;\n  }\n  peopleState.value = 'loading';\n  try {\n    const r = await props.api.listPermissions(node.path);\n    if (seq !== peopleSeq) return;\n    // RBAC off on this storage → there are no grants, and a section reading\n    // \"nobody\" would misdescribe a drive where everyone can already read it.\n    if (!r.storage_rbac) {\n      peopleState.value = 'hidden';\n      people.value = [];\n      return;\n    }\n    people.value = [...(r.direct ?? []), ...(r.inherited ?? [])];\n    peopleState.value = 'ok';\n  } catch {\n    if (seq !== peopleSeq) return;\n    people.value = [];\n    peopleState.value = 'hidden';\n  }\n}\n\nfunction personName(g: Grant): string {\n  return g.user_display_name || g.user_email || `#${g.user_id}`;\n}\n\nfunction personInitial(g: Grant): string {\n  const n = personName(g).trim();\n  return n ? n[0].toUpperCase() : '?';\n}\n\n/** The share-link row: the first live link, or the Create button. */\nconst primaryShare = computed(() => (shares.value.length ? shares.value[0] : null));\nconst shareBusy = ref(false);\n\nasync function createLink(): Promise<void> {\n  const node = single.value;\n  if (!node || shareBusy.value) return;\n  shareBusy.value = true;\n  try {\n    const r = await props.api.createShare({ path: node.path });\n    const url = r.share?.url ?? '';\n    // Re-read the list rather than push the response into it: the LIST\n    // endpoint is what a later copy or revoke acts on, and its `uuid` is the\n    // numeric id the DELETE route wants — not the token the create response\n    // carries under that name.\n    const { shares: list } = await props.api.listShares(node.path);\n    shares.value = Array.isArray(list) ? list : [];\n    sharesState.value = 'ok';\n    if (url) {\n      emit('share-created', { path: node.path, url });\n      await copyText(url);\n    }\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    shareBusy.value = false;\n  }\n}\n\nwatch(\n  () => [props.nodes.map((n) => n.path).join('|'), props.tabs] as const,\n  () => void loadPeople(),\n  { immediate: true },\n);\n\n/* Versions and comments are the two real feeds; when a selection has neither,\n * the Activity tab says so instead of showing two empty headings. */\nconst activityUsable = computed(\n  () => versionsState.value !== 'hidden' || commentsState.value !== 'hidden',\n);\n/* === /surucu:d1 === */\n\nwatch(\n  () => props.nodes.map((n) => n.path).join('\\u0000'),\n  () => void refresh(),\n  { immediate: true },\n);\n\n/* === calisma:d3 — Yorumlar (node comments) ===\n * Flat chronological thread per node (files AND folders — every backend\n * row carries an id). Loaded through its own watcher + seq guard so the\n * existing refresh() stays untouched. Add/delete are NOT optimistic: the\n * list re-fetches after each successful API round-trip. The section hides\n * silently when the backend gates (401/403) or lacks (404) the endpoint.\n */\nimport type { NodeComment } from '../composables/useFileApi';\n\nconst commentsState = ref<SectionState>('hidden');\nconst comments = ref<NodeComment[]>([]);\nconst commentDraft = ref('');\nconst commentBusy = ref(false);\nconst commentNodeId = computed<number | null>(() =>\n  typeof single.value?.id === 'number' ? (single.value.id as number) : null,\n);\nlet commentSeq = 0;\n\nasync function loadComments(): Promise<void> {\n  const seq = ++commentSeq;\n  const id = commentNodeId.value;\n  if (id == null) {\n    commentsState.value = 'hidden';\n    comments.value = [];\n    return;\n  }\n  commentsState.value = comments.value.length > 0 ? 'ok' : 'loading';\n  try {\n    const list = await props.api.listComments(id);\n    if (seq !== commentSeq) return;\n    comments.value = list;\n    commentsState.value = 'ok';\n  } catch (err) {\n    if (seq !== commentSeq) return;\n    comments.value = [];\n    const status = (err as { status?: number }).status;\n    commentsState.value =\n      status === 401 || status === 403 || status === 404 ? 'hidden' : 'error';\n  }\n}\n\nasync function sendComment(): Promise<void> {\n  const id = commentNodeId.value;\n  const body = commentDraft.value.trim();\n  if (id == null || body === '' || commentBusy.value) return;\n  commentBusy.value = true;\n  try {\n    await props.api.addComment(id, body);\n    commentDraft.value = '';\n    await loadComments();\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    commentBusy.value = false;\n  }\n}\n\nasync function removeComment(c: NodeComment): Promise<void> {\n  if (commentBusy.value) return;\n  commentBusy.value = true;\n  try {\n    await props.api.deleteComment(c.id);\n    await loadComments();\n  } catch (err) {\n    emit('toast', (err as Error).message);\n  } finally {\n    commentBusy.value = false;\n  }\n}\n\n/** Relative \"3 minutes ago\" stamp via Intl (locale-aware, no i18n keys). */\nfunction relativeTime(iso: string): string {\n  const ms = Date.parse(iso);\n  if (Number.isNaN(ms)) return iso;\n  const diffS = Math.round((ms - Date.now()) / 1000);\n  const abs = Math.abs(diffS);\n  const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n    ['year', 31536000],\n    ['month', 2592000],\n    ['day', 86400],\n    ['hour', 3600],\n    ['minute', 60],\n  ];\n  try {\n    const rtf = new Intl.RelativeTimeFormat(\n      props.locale === 'en' ? 'en' : 'tr',\n      { numeric: 'auto' },\n    );\n    for (const [unit, secs] of units) {\n      if (abs >= secs) return rtf.format(Math.trunc(diffS / secs), unit);\n    }\n    return rtf.format(diffS, 'second');\n  } catch {\n    return formatDateStr(iso);\n  }\n}\n\nwatch(\n  () => commentNodeId.value,\n  () => {\n    comments.value = [];\n    commentDraft.value = '';\n    void loadComments();\n  },\n  { immediate: true },\n);\n/* === /calisma:d3 === */\n</script>\n\n<template>\n  <aside\n    class=\"fe-inspector\"\n    :class=\"{ 'fe-inspector--overlay': narrow }\"\n    role=\"complementary\"\n    :aria-label=\"t('inspector.title')\"\n  >\n    <!-- The head is about the ITEM, not about the panel: its glyph, its name\n         and one caption naming what it is. \"Copy name\" is next to the name it\n         copies; the close button is last, on the edge. -->\n    <header class=\"fe-inspector__head\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n      <span class=\"fe-inspector__head-icon\" aria-hidden=\"true\" v-html=\"headIcon\"></span>\n      <div class=\"fe-inspector__head-text\">\n        <h2 class=\"fe-inspector__title\" :title=\"headName\">{{ headName }}</h2>\n        <p class=\"fe-inspector__caption\">{{ headCaption }}</p>\n        <!-- pane:p1 — the held-subject line. Drawn ONLY while this panel is\n             describing the last selected thing rather than a live selection,\n             and it names the folder that thing is in, because with a split\n             window that folder may not be the one on screen. `role=\"note\"`:\n             it is a fact about the panel, not another fact about the file. -->\n        <p v-if=\"heldIn\" class=\"fe-inspector__held\" role=\"note\" data-testid=\"inspector-held\">\n          {{ t('inspector.held', { where: heldIn }) }}\n        </p>\n      </div>\n      <button\n        v-if=\"single\"\n        type=\"button\"\n        class=\"fe-inspector__iconbtn\"\n        :title=\"t('inspector.copy_name')\"\n        :aria-label=\"t('inspector.copy_name')\"\n        data-testid=\"inspector-copy-name\"\n        @click=\"copyText(headName)\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-inspector__iconbtn fe-inspector__close\"\n        :title=\"t('inspector.close')\"\n        :aria-label=\"t('inspector.close')\"\n        @click=\"emit('close')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n      </button>\n    </header>\n\n    <!-- surucu:d1 — Details / Activity. Rendered only in the drive shell; the\n         classic panel keeps its single flat scroll of sections. -->\n    <div v-if=\"tabs\" class=\"fe-inspector__tabs\" role=\"tablist\" :aria-label=\"t('inspector.title')\">\n      <button\n        type=\"button\"\n        class=\"fe-inspector__tab\"\n        :class=\"{ 'is-active': tab === 'details' }\"\n        role=\"tab\"\n        :aria-selected=\"tab === 'details'\"\n        data-testid=\"inspector-tab-details\"\n        @click=\"tab = 'details'\"\n      >{{ t('inspector.tab.details') }}</button>\n      <button\n        type=\"button\"\n        class=\"fe-inspector__tab\"\n        :class=\"{ 'is-active': tab === 'activity' }\"\n        role=\"tab\"\n        :aria-selected=\"tab === 'activity'\"\n        data-testid=\"inspector-tab-activity\"\n        @click=\"tab = 'activity'\"\n      >{{ t('inspector.tab.activity') }}</button>\n    </div>\n\n    <div class=\"fe-inspector__scroll\">\n      <!-- ══ Genel ══ -->\n      <section v-if=\"!tabs || tab === 'details'\" class=\"fe-inspector__section\">\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.general') }}</h3>\n\n        <!-- Multi selection → summary. The head already counts them, so this\n             is the one fact the head does not carry. -->\n        <dl v-if=\"isMulti\" class=\"fe-inspector__meta\">\n          <div class=\"fe-inspector__row\">\n            <dt>{{ t('inspector.size') }}</dt>\n            <dd>{{ formatSize(multiTotal) }}</dd>\n          </div>\n        </dl>\n\n        <!-- Single selection → full meta.\n             ⚠ No Owner row. There is no per-node owner on the wire\n             (`handlers/shared.go`: \"There is no per-node owner\"), so the\n             reference shell's \"Owner: You\" would be a constant wearing the\n             shape of a fact. -->\n        <template v-else-if=\"single\">\n          <!-- The thumbnail, when the host resolved one. Wide and short: this\n               is the one place in the panel where a picture beats a word, and\n               the 30px square in the head is not that place.\n               ⚠ INSIDE this branch, not before it: a `v-if` sibling between\n               `v-if=\"isMulti\"` and this `v-else-if` silently captures the\n               else — which is exactly what happened, and the whole General\n               table stopped rendering while the heading above it stayed. -->\n          <img\n            v-if=\"previewSrc\"\n            class=\"fe-inspector__preview\"\n            :src=\"previewSrc\"\n            alt=\"\"\n            aria-hidden=\"true\"\n          />\n          <dl class=\"fe-inspector__meta\">\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.type') }}</dt>\n              <dd>{{ typeLabelFor(single, t) }}</dd>\n            </div>\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.path') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\" :title=\"single.path\">{{ single.path }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(single.path)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n            <div v-if=\"isFile\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.size') }}</dt>\n              <dd>{{ formatSize(typeof single.size === 'number' ? single.size : null) }}</dd>\n            </div>\n            <div class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.modified') }}</dt>\n              <dd>{{ formatDate(single.last_modified) }}</dd>\n            </div>\n            <div v-if=\"isFile && single.mime_type\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.mime') }}</dt>\n              <dd class=\"fe-inspector__mime\">{{ single.mime_type }}</dd>\n            </div>\n            <!-- ⚠ The node id lives HERE and nowhere else (owner's call,\n                 2026-09-13). It used to be a row in the right-click menu and the\n                 selection bar — a developer's handle on a support ticket sitting\n                 in front of everyone, twice. This panel is where the other\n                 technical facts about a file already are (Path, MIME, ETag), and\n                 it is still one click to copy. Drawn only when the row actually\n                 has one: a client-synthesized row (a multi-storage folder) has\n                 no backend id, and an empty \"ID —\" teaches nothing. -->\n            <div v-if=\"typeof single.id === 'number'\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.nodeId') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\">{{ single.id }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(String(single.id))\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n            <div v-if=\"etag\" class=\"fe-inspector__row\">\n              <dt>{{ t('inspector.etag') }}</dt>\n              <dd class=\"fe-inspector__pathcell\">\n                <span class=\"fe-inspector__path\" :title=\"etag\">{{ shortHash(etag) }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-inspector__copy\"\n                  :title=\"t('inspector.copy')\"\n                  :aria-label=\"t('inspector.copy')\"\n                  @click=\"copyText(etag)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                </button>\n              </dd>\n            </div>\n          </dl>\n        </template>\n\n        <!-- No selection → nothing more to say. The head already names the\n             folder you are in and counts what is in it. -->\n        <p v-else class=\"fe-inspector__empty\">{{ t('inspector.select_hint') }}</p>\n      </section>\n\n      <!-- ══ etiket:t1 — Etiketler ══\n           The SAME `TagPicker` the context menu opens in a modal, mounted\n           inline. Not a second tag editor: one component, so the chips, the\n           colours and the add flow are identical wherever tags are edited,\n           and a fix to any of them reaches both places at once. -->\n      <section\n        v-if=\"canTag && (!tabs || tab === 'details')\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-tags\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.tags') }}</h3>\n        <TagPicker\n          :node-id=\"nodeId as number\"\n          :locale=\"locale\"\n          :api-base=\"apiBase\"\n          :auth-headers=\"authHeaders\"\n          :auth-credentials=\"authCredentials\"\n          @change=\"(tags: string[]) => emit('tags-changed', tags)\"\n          @open=\"(tag: string) => emit('open-tag', tag)\"\n          @error=\"() => emit('toast', t('inspector.error'))\"\n        />\n      </section>\n\n      <!-- ══ Sürümler ══ -->\n      <section\n        v-if=\"(versionsState === 'ok' || versionsState === 'error') && (!tabs || tab === 'activity')\"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.versions') }}</h3>\n\n        <p v-if=\"versionsState === 'error'\" class=\"fe-inspector__empty\">\n          {{ t('inspector.error') }}\n        </p>\n        <template v-else>\n          <p v-if=\"versions.length === 0\" class=\"fe-inspector__empty\">\n            {{ t('inspector.versions.empty') }}\n          </p>\n          <ul v-else class=\"fe-inspector__versions\">\n            <li v-for=\"v in versions\" :key=\"v.id\" class=\"fe-inspector__version\">\n              <div class=\"fe-inspector__version-main\">\n                <span class=\"fe-inspector__version-n\">\n                  {{ t('inspector.versions.v', { n: v.version_n }) }}\n                </span>\n                <span class=\"fe-inspector__version-meta\">\n                  {{ formatDateStr(v.created_at) }} · {{ formatSize(v.size) }}\n                </span>\n              </div>\n              <div v-if=\"confirmVersionId === v.id\" class=\"fe-inspector__confirm\">\n                <p class=\"fe-inspector__confirm-q\">{{ t('inspector.versions.restore_confirm') }}</p>\n                <label class=\"fe-inspector__check\">\n                  <input v-model=\"snapshotFirst\" type=\"checkbox\" />\n                  {{ t('inspector.versions.snapshot_current') }}\n                </label>\n                <div class=\"fe-inspector__confirm-actions\">\n                  <button\n                    type=\"button\"\n                    class=\"fe-btn fe-btn--primary fe-btn--sm\"\n                    :disabled=\"versionBusy\"\n                    @click=\"confirmRestore(v)\"\n                  >{{ t('inspector.versions.confirm') }}</button>\n                  <button\n                    type=\"button\"\n                    class=\"fe-btn fe-btn--sm\"\n                    :disabled=\"versionBusy\"\n                    @click=\"confirmVersionId = null\"\n                  >{{ t('inspector.versions.cancel') }}</button>\n                </div>\n              </div>\n              <button\n                v-else\n                type=\"button\"\n                class=\"fe-btn fe-btn--sm\"\n                :disabled=\"versionBusy\"\n                @click=\"askRestore(v)\"\n              >{{ t('inspector.versions.restore') }}</button>\n            </li>\n          </ul>\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm fe-inspector__snapshot\"\n            :disabled=\"versionBusy\"\n            @click=\"takeSnapshot\"\n          >{{ t('inspector.versions.take_snapshot') }}</button>\n        </template>\n      </section>\n\n      <!-- ══ İzinler ══ -->\n      <!-- ⚠ surucu:d1 — stands down when \"People with access\" is on screen. The\n           two say the same thing there (your own row is in the roster, with the\n           same level) and each carries its own button into the SAME modal —\n           two doors into one room, six lines apart. It stays for every other\n           case, which is exactly the case where People is hidden: RBAC off on\n           the storage, or the server refusing the grant list to a non-owner. -->\n      <section\n        v-if=\"\n          single &&\n          effectivePerm &&\n          (!tabs || tab === 'details') &&\n          !(tabs && peopleState === 'ok')\n        \"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.section.permissions') }}</h3>\n        <div class=\"fe-inspector__permrow\">\n          <span\n            class=\"fe-inspector__badge\"\n            :class=\"`fe-inspector__badge--${effectivePerm}`\"\n          >{{ permLabel(effectivePerm) }}</span>\n          <button\n            v-if=\"canManagePerms\"\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm\"\n            @click=\"emit('manage-permissions', single)\"\n          >{{ t('inspector.perm.manage') }}</button>\n        </div>\n      </section>\n\n      <!-- ══ surucu:d1 — People with access ══\n           Real grants from `GET /api/files/permissions`; hidden entirely when\n           the caller is not an owner (403) or the storage has RBAC off, rather\n           than drawn empty. -->\n      <section\n        v-if=\"tabs && tab === 'details' && peopleState === 'ok'\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-people\"\n      >\n        <h3 class=\"fe-inspector__heading\">{{ t('inspector.people') }}</h3>\n        <p v-if=\"people.length === 0\" class=\"fe-inspector__empty\">\n          {{ t('inspector.people.empty') }}\n        </p>\n        <ul v-else class=\"fe-inspector__people\">\n          <li v-for=\"g in people\" :key=\"`${g.id}-${g.user_id}`\" class=\"fe-inspector__person\">\n            <span class=\"fe-inspector__avatar\" aria-hidden=\"true\">{{ personInitial(g) }}</span>\n            <span class=\"fe-inspector__person-main\">\n              <span class=\"fe-inspector__person-name\" :title=\"g.user_email\">{{ personName(g) }}</span>\n              <span class=\"fe-inspector__person-sub\">\n                {{ permLabel(g.level) }}<template v-if=\"g.inherited\"> · {{ t('inspector.people.inherited') }}</template>\n              </span>\n            </span>\n          </li>\n        </ul>\n        <button\n          v-if=\"canManagePerms && single\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--sm\"\n          @click=\"emit('manage-permissions', single)\"\n        >{{ t('inspector.people.manage') }}</button>\n      </section>\n\n      <!-- ══ Paylaşımlar ══ -->\n      <section\n        v-if=\"sharesState === 'ok' && (!tabs || tab === 'details')\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-shares\"\n      >\n        <h3 class=\"fe-inspector__heading\">\n          {{ tabs ? t('inspector.link') : t('inspector.section.shares') }}\n        </h3>\n        <!-- surucu:d1 — the mockup's link row: what the state IS, and the one\n             button that changes it. Only when there is no link yet; the list\n             below is what an item that HAS links has always shown. -->\n        <div v-if=\"tabs && shares.length === 0\" class=\"fe-inspector__linkrow\">\n          <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n          <span class=\"fe-inspector__linkicon\" aria-hidden=\"true\" v-html=\"actionIconSvg('link')\"></span>\n          <span class=\"fe-inspector__linknone\">{{ t('inspector.link.none') }}</span>\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--sm\"\n            :disabled=\"shareBusy || !single\"\n            data-testid=\"inspector-create-link\"\n            @click=\"createLink\"\n          >{{ t('inspector.link.create') }}</button>\n        </div>\n        <p v-else-if=\"shares.length === 0\" class=\"fe-inspector__empty\">\n          {{ t('inspector.shares.empty') }}\n        </p>\n        <ul v-else class=\"fe-inspector__shares\">\n          <li v-for=\"s in shares\" :key=\"s.uuid\" class=\"fe-inspector__share\">\n            <span class=\"fe-inspector__share-url\" :title=\"s.url\">{{ s.url }}</span>\n            <span v-if=\"s.password_pin\" class=\"fe-inspector__badge fe-inspector__badge--pin\">PIN</span>\n            <span v-if=\"s.expires_at\" class=\"fe-inspector__share-exp\">\n              {{ formatDateStr(s.expires_at) }}\n            </span>\n            <button\n              type=\"button\"\n              class=\"fe-inspector__copy\"\n              :title=\"t('inspector.shares.copy')\"\n              :aria-label=\"t('inspector.shares.copy')\"\n              @click=\"copyText(s.url)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n            </button>\n          </li>\n        </ul>\n      </section>\n\n      <!-- ══ calisma:d3 — Yorumlar ══ -->\n      <section\n        v-if=\"(commentsState === 'ok' || commentsState === 'error') && (!tabs || tab === 'activity')\"\n        class=\"fe-inspector__section\"\n      >\n        <h3 class=\"fe-inspector__heading\">\n          {{ t('inspector.section.comments') }}\n          <span\n            v-if=\"comments.length > 0\"\n            class=\"fe-inspector__countbadge\"\n          >{{ comments.length }}</span>\n        </h3>\n\n        <p v-if=\"commentsState === 'error'\" class=\"fe-inspector__empty\">\n          {{ t('inspector.error') }}\n        </p>\n        <template v-else>\n          <p v-if=\"comments.length === 0\" class=\"fe-inspector__empty\">\n            {{ t('inspector.comments.empty') }}\n          </p>\n          <ul v-else class=\"fe-inspector__comments\">\n            <li v-for=\"c in comments\" :key=\"c.id\" class=\"fe-inspector__comment\">\n              <div class=\"fe-inspector__comment-top\">\n                <span class=\"fe-inspector__comment-author\" :title=\"c.author_name\">\n                  {{ c.author_name || '—' }}\n                </span>\n                <span class=\"fe-inspector__comment-time\" :title=\"formatDateStr(c.created_at)\">\n                  {{ relativeTime(c.created_at) }}\n                </span>\n                <button\n                  v-if=\"c.can_delete\"\n                  type=\"button\"\n                  class=\"fe-inspector__comment-del\"\n                  :disabled=\"commentBusy\"\n                  :title=\"t('inspector.comments.delete')\"\n                  :aria-label=\"t('inspector.comments.delete')\"\n                  @click=\"removeComment(c)\"\n                >×</button>\n              </div>\n              <p class=\"fe-inspector__comment-body\">{{ c.body }}</p>\n            </li>\n          </ul>\n          <form class=\"fe-inspector__comment-form\" @submit.prevent=\"sendComment\">\n            <input\n              v-model=\"commentDraft\"\n              type=\"text\"\n              class=\"fe-inspector__comment-input\"\n              maxlength=\"5000\"\n              :placeholder=\"t('inspector.comments.placeholder')\"\n              :aria-label=\"t('inspector.comments.placeholder')\"\n              :disabled=\"commentBusy\"\n            />\n            <button\n              type=\"submit\"\n              class=\"fe-btn fe-btn--primary fe-btn--sm\"\n              :disabled=\"commentBusy || commentDraft.trim() === ''\"\n            >{{ t('inspector.comments.send') }}</button>\n          </form>\n        </template>\n      </section>\n      <!-- ══ /calisma:d3 ══ -->\n\n      <!-- surucu:d1 — the Activity tab with nothing behind it. It says which\n           two feeds fill it, because there is no third one to wait for: this\n           server keeps no per-file audit trail (target_id is empty for every\n           file action, and the log is admin-only). -->\n      <section\n        v-if=\"tabs && tab === 'activity' && !activityUsable\"\n        class=\"fe-inspector__section\"\n        data-testid=\"inspector-activity-empty\"\n      >\n        <p class=\"fe-inspector__empty\">\n          {{ single ? t('inspector.activity.empty') : t('inspector.activity.select') }}\n        </p>\n        <p v-if=\"single\" class=\"fe-inspector__hint\">{{ t('inspector.activity.hint') }}</p>\n      </section>\n    </div>\n  </aside>\n</template>\n","<script setup lang=\"ts\">\n/**\n * SideNav — the explorer's navigation panel.\n *\n * A left column inside `.fe__main`, sibling to `.fe__primary` and the mirror\n * image of `InspectorPanel` on the other side. Three sections, top to bottom:\n * the primary action (Upload, with New folder as a secondary), the views\n * (Recent / Starred / Shared with me / Trash), and the storages the caller can\n * see.\n *\n * Why it exists (GitHub #14): the explorer's shape — split pane, tabs, three\n * view modes, \"How to connect\" — is a power-user tool, and the reporter's\n * users read that as a file manager they would have to relearn. The answer is\n * not a second UI: it is one explorer with the navigation people already know\n * from Drive, that anyone can collapse when they want the width back.\n *\n * Collapse goes to a RAIL, not to nothing. A panel that vanishes takes its own\n * re-open affordance with it; the rail keeps every destination one click away\n * and every icon tab-reachable, with its label in `title` + `aria-label`.\n *\n * ⚠ Presentational only. It fetches nothing and owns no listing state — the\n * host (FileExplorer) loads the views and tells this component which one is\n * active, exactly as it does for Toolbar. Two components fetching the same\n * list is how the panel and the pane end up disagreeing.\n *\n * ⚠ No `<style>` block, scoped or otherwise: the package's CSS lives in\n * `styles/base.css`. A scoped block compiles to `.cls[data-v-HASH]` and the\n * hash does not match in the web-component build, so the rules silently stop\n * applying in every embed (measured on the share dialog: raw unstyled HTML).\n */\nimport { computed, ref } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport ContextMenu, { type ContextAction } from './ContextMenu.vue';\n\n/** The virtual listings the panel can open. '' = an ordinary folder.\n *  ⚠ `home` is not a listing: it is the overview (storages · recent · starred)\n *  the reference shell lands on, and the explorer renders it instead of a file\n *  list. It is in this union because the panel's selected-row logic, the\n *  address bar and the tab strip all key off ONE type — a second mechanism for\n *  \"which destination am I on\" is how two of them end up disagreeing. */\nexport type NavView = '' | 'home' | 'recent' | 'starred' | 'shared' | 'trash' | 'tag';\n\n/**\n * A row in the panel's first group — what `open-view` carries.\n *\n * ⚠ It is NOT `NavView`. \"My files\" is a destination without being a view: it\n * opens the root LISTING, so the explorer answers it with an ordinary\n * navigation and `activeView` goes back to `''`. Giving it a NavView value\n * would mean a mode that every `if (navView)` in the explorer — \"is this a\n * cross-folder view?\", \"is there a folder to upload into?\", \"what does Up do?\"\n * — would answer wrongly, for a row whose whole job is to be an ordinary\n * folder again.\n */\nexport type NavDest = Exclude<NavView, '' | 'tag'> | 'myfiles';\n\nexport interface NavStorage {\n  name: string;\n  label?: string;\n  driver?: string;\n  readOnly?: boolean;\n}\n\nconst props = defineProps<{\n  /** Expanded (labels visible) vs collapsed to the icon rail. */\n  expanded: boolean;\n  /** Narrow/embed mode — the panel is a drawer over the listing, not a column. */\n  narrow?: boolean;\n  /** Which virtual view is on screen, so the row can read as selected. */\n  activeView: NavView;\n  /** Storage currently open ('' at the multi-storage root). */\n  activeStorage?: string;\n  /** Storages the caller can see (ExplorerConfig.storages). */\n  storages: NavStorage[];\n  /**\n   * Names of storages the caller reaches through a GRANT rather than their own\n   * role — Drive's \"shared drives\". Marked, not sorted out: the reporter's ask\n   * was that they \"just appear there\", one click, no mount instructions.\n   */\n  sharedStorages?: string[];\n  /** Show the Trash entry (mirrors ExplorerConfig.trashVisible). */\n  trashVisible?: boolean;\n  /* === etiket:t1 — the Tags section ==================================\n   * \"Tagged files should show up inside the tag.\" Tags are the one\n   * navigation family whose entries are USER data: unbounded in number and\n   * dynamic in name. Still presentational here — the host fetches\n   * `tags/all` (once, cached) and hands the list over, exactly as it does\n   * for storages. */\n  /** Every tag that exists, alphabetical. Empty → the section shows its own\n   *  \"no tags yet\" line rather than disappearing. */\n  tags?: string[];\n  /** False until the first answer arrives, so \"no tags yet\" is never shown\n   *  to somebody who is simply still waiting. */\n  tagsLoaded?: boolean;\n  /** The tag currently on screen (activeView === 'tag'). */\n  activeTag?: string;\n  /**\n   * Show the Connections entries — \"How to connect\" and \"API keys\".\n   * ⚠ Never derived from a role here or anywhere: the backend decides what a\n   * caller may see, and hiding the surface client-side only hides it from the\n   * accounts that need it (see ExplorerConfig.connections).\n   */\n  showConnections?: boolean;\n  /**\n   * Draw the surfaces that only mean something for ONE person: API keys,\n   * Recent, Starred, Shared with me. False when the caller is an app token —\n   * a host proxy's shared credential, where \"your keys\" would be the proxy's\n   * own and \"your Recent\" would be the token owner's history shown to a\n   * stranger (see ExplorerConfig.callerKind).\n   *\n   * ⚠ This is a KIND check, not the role check the comment above forbids, and\n   * it is not the whole panel: Upload, the storages, Trash and \"How to\n   * connect\" stay — an embed's users still upload and still mount. An embedder\n   * who wants no panel at all already has `sideNav: false`.\n   */\n  showIdentitySurfaces?: boolean;\n  /** RBAC/root state — false hides the write affordances. */\n  canWrite?: boolean;\n  locale: LocaleCode;\n  /* === surucu:d1 — the shell ========================================== */\n  /**\n   * ⚠ There is no `newMenu` prop any more. The two-button block (Upload as the\n   * primary, New folder one step quieter) is gone and the \"+ New\" menu is what\n   * this panel draws, everywhere — it is the shell, not a profile. Nothing was\n   * removed: the menu holds what the explorer could already do — upload files,\n   * make a folder (the modal offers the encrypted variant from inside itself),\n   * and ask somebody else for files.\n   *\n   * There is deliberately no \"Upload folder\": the upload path takes a flat\n   * `File[]` and would have to create the intermediate directories itself, and\n   * an entry that quietly flattens someone's folder into one heap is worse\n   * than an entry that is not there.\n   */\n  /** Offer \"Request files\" in that menu — a folder we may write to and share. */\n  canRequestFiles?: boolean;\n  /**\n   * belge:n1 — offer \"New document\" in that menu. False on a server that\n   * publishes no `newdoc_types`, and on one where every type it publishes\n   * needs an editor service this deployment has not got.\n   */\n  canNewDocument?: boolean;\n  /**\n   * The signed-in person's storage line, from `GET /api/files/quota/me`. Null\n   * (the default) renders nothing at all.\n   *\n   * ⚠ It is a PER-USER figure, not this storage's — `quota.Snapshot` sums\n   * `nodes.size WHERE owner_id = me`, and there is no per-provider quota\n   * (internal/quota/service.go). The mockup labels it with the drive's name;\n   * that would be a lie about which number this is, so the label says\n   * \"Storage\" and the drive name stays out of it.\n   */\n  quota?: { used: number; total: number; unlimited: boolean } | null;\n  /** Resolved theme — the teleported New menu leaves the `.fe` variable scope. */\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'toggle'): void;\n  (e: 'open-view', view: NavDest): void;\n  (e: 'open-tag', tag: string): void;\n  (e: 'open-storage', name: string): void;\n  (e: 'open-root'): void;\n  (e: 'upload'): void;\n  (e: 'new-folder'): void;\n  (e: 'new-document'): void;\n  (e: 'open-connections'): void;\n  (e: 'open-tokens'): void;\n  /* surucu:d1 — \"Request files\": the access modal on THIS folder, drop tab. */\n  (e: 'request-files'): void;\n  /** Drawer scrim / Esc — narrow mode only. */\n  (e: 'close'): void;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\n// In drawer mode \"expanded\" is the only meaningful state: a rail inside an\n// overlay would be an overlay that shows nothing but icons while covering the\n// listing anyway.\nconst showLabels = computed(() => props.expanded || !!props.narrow);\n\nconst sharedSet = computed(() => new Set(props.sharedStorages ?? []));\n\n/** The views that answer \"what did *I* do\" — dropped for an app token. */\nconst IDENTITY_VIEWS = new Set<string>(['recent', 'starred', 'shared']);\n\n/**\n * gorunum:v3-shell — the destinations, and their ORDER.\n *\n * Home · My files · Shared with me · Recent · Starred · Trash. The order is\n * not a taste: it runs from the widest answer to the narrowest — everything\n * you have, then your own tree, then somebody else's, then two slices of your\n * own, then what you threw away. The panel used to open with Recent, which\n * put a slice of the tree above the tree.\n *\n * ⚠⚠ \"My files\" is drawn ONLY where it can honestly mean \"my files\" — a\n * deployment whose caller can see at most ONE storage. There it opens that\n * storage's root and the label is the truth (measured: `soleStorageName` in\n * FileExplorer sends `load('')` straight to the storage, so the row lands on\n * the file list, exactly as the reference build's own \"My files\" does).\n *\n * With SEVERAL storages it cannot mean that, and what it actually did was open\n * the multi-storage root — a listing OF THE DRIVES. Owner, 2026-09-13: \"my\n * files kısmında yüklediğimiz dosyalar gelmesi lazım ama onun yerine storages\n * gösteren ana bölge geliyor… direk silebiliriz.\" Three reasons it goes rather\n * than gets repointed:\n *\n *   1. it was the THIRD copy of that list. Home's \"Storages\" section draws the\n *      same drives as cards with a size caption, and this panel's own STORAGES\n *      group draws them one click away — and all three are on screen together.\n *      \"Aynı işlevi yapan iki buton olmaması lazım.\"\n *   2. it was the worst of the three. The drives are synthesized rows, so the\n *      listing shows them under Type / Modified / Size columns that are all\n *      \"—\", owner \"System\", and with no filter row at all.\n *   3. nothing is stranded. Measured in the browser: the breadcrumb's house\n *      crumb (`crumbs[0]`, `adapterPath: ''`) and Alt+↑ from a storage root\n *      both land on exactly that listing, and both leave the panel in the same\n *      state this row used to.\n *\n * ⚠ `<= 1`, not `=== 1`: a caller who can see NO storage keeps the row, so an\n * account with nothing mounted still has a door back to the root listing and\n * its \"no storages\" message, rather than a panel of views with no files in it.\n * ⚠ It is still not an identity view — where it IS drawn it stays drawn for an\n * app token, which has no Recent and no Starred to escape through.\n */\nconst views = computed(() => {\n  const list: Array<{ key: NavDest; label: string }> = [\n    { key: 'home', label: t('sidenav.home') },\n    ...(props.storages.length <= 1\n      ? [{ key: 'myfiles' as NavDest, label: t('sidenav.myfiles') }]\n      : []),\n    { key: 'shared', label: t('sidenav.shared') },\n    { key: 'recent', label: t('sidenav.recent') },\n    { key: 'starred', label: t('sidenav.starred') },\n  ];\n  if (props.trashVisible !== false) list.push({ key: 'trash', label: t('sidenav.trash') });\n  // Filtered at the end rather than built conditionally: Trash is shared by\n  // everyone and the list keeps growing, so one rule at the bottom beats a\n  // condition wrapped around each entry.\n  if (props.showIdentitySurfaces === false) return list.filter((v) => !IDENTITY_VIEWS.has(v.key));\n  return list;\n});\n\nconst writable = computed(() => props.canWrite !== false);\n\n/**\n * The storage the listing is in is mounted read-only. Its \"+ New\" menu is not\n * disabled but GONE: on a read-only mount there is no folder where any of\n * its rows could ever work, and a disabled menu invites the question a menu\n * cannot answer. The row itself says why — see the tag on it (issue #30).\n */\nconst activeReadOnly = computed(\n  () => !!props.activeStorage && props.storages.some((s) => s.name === props.activeStorage && s.readOnly === true),\n);\n\n/**\n * Which row reads as the one you are standing on.\n *\n * Every view answers for itself. \"My files\" is the exception, because it has\n * no view value to compare against: it is lit when the explorer is showing the\n * ROOT of the tree and nothing else — no virtual view, and no storage opened,\n * which is the state where the storage rows below all read as inactive too.\n * Inside a storage the storage's own row is the active one, so lighting both\n * would claim the selection is in two places.\n */\nfunction isActiveDest(key: NavDest): boolean {\n  if (key === 'myfiles') return !props.activeView && !props.activeStorage;\n  return props.activeView === key;\n}\n\n/* === etiket:t1 — an unbounded list in a fixed panel ====================\n * A user with sixty tags must not push Storages and Connections off the\n * bottom of the panel, and must not be handed sixty identical glyphs on a\n * 56px rail either.\n *\n *   expanded / drawer → the first TAG_PEEK, then \"Show all (N)\". Both states\n *                       scroll (.fe-sidenav__scroll), so this is about the\n *                       sections BELOW staying reachable, not about overflow.\n *   rail             → ONE \"Tags\" button that opens the panel. Sixty rail\n *                       icons would be sixty copies of the same glyph with no\n *                       label — the rail's contract is \"every destination one\n *                       click away\", and this keeps it with one click more.\n */\nconst TAG_PEEK = 8;\nconst tagsExpanded = ref(false);\nconst allTags = computed(() => props.tags ?? []);\nconst visibleTags = computed(() =>\n  tagsExpanded.value ? allTags.value : allTags.value.slice(0, TAG_PEEK),\n);\nconst hiddenTagCount = computed(() => Math.max(0, allTags.value.length - visibleTags.value.length));\n/* The section is rendered as soon as the panel knows there ARE tags, and also\n * once the answer came back empty — an empty section that says why is how a\n * user learns the feature exists at all. It stays hidden only while the first\n * answer is still in flight. */\nconst showTags = computed(() => !!props.tagsLoaded || allTags.value.length > 0);\n\n/* === surucu:d1 — the \"+ New\" menu ====================================\n * One primary action instead of two buttons, the shape the reporter drew and\n * the shape Drive/FileRun/Nextcloud share. It is the SAME ContextMenu the\n * right-click menu uses — teleported to <body>, so the panel's own scroll\n * container cannot clip it, and one keyboard/focus behaviour for both. */\nconst newBtnEl = ref<HTMLElement | null>(null);\nconst newMenuRef = ref<InstanceType<typeof ContextMenu> | null>(null);\n\nconst newActions = computed<ContextAction[]>(() => {\n  const list: ContextAction[] = [\n    /* ⚠ NO `icon:` on any of these three, and that is the fix rather than an\n       omission. `ContextMenu.iconFor` resolves `actionIconSvg(a.icon || a.key)`,\n       so an `icon` string is an OVERRIDE — and `'⬆'` / `'📁'` / `'🔗'` are not\n       keys, so the lookup missed, the component fell through to its literal\n       branch and printed the emoji. Meanwhile `new-document`, which carries no\n       override, resolved by key and drew a proper glyph: one menu, two icon\n       systems, three rows apart. All three keys have had stroked glyphs in\n       `lib/actionIcons.ts` the whole time (`upload`, `new-folder`,\n       `request-files`); dropping the override is what reaches them.\n       ⚠ Emoji in markup is forbidden here for a reason that is visible in this\n       very menu: they are rendered by whatever font the OS ships, so the row\n       came out flat-grey on one machine and full-colour on another, at a weight\n       that matched nothing beside it. */\n    { key: 'upload', label: t('drive.new.upload'), disabled: !writable.value },\n    { key: 'new-folder', label: t('drive.new.folder'), disabled: !writable.value },\n  ];\n  // belge:n1 — DROPPED rather than disabled when unavailable, unlike\n  // \"Request files\": a disabled row invites the question \"why?\" and cannot\n  // answer it. The dialog behind it explains what is missing; a greyed row\n  // in a menu has nowhere to say so.\n  if (props.canNewDocument) {\n    list.push({ key: 'new-document', label: t('drive.new.document'), disabled: !writable.value });\n  }\n  // Only when there is a real folder to hang a drop link on. Rendered as a\n  // disabled row rather than dropped, so the menu does not change height\n  // between folders — a menu whose items move is a menu people misclick.\n  list.push({ divider: true, key: 'new-sep', label: '' });\n  list.push({\n    key: 'request-files',\n    label: t('drive.new.request'),\n    disabled: !props.canRequestFiles,\n  });\n  return list;\n});\n\nfunction openNewMenu() {\n  const r = newBtnEl.value?.getBoundingClientRect();\n  newMenuRef.value?.show(\n    { clientX: r ? r.left : 0, clientY: r ? r.bottom + 6 : 0 } as MouseEvent,\n    [],\n  );\n}\n\nfunction onNewSelect(a: ContextAction) {\n  if (a.key === 'upload') emit('upload');\n  else if (a.key === 'new-document') emit('new-document');\n  else if (a.key === 'new-folder') emit('new-folder');\n  else if (a.key === 'request-files') emit('request-files');\n}\n\n/* === surucu:d1 — the storage line ===================================\n * The size comes from `useLocale.formatSize`, the same call `HomeView` makes\n * for the same `drive.storage.*` string. There was a private byte formatter\n * here with hardcoded English units and its own rounding, so one quota\n * rendered two ways — \"9.3 GB\" in this rail, \"9.31 GB\" on the home screen,\n * and \"10 GB\" in the admin panel that set it. */\n\nconst quotaPercent = computed(() => {\n  const q = props.quota;\n  if (!q || q.unlimited || q.total <= 0) return 0;\n  return Math.max(0, Math.min(100, Math.round((q.used / q.total) * 100)));\n});\n\nconst quotaText = computed(() => {\n  const q = props.quota;\n  if (!q) return '';\n  return q.unlimited || q.total <= 0\n    ? t('drive.storage.used_unlimited', { used: formatSize(q.used) })\n    : t('drive.storage.used', { used: formatSize(q.used), total: formatSize(q.total) });\n});\n\n/** Only the drawer draws this control now (see the template). */\nconst toggleLabel = computed(() => t('sidenav.close'));\n</script>\n\n<template>\n  <nav\n    class=\"fe-sidenav\"\n    :class=\"{\n      'fe-sidenav--rail': !expanded && !narrow,\n      'fe-sidenav--drawer': narrow,\n    }\"\n    role=\"navigation\"\n    :aria-label=\"t('sidenav.title')\"\n    data-testid=\"sidenav\"\n  >\n    <!-- gorunum:v3-shell — the panel's own edge control is now the DRAWER's\n         close button and nothing else.\n         ⚠ At 560px and up it is gone, deliberately: the collapse button lives\n         at the far left of the top bar (`.fe-toolbar__brand`), above the panel\n         rather than inside it, which is where the reference puts it and where\n         it still exists when the panel is a 56px rail. Two buttons for one\n         verb, one of them inside the thing it collapses, was the duplicate\n         this removed. At 390px the panel is an overlay ON TOP of the files, so\n         it keeps a dismiss of its own — the same reason a dialog has one. -->\n    <div v-if=\"narrow\" class=\"fe-sidenav__head\">\n      <button\n        type=\"button\"\n        class=\"fe-sidenav__toggle\"\n        :aria-expanded=\"showLabels\"\n        :title=\"toggleLabel\"\n        :aria-label=\"toggleLabel\"\n        data-testid=\"sidenav-toggle\"\n        @click=\"emit('close')\"\n      >\n        <svg\n          class=\"fe-ficon\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"1.8\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M6 6l12 12M18 6L6 18\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- Primary action. Making something is what people come to this panel to\n         do, so it reads as the main button rather than one toolbar icon among\n         fourteen. -->\n    <!-- Rendered even with nowhere to write, and disabled instead. A block\n         that appears and disappears makes every row below it jump by 90px each\n         time the user opens a view, which reads as the panel reloading. -->\n    <div class=\"fe-sidenav__primary\">\n      <!-- surucu:d1 — ONE primary action, the shape #14's mockups draw, in\n           every profile and every embed. The two-button block that used to\n           stand here behind `v-if=\"!newMenu\"` (Upload + New folder) is gone:\n           both verbs are the first two rows of this menu. -->\n      <button\n        v-if=\"!activeReadOnly\"\n        ref=\"newBtnEl\"\n        type=\"button\"\n        class=\"fe-sidenav__new\"\n        aria-haspopup=\"menu\"\n        :title=\"t('drive.new')\"\n        :aria-label=\"t('drive.new')\"\n        data-testid=\"sidenav-new\"\n        @click=\"openNewMenu\"\n      >\n        <!-- ⚠⚠ TWO SPANS AND A DIVIDER, NOT A SPLIT BUTTON. The reference draws\n             a label half, a hairline and a chevron half; the owner asked twice\n             for the chevron (\"new tuşunun yanına caret koymamışsın, onu koymanı\n             istiyorum\") because a button that opens a menu has to look like\n             one. But it stays ONE `<button aria-haspopup=\"menu\">`: a real split\n             button needs two focusable regions with two different actions, and\n             here both halves do the same thing. Copying the shape without\n             copying the mechanism is deliberate — two tab stops that lead to\n             one menu is a keyboard user counting controls that do not exist.\n             ⚠ The divider is `aria-hidden` decoration; it is 16px inset inside\n             a 34px pill, not full height, or it reads as a seam between two\n             buttons — which is exactly the thing this is not. -->\n        <span class=\"fe-sidenav__new-main\">\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M12 5v14M5 12h14\" />\n          </svg>\n          <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('drive.new') }}</span>\n        </span>\n        <span v-if=\"showLabels\" class=\"fe-sidenav__new-rule\" aria-hidden=\"true\"></span>\n        <span v-if=\"showLabels\" class=\"fe-sidenav__new-caret\" aria-hidden=\"true\">\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M7 10l5 5 5-5\" />\n          </svg>\n        </span>\n      </button>\n    </div>\n\n    <div class=\"fe-sidenav__scroll\">\n      <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.views')\">\n        <li v-for=\"v in views\" :key=\"v.key\">\n          <button\n            type=\"button\"\n            class=\"fe-sidenav__item\"\n            :class=\"{ 'is-active': isActiveDest(v.key) }\"\n            :aria-current=\"isActiveDest(v.key) ? 'page' : undefined\"\n            :title=\"v.label\"\n            :aria-label=\"v.label\"\n            :data-testid=\"`sidenav-view-${v.key}`\"\n            @click=\"emit('open-view', v.key)\"\n          >\n            <svg\n              class=\"fe-ficon\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"1.8\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              aria-hidden=\"true\"\n              focusable=\"false\"\n            >\n              <template v-if=\"v.key === 'home'\">\n                <path d=\"M4 10.5L12 4l8 6.5\" />\n                <path d=\"M6 9.8V19a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9.8\" />\n                <path d=\"M10 20v-5.5h4V20\" />\n              </template>\n              <template v-else-if=\"v.key === 'myfiles'\">\n                <path d=\"M3.5 7.5A1.5 1.5 0 0 1 5 6h4l2 2.5h8A1.5 1.5 0 0 1 20.5 10v7.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5z\" />\n              </template>\n              <template v-else-if=\"v.key === 'recent'\">\n                <circle cx=\"12\" cy=\"12\" r=\"8.5\" />\n                <path d=\"M12 7.5V12l3 2\" />\n              </template>\n              <template v-else-if=\"v.key === 'starred'\">\n                <path d=\"M12 4l2.4 4.9 5.4.8-3.9 3.8.9 5.4-4.8-2.5-4.8 2.5.9-5.4-3.9-3.8 5.4-.8z\" />\n              </template>\n              <template v-else-if=\"v.key === 'shared'\">\n                <circle cx=\"17.5\" cy=\"6.5\" r=\"2.5\" />\n                <circle cx=\"6.5\" cy=\"12\" r=\"2.5\" />\n                <circle cx=\"17.5\" cy=\"17.5\" r=\"2.5\" />\n                <path d=\"M8.8 10.8l6.4-3.2M8.8 13.2l6.4 3.2\" />\n              </template>\n              <template v-else>\n                <path d=\"M4.5 7h15\" />\n                <path d=\"M9.5 7V5.2A1.2 1.2 0 0 1 10.7 4h2.6a1.2 1.2 0 0 1 1.2 1.2V7\" />\n                <path d=\"M6.5 7l.9 11.1A1.4 1.4 0 0 0 8.8 19.4h6.4a1.4 1.4 0 0 0 1.4-1.3L17.5 7\" />\n              </template>\n            </svg>\n            <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ v.label }}</span>\n          </button>\n        </li>\n      </ul>\n\n      <!-- etiket:t1 — Tags. Between the views and the storages because a tag\n           IS a view (a listing with no folder behind it), not a place files\n           live. On the rail it collapses to one button that opens the panel:\n           sixty tags would otherwise be sixty copies of one glyph with no\n           label, and the rail's promise is that every destination stays one\n           click away. -->\n      <div v-if=\"showTags\" class=\"fe-sidenav__section\">\n        <template v-if=\"showLabels\">\n          <p class=\"fe-sidenav__heading\">{{ t('sidenav.tags') }}</p>\n          <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.tags')\">\n            <li v-for=\"tag in visibleTags\" :key=\"tag\">\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__item fe-sidenav__item--tag\"\n                :class=\"{ 'is-active': activeView === 'tag' && activeTag === tag }\"\n                :aria-current=\"activeView === 'tag' && activeTag === tag ? 'page' : undefined\"\n                :title=\"tag\"\n                :aria-label=\"tag\"\n                :data-testid=\"`sidenav-tag-${tag}`\"\n                @click=\"emit('open-tag', tag)\"\n              >\n                <svg\n                  class=\"fe-ficon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path d=\"M4 4.5h7l9 9-6.5 6.5-9-9z\" />\n                  <circle cx=\"8\" cy=\"8.5\" r=\"1.4\" />\n                </svg>\n                <span class=\"fe-sidenav__text\">{{ tag }}</span>\n              </button>\n            </li>\n            <!-- Nothing tagged yet: the section stays, and says how tags get\n                 made. A section that only exists once you already know the\n                 feature teaches nobody. -->\n            <li v-if=\"allTags.length === 0\">\n              <p class=\"fe-sidenav__hint\">{{ t('sidenav.tags.empty') }}</p>\n            </li>\n            <li v-if=\"hiddenTagCount > 0\">\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__more\"\n                data-testid=\"sidenav-tags-more\"\n                @click=\"tagsExpanded = true\"\n              >\n                {{ t('sidenav.tags.more', { count: hiddenTagCount }) }}\n              </button>\n            </li>\n            <li v-else-if=\"tagsExpanded && allTags.length > 8\">\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__more\"\n                data-testid=\"sidenav-tags-less\"\n                @click=\"tagsExpanded = false\"\n              >\n                {{ t('sidenav.tags.less') }}\n              </button>\n            </li>\n          </ul>\n        </template>\n        <template v-else>\n          <hr class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n          <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.tags')\">\n            <li>\n              <button\n                type=\"button\"\n                class=\"fe-sidenav__item\"\n                :class=\"{ 'is-active': activeView === 'tag' }\"\n                :title=\"t('sidenav.tags')\"\n                :aria-label=\"t('sidenav.tags')\"\n                data-testid=\"sidenav-tags-rail\"\n                @click=\"emit('toggle')\"\n              >\n                <svg\n                  class=\"fe-ficon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path d=\"M4 4.5h7l9 9-6.5 6.5-9-9z\" />\n                  <circle cx=\"8\" cy=\"8.5\" r=\"1.4\" />\n                </svg>\n              </button>\n            </li>\n          </ul>\n        </template>\n      </div>\n\n      <div v-if=\"storages.length\" class=\"fe-sidenav__section\">\n        <p v-if=\"showLabels\" class=\"fe-sidenav__heading\">{{ t('sidenav.storages') }}</p>\n        <hr v-else class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n        <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.storages')\">\n          <li v-for=\"s in storages\" :key=\"s.name\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :class=\"{ 'is-active': !activeView && activeStorage === s.name }\"\n              :title=\"\n                sharedSet.has(s.name)\n                  ? `${s.label || s.name} — ${t('sidenav.storage.shared')}`\n                  : s.label || s.name\n              \"\n              :aria-label=\"\n                sharedSet.has(s.name)\n                  ? `${s.label || s.name} — ${t('sidenav.storage.shared')}`\n                  : s.label || s.name\n              \"\n              :data-testid=\"`sidenav-storage-${s.name}`\"\n              @click=\"emit('open-storage', s.name)\"\n            >\n              <!-- A granted storage gets a different glyph, not a badge glued\n                   into the label: a badge inside the name span changes the\n                   row's textContent and breaks every selector that finds a row\n                   by its name (measured on the compliance badges, PR #12). -->\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <template v-if=\"sharedSet.has(s.name)\">\n                  <path d=\"M3 8.5A1.5 1.5 0 0 1 4.5 7h5L11 9h8.5A1.5 1.5 0 0 1 21 10.5v7A1.5 1.5 0 0 1 19.5 19h-15A1.5 1.5 0 0 1 3 17.5z\" />\n                  <circle cx=\"15.6\" cy=\"13.6\" r=\"1.6\" />\n                  <circle cx=\"9.4\" cy=\"15.4\" r=\"1.6\" />\n                  <path d=\"M10.9 14.7l3.3-.9\" />\n                </template>\n                <template v-else>\n                  <rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1.6\" />\n                  <rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1.6\" />\n                  <path d=\"M6.5 8h.01M6.5 16h.01\" />\n                </template>\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ s.label || s.name }}</span>\n              <span\n                v-if=\"showLabels && sharedSet.has(s.name)\"\n                class=\"fe-sidenav__tag\"\n                role=\"img\"\n                :aria-label=\"t('sidenav.storage.shared')\"\n                >{{ t('sidenav.storage.shared') }}</span\n              >\n              <!-- A read-only mount says so on the row, where the user looks\n                   for it. The admin list had an \"RO\" badge; the people it\n                   applied to never saw one (issue #30). -->\n              <span\n                v-if=\"showLabels && s.readOnly\"\n                class=\"fe-sidenav__tag\"\n                role=\"img\"\n                data-testid=\"sidenav-storage-readonly\"\n                :aria-label=\"t('sidenav.storage.readOnly')\"\n                >{{ t('sidenav.storage.readOnly') }}</span\n              >\n            </button>\n          </li>\n        </ul>\n      </div>\n\n      <!-- Connections. Last, because it is where you go once rather than every\n           day — and in core rather than in the host app, so an embedded\n           explorer's users can reach the guides and mint their own keys\n           instead of being told to ask an administrator. -->\n      <div v-if=\"showConnections\" class=\"fe-sidenav__section\">\n        <p v-if=\"showLabels\" class=\"fe-sidenav__heading\">{{ t('sidenav.connections') }}</p>\n        <hr v-else class=\"fe-sidenav__rule\" aria-hidden=\"true\" />\n        <ul class=\"fe-sidenav__group\" :aria-label=\"t('sidenav.connections')\">\n          <li>\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.connect')\"\n              :aria-label=\"t('sidenav.connect')\"\n              data-testid=\"sidenav-connect\"\n              @click=\"emit('open-connections')\"\n            >\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <path d=\"M9.5 14.5l-2.6 2.6a3.7 3.7 0 0 1-5.2-5.2l2.6-2.6\" />\n                <path d=\"M14.5 9.5l2.6-2.6a3.7 3.7 0 0 1 5.2 5.2l-2.6 2.6\" />\n                <path d=\"M9 15l6-6\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.connect') }}</span>\n            </button>\n          </li>\n          <!-- API keys is the person half of this section: \"How to connect\"\n               stays for an app token (mount instructions are not identity),\n               the keys go. -->\n          <li v-if=\"showIdentitySurfaces !== false\">\n            <button\n              type=\"button\"\n              class=\"fe-sidenav__item\"\n              :title=\"t('sidenav.apikeys')\"\n              :aria-label=\"t('sidenav.apikeys')\"\n              data-testid=\"sidenav-apikeys\"\n              @click=\"emit('open-tokens')\"\n            >\n              <svg\n                class=\"fe-ficon\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.8\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                aria-hidden=\"true\"\n                focusable=\"false\"\n              >\n                <circle cx=\"8\" cy=\"12\" r=\"3.5\" />\n                <path d=\"M11.5 12H21\" />\n                <path d=\"M17.5 12v3.2M20 12v2.2\" />\n              </svg>\n              <span v-if=\"showLabels\" class=\"fe-sidenav__text\">{{ t('sidenav.apikeys') }}</span>\n            </button>\n          </li>\n        </ul>\n      </div>\n    </div>\n\n    <!-- surucu:d1 — the storage line. Under the navigation, above nothing:\n         it is the last thing in the panel because it is a status, not a\n         destination. Hidden entirely when the server did not answer (an app\n         token has no person to have a quota) rather than drawn empty. -->\n    <div v-if=\"quota\" class=\"fe-sidenav__quota\" data-testid=\"sidenav-quota\">\n      <p v-if=\"showLabels\" class=\"fe-sidenav__quota-label\">{{ t('drive.storage.label') }}</p>\n      <div\n        class=\"fe-sidenav__quota-bar\"\n        role=\"progressbar\"\n        :aria-valuenow=\"quotaPercent\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        :aria-label=\"quotaText\"\n        :title=\"quotaText\"\n      >\n        <span class=\"fe-sidenav__quota-fill\" :style=\"{ width: quotaPercent + '%' }\"></span>\n      </div>\n      <p v-if=\"showLabels\" class=\"fe-sidenav__quota-text\">{{ quotaText }}</p>\n    </div>\n\n    <ContextMenu\n      ref=\"newMenuRef\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :actions=\"newActions\"\n      @select=\"onNewSelect\"\n    />\n  </nav>\n</template>\n","/**\n * Dragging files OUT of filex — onto the desktop, into another app.\n *\n * There are exactly two ways a page can hand real files to the operating\n * system, and filex uses both because neither one alone covers the ask:\n *\n * 1. **`DownloadURL`** (any Chromium browser, so the web explorer AND the\n *    desktop app get it for free). One `dataTransfer.setData('DownloadURL',\n *    'mime:name:url')` and the browser downloads that URL into wherever the\n *    drop landed. Costs nothing until the drop happens — but Chromium carries\n *    exactly ONE such entry, so it is a single-file gesture, and the URL is\n *    fetched by the browser's own download stack, which sends cookies but no\n *    Authorization header (see `canDownloadUrlDrag`).\n *\n * 2. **A native OS drag** (`webContents.startDrag`, desktop app only). Takes a\n *    list of real paths, so folders and multi-selections drop as separate real\n *    files — the WinRAR gesture. The catch is in the word *real*: the shell\n *    copies the bytes at DROP time, from a path, so the file has to be on this\n *    computer BEFORE the drag starts. There is no lazy/virtual-file API to\n *    borrow (that is a Win32 `IDataObject` affair Chromium does not expose).\n *\n * ⚠ The native drag REPLACES the HTML5 drag — `startDrag` requires\n * `preventDefault()` on `dragstart`, and after that the app's own drop targets\n * see an OS file drag instead of `application/x-brf-files`. Dropping a row on a\n * folder inside filex would then UPLOAD the temp copy back to the server: a\n * round trip of the same bytes, a copy instead of a move, and the original left\n * behind. That is what `beginNativeDrag` is for — the payload is remembered on\n * this side, and every drop target asks `internalDragItems(ev)` rather than\n * reading the dataTransfer directly. An OS drag we started is still an internal\n * drag when it lands inside our own window.\n *\n * Because the bytes must exist first, the shell is asked to prepare them on\n * `mousedown` — before the gesture becomes a drag — and the native path is only\n * taken when it answered \"ready\". Anything else keeps the ordinary HTML5 drag,\n * so an internal move never waits on a download it does not need.\n */\n\nexport interface DragItem {\n  path: string;\n  basename: string;\n  type: 'file' | 'dir';\n}\n\nexport const FE_DND_MIME = 'application/x-brf-files';\nexport const FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\n/** An OS drag this window started, and where it came from. */\ninterface NativeDrag {\n  items: DragItem[];\n  origin: string;\n  startedAt: number;\n}\n\nlet native: NativeDrag | null = null;\n\n/**\n * A native drag has no `dragend` on our side (the HTML5 one never started), so\n * the record is dropped by whoever notices the gesture is over — a drop we\n * handled, a pointerup, or this ceiling. Five minutes is far longer than any\n * drag and short enough that a stale record cannot outlive the user's memory\n * of it.\n */\nconst NATIVE_DRAG_TTL_MS = 5 * 60_000;\n\nexport function beginNativeDrag(items: DragItem[], origin: string): void {\n  native = { items: items.slice(), origin, startedAt: Date.now() };\n}\n\nexport function endNativeDrag(): void {\n  native = null;\n}\n\nexport function activeNativeDrag(): NativeDrag | null {\n  if (!native) return null;\n  if (Date.now() - native.startedAt > NATIVE_DRAG_TTL_MS) {\n    native = null;\n    return null;\n  }\n  return native;\n}\n\n/**\n * True when this drag is filex's own — either the HTML5 payload is on the\n * dataTransfer, or we are mid-native-drag. Safe to call from `dragover`, where\n * `getData` is blocked and only `types` may be read.\n */\nexport function hasInternalDrag(ev: DragEvent): boolean {\n  if (ev.dataTransfer?.types.includes(FE_DND_MIME)) return true;\n  return activeNativeDrag() !== null;\n}\n\n/** The dragged rows, from whichever of the two drag mechanisms is in play. */\nexport function internalDragItems(ev: DragEvent): DragItem[] | null {\n  const raw = ev.dataTransfer?.getData(FE_DND_MIME);\n  if (raw) {\n    try {\n      const parsed = JSON.parse(raw) as DragItem[];\n      return Array.isArray(parsed) && parsed.length > 0 ? parsed : null;\n    } catch {\n      return null;\n    }\n  }\n  const n = activeNativeDrag();\n  return n && n.items.length > 0 ? n.items : null;\n}\n\n/** The folder a drag started from — the origin stamp used by move ops. */\nexport function internalDragOrigin(ev: DragEvent): string | undefined {\n  const v = ev.dataTransfer?.getData(FE_DND_SRC_MIME);\n  if (v) return v;\n  return activeNativeDrag()?.origin || undefined;\n}\n\n/**\n * Can this install hand a plain URL to the browser's download stack?\n *\n * Only when the credential travels on its own: a cookie session (the web\n * explorer) or no auth at all. With a bearer token the page holds the\n * credential and the download would arrive unauthenticated — a drop that\n * silently produces a 401 page named like the file is worse than a drop that\n * does nothing, so the desktop app (bearer) uses the native path instead.\n */\nexport function canDownloadUrlDrag(auth: unknown): boolean {\n  const kind = authKindOf(auth);\n  return kind === undefined || kind === 'none' || kind === 'csrf';\n}\n\n/** `AuthConfig` carries the strategy as `kind`, or as `type` in the 0.1.0\n *  shape embedders still pass. Both mean the same thing here. */\nexport function authKindOf(auth: unknown): string | undefined {\n  if (!auth || typeof auth !== 'object') return undefined;\n  const a = auth as { kind?: unknown; type?: unknown };\n  const raw = typeof a.kind === 'string' ? a.kind : typeof a.type === 'string' ? a.type : undefined;\n  return raw;\n}\n\n/**\n * The `DownloadURL` value Chromium wants: `<mime>:<filename>:<absolute url>`.\n *\n * ⚠ Absolute. A relative URL is accepted by `setData` and then fails to\n * resolve in the browser process, which is a drop that quietly does nothing.\n */\nexport function downloadUrlPayload(item: DragItem, url: string, mime?: string): string | null {\n  if (item.type !== 'file') return null;\n  let abs = url;\n  try {\n    abs = new URL(url, typeof location !== 'undefined' ? location.href : undefined).toString();\n  } catch {\n    return null;\n  }\n  if (!/^https?:/i.test(abs)) return null;\n  const name = item.basename.replace(/[:\\r\\n]/g, '_');\n  return `${mime && mime.trim() ? mime : 'application/octet-stream'}:${name}:${abs}`;\n}\n\n/** Stable key for \"is the shell's prepared set still the one being dragged?\" */\nexport function dragKey(items: Array<{ path: string }>): string {\n  return items\n    .map((i) => i.path)\n    .sort()\n    .join('\u0000');\n}\n","/**\n * useRowTouch — the one click and touch grammar every file view speaks (list,\n * grid, gallery).\n *\n * The rule (issue #26, fourth round — the reporter's words: \"only clicking on\n * checkbox selects it, any other click will open\"), the same on every device:\n *\n *   - the item's CHECKBOX selects: a tick adds or removes, shift+tick extends\n *     the range from the anchor;\n *   - a click or tap ANYWHERE ELSE on the item opens it — the name, the icon,\n *     the size column, the empty space beside the name, with or without a\n *     selection, with or without Ctrl/Shift held;\n *   - a right click (mouse) or a long press (finger) opens the item's menu;\n *   - the item's own controls — the star, the ⋮ button — do their own job.\n *\n * The views only report. What a click means is decided once, in FilePane.\n *\n * How the rule got here:\n *   - First round: a finger has no double-click, so on a phone nothing could\n *     be opened at all. A tap was made to open.\n *   - Second round: a press on the NAME opened on every device, a press\n *     beside it still selected. The reporter: \"need to click precisely on\n *     name, if a lil bit on the right then it selects file\".\n *   - Third round: on a phone the name still needed two taps. A tap reaches a\n *     page as a click only at the end of the browser's compatibility sequence\n *     (touch → mouse move → hover → mouse down/up → click), and iOS WebKit\n *     stops that sequence when the hover step reveals content. So a finger\n *     lifted on the item opens it right there, at `touchend`, and cancels the\n *     emulated mouse events that would follow (`onTap`); the hover reveals are\n *     kept off screens that cannot hover (styles/base.css,\n *     `@media (hover: hover)`).\n *   - Fourth round: the checkbox became the only way a click selects, and the\n *     grid and gallery cards got one too (they had none).\n *\n * ⚠ A tap is judged from the gesture that produced the click, never from the\n * screen: `pointerType` where the browser sets it on click (Chromium, Firefox),\n * and the touchend that just preceded the click where it does not (older\n * WebKit). A touch laptop's trackpad and its screen are two different gestures\n * a `(pointer: coarse)` media query cannot tell apart.\n *\n * ⚠ It used to live as three identical copies of the long-press timer, one per\n * view; a rule like this one is exactly the kind of addition a copy misses.\n */\nimport { onBeforeUnmount } from 'vue';\n\n/** How long a finger rests before the press becomes a long press. */\nexport const LONG_PRESS_MS = 500;\n/** A click this soon after a touchend is the tap that touchend ended. */\nconst TAP_WINDOW_MS = 800;\n/** A finger that travels further than this is scrolling, not pressing. */\nconst MOVE_TOLERANCE_PX = 10;\n\n/**\n * What on an item is a control of its own: a press there is the control's,\n * not the item's. The checkbox is one (it selects on its own click), and so\n * are the star and the ⋮ button. A wrapper cell that swallows its clicks\n * carries `data-fe-control` so a finger on its padding is not an open either.\n */\nexport const ITEM_CONTROL_SELECTOR =\n  'button, a, input, select, textarea, label, [role=\"checkbox\"], [data-fe-control]';\n\nexport interface TouchPoint {\n  clientX: number;\n  clientY: number;\n}\n\n/** What a view reports about a click on one of its items. */\nexport interface ClickMod {\n  ctrl: boolean;\n  shift: boolean;\n  /** The click was a finger's tap. */\n  touch?: boolean;\n  /** The click was on the item's checkbox — the one click that selects. */\n  check?: boolean;\n}\n\n/** The one place a view turns a click on an item into a `ClickMod`. */\nexport function clickMod(ev: MouseEvent, touch: boolean): ClickMod {\n  return { ctrl: ev.ctrlKey || ev.metaKey, shift: ev.shiftKey, touch };\n}\n\n/**\n * The one place a view turns a click on an item's CHECKBOX into a `ClickMod`.\n * `ctrl` because a tick adds to a selection rather than replacing it; `shift`\n * passes through so a shift-tick still extends the range from the anchor.\n */\nexport function checkMod(ev: MouseEvent): ClickMod {\n  return { ctrl: true, shift: ev.shiftKey, check: true };\n}\n\nexport interface RowTouchOptions<T> {\n  /** A tap on the item outside its controls: open it, before any click. */\n  onTap?: (item: T) => void;\n}\n\n/** Whether the press started on one of the item's own controls. */\nfunction onControl(ev: Event): boolean {\n  const el = ev.target as Element | null;\n  if (typeof el?.closest !== 'function') return false;\n  const control = el.closest(ITEM_CONTROL_SELECTOR);\n  const item = ev.currentTarget as Element | null;\n  // Only a control INSIDE the item counts: the listing itself may sit in a\n  // label or a link on some host page, and that must not disarm every tap.\n  return control !== null && (item === null || typeof item.contains !== 'function' || item.contains(control));\n}\n\nexport function useRowTouch<T>(onLongPress: (item: T, at: TouchPoint) => void, options: RowTouchOptions<T> = {}) {\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  let target: T | null = null;\n  let origin: TouchPoint = { clientX: 0, clientY: 0 };\n  let longPressed = false;\n  let tapEndedAt = 0;\n  let startedOnItem = false;\n\n  function stopTimer() {\n    if (timer) clearTimeout(timer);\n    timer = undefined;\n  }\n\n  function onTouchStart(item: T, ev: TouchEvent) {\n    const t0 = ev.touches[0];\n    if (!t0) return;\n    stopTimer();\n    target = item;\n    longPressed = false;\n    origin = { clientX: t0.clientX, clientY: t0.clientY };\n    startedOnItem = !onControl(ev);\n    timer = setTimeout(() => {\n      timer = undefined;\n      if (target === null) return;\n      longPressed = true;\n      onLongPress(target, origin);\n    }, LONG_PRESS_MS);\n  }\n\n  function onTouchMove(ev: TouchEvent) {\n    const t0 = ev.touches[0];\n    if (\n      !t0 ||\n      Math.abs(t0.clientX - origin.clientX) > MOVE_TOLERANCE_PX ||\n      Math.abs(t0.clientY - origin.clientY) > MOVE_TOLERANCE_PX\n    ) {\n      stopTimer();\n      target = null;\n    }\n  }\n\n  /**\n   * ⚠ Bind it WITHOUT `.passive`: a passive listener cannot cancel the\n   * emulated mouse events, and the click they end in would then reach the new\n   * listing under the finger (FilePane's open guard catches that too).\n   */\n  function onTouchEnd(ev?: TouchEvent) {\n    stopTimer();\n    const item = target;\n    const tapped = item !== null && !longPressed;\n    if (tapped) tapEndedAt = Date.now();\n    target = null;\n    if (tapped && startedOnItem && options.onTap) {\n      if (ev?.cancelable) ev.preventDefault();\n      options.onTap(item as T);\n    }\n    startedOnItem = false;\n  }\n\n  /** Whether this click is a finger's tap. */\n  function isTap(ev: MouseEvent): boolean {\n    const kind = (ev as PointerEvent).pointerType;\n    if (kind) return kind === 'touch';\n    return Date.now() - tapEndedAt < TAP_WINDOW_MS;\n  }\n\n  onBeforeUnmount(stopTimer);\n\n  return { onTouchStart, onTouchMove, onTouchEnd, isTap };\n}\n","<script setup lang=\"ts\">\n/**\n * ItemCheck — the checkbox on a listing item: the list row's tick column and\n * the grid and gallery cards' corner (issue #26, fourth round: \"only clicking\n * on checkbox selects it\"). One element for the three views, so the tick a\n * card shows cannot drift from the one a row shows.\n *\n * The view binds the click on the wrapper around it and routes it through\n * `checkMod` — the same `click-row` emit and the same `useSelection.click`\n * every selection goes through, so shift ranges and toggles are one\n * implementation, not two.\n *\n * ⚠ A button with role=\"checkbox\", NOT an <input type=\"checkbox\">. The input\n * owns a `checked` state of its own: the browser flips it before the click\n * handler runs and, if the default is prevented, flips it back AFTER Vue has\n * patched — so the row went selected while the box stayed empty (measured:\n * rowSelected=true, domChecked=false). Drawing the state from the selection\n * leaves nothing to drift. Space and Enter still tick it, because a button\n * fires `click` for both.\n *\n * ⚠ A mouse press does not move focus onto it (`mousedown.prevent`). The tick\n * is now the ONLY click that selects, so \"tick, then Space\" is the way to\n * quick-look a file — and Space on a focused button is that button's own\n * activation, which the shortcut layer rightly leaves alone: the peek would\n * never open and the tick would flip back off. Tab still reaches it, and Space\n * still ticks it from the keyboard.\n */\ndefineProps<{\n  /** Whether the item is selected. */\n  on: boolean;\n  /** The item's display name — the checkbox's accessible name. */\n  label: string;\n}>();\n</script>\n\n<template>\n  <button\n    type=\"button\"\n    class=\"fe-list__check\"\n    :class=\"{ 'is-on': on }\"\n    role=\"checkbox\"\n    :aria-checked=\"on ? 'true' : 'false'\"\n    :aria-label=\"label\"\n    :title=\"label\"\n    @mousedown.prevent\n  ></button>\n</template>\n","/**\n * filePreview — gorunum:v1-preview.\n *\n * The first lines of the REAL file, drawn inside the card's preview box when\n * there is nothing better to put there.\n *\n * ## Why this exists at all\n *\n * The backend already answers `thumb_url` for a `.ts` or a `.csv` — but what\n * it renders for them is `internal/thumb/generic.go`: a card tinted from a\n * hash of the extension with the letters \"TS\" drawn in the middle. Measured\n * on the local backend, `GET /api/files/thumb/6` (app.ts) is a 1,745-byte\n * JPEG of exactly that. So the card was already spending a request to be told\n * the same thing its own footer tile says, in a colour nobody chose.\n *\n * A code file's first five lines say what it is in a way no glyph can. That\n * is the whole idea: for the kinds we can read as text we skip the generic\n * thumbnail entirely and fetch a few kilobytes of the file instead — the same\n * number of requests, a preview that means something.\n *\n * ⚠ This never competes with a REAL thumbnail. The kinds it claims (code,\n * plain text, csv/tsv) are precisely the kinds this backend cannot render a\n * content-derived thumbnail for; images, video, audio and PDFs are untouched\n * and keep their `<img>`.\n *\n * ## What bounds the cost\n *\n * Four independent limits, because any one of them alone is a promise rather\n * than a bound:\n *\n *   1. **Visibility.** Nothing is fetched until the card intersects the\n *      viewport (IntersectionObserver, 150px of margin so a scroll does not\n *      chase the reader). ⚠ `useThumbs` does NOT do this — it fires on first\n *      render for every row the parent hands it — so there was nothing to\n *      reuse here; a 400-file folder would have been 400 reads.\n *   2. **A ranged request.** `Range: bytes=0-8191`. The preview endpoint\n *      answers 206 through `http.ServeContent` whenever the driver can seek\n *      (`vfStream`, manager.go).\n *   3. **A bounded read.** ⚠ A driver that cannot seek answers 200 with the\n *      WHOLE body and `Accept-Ranges: none` — the Range header is a request,\n *      not a guarantee. So the body is consumed chunk by chunk and the reader\n *      is cancelled the moment we have enough. This, not the header, is what\n *      actually caps the bytes.\n *   4. **A file-size ceiling + a concurrency cap.** 4 MB and 3 in flight.\n *\n * Results are cached per path AND per version (etag, else mtime, else size),\n * so an edited file re-reads and an unchanged one never does.\n */\n\nimport { ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport { iconFamilyFor } from './fileIcons';\nimport { resolveEndpoints } from '../composables/useFileApi';\n\n/** What shape the preview takes. `null` = this node has no text preview. */\nexport type PreviewKind = 'code' | 'text' | 'table';\n\n/**\n * One rendered line. Split in three so the view can print it WITHOUT\n * `v-html` — the content is somebody's file, and interpolation is the only\n * honest way to put it on screen.\n */\nexport interface PreviewLine {\n  /** Leading whitespace, kept so nesting is visible. */\n  indent: string;\n  /** The opening token when it is worth tinting ('' = leave it plain). */\n  tint: string;\n  /** Everything after it, verbatim. */\n  text: string;\n}\n\nexport interface FilePreview {\n  kind: PreviewKind;\n  /** `code` / `text`. Empty for a table. */\n  lines: PreviewLine[];\n  /**\n   * `table` only: first rows × first columns, already clipped and PADDED to a\n   * rectangle. The card lays them out as one CSS grid, so a short row has to\n   * carry its empty cells or every row below it shifts a column left.\n   */\n  rows: string[][];\n  /** `table` only: the grid's column count (0 otherwise). */\n  cols: number;\n}\n\n/* ---------------------------------------------------------------- limits */\n\n/** Bytes asked for, and the hard cap on bytes actually read. */\nconst MAX_BYTES = 8 * 1024;\n/** Files bigger than this are left alone. See the header: the streaming\n *  cancel is the real bound, this is the \"never surprise the operator whose\n *  driver cannot seek\" guard. */\nconst MAX_FILE_BYTES = 4 * 1024 * 1024;\n/** Concurrent reads. Three keeps a fast scroll responsive without turning a\n *  folder of scripts into a thundering herd against one S3 bucket. */\nconst MAX_INFLIGHT = 3;\n/**\n * How much is parsed — NOT how much is shown.\n *\n * ⚠ These used to be 10 lines / 6 rows / 4 columns, and those numbers were\n * chosen for one box: the 184×108 grid card. They are not that box's height\n * in any other view, and a fixed count is the wrong shape of answer anyway.\n * Measured on 2026-09-12, before this change:\n *\n *   grid card    184×108  · 10 lines parsed, ~9 fit          → close enough\n *   gallery tile 220×220  · 10 lines parsed, 15 fit          → the bottom\n *                                                              HALF of every\n *                                                              tile was empty\n *   csv, either  · 6 rows × 4 cols whatever the box was, and budget.csv has\n *                  six columns, so two of them were simply never shown\n *\n * The owner's instruction is \"as much as we can fit\" (2026-09-12), so the box\n * decides: the parser hands over more than any box can show and the box\n * clips what it cannot, which is what `overflow: hidden` and the bottom fade\n * on `.fe-fprev` have always been for. These are therefore CEILINGS on work\n * and DOM, not layout constants — big enough for the largest tile we draw\n * with room over it, small enough that a 400-file folder stays cheap.\n */\nconst MAX_LINES = 24;\n/** Characters kept per line. The box clips long lines anyway; this bounds\n *  the DOM when a minified file arrives as one 8 KB line. */\nconst MAX_LINE_CHARS = 120;\nconst MAX_ROWS = 16;\n/** Columns parsed. How many are DRAWN follows the box: the grid lays the\n *  cells out on tracks with a readable minimum width and clips the overflow,\n *  so a wide tile shows more of the table than a narrow one without either\n *  view knowing anything the other does not. */\nconst MAX_COLS = 8;\n/** Cache ceiling, mirroring useThumbs' own. Parsed previews are a few hundred\n *  bytes each, so this is generous. */\nconst MAX_CACHED = 400;\n\n/* ------------------------------------------------------------ can we read */\n\n/** The two tabular extensions. `sheet` as a FAMILY also holds xls/xlsx/ods,\n *  which are zip containers — reading their first bytes gives binary. */\nconst TABLE_EXTS = new Set(['csv', 'tsv']);\n\n/**\n * Is this row a deleted thing?\n *\n * ⚠ Two fields, because the two ways filex shows you a deleted file disagree.\n * A normal listing marks a soft-deleted row with `trashed`. The TRASH VIEW\n * does not: `FileExplorer.loadTrash` builds its rows from `TrashEntry` by hand\n * and that literal sets neither `trashed` nor `size` — it writes `file_size`\n * and stamps `extra_metadata.deleted_at`.\n *\n * Which means the size ceiling below was already excluding the whole trash\n * view, by accident, because `size` came back undefined. That is not a guard,\n * it is a coincidence one line in an unrelated file would end: the trash row's\n * `path` points at the trash KEY, not at the file it used to be, so a content\n * read there fetches a 404 for every row in the folder.\n */\nfunction isTrashRow(node: FileNode): boolean {\n  if (node.trashed) return true;\n  const meta = node.extra_metadata;\n  return !!meta && typeof meta === 'object' && 'deleted_at' in meta;\n}\n\n/**\n * Which preview this node could have, ignoring whether anything is wired up.\n *\n * Built on `iconFamilyFor` rather than on a second extension list: the\n * families ARE the taxonomy (filex lesson #67), so a new extension registered\n * for the icon set becomes previewable in the same edit. `svg` belongs to the\n * `image` family and is therefore excluded here — it is text, but it has a\n * real thumbnail, and the real one wins.\n */\nexport function previewKindFor(node: FileNode): PreviewKind | null {\n  if (node.type !== 'file') return null;\n  if (node.basename === '.trash' || node.mime_type === 'inode/storage') return null;\n  if (isTrashRow(node)) return null;\n  // ⚠ A node with NO size is excluded too, not just an empty one: the size is\n  // what the 4 MB ceiling is checked against, and \"we don't know\" is not a\n  // basis for deciding to read a file. Every row `projectFileNodes` emits\n  // carries one.\n  const size = node.size ?? 0;\n  if (size <= 0 || size > MAX_FILE_BYTES) return null;\n  const ext = (node.extension || '').trim().toLowerCase();\n  if (TABLE_EXTS.has(ext)) return 'table';\n  const family = iconFamilyFor(node);\n  if (family === 'code') return 'code';\n  if (family === 'text') return 'text';\n  return null;\n}\n\n/**\n * Is this node's thumbnail a PAGE — the first page of a document, rather than\n * a picture that was already the shape it wanted to be?\n *\n * It matters because of where the card crops. A thumbnail box is landscape\n * (184×108 in the grid) and a page is portrait, so `object-fit: cover` has to\n * throw away most of the height, and WHICH part it throws away is the whole\n * question. Centred — the default, and what this did before — discards the\n * top, which on a document is the letterhead, the title and the date: the\n * only part that says which document it is. Measured on 2026-09-12 against a\n * reference deployment carrying the same defect, five different PDFs sharing\n * one template produced five cards nobody could tell apart, because the only\n * thing that differed between them was the title that had been cropped away.\n *\n * So pages anchor to the top and photographs stay centred, and this is the\n * one place that decides which is which. Built on `iconFamilyFor` rather than\n * a private extension list, for the same reason the preview kinds are: the\n * families ARE the taxonomy (filex lesson #67).\n */\nexport function drawsAsPage(node: FileNode): boolean {\n  if (node.type !== 'file') return false;\n  switch (iconFamilyFor(node)) {\n    case 'pdf':\n    case 'doc':\n    case 'sheet':\n    case 'slides':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Is this node's thumbnail a still taken from a MOVING picture?\n *\n * A frame lifted out of a video is, on a card, indistinguishable from a\n * photograph — which is the one thing a person needs to know before they\n * click it. The views draw a play badge over these, so the answer lives here\n * rather than in each of them.\n */\nexport function drawsAsVideo(node: FileNode): boolean {\n  return node.type === 'file' && iconFamilyFor(node) === 'video';\n}\n\n/* --------------------------------------------------------------- parsing */\n\n/**\n * Openers worth a tint. Deliberately small and deliberately language-agnostic:\n * the brief's own instruction is that plain text beats fake colour, so a token\n * is tinted only when it really is a keyword. A JSON file opening on `{`, or a\n * YAML file opening on a key, gets no colour at all — which is the correct\n * answer, not a missing feature.\n */\nconst KEYWORDS = new Set([\n  'import', 'export', 'from', 'require', 'include', 'use', 'using', 'package',\n  'module', 'namespace', 'const', 'let', 'var', 'function', 'func', 'fn', 'def',\n  'class', 'struct', 'enum', 'interface', 'type', 'impl', 'trait',\n  'public', 'private', 'protected', 'static', 'async', 'await', 'return',\n  'if', 'else', 'for', 'while', 'switch', 'case', 'try', 'catch',\n  'select', 'insert', 'update', 'delete', 'create', 'alter', 'drop',\n]);\n\n/** Markdown-ish line markers — the only thing tinted in a `text` preview. */\nconst TEXT_MARKER = /^(#{1,6}|[-*+]|>|\\d+\\.)$/;\n\n/** Strip the punctuation a keyword is usually wearing (`const,` `if(` `def:`). */\nfunction bareToken(token: string): string {\n  return token.replace(/[(){}[\\];:,.]+$/, '').toLowerCase();\n}\n\nfunction toLine(raw: string, kind: PreviewKind): PreviewLine {\n  const clipped = raw.length > MAX_LINE_CHARS ? raw.slice(0, MAX_LINE_CHARS) : raw;\n  const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(clipped);\n  if (!m) return { indent: '', tint: '', text: clipped };\n  const [, indent, first, rest] = m;\n  const tintable =\n    kind === 'code' ? KEYWORDS.has(bareToken(first)) : TEXT_MARKER.test(first);\n  if (!tintable) return { indent: '', tint: '', text: clipped };\n  return { indent, tint: first, text: rest };\n}\n\n/**\n * Split one delimited row into cells, honouring `\"…\"` quoting (and `\"\"` as an\n * escaped quote) so a value containing the separator does not become two\n * columns. Small on purpose — this draws six rows on a 184px card, it is not\n * a CSV parser and must never grow into one.\n */\nexport function splitCells(line: string, sep: string): string[] {\n  const out: string[] = [];\n  let cur = '';\n  let quoted = false;\n  for (let i = 0; i < line.length; i++) {\n    const c = line[i];\n    if (quoted) {\n      if (c === '\"') {\n        if (line[i + 1] === '\"') {\n          cur += '\"';\n          i++;\n        } else {\n          quoted = false;\n        }\n      } else {\n        cur += c;\n      }\n    } else if (c === '\"') {\n      quoted = true;\n    } else if (c === sep) {\n      out.push(cur);\n      cur = '';\n    } else {\n      cur += c;\n    }\n  }\n  out.push(cur);\n  return out;\n}\n\n/** `,` normally; `\\t` for a .tsv; `;` when the first row clearly uses it —\n *  the shape Excel writes in most of Europe, Turkey included. */\nfunction separatorFor(ext: string, firstLine: string): string {\n  if (ext === 'tsv') return '\\t';\n  if (!firstLine.includes(',') && firstLine.includes(';')) return ';';\n  return ',';\n}\n\n/**\n * Bytes → a drawable preview, or null when the bytes are not text after all\n * (a `.json` that is really a binary blob, ciphertext, a mislabelled file).\n *\n * `truncated` says the byte cap cut the stream, in which case the last line is\n * dropped: half a line of source looks like a bug, not like a preview.\n */\nexport function parsePreview(\n  bytes: Uint8Array,\n  kind: PreviewKind,\n  ext: string,\n  truncated: boolean,\n): FilePreview | null {\n  // A NUL in the first few KB is the cheapest reliable \"this is not text\".\n  for (let i = 0; i < bytes.length; i++) {\n    if (bytes[i] === 0) return null;\n  }\n  const text = new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n  // A decode full of replacement characters is binary wearing a text\n  // extension — or a file in an encoding we are not going to guess at.\n  let bad = 0;\n  for (const ch of text) if (ch === '�') bad++;\n  if (text.length > 0 && bad / text.length > 0.1) return null;\n\n  const lines = text.split(/\\r\\n|\\r|\\n/);\n  if (truncated && lines.length > 1) lines.pop();\n  // Blank lines at either end waste a box that only holds eight — and every\n  // text file that ends in a newline has one. Interior blanks stay: they are\n  // part of how the file looks, which is the whole point.\n  while (lines.length && lines[0].trim() === '') lines.shift();\n  while (lines.length && lines[lines.length - 1].trim() === '') lines.pop();\n  if (lines.length === 0) return null;\n\n  if (kind === 'table') {\n    const sep = separatorFor(ext, lines[0]);\n    const rows = lines\n      .filter((l) => l.trim() !== '')\n      .slice(0, MAX_ROWS)\n      .map((l) => splitCells(l, sep).slice(0, MAX_COLS).map((c) => c.trim().slice(0, 24)));\n    if (rows.length === 0) return null;\n    const cols = rows.reduce((n, r) => Math.max(n, r.length), 0);\n    for (const r of rows) while (r.length < cols) r.push('');\n    return { kind, lines: [], rows, cols };\n  }\n\n  return {\n    kind,\n    lines: lines.slice(0, MAX_LINES).map((l) => toLine(l, kind)),\n    rows: [],\n    cols: 0,\n  };\n}\n\n/* ---------------------------------------------------------------- loading */\n\nexport interface PreviewLoaderOptions {\n  /** Same prefix the explorer hands the views. `undefined` = no API wired\n   *  (a legacy embedder on an explicit `endpoint`) → the loader stays off. */\n  apiBase?: string;\n  /**\n   * ⚠ ASYNC, and it is the whole reason this signature is a function and not\n   * an object. Spreading a Promise into a headers literal yields `{}` — the\n   * request goes out with no Authorization and 401s with nothing in the\n   * console. Every call site here `await`s it.\n   */\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  credentials?: RequestCredentials;\n  /**\n   * Answered on every decision, not once at construction: \"is reading file\n   * bytes off right now?\". The explorer passes its encrypted-folder state —\n   * inside one, every body on the wire is ciphertext, and fetching 8 KB of it\n   * to discover that it does not decode is a request spent to learn nothing.\n   */\n  disabled?: () => boolean;\n}\n\nexport interface FilePreviewLoader {\n  /** False when nothing is wired — callers must then keep their old markup. */\n  readonly enabled: boolean;\n  /** The kind this node would get, or null (including when disabled). */\n  kindFor: (node: FileNode) => PreviewKind | null;\n  /** Reactive read. null = not loaded (yet), or never. */\n  get: (node: FileNode) => FilePreview | null;\n  /** Template-ref sink: hand it the preview box and its node. */\n  bind: (el: Element | null, node: FileNode) => void;\n  /** In-flight + queued, for tests and measurement. */\n  stats: () => { loaded: number; inflight: number; queued: number; failed: number };\n  dispose: () => void;\n}\n\n/** path + version: an edited file re-reads, an untouched one never does. */\nfunction keyOf(node: FileNode): string {\n  const etag = typeof node.etag === 'string' ? node.etag : '';\n  const version = etag || String(node.last_modified ?? '') || String(node.size ?? '');\n  return `${node.path}\u0000${version}`;\n}\n\nexport function createFilePreviews(opts: PreviewLoaderOptions): FilePreviewLoader {\n  const enabled =\n    opts.apiBase !== undefined &&\n    typeof opts.authHeaders === 'function' &&\n    typeof IntersectionObserver !== 'undefined' &&\n    typeof fetch === 'function';\n\n  const cache = ref<Record<string, FilePreview>>({});\n  const order: string[] = [];\n  const failed = new Set<string>();\n  const queued = new Set<string>();\n  const queue: FileNode[] = [];\n  const controllers = new Set<AbortController>();\n  /** element → the key it is currently observed for, so a re-render of the\n   *  same card does not re-observe and a recycled row does. */\n  const bound = new WeakMap<Element, string>();\n  let inflight = 0;\n  let observer: IntersectionObserver | null = null;\n  /** The observed element's node, kept until the callback fires. */\n  const watching = new Map<Element, FileNode>();\n\n  function previewUrl(path: string): string {\n    // resolveEndpoints is the one place that knows how apiBase becomes a\n    // manager URL; `?q=` + `&action=` is the pair every other caller sends.\n    const manager = resolveEndpoints({ apiBase: opts.apiBase }).manager;\n    const sep = manager.includes('?') ? '&' : '?';\n    const query = new URLSearchParams({ q: 'preview', action: 'preview', path });\n    return `${manager}${sep}${query.toString()}`;\n  }\n\n  function remember(key: string, value: FilePreview) {\n    if (order.length >= MAX_CACHED) {\n      const evict = order.shift();\n      if (evict) {\n        const next = { ...cache.value };\n        delete next[evict];\n        cache.value = next;\n      }\n    }\n    order.push(key);\n    cache.value = { ...cache.value, [key]: value };\n  }\n\n  /**\n   * Read at most `MAX_BYTES` of the body, whatever the server decided to send.\n   * A 206 is already short; a 200 from a driver that cannot seek is the whole\n   * file, and cancelling the reader is what stops it.\n   */\n  async function readHead(res: Response): Promise<{ bytes: Uint8Array; truncated: boolean }> {\n    const body = res.body;\n    if (!body) {\n      const buf = new Uint8Array(await res.arrayBuffer());\n      return { bytes: buf.slice(0, MAX_BYTES), truncated: buf.length > MAX_BYTES };\n    }\n    const reader = body.getReader();\n    const chunks: Uint8Array[] = [];\n    let total = 0;\n    try {\n      while (total < MAX_BYTES) {\n        const { done, value } = await reader.read();\n        if (done) break;\n        if (value && value.length) {\n          chunks.push(value);\n          total += value.length;\n        }\n      }\n    } finally {\n      try {\n        await reader.cancel();\n      } catch {\n        /* already closed */\n      }\n    }\n    const joined = new Uint8Array(Math.min(total, MAX_BYTES));\n    let at = 0;\n    for (const c of chunks) {\n      if (at >= joined.length) break;\n      joined.set(c.subarray(0, joined.length - at), at);\n      at += c.length;\n    }\n    return { bytes: joined, truncated: total >= MAX_BYTES };\n  }\n\n  async function load(node: FileNode, kind: PreviewKind): Promise<void> {\n    const key = keyOf(node);\n    const ctrl = new AbortController();\n    controllers.add(ctrl);\n    try {\n      // ⚠ The await. Without it this object holds a Promise under\n      // `authHeaders`, fetch drops it, and the request 401s silently.\n      const base = opts.authHeaders ? await opts.authHeaders() : {};\n      const res = await fetch(previewUrl(node.path), {\n        headers: { ...base, Accept: '*/*', Range: `bytes=0-${MAX_BYTES - 1}` },\n        credentials: opts.credentials,\n        signal: ctrl.signal,\n      });\n      if (!res.ok && res.status !== 206) throw new Error(String(res.status));\n      const { bytes, truncated } = await readHead(res);\n      ctrl.abort();\n      const ext = (node.extension || '').trim().toLowerCase();\n      const parsed = parsePreview(bytes, kind, ext, truncated);\n      if (!parsed) {\n        failed.add(key);\n        return;\n      }\n      remember(key, parsed);\n    } catch {\n      // 403/404/offline/not-really-text — the card keeps its type tile, and\n      // we do not retry inside this session (same policy as useThumbs).\n      failed.add(key);\n    } finally {\n      controllers.delete(ctrl);\n    }\n  }\n\n  function pump() {\n    while (inflight < MAX_INFLIGHT && queue.length > 0) {\n      const node = queue.shift()!;\n      const kind = previewKindFor(node);\n      queued.delete(keyOf(node));\n      if (!kind) continue;\n      inflight++;\n      void load(node, kind).finally(() => {\n        inflight--;\n        pump();\n      });\n    }\n  }\n\n  function enqueue(node: FileNode) {\n    const key = keyOf(node);\n    if (cache.value[key] || failed.has(key) || queued.has(key)) return;\n    queued.add(key);\n    queue.push(node);\n    pump();\n  }\n\n  function ensureObserver(): IntersectionObserver | null {\n    if (!enabled) return null;\n    if (!observer) {\n      observer = new IntersectionObserver(\n        (entries) => {\n          for (const entry of entries) {\n            if (!entry.isIntersecting) continue;\n            const node = watching.get(entry.target);\n            observer?.unobserve(entry.target);\n            watching.delete(entry.target);\n            if (node) enqueue(node);\n          }\n        },\n        { rootMargin: '150px' },\n      );\n    }\n    return observer;\n  }\n\n  function kindFor(node: FileNode): PreviewKind | null {\n    if (!enabled) return null;\n    if (opts.disabled?.()) return null;\n    return previewKindFor(node);\n  }\n\n  return {\n    enabled,\n    kindFor,\n    get(node: FileNode): FilePreview | null {\n      if (!enabled) return null;\n      return cache.value[keyOf(node)] ?? null;\n    },\n    bind(el: Element | null, node: FileNode) {\n      if (!el || !kindFor(node)) return;\n      const key = keyOf(node);\n      if (bound.get(el) === key) return;\n      bound.set(el, key);\n      if (cache.value[key] || failed.has(key)) return;\n      const io = ensureObserver();\n      if (!io) return;\n      watching.set(el, node);\n      io.observe(el);\n    },\n    stats: () => ({\n      loaded: order.length,\n      inflight,\n      queued: queue.length,\n      failed: failed.size,\n    }),\n    dispose() {\n      observer?.disconnect();\n      observer = null;\n      watching.clear();\n      for (const c of controllers) c.abort();\n      controllers.clear();\n      queue.length = 0;\n      queued.clear();\n    },\n  };\n}\n","/**\n * dateGroups — ONE date ladder, for every view that draws one.\n *\n * ⚠⚠ WHY THIS FILE EXISTS. The ladder used to live inside `ListView.vue` as a\n * private `bucketFor()`, and only the list drew headings at all: the grid and\n * the gallery showed the same rows in the same date order with nothing naming\n * the days. The owner asked for the headings in every view (\"Ve bunu her\n * görünümde de yapması lazım\"), and the shape of that request is exactly the\n * shape this repository keeps getting wrong — a rule copied into a second view\n * agrees with the first on the day it is written and on no day after it.\n * `lib/sortOrder` and `lib/listing.byFoldersFirst` are here for the same\n * reason, after the grid and the list had already drifted once (filex lesson\n * #67). So the ladder is written once, and List, Grid and Gallery all read it.\n *\n * ⚠ THE HEADING IS A CLAIM ABOUT THE ORDER. \"Today / Yesterday / March 2026\"\n * over rows that are not in date order is not a grouping, it is a lie: the\n * same heading would reappear wherever the real order happened to interleave\n * two days. `groupingActive()` is that rule, and it is the reason grouping\n * follows the SORT KEY rather than a switch of its own — a switch would create\n * a state in which the key says one thing and the grouping another, and no\n * view could honestly draw both (`lib/viewPrefs`'s header says the same).\n *\n * ⚠ zaman:z1 — every boundary here is a boundary in the VIEWER's zone, never\n * the device's. A file touched at 01:00 in Istanbul belongs under \"Yesterday\"\n * for a reader on UTC and under \"Today\" for a reader on Istanbul, and the\n * header has to agree with the date the cell four pixels away prints. That is\n * why the labels and the month id are taken from the caller (`useLocale`,\n * which reads `lib/timezone`) instead of being formatted here.\n */\nimport { zonedDayNumber } from './timezone';\n\nimport type { ListingOrder, SortKey } from './sortOrder';\n\n/** One rung: a stable id to compare runs by, and the words to draw. */\nexport interface DateBucket {\n  id: string;\n  label: string;\n}\n\n/**\n * What a view lends this module so the headings speak its language and read\n * its clock. All three come straight off `useLocale(...)`.\n */\nexport interface DateGroupLabels {\n  t: (key: string) => string;\n  /** \"September 2026\", in the viewer's locale and zone. */\n  formatMonthYear: (value: number | Date | undefined | null) => string;\n  /** `YYYY-MM` in the viewer's zone — a bucket id, not a label. */\n  zonedYearMonth: (value: number | Date | undefined | null) => string;\n}\n\n/**\n * THE LADDER.\n *\n * Today · Yesterday · This Week · This Month · then one rung per month,\n * named (\"September 2026\"). Undated rows land in \"No date\", which the sort\n * already parks at the end in both directions (`lib/sortOrder.byActiveKey`).\n *\n * Measured against the reference the owner pointed at — filex.blipnova.com,\n * 2026-09-13, the `/recent` page, which is the only surface there that groups.\n * Its ladder is `Today · Yesterday · <that day's date>`: one heading per\n * calendar day for ever, taken from the browser's own clock. Ours keeps its\n * first two rungs verbatim and then collapses, deliberately:\n *\n *   - a heading per day is not a grouping once a listing is long — a folder\n *     touched file-by-file over a month draws thirty headings over thirty\n *     single rows;\n *   - the owner's own words name the rungs we keep: \"son bir hafta, dün,\n *     bugün, bu ay içinde vb.\" (last week, yesterday, today, within this\n *     month, and so on);\n *   - and the reference reads the DEVICE's calendar, which is the bug\n *     `lib/timezone` exists to have fixed here.\n *\n * ⚠ \"This Week\" is the six days before yesterday (`day > today - 7`), NOT a\n * calendar week: a Monday listing with a calendar rule would put Sunday —\n * eighteen hours ago — under a month heading.\n *\n * ⚠ A stamp in the future reads best as \"today\". Clock skew between a storage\n * and the reader is ordinary, and \"September 2027\" over the file somebody just\n * saved is worse than a day's imprecision.\n */\nexport function dateBucketFor(d: Date | null, l: DateGroupLabels): DateBucket {\n  if (!d) return { id: 'none', label: l.t('group.no_date') };\n  const now = new Date();\n  const today = zonedDayNumber(now);\n  const day = zonedDayNumber(d);\n  if (day >= today) return { id: 'today', label: l.t('group.today') };\n  if (day === today - 1) return { id: 'yesterday', label: l.t('group.yesterday') };\n  if (day > today - 7) return { id: 'week', label: l.t('group.this_week') };\n  const ym = l.zonedYearMonth(d);\n  if (ym === l.zonedYearMonth(now)) return { id: 'month', label: l.t('group.this_month') };\n  return { id: `m-${ym}`, label: l.formatMonthYear(d) };\n}\n\n/**\n * Is a date heading honest over THIS listing?\n *\n * Both halves are required and neither is cosmetic:\n *   - the key has to be `modified`, because that is the only order in which\n *     consecutive rows share a day;\n *   - the listing must not be the server's RANKED answer, where the key is\n *     still `modified` (nothing cleared it) and the rows simply are not\n *     obeying it.\n *\n * Sorting by name with date headings on would be exactly the lie above, so\n * every other key draws no headings at all — in all three views.\n */\nexport function groupingActive(key: SortKey, order: ListingOrder | undefined): boolean {\n  return order !== 'relevance' && key === 'modified';\n}\n\n/** A contiguous run of items that share a heading. `label: null` = no heading. */\nexport interface DateRun<T> {\n  id: string;\n  label: string | null;\n  items: T[];\n}\n\n/** An item that is not filed under a date, and the run it belongs to instead. */\nexport interface AsideRun {\n  id: string;\n  /** A heading for that run, or null/absent for a run drawn without one. */\n  label?: string | null;\n}\n\nexport interface DateGroupOptions<T> {\n  /** `groupingActive(...)`. False → one unlabelled run holding everything. */\n  active: boolean;\n  /** The instant this item is filed under, or null for \"no date\". */\n  dateOf: (item: T) => Date | null;\n  /**\n   * Items that are NOT filed under a date — return the run they belong to, or\n   * null to bucket them by date like everything else.\n   *\n   * ⚠ This is how \"folders first\" survives a date sort. Folders are given a\n   * run of their own at the top rather than floating to the top of each\n   * bucket, because floating would split a bucket in two and draw \"Today\"\n   * twice — once over the folders, once over the files. A folder has no\n   * meaningful modification date to file under anyway. The list uses it for\n   * its pinned storage rows as well.\n   */\n  aside?: (item: T) => AsideRun | null;\n  labels: DateGroupLabels;\n}\n\n/**\n * The grouping, in the two shapes the three views need.\n *\n * `runs` is for a view that renders segment by segment (the list, whose rows\n * are already nested under a heading element). `headingBefore` is for a view\n * that renders one flat sequence of cards and inserts a full-width heading\n * item in front of the card that starts a run (the grid and the gallery).\n *\n * ⚠ They are two readings of ONE pass, not two implementations: the map is\n * built from the runs. A view that used its own \"did the bucket change since\n * the previous card\" test would be the second copy this module exists to\n * prevent.\n */\nexport interface DateGrouping<T> {\n  /** Mirrors the `active` that was asked for — views branch on it. */\n  active: boolean;\n  runs: DateRun<T>[];\n  /** The heading to draw immediately before this item, or null. */\n  headingBefore: (item: T) => string | null;\n}\n\nexport function groupByDate<T>(items: readonly T[], opts: DateGroupOptions<T>): DateGrouping<T> {\n  const runs: DateRun<T>[] = [];\n  if (!opts.active) {\n    runs.push({ id: 'all', label: null, items: [...items] });\n  } else {\n    let cur: DateRun<T> | null = null;\n    for (const item of items) {\n      const side = opts.aside?.(item) ?? null;\n      const b: { id: string; label: string | null } = side\n        ? { id: side.id, label: side.label ?? null }\n        : dateBucketFor(opts.dateOf(item), opts.labels);\n      if (!cur || cur.id !== b.id) {\n        cur = { id: b.id, label: b.label, items: [] };\n        runs.push(cur);\n      }\n      cur.items.push(item);\n    }\n  }\n  /* Identity-keyed: the items are the very objects the template loops over in\n   * the same render, so no key function has to be invented — and inventing one\n   * is how two views end up disagreeing about what \"the same row\" means. */\n  const firsts = new Map<T, string>();\n  for (const r of runs) {\n    if (r.label && r.items.length) firsts.set(r.items[0], r.label);\n  }\n  return {\n    active: opts.active,\n    runs,\n    headingBefore: (item: T) => firsts.get(item) ?? null,\n  };\n}\n","/**\n * star.ts — the ONE place that talks to `POST /api/files/manager/star`.\n *\n * Starring grew a second surface (the context menu, then the grid/gallery\n * cards) and a menu entry cannot render a component, so the request had to\n * come out of `StarButton.vue` — but only ONCE. `StarButton` calls this, the\n * explorer's menu action calls this, and there is no third copy of the URL,\n * the credentials rule or the payload shape anywhere.\n *\n * ⚠ `credentials` defaults to 'same-origin', never 'include': a credentialed\n * cross-origin request may not be answered with `Access-Control-Allow-Origin:\n * *`, which is what filex sends — hardcoding 'include' silently broke starring\n * in every embed served from a different origin to the API (the desktop app is\n * one). Same trap as `loadStarred`/`fetchNavRows` in FileExplorer.\n */\n\nexport interface StarRequestOptions {\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}\n\n/** Toggle the starred flag for ONE node. Throws on a non-2xx answer so the\n *  caller can roll its optimistic state back. */\nexport async function setNodeStarred(\n  nodeId: number,\n  starred: boolean,\n  opts: StarRequestOptions = {},\n): Promise<void> {\n  const headers = {\n    'Content-Type': 'application/json',\n    ...(await (opts.authHeaders ?? (() => ({})))()),\n  };\n  const base = opts.apiBase ?? '';\n  const res = await fetch(`${base}/api/files/manager/star`, {\n    method: 'POST',\n    headers,\n    credentials: opts.authCredentials ?? 'same-origin',\n    body: JSON.stringify({ node_id: nodeId, starred }),\n  });\n  if (!res.ok) throw new Error(`star toggle failed: ${res.status}`);\n}\n","<script setup lang=\"ts\">\n/**\n * StarButton — toggleable star indicator for a node.\n *\n * Backed by the `node_meta key=\"starred\"` server-side row (see\n * `POST /api/files/manager/star`). Optimistic update — flips the local\n * state immediately and rolls back on API error.\n */\nimport { ref, watch, computed } from 'vue';\nimport { setNodeStarred } from '../lib/star';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  starred: boolean;\n  nodeId: number;\n  apiBase?: string;\n  /** Auth header builder injected by the parent file explorer. */\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  /** Credentials mode, from the explorer's auth kind. ⚠ Defaults to\n   *  'same-origin': a credentialed cross-origin request cannot be answered\n   *  with ACAO:* , so hardcoding 'include' broke this call in every embed\n   *  served from a different origin to the API. */\n  authCredentials?: RequestCredentials;\n  /** Compact mode for grid view (no label, just the icon). */\n  compact?: boolean;\n  /**\n   * Card mode — the same button sitting ON a grid/gallery tile instead of in\n   * a list cell: a round translucent chip in the tile's corner. It is the SAME\n   * component, deliberately: a card star written separately is a second\n   * starring path, and the two drift the first time one of them is fixed.\n   */\n  card?: boolean;\n  /** Locale for the title/label. ⚠ The strings used to be hardcoded English\n   *  (\"Star\"/\"Unstar\"), which is a Turkish user's only untranslated control in\n   *  the row. */\n  locale?: LocaleCode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'change', value: boolean): void;\n  (e: 'error', message: string): void;\n}>();\n\nconst local = ref(props.starred);\nwatch(() => props.starred, (v) => { local.value = v; });\n\nconst { t } = useLocale(() => resolveLocale(props.locale));\nconst label = computed(() => t(local.value ? 'ctx.unstar' : 'ctx.star'));\n\nasync function toggle() {\n  const next = !local.value;\n  local.value = next; // optimistic\n  try {\n    await setNodeStarred(props.nodeId, next, {\n      apiBase: props.apiBase,\n      authHeaders: props.authHeaders,\n      authCredentials: props.authCredentials,\n    });\n    emit('change', next);\n  } catch (err) {\n    local.value = !next; // rollback\n    emit('error', err instanceof Error ? err.message : String(err));\n  }\n}\n</script>\n\n<template>\n  <button\n    type=\"button\"\n    class=\"filex-star-btn\"\n    :class=\"{ 'is-starred': local, 'is-compact': compact, 'is-card': card }\"\n    :aria-pressed=\"local\"\n    :title=\"label\"\n    :aria-label=\"label\"\n    data-testid=\"star-toggle\"\n    @click.stop=\"toggle\"\n  >\n    <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n      <path\n        :fill=\"local ? 'currentColor' : 'none'\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linejoin=\"round\"\n        d=\"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z\"\n      />\n    </svg>\n    <span v-if=\"!compact\" class=\"filex-star-label\">{{ label }}</span>\n  </button>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-star-btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  background: transparent;\n  border: 1px solid transparent;\n  border-radius: 6px;\n  padding: 4px 8px;\n  color: var(--filex-text-muted, #9ca3af);\n  cursor: pointer;\n  transition: color 120ms, background 120ms;\n}\n.filex-star-btn:hover {\n  color: var(--filex-accent-amber, #f59e0b);\n  background: var(--filex-bg-soft, rgba(0, 0, 0, 0.04));\n}\n.filex-star-btn.is-starred {\n  color: var(--filex-accent-amber, #f59e0b);\n}\n.filex-star-btn.is-compact {\n  padding: 4px;\n}\n.filex-star-label {\n  font-size: 13px;\n}\n</style>\n","/* bul:s3 */\n/**\n * Snippet segment parser — the search backend returns content snippets as\n * PLAIN TEXT with matched words wrapped in «guillemets» (contract: no HTML\n * ever crosses the wire). The UI renders highlights by splitting the string\n * into segments and emitting each one as a TEXT node (a <mark> wrapper for\n * matches) — never via innerHTML, so a file whose content contains markup\n * can't inject anything into the page.\n */\n\nexport interface SnippetSegment {\n  /** Literal text of this segment. Always rendered as a text node. */\n  text: string;\n  /** True when the segment was «wrapped» — render inside <mark>. */\n  match: boolean;\n}\n\n/**\n * Split a `«»`-annotated snippet into render segments. An unpaired `«`\n * degrades gracefully: the rest of the string is treated as plain text.\n */\nexport function snippetSegments(snippet: string): SnippetSegment[] {\n  const out: SnippetSegment[] = [];\n  if (!snippet) return out;\n  const re = /«([^«»]*)»/g;\n  let last = 0;\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(snippet)) !== null) {\n    if (m.index > last) out.push({ text: snippet.slice(last, m.index), match: false });\n    if (m[1]) out.push({ text: m[1], match: true });\n    last = m.index + m[0].length;\n  }\n  if (last < snippet.length) out.push({ text: snippet.slice(last), match: false });\n  return out;\n}\n\n/** Matched-in values the search contract allows on a hit. */\nexport type SearchMatched = 'name' | 'content' | 'both';\n\n/** True when the hit matched (at least partly) inside file CONTENT. */\nexport function matchedInContent(matched: unknown): boolean {\n  return matched === 'content' || matched === 'both';\n}\n","/**\n * dragGhost — wiring:c4 custom HTML5 drag image.\n *\n * The browser default drag image (a translucent snapshot of the row/card)\n * reads poorly for multi-selection drags. This builds a small pill with the\n * dragged item's name and, for multi-drags, a count badge, parks it\n * off-screen (setDragImage requires a rendered element), and removes it on\n * the next tick. Purely visual — the dataTransfer payload is untouched.\n *\n * Styled by `.fe-dragghost` in base.css via the `--fe-*` tokens published\n * at :root (and re-published at `.dark`/html level for dark hosts), so it\n * matches the active theme even though it's appended to <body>.\n */\nexport function applyDragGhost(ev: DragEvent, name: string, count: number): void {\n  const dt = ev.dataTransfer;\n  if (!dt || typeof document === 'undefined' || typeof dt.setDragImage !== 'function') return;\n  try {\n    const el = document.createElement('div');\n    el.className = 'fe-dragghost';\n    const label = document.createElement('span');\n    label.className = 'fe-dragghost__name';\n    label.textContent = name;\n    el.appendChild(label);\n    if (count > 1) {\n      const badge = document.createElement('span');\n      badge.className = 'fe-dragghost__badge';\n      badge.textContent = String(count);\n      el.appendChild(badge);\n    }\n    el.style.position = 'fixed';\n    el.style.top = '-1000px';\n    el.style.left = '-1000px';\n    document.body.appendChild(el);\n    dt.setDragImage(el, 14, 14);\n    // The engine snapshots the element synchronously during dragstart —\n    // safe to drop it right after.\n    setTimeout(() => el.remove(), 0);\n  } catch {\n    /* non-critical visual nicety — native ghost remains */\n  }\n}\n","<script setup lang=\"ts\">\n/**\n * GridView — card grid.\n *\n * gorunum:v1 — the card has an anatomy now, and it is not the same anatomy\n * for a folder and for a file:\n *\n *   folder  186×56   glyph · name over \"Folder\" · ⋮\n *   file    186×166  184×108 preview · 56px footer (24px type tile · name\n *                    over \"1.7 MB • Sep 9, 2026\" · ⋮)\n *\n * A folder has no preview to show and no size or date worth printing, so a\n * square thumbnail box above its name was 108px of nothing on the most common\n * row in any listing. The two shapes share one footer row — the folder card\n * IS that row — so there is a single piece of markup to change when the row\n * changes.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'; /* wiring:c4 */\nimport type { FileNode } from '../types/FileNode';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport ItemCheck from './ItemCheck.vue';\nimport { encryptedFolderTile, fileIconTile, isEncryptedFolder } from '../lib/fileIcons';\nimport {\n  createFilePreviews,\n  drawsAsPage,\n  drawsAsVideo,\n  type FilePreview,\n} from '../lib/filePreview'; /* gorunum:v1-preview */\nimport { byFoldersFirst, parentDirOf } from '../lib/listing'; /* gorunum:v1 */\nimport {\n  groupByDate,\n  groupingActive,\n} from '../lib/dateGroups'; /* gruplama */\nimport { useSortStore, type ListingOrder } from '../lib/sortOrder'; /* gruplama */\nimport StarButton from './StarButton.vue';\nimport { snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\n\nconst props = withDefaults(defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  clipped?: Set<string>;\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Authenticated thumb resolver (useThumbs.src). Raw `thumb_url` is\n   *  root-relative and unauthenticated — a bare <img src> only works for the\n   *  native same-origin SPA, so embedded hosts NEED this. null = icon. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /** Desktop selective sync: availability badge per tile. Absent on the\n   *  web — no badge renders at all. */\n  keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n  /**\n   * Starring on a card. Same contract as ListView: the id set the explorer\n   * keeps, plus the API wiring StarButton needs. Absent apiBase → no star is\n   * rendered at all, exactly as in the list.\n   *\n   * ⚠ Not list-only. The Starred VIEW shipped before starring was reachable\n   * from anywhere but the list, so a user in grid view — the mode the panel's\n   * own screenshots show — had a view they could not fill.\n   */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /**\n   * surucu:d1 — draw \"Folders\" and \"Files\" as labelled sections.\n   *\n   * ⚠ It used to arrive with `uiProfile: 'drive'`; the explorer now passes it\n   * unconditionally, because the sections are part of the shell rather than of\n   * a profile. The prop stays for an embedder mounting this view directly:\n   * absent/false renders the grid without them, down to the DOM — the two\n   * headings are the only extra nodes, and without this prop none are emitted.\n   *\n   * ⚠ The prop gates the HEADINGS, not the order. Folders come before files\n   * in every profile (see `ordered`) — a heading only names a group that is\n   * there either way.\n   */\n  sections?: boolean;\n  /**\n   * gruplama — where these rows got their order, exactly as `ListView` takes\n   * it (`lib/sortOrder.ListingOrder`).\n   *\n   * ⚠ It changes nothing about the ORDER here — the pane hands this view rows\n   * that are already sorted, and `compareInOrder('relevance')` is\n   * byte-for-byte the folders-first pass below. It is read for one thing: a\n   * date heading over a RANKED answer would be a claim about an order the\n   * rows are not in. Omitted = an ordinary folder listing.\n   */\n  order?: ListingOrder;\n  /**\n   * gorunum:v1-preview — we are inside an E2E-encrypted folder.\n   *\n   * Every body on the wire in there is ciphertext, so reading a file's first\n   * kilobytes to draw its first lines would spend a request to learn that the\n   * bytes do not decode. The text preview stays off; the cards keep their\n   * type tiles. Absent/false = the ordinary case.\n   */\n  e2eActive?: boolean;\n  /**\n   * issue #26 — draw the checkbox on each card, the one click that selects.\n   * Default on. Home passes false: its cards open on a click and there is no\n   * selection there to put anything into.\n   */\n  selectable?: boolean;\n}>(), {\n  // ⚠ Not left to `undefined`: Vue casts an absent boolean prop to false, and\n  // the listing would lose its checkboxes wherever the host said nothing.\n  selectable: true,\n});\n\nconst emit = defineEmits<{\n  (e: 'click-card', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-card', node: FileNode): void;\n  (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /** gorunum:v1 — the order this view renders, so the parent's shift-range\n   *  arithmetic runs over what the user sees rather than over the backend's\n   *  answer. See the same emit in ListView. */\n  (e: 'display-order', nodes: FileNode[]): void;\n}>();\n\n/**\n * gorunum:v1 — folders first, always, and by the SHARED comparator\n * (`lib/listing.byFoldersFirst`) the list view uses as its own primary key.\n * Two sorts, one rule: a second private copy of \"dirs are 0, files are 1\" is\n * how the grid and the list end up disagreeing (filex lesson #67).\n *\n * `Array.prototype.sort` is stable, and this comparator returns 0 for any two\n * nodes of the same kind, so whatever order the parent sends survives\n * untouched INSIDE each group. The day a sort control reaches the grid,\n * descending will mean folders descending and then files descending, without\n * this line being touched.\n *\n * Display order only. Selection is keyed by path and the explorer's shift-range\n * still walks its own list, so nothing here moves an index the parent holds.\n */\nconst { t, formatSize, nodeDisplayName, formatDate, formatMonthYear, zonedYearMonth, toDate } =\n  useLocale(() => props.locale);\n\nconst ordered = computed<FileNode[]>(() => [...props.files].sort(byFoldersFirst));\nwatch(\n  ordered,\n  (list) => emit('display-order', list),\n  { immediate: true },\n);\n\nconst firstDirPath = computed(() => ordered.value.find((f) => f.type === 'dir')?.path ?? null);\nconst firstFilePath = computed(() => ordered.value.find((f) => f.type !== 'dir')?.path ?? null);\n\n/* gruplama — the same sort this pane's list view reads, by injection, so the\n * two cannot disagree about whether a date heading is honest right now. */\nconst sort = useSortStore();\n\n/**\n * gruplama — THE DATE HEADINGS, from `lib/dateGroups`, which is also where the\n * list gets them. Not a grid variant of the ladder: a rung added there has to\n * appear here on the same day or the two views name the same day differently.\n */\nconst grouped = computed(() =>\n  groupByDate(ordered.value, {\n    active: groupingActive(sort.key.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    /* Folders keep their own run at the top — the same rule the list follows,\n     * and the reason \"folders before files\" survives a date sort. Here the run\n     * is the one that already had a name. */\n    aside: (n) =>\n      n.type === 'dir'\n        ? { id: 'dirs', label: props.sections ? t('drive.section.folders') : null }\n        : null,\n    labels: { t, formatMonthYear, zonedYearMonth },\n  }),\n);\n\n/**\n * ⚠⚠ TWO HEADING SYSTEMS DO NOT STACK. While the rows are in date order the\n * \"Files\" label is replaced by the date headings rather than sitting above\n * them: the date headings ARE the files' headings, and \"Files\" followed\n * immediately by \"Today\" names one group twice and tells the reader nothing\n * the second time. \"Folders\" stays, because the folders are still one run and\n * no date can name it.\n *\n * Off that order (any other sort key, or a ranked search answer) the grid\n * keeps exactly the Folders / Files sections it has always drawn.\n */\nfunction headingBefore(n: FileNode): string | null {\n  if (grouped.value.active) return grouped.value.headingBefore(n);\n  if (!props.sections) return null;\n  if (n.path === firstDirPath.value) return t('drive.section.folders');\n  if (n.path === firstFilePath.value) return t('drive.section.files');\n  return null;\n}\n\n\n// Prefer the authenticated resolver when the host wired one; otherwise fall\n// back to the raw URL (legacy same-origin behavior).\nfunction thumbOf(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/* ==================================================================\n * gorunum:v1-preview — the card shows the file's own first lines.\n *\n * ⚠ The brief for this slice said these files \"have no thumbnail\". Measured\n * on the local backend, they do: `internal/thumb/generic.go` renders a card\n * tinted from a hash of the extension with the letters \"TS\"/\"CSV\"/\"ZIP\" drawn\n * in it, and the listing hands out a `thumb_url` for it (app.ts → a 1,745-byte\n * JPEG). So the choice is not \"preview or nothing\", it is \"the file's first\n * lines, or a coloured rectangle repeating the extension the footer tile and\n * the Type column both already say\".\n *\n * Hence the order below: for a node we can read as TEXT the `<img>` is not\n * rendered at all — which also means `thumbOf()` is never called for it and\n * `useThumbs` never fetches that generic JPEG, so this costs the same one\n * request it replaces. Every other node is untouched: images, video, audio\n * and PDFs keep their real, content-derived thumbnails.\n *\n * While the read is in flight (and if it fails, or the bytes turn out not to\n * be text) the card shows the type tile on `--fe-bg-elev` — the spec's stated\n * fallback, and no flash of a placeholder we are about to replace.\n * ================================================================== */\nconst previews = createFilePreviews({\n  // Read once: the explorer's `config.apiBase` is fixed for the life of a\n  // mounted panel, and `enabled` has to be answerable at construction.\n  apiBase: props.apiBase,\n  // Wrapped rather than passed, so a parent that re-creates its arrow on each\n  // render is still called through the CURRENT prop. ⚠ The builder is async;\n  // `createFilePreviews` awaits it (see the note there — a Promise spread into\n  // a headers object sends no Authorization and 401s in silence).\n  authHeaders: props.authHeaders ? () => props.authHeaders!() : undefined,\n  credentials: props.authCredentials,\n  disabled: () => props.e2eActive === true,\n});\nonBeforeUnmount(() => previews.dispose());\n\n/** Non-null only for a node whose bytes we can read as text. */\nfunction previewKind(n: FileNode) {\n  return previews.kindFor(n);\n}\n\n/** At most one element, so the template gets a typed local without a\n *  non-null assertion repeated at every nested loop. */\nfunction previewFor(n: FileNode): FilePreview[] {\n  const p = previews.get(n);\n  return p ? [p] : [];\n}\n\n/** Template-ref sink: the preview box itself is what the IntersectionObserver\n *  watches, so nothing is fetched for a card that never comes into view.\n *  ⚠ `unknown` because a Vue template `:ref` hands back an Element, a\n *  component instance or null depending on what it is put on. */\nfunction bindPreview(el: unknown, n: FileNode) {\n  previews.bind(el instanceof Element ? el : null, n);\n}\n\n/** A card carries a star when the host wired the API and the node is a file\n *  with a server id — the same rule the list row uses. */\nfunction canStar(n: FileNode): boolean {\n  if (props.starEnabled === false) return false;\n  return props.apiBase !== undefined && typeof n.id === 'number' && n.type === 'file';\n}\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\n/**\n * issue #26 — the card's checkbox is the one click that selects (a click\n * anywhere else on the card opens it), routed exactly like the list row's:\n * one `click-card` emit marked `check`, one `useSelection.click`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, checkMod(ev));\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onDbl(n: FileNode) {\n  emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-card', n, ev);\n}\n\n/**\n * gorunum:v1 — the ⋮ button. It calls the RIGHT-CLICK handler with the same\n * node and the same event, so the menu it opens is the context menu, built by\n * the explorer's one `selectionActionList`. There is deliberately no action\n * list here: a second one drifts from the first the week after it is written\n * (filex lesson #67).\n */\nfunction onMenuButton(n: FileNode, ev: MouseEvent) {\n  onCtx(n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  /* wiring:c4 — custom ghost (name + multi-select count badge), visual only. */\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight, mirrors ListView (visual layer only). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null; /* wiring:c4 */\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the card's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-card', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-card', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\n/**\n * The card's second line. A file prints \"1.7 MB • Sep 9, 2026\"; a folder\n * prints what it is, because its size is 0 and its date is the date something\n * inside it changed.\n *\n * Same epoch normalization the list and the gallery use (the backend has sent\n * both seconds and milliseconds), and the same locale the rest of the card is\n * drawn in — `toLocaleDateString` with the explorer's own tag, not the\n * browser's, so a Turkish panel says \"9 Eyl 2026\" whatever the OS is set to.\n */\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms);\n}\n\nfunction captionFor(n: FileNode): string {\n  if (n.type === 'dir') return t('node.folder');\n  const when = displayDate(n.last_modified);\n  const size = formatSize(n.size);\n  return when ? `${size} • ${when}` : size;\n}\n\nfunction keepGlyph(b: 'kept' | 'syncing' | 'cloud' | 'partial'): string {\n  if (b === 'kept') return '\\u2713';\n  if (b === 'syncing') return '\\u27f3';\n  if (b === 'partial') return '\\u25d0';\n  return '\\u2601';\n}\n\n/* bul:s3 — search-result enrichment, same presence-gating as ListView:\n * only search hits carry `snippet`, so normal listings render nothing. */\nfunction cardSnippet(n: FileNode): string {\n  const s = (n as Record<string, unknown>).snippet;\n  return typeof s === 'string' ? s : '';\n}\n\n// Plain-text form for the title attribute — same parser as the render\n// path, guillemets dropped (no separate sanitize route).\nfunction snippetTitle(snippet: string): string {\n  return snippetSegments(snippet)\n    .map((seg) => seg.text)\n    .join('');\n}\n</script>\n\n<template>\n  <!-- wiring:c4 — listbox semantics (multi-selectable cards as options);\n       localized label + busy state. Structure/layout untouched. -->\n  <div\n    class=\"fe-grid\"\n    :class=\"{ 'is-loading': loading, 'has-selection': selectable && selected.size > 0 }\"\n    role=\"listbox\"\n    aria-multiselectable=\"true\"\n    :aria-label=\"t('grid.aria')\"\n    :aria-busy=\"loading ? 'true' : undefined\"\n  >\n    <template v-for=\"n in ordered\" :key=\"n.path\">\n    <!-- surucu:d1 — the section label: a grid item spanning every column. The\n         cards keep `role=\"option\"`; the heading is aria-hidden, and the group\n         it names is already in each card's own label. -->\n    <p v-if=\"headingBefore(n)\" class=\"fe-grid__heading\" aria-hidden=\"true\">{{ headingBefore(n) }}</p>\n    <div\n      class=\"fe-grid__card\"\n      :class=\"{\n        'fe-grid__card--folder': n.type === 'dir' /* gorunum:v1 */,\n        'fe-grid__card--file': n.type !== 'dir' /* gorunum:v1 */,\n        'is-selected': isSelected(n),\n        'is-dir': n.type === 'dir',\n        'is-trash': n.trashed,\n        'is-clipped': clipped?.has(n.path),\n        'is-droptarget': dropTargetPath === n.path /* wiring:c4 */,\n      }\"\n      tabindex=\"0\"\n      role=\"option\"\n      :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n      :aria-label=\"nodeDisplayName(n) /* wiring:c4 */\"\n      :data-fe-path=\"n.path /* wiring:d1 — middle-click open-in-new-tab delegation */\"\n      draggable=\"true\"\n      @click=\"onClick(n, $event)\"\n      @dblclick=\"onDbl(n)\"\n      @contextmenu=\"onCtx(n, $event)\"\n      @dragstart=\"onItemDragStart(n, $event)\"\n      @dragover=\"onItemDragOver(n, $event)\"\n      @dragleave=\"onItemDragLeave(n) /* wiring:c4 */\"\n      @drop=\"onItemDrop(n, $event)\"\n      @touchstart.passive=\"touch.onTouchStart(n, $event)\"\n      @touchend=\"touch.onTouchEnd\"\n      @touchmove.passive=\"touch.onTouchMove\"\n    >\n      <!-- gorunum:v1 — the preview, files only: 184×108. A thumbnail when\n           there is one, otherwise the type tile centred on --fe-bg-elev.\n           gorunum:v1-preview — and, for a file we can read as text, its own\n           first lines instead (see the block comment in the script). -->\n      <div v-if=\"n.type !== 'dir'\" class=\"fe-grid__thumb\" :ref=\"(el) => bindPreview(el, n)\">\n        <!-- gorunum:v1-preview — text-readable kinds never reach the <img>\n             branch, so no generic placeholder thumbnail is fetched for them. -->\n        <template v-if=\"previewKind(n)\">\n          <!-- ⚠ Interpolated, never v-html: this is somebody's file content. -->\n          <div\n            v-for=\"p in previewFor(n)\"\n            :key=\"'fprev'\"\n            class=\"fe-fprev\"\n            :class=\"'fe-fprev--' + p.kind\"\n            :style=\"p.kind === 'table' ? { '--fprev-cols': String(p.cols) } : undefined\"\n            aria-hidden=\"true\"\n          >\n            <!-- One grid, cells emitted flat: <template> makes no DOM, so a\n                 short row's padding cells keep every column aligned. -->\n            <template v-if=\"p.kind === 'table'\">\n              <template v-for=\"(row, ri) in p.rows\" :key=\"ri\">\n                <span\n                  v-for=\"(cell, ci) in row\"\n                  :key=\"ci\"\n                  class=\"fe-fprev__cell\"\n                  :class=\"{ 'is-head': ri === 0 }\"\n                >{{ cell }}</span>\n              </template>\n            </template>\n            <template v-else>\n              <div v-for=\"(ln, li) in p.lines\" :key=\"li\" class=\"fe-fprev__line\"><span\n                v-if=\"ln.tint\"\n                class=\"fe-fprev__tint\"\n              >{{ ln.indent }}{{ ln.tint }}</span>{{ ln.text }}</div>\n            </template>\n          </div>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"previewFor(n).length === 0\"\n            class=\"fe-grid__icon fe-grid__icon--svg\"\n            v-html=\"fileIconTile(n)\"\n          ></span>\n        </template>\n        <!--\n          draggable=\"false\" — HTML5 image drag dataTransfer adds 'Files'\n          MIME, which trips the parent's upload handler; without this\n          the user dragging an item with a thumbnail re-uploads it.\n          Parent card stays draggable=true so internal move works.\n        -->\n        <img\n          v-else-if=\"thumbOf(n)\"\n          :src=\"thumbOf(n)!\"\n          :alt=\"n.basename\"\n          :class=\"{ 'fe-thumb--page': drawsAsPage(n) /* gorunum:v1-preview — crop a page from its TOP */ }\"\n          loading=\"lazy\"\n          draggable=\"false\"\n        />\n        <!-- ikon:emoji — an encrypted folder is still a FOLDER, so it keeps the\n             folder's own shape and colour with the padlock cut out of it; the\n             🔒 it replaces said \"locked\" and nothing else. One definition,\n             in lib/fileIcons, for all three views. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n        <span\n          v-else-if=\"isEncryptedFolder(n)\"\n          class=\"fe-grid__icon fe-grid__icon--svg\"\n          role=\"img\"\n          :aria-label=\"t('e2e.badge')\"\n          v-html=\"encryptedFolderTile()\"\n        ></span>\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n        <span v-else class=\"fe-grid__icon fe-grid__icon--svg\" v-html=\"fileIconTile(n)\"></span>\n        <!-- Star, ON the tile. A hover-only affordance would be invisible to\n             the person looking for what they starred, so the chip is always\n             painted once the file IS starred and only appears on hover/focus\n             otherwise (see .fe-grid__star in styles/base.css). @click.stop so\n             starring never doubles as opening the card. -->\n        <!-- gorunum:v1-preview — a frame lifted out of a video is, on a card,\n             indistinguishable from a photograph. The badge is the difference,\n             and it is drawn only over a real frame: a video that fell back to\n             its type tile already says what it is. -->\n        <span\n          v-if=\"!previewKind(n) && thumbOf(n) && drawsAsVideo(n)\"\n          class=\"fe-thumb__play\"\n          aria-hidden=\"true\"\n        ></span>\n        <div v-if=\"canStar(n)\" class=\"fe-grid__star\" @click.stop @dblclick.stop>\n          <StarButton\n            :starred=\"!!starredIds?.has(n.id!)\"\n            :node-id=\"n.id!\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            card\n            @change=\"(val: boolean) => emit('star-change', n, val)\"\n          />\n        </div>\n      </div>\n\n      <!-- gorunum:v1 — the row both cards share: tile · name over caption · ⋮.\n           On a file it is the 56px footer under the preview; on a folder it is\n           the whole 56px card. -->\n      <div class=\"fe-grid__foot\">\n        <!-- issue #26 — the checkbox takes the tile's place while it shows\n             (hovered, focused, selected, or once anything is selected), so\n             the name does not move when it appears. -->\n        <span class=\"fe-grid__lead\" :class=\"{ 'fe-grid__lead--pick': selectable }\">\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"isEncryptedFolder(n)\"\n            class=\"fe-grid__tile fe-grid__tile--svg\"\n            role=\"img\"\n            :aria-label=\"t('e2e.badge')\"\n            v-html=\"encryptedFolderTile()\"\n          ></span>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span v-else class=\"fe-grid__tile fe-grid__tile--svg\" v-html=\"fileIconTile(n)\"></span>\n          <span\n            v-if=\"selectable\"\n            class=\"fe-item-check\"\n            data-fe-control\n            @click.stop=\"onCheckClick(n, $event)\"\n            @dblclick.stop\n          >\n            <ItemCheck :on=\"isSelected(n)\" :label=\"nodeDisplayName(n)\" />\n          </span>\n        </span>\n        <div class=\"fe-grid__main\">\n          <div class=\"fe-grid__label\" :title=\"n.basename\">\n            {{ nodeDisplayName(n) }}\n            <span\n              v-if=\"keepBadgeFor && keepBadgeFor(n)\"\n              :class=\"['fe-keepbadge', 'fe-keepbadge--' + keepBadgeFor(n)]\"\n              :title=\"t('keep.badge_' + keepBadgeFor(n))\"\n              role=\"img\"\n              :aria-label=\"t('keep.badge_' + keepBadgeFor(n))\"\n            >{{ keepGlyph(keepBadgeFor(n)!) }}</span>\n          </div>\n          <div class=\"fe-grid__meta\">{{ captionFor(n) }}</div>\n          <!-- A card at a storage's root has no parent folder to name: no line,\n               not an em dash — the same rule the gallery follows and the list's\n               Location cell (tablo:t1). The dash read as a stray character under\n               the filename in search results. -->\n          <div\n            v-if=\"showParentPath && parentDirOf(n.path)\"\n            class=\"fe-grid__parent\"\n            :title=\"parentDirOf(n.path)\"\n          >{{ parentDirOf(n.path) }}</div>\n          <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n          <div v-if=\"cardSnippet(n)\" class=\"fe-grid__snippet\" :title=\"snippetTitle(cardSnippet(n))\">\n            <template v-for=\"(seg, si) in snippetSegments(cardSnippet(n))\" :key=\"si\">\n              <mark v-if=\"seg.match\" class=\"fe-grid__mark\">{{ seg.text }}</mark>\n              <template v-else>{{ seg.text }}</template>\n            </template>\n          </div>\n        </div>\n        <button\n          type=\"button\"\n          class=\"fe-grid__menu\"\n          :aria-label=\"t('toolbar.more')\"\n          :title=\"t('toolbar.more')\"\n          @click.stop=\"onMenuButton(n, $event)\"\n          @dblclick.stop\n        >⋮</button>\n      </div>\n    </div>\n    </template>\n    <div v-if=\"!loading && files.length === 0\" class=\"fe-grid__empty\">\n      {{ t('empty.folder') }}\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * HomeView — the overview the explorer lands on, INSIDE the shell.\n *\n * Three blocks, each answering a question somebody actually has on arrival:\n *\n *   Storages  which drives are mine to open?   (one card per storage)\n *   Recent    what was I just working on?\n *   Starred   what did I mark to come back to?\n *\n * ⚠⚠ Why it is in this package and not in the web app. It used to be a\n * separate PAGE there (`web/src/views/Home.vue`) with a header of its own — a\n * logo, a refresh, an \"All files\" button, an apps grid, sign-out and a\n * language switch — and no navigation panel at all, so moving between Home and\n * the files replaced the whole screen and half of that header repeated a\n * control the explorer already drew. Home is a VIEW, the way Recent and\n * Starred are: same panel, same top bar, only the content area changes. A view\n * of the explorer belongs to the explorer, and putting it here is also what\n * makes the panel's \"Home\" row mean something inside `<filex-explorer>`\n * instead of being a destination that only exists on one surface.\n *\n * ⚠ Recent and Starred render through GridView — the SAME card, with the same\n * thumbnails, the same type tiles and the same right-click menu as the listing\n * behind it. A second card implementation for the same object is how the two\n * start disagreeing about what a .docx looks like (it already happened once:\n * the web page deep-imported `fileIcons` precisely to avoid it).\n *\n * ⚠ No `<style>` block, scoped or otherwise — the package's CSS lives in\n * `styles/base.css`. A scoped block compiles to `.cls[data-v-HASH]` and the\n * hash does not match in the web-component build, so the rules would silently\n * stop applying in every embed.\n */\nimport { computed, ref } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { nameMatches } from '../lib/fileFilters';\nimport GridView from './GridView.vue';\n\nexport interface HomeStorage {\n  name: string;\n  label?: string;\n  driver?: string;\n  readOnly?: boolean;\n  /** Bytes this storage holds, when the server reported one. */\n  usedBytes?: number;\n}\n\nconst props = defineProps<{\n  storages: HomeStorage[];\n  recent: FileNode[];\n  starred: FileNode[];\n  /** True while the two per-user lists are still in flight. */\n  loading?: boolean;\n  locale: LocaleCode;\n  /**\n   * surucu:d1-scope — what the filter row above this view has in its name box.\n   *\n   * ⚠ It narrows ALL THREE blocks, not the two made of files. Home's first\n   * block is the drive list, and \"orada adam isterse storage ismi aratabilir\"\n   * is precisely the case the owner asked for; a box that skipped the block\n   * with the fewest, longest-lived names in it would be the box that misses\n   * the one thing people look for here.\n   *\n   * ⚠ Through `lib/fileFilters`'s own `nameMatches`, which is the predicate the\n   * listing's box uses — so an accent folds here exactly as it folds there.\n   * Optional: an embedder that draws no filter row passes nothing and sees\n   * everything, which is what this view has always done.\n   */\n  nameFilter?: string;\n  /** Authenticated thumb resolver (useThumbs.src) — the grid needs it in an\n   *  embed, where a bare root-relative `thumb_url` is not authenticated. */\n  thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'open-storage', name: string): void;\n  (e: 'open-node', node: FileNode): void;\n  (e: 'context-node', node: FileNode, ev: MouseEvent): void;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\n/* surucu:d1-scope — the three narrowed blocks.\n *\n * ⚠ A storage is matched on the word ON THE CARD (`label || name`), which is\n * also the only word a person can see to type. A card labelled \"Arşiv\" over a\n * storage named `s3-archive` must answer to \"arş\"; matching the wire name\n * instead would make the filter miss the thing it is pointing at.\n */\nconst needle = computed(() => (props.nameFilter ?? '').trim());\nconst filtering = computed(() => needle.value !== '');\nconst shownStorages = computed(() =>\n  props.storages.filter((s) => nameMatches(s.label || s.name, needle.value)),\n);\nconst shownRecent = computed(() =>\n  props.recent.filter((n) => nameMatches(n.basename || '', needle.value)),\n);\nconst shownStarred = computed(() =>\n  props.starred.filter((n) => nameMatches(n.basename || '', needle.value)),\n);\n/** True when a block has rows but the filter hid all of them — a different\n *  fact from \"you have starred nothing\", and it must not borrow that sentence. */\nfunction filteredEmpty(total: number, shown: number): boolean {\n  return filtering.value && total > 0 && shown === 0;\n}\n\n/**\n * ⚠ One frozen empty set, not `new Set()` in the template. GridView takes the\n * selection as a prop and a fresh Set on every render is a new identity every\n * time, which re-runs everything downstream of it for a value that never\n * changes. Nothing on Home is selectable: there is no selection bar, no\n * checkbox column and no verb to apply — so the honest answer is \"nothing\",\n * once.\n */\nconst NO_SELECTION: Set<string> = new Set();\n\n/**\n * The storage card's glyph.\n *\n * ⚠ `mime_type: 'inode/storage'` is the whole point of this line. A storage row\n * IS `type: 'dir'`, so asking for `{ type: 'dir' }` alone falls through to the\n * plain folder branch and every drive on the first screen a person sees — the\n * screen with the most drives on it — came out as a yellow folder. `storage` is\n * a real icon family now (lib/fileIcons answers it BEFORE the folder branch),\n * and it is the two-bay drive the navigation panel already draws for the same\n * storages: one shape for a drive across the panel, the list, the grid and here.\n *\n * One constant rather than a per-card call: every storage resolves to the same\n * family, so this is one string, not one per row.\n */\nconst storageTile = fileIconTile({ type: 'dir', mime_type: 'inode/storage' });\n\n/**\n * What a storage card says under its name.\n *\n * ⚠ A size only when the server reported one, and it is the same quantity for\n * everybody who gets it (`/api/admin/storages` for an operator, the\n * RBAC-filtered `/api/files/quota/storages` for everybody else). The per-USER\n * quota is a sum across every storage, so printing that here would be a number\n * about the person under a label about the drive. With no figure the caption\n * names the kind of thing instead: a card with no size line says less; a card\n * with the wrong size line says something false.\n */\nfunction storageCaption(s: HomeStorage): string {\n  const base =\n    typeof s.usedBytes === 'number' && s.usedBytes >= 0\n      ? t('drive.storage.used_unlimited', { used: formatSize(s.usedBytes) })\n      : t('conn.guide.storage');\n  // A read-only mount says so on its card too (issue #30).\n  return s.readOnly ? `${base} · ${t('sidenav.storage.readOnly')}` : base;\n}\n\n/**\n * A card opens what it names.\n *\n * A single click, exactly as in the listing behind it (issue #26: a click\n * anywhere but the checkbox opens). Home's cards carry no checkbox at all —\n * there is no selection here to tick anything into (see NO_SELECTION).\n *\n * ⚠ Which is why the double click has to be swallowed: a real double click\n * fires `click-card` twice, and two opens of a file are two viewer tabs. The\n * guard is on the NODE, not on a timer alone — opening the same thing twice in\n * a moment is the accident; opening two different things quickly is somebody\n * working fast.\n */\nconst lastOpen = ref<{ path: string; at: number }>({ path: '', at: 0 });\nfunction openNode(n: FileNode) {\n  const now = Date.now();\n  if (n.path === lastOpen.value.path && now - lastOpen.value.at < 700) return;\n  lastOpen.value = { path: n.path, at: now };\n  emit('open-node', n);\n}\n</script>\n\n<template>\n  <!-- ⚠ No title of its own, and as of 2026-09-13 nobody else draws one either.\n       The explorer used to render \"Home\" into the breadcrumb row above this;\n       the owner had it removed (\"ver sayfa içinde salak bir Home yazısı var,\n       onu kaldıralım\") because the panel row, the tab and the address bar\n       already say it three times over. The section headings below stay — they\n       name the blocks, not the page. -->\n  <div class=\"fe-home\" data-testid=\"home-view\">\n    <!-- ── Storages ──────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-storages\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.storages') }}</h2>\n\n      <div v-if=\"shownStorages.length\" class=\"fe-home__storages\">\n        <button\n          v-for=\"s in shownStorages\"\n          :key=\"s.name\"\n          type=\"button\"\n          class=\"fe-home__storage\"\n          data-testid=\"home-storage-card\"\n          :data-storage=\"s.name\"\n          :title=\"s.label || s.name\"\n          @click=\"emit('open-storage', s.name)\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span class=\"fe-home__storage-tile\" aria-hidden=\"true\" v-html=\"storageTile\"></span>\n          <span class=\"fe-home__storage-main\">\n            <span class=\"fe-home__storage-label\">{{ s.label || s.name }}</span>\n            <span class=\"fe-home__storage-meta\">{{ storageCaption(s) }}</span>\n          </span>\n        </button>\n      </div>\n\n      <!-- ⚠ The filter hid them — NOT \"no storages yet\". Two different facts,\n           and borrowing the second sentence for the first tells an operator\n           their drives are gone. One row per block, `data-testid` included, so\n           a test can tell the two apart too. -->\n      <p\n        v-else-if=\"filteredEmpty(storages.length, shownStorages.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-storages-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-storages-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <rect x=\"26\" y=\"30\" width=\"68\" height=\"18\" rx=\"5\" />\n          <rect x=\"26\" y=\"54\" width=\"68\" height=\"18\" rx=\"5\" />\n          <path d=\"M38 39h.01M38 63h.01\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('home.storages.empty') }}</p>\n        <p class=\"fe-state__hint\">{{ t('home.storages.hint') }}</p>\n      </div>\n    </section>\n\n    <!-- ── Recent ────────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-recent\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.recent') }}</h2>\n\n      <GridView\n        v-if=\"shownRecent.length\"\n        :files=\"shownRecent\"\n        :selected=\"NO_SELECTION\"\n        :selectable=\"false\"\n        :locale=\"locale\"\n        :thumb-src=\"thumbSrc\"\n        @click-card=\"openNode\"\n        @dbl-card=\"openNode\"\n        @context-card=\"(n: FileNode, ev: MouseEvent) => emit('context-node', n, ev)\"\n      />\n      <!-- ⚠ A block still loading says so, and must NOT fall through to the\n           empty state: every visit would otherwise flash \"Nothing starred yet\"\n           at somebody who has starred things. -->\n      <p v-else-if=\"loading\" class=\"fe-home__loading\">{{ t('loading') }}</p>\n      <p\n        v-else-if=\"filteredEmpty(recent.length, shownRecent.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-recent-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-recent-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"60\" cy=\"50\" r=\"28\" />\n          <path d=\"M60 32v18l12 8\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.recent.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.recent.hint') }}</p>\n      </div>\n    </section>\n\n    <!-- ── Starred ───────────────────────────────────────────────────── -->\n    <section class=\"fe-home__section\" data-testid=\"home-starred\">\n      <h2 class=\"fe-home__heading\">{{ t('sidenav.starred') }}</h2>\n\n      <GridView\n        v-if=\"shownStarred.length\"\n        :files=\"shownStarred\"\n        :selected=\"NO_SELECTION\"\n        :selectable=\"false\"\n        :locale=\"locale\"\n        :thumb-src=\"thumbSrc\"\n        @click-card=\"openNode\"\n        @dbl-card=\"openNode\"\n        @context-card=\"(n: FileNode, ev: MouseEvent) => emit('context-node', n, ev)\"\n      />\n      <p v-else-if=\"loading\" class=\"fe-home__loading\">{{ t('loading') }}</p>\n      <p\n        v-else-if=\"filteredEmpty(starred.length, shownStarred.length)\"\n        class=\"fe-home__nomatch\"\n        data-testid=\"home-starred-nomatch\"\n      >\n        {{ t('filter.empty.title') }}\n      </p>\n      <div v-else class=\"fe-state fe-home__state\" data-testid=\"home-starred-empty\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"96\"\n          height=\"80\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d=\"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\"\n          />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.starred.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.starred.hint') }}</p>\n      </div>\n    </section>\n  </div>\n</template>\n","/**\n * useConnections — the one client for the storage-connection surface.\n *\n * It talks to the same server the explorer does, through the same auth\n * plumbing (`useFileApi` owns bearer/CSRF/basic resolution, including the\n * function-token the desktop app hands down), so there is no second place\n * that knows how to authenticate.\n *\n * Two audiences, deliberately separated:\n *\n *   • an ADMIN gets the driver descriptors and full CRUD over storages\n *     (`/api/admin/*`);\n *   • everybody else gets `visible` — the storage names the manager root\n *     already returns to them — plus their own identity, which is all the\n *     \"how to connect\" pages need.\n *\n * ⚠ Permission is decided by ASKING THE SERVER, never by reading a role\n * off `/api/auth/me`. An API token whose scopes exclude `admin` belongs to\n * an admin account and still gets 403 on `/api/admin/storages`; trusting\n * the role would render a form whose every submit fails.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type {\n  ConnectionsUser,\n  ManageDenial,\n  StorageDriverDescriptor,\n  StorageField,\n  StorageRow,\n  StorageTestResult,\n  StorageWrite,\n} from '../types/Connections';\nimport { useFileApi } from './useFileApi';\n\n/**\n * The URL prefix the `/api/...` routes hang off.\n *\n * `apiBase: ''` is a legitimate value (the admin SPA is same-origin), so\n * only `undefined`/`null` means \"not given\" — a falsy check would send the\n * SPA's requests to the wrong place. Legacy embedders configure `endpoint`\n * instead of `apiBase`; the prefix is recovered from it so they are not\n * excluded.\n */\nexport function connectionsBase(config: ExplorerConfig): string {\n  if (config.apiBase != null) return config.apiBase.replace(/\\/+$/, '');\n  const m = config.endpoint ?? '';\n  const cut = m.indexOf('/api/');\n  return cut >= 0 ? m.slice(0, cut) : '';\n}\n\n/**\n * The origin a client program should be pointed at.\n *\n * The instruction pages are only worth anything if they name the real\n * deployment, so this resolves to an absolute address, best evidence first:\n *\n *   1. `publicUrl` — what the SERVER says it is reached at\n *      (`/api/files/capabilities` → `public_url`, published only when the\n *      operator configured it or the request came in on a tenant's own host);\n *   2. the configured apiBase when it is absolute (the desktop app, embeds\n *      that talk to filex directly);\n *   3. the page's own origin (the admin SPA, which the same binary serves).\n *\n * ⚠⚠ The first rung is new and it is the fix. Without it an explorer embedded\n * in ANOTHER app — which proxies `/api` to filex under its own origin, the way\n * work.example.com and fishapp do — printed `https://<that app>/dav/`: an address\n * that reaches the host application, never filex. It also left one guide page\n * speaking with two voices, because its S3 endpoint and SFTP host were always\n * the server's and only the WebDAV / mount lines were the page's.\n */\nexport function connectionsOrigin(config: ExplorerConfig, publicUrl?: string | null): string {\n  const told = String(publicUrl ?? '').trim();\n  if (/^https?:\\/\\/[^/]/i.test(told)) return told.replace(/\\/+$/, '');\n  const base = connectionsBase(config);\n  if (/^https?:\\/\\//i.test(base)) {\n    try {\n      return new URL(base).origin;\n    } catch {\n      return base;\n    }\n  }\n  if (typeof window !== 'undefined' && window.location) return window.location.origin;\n  return base;\n}\n\nexport function useConnections(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const drivers = shallowRef<StorageDriverDescriptor[]>([]);\n  const storages = shallowRef<StorageRow[]>([]);\n  /** Storage names a non-admin may see (manager root). */\n  const visible = shallowRef<string[]>([]);\n  const me = ref<ConnectionsUser | null>(null);\n  /** The server's own public address, when it has one to give (see connectionsOrigin). */\n  const publicUrl = ref<string | null>(null);\n\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /** null until the first load decides; then true, or a reason it is false. */\n  const canManage = ref<boolean | null>(null);\n  const denial = ref<ManageDenial | null>(null);\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  function messageOf(e: unknown): string {\n    const err = e as { message?: string } | null;\n    return err?.message || String(e);\n  }\n\n  /** The full picture, in as few round-trips as the permission allows. */\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      // Where the server says it lives. Best-effort and in parallel: a server\n      // older than `public_url`, or one that has none to give, leaves the\n      // guides on the address the page loaded from — exactly as before.\n      const told = api\n        .capabilities()\n        .then((c) => {\n          const v = (c as { public_url?: unknown } | null)?.public_url;\n          publicUrl.value = typeof v === 'string' && v ? v : null;\n        })\n        .catch(() => {\n          publicUrl.value = null;\n        });\n\n      // Identity first: the guides need the caller's own e-mail (it IS the\n      // WebDAV username), and it is the one call every role may make.\n      try {\n        const body = await api.jsonFetch<{ user: ConnectionsUser }>(url('/api/auth/me'));\n        me.value = body?.user ?? null;\n      } catch (e) {\n        if (statusOf(e) === 401) {\n          canManage.value = false;\n          denial.value = 'anonymous';\n        }\n        me.value = null;\n      }\n\n      try {\n        drivers.value = await api.jsonFetch<StorageDriverDescriptor[]>(\n          url('/api/admin/storage-drivers'),\n        );\n        canManage.value = true;\n        denial.value = null;\n      } catch (e) {\n        drivers.value = [];\n        canManage.value = false;\n        // 401/403 is a permission answer, not a fault: a viewer is meant to\n        // land on the guides. Anything else is a real failure and is shown.\n        const st = statusOf(e);\n        if (st === 403) denial.value = 'none';\n        else if (st === 401) denial.value = 'anonymous';\n        else {\n          denial.value = 'unreachable';\n          error.value = messageOf(e);\n        }\n      }\n\n      if (canManage.value) {\n        try {\n          const rows = await api.jsonFetch<StorageRow[]>(url('/api/admin/storages'));\n          storages.value = Array.isArray(rows) ? rows : [];\n          visible.value = storages.value.map((s) => s.name);\n        } catch (e) {\n          error.value = messageOf(e);\n        }\n      } else {\n        // What a non-admin may see, from the endpoint they already use.\n        try {\n          const root = await api.index('');\n          visible.value = Array.isArray(root?.storages) ? root.storages : [];\n        } catch {\n          visible.value = [];\n        }\n      }\n      await told;\n      loaded.value = true;\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  async function createStorage(body: StorageWrite): Promise<StorageRow> {\n    const created = await api.jsonFetch<StorageRow>(url('/api/admin/storages'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n    await load();\n    return created;\n  }\n\n  async function updateStorage(id: number, body: Partial<StorageWrite>): Promise<StorageRow> {\n    const updated = await api.jsonFetch<StorageRow>(url(`/api/admin/storages/${id}`), {\n      method: 'PATCH',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n    await load();\n    return updated;\n  }\n\n  async function deleteStorage(id: number): Promise<void> {\n    await api.jsonFetch(url(`/api/admin/storages/${id}`), { method: 'DELETE' });\n    await load();\n  }\n\n  /**\n   * Try a driver config without saving it.\n   *\n   * The endpoint answers 200 with `{ok:false,error}` for a connection that\n   * did not work — a failed *test* is a successful *request* — so a thrown\n   * error here means the call itself failed and is reported as such.\n   */\n  async function testStorage(body: {\n    driver: string;\n    config: Record<string, unknown>;\n  }): Promise<StorageTestResult> {\n    try {\n      return await api.jsonFetch<StorageTestResult>(url('/api/admin/storages/test'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(body),\n      });\n    } catch (e) {\n      return { ok: false, error: messageOf(e) };\n    }\n  }\n\n  function descriptor(driver: string): StorageDriverDescriptor | undefined {\n    return drivers.value.find((d) => d.driver === driver);\n  }\n\n  function fields(driver: string): StorageField[] {\n    return descriptor(driver)?.fields ?? [];\n  }\n\n  /** The config a fresh form starts from: every declared default, nothing else. */\n  function defaults(driver: string): Record<string, unknown> {\n    const out: Record<string, unknown> = {};\n    for (const f of fields(driver)) {\n      if (f.default !== undefined && f.default !== null) out[f.key] = f.default;\n    }\n    return out;\n  }\n\n  /**\n   * Required fields the config has not filled — checked HERE as well as on\n   * the server so the user is told before a round-trip, and with the same\n   * alias rules (`base_path` still counts as `root`).\n   */\n  function missingRequired(driver: string, cfg: Record<string, unknown>): StorageField[] {\n    return fields(driver).filter((f) => {\n      if (!f.required || f.default !== undefined) return false;\n      for (const k of [f.key, ...(f.aliases ?? [])]) {\n        const v = cfg[k];\n        if (v === undefined || v === null) continue;\n        if (typeof v === 'string' && v.trim() === '') continue;\n        return false;\n      }\n      return true;\n    });\n  }\n\n  const driverNames = computed(() => drivers.value.map((d) => d.driver));\n\n  return {\n    // state\n    drivers,\n    driverNames,\n    storages,\n    visible,\n    me,\n    publicUrl,\n    loading,\n    loaded,\n    error,\n    canManage,\n    denial,\n    // actions\n    load,\n    createStorage,\n    updateStorage,\n    deleteStorage,\n    testStorage,\n    // descriptor helpers\n    descriptor,\n    fields,\n    defaults,\n    missingRequired,\n  };\n}\n\nexport type ConnectionsApi = ReturnType<typeof useConnections>;\n","/**\n * connectionGuides — \"how do I connect to this thing?\", generated from the\n * live deployment instead of written as prose.\n *\n * A published document says `https://fm.example.com/dav/` and leaves the\n * reader to substitute three values, one of which (their own username) they\n * usually get wrong. What ships here is the real host, the real storage\n * name and the caller's own credential, with a copy button — which is the\n * difference between a doc and a working paste. No surveyed product\n * (Backblaze, R2, Storj, MinIO, Garage) does this; it is the cheapest win\n * on the whole surface.\n *\n * Shape of the thing: a protocol is a `GuideBuilder` registered in\n * `GUIDE_BUILDERS`. WebDAV is built here because WebDAV is what filex\n * serves today; S3 and SFTP are a builder each and a registry line when\n * their servers land — no second implementation, no second UI.\n *\n * The commands are not invented. They are the ones verified on 2026-08-14\n * and written down in `docs/WEBDAV.md` and §13.5 of the write-path\n * handover, including the three Windows registry limits that otherwise\n * look exactly like filex bugs.\n */\n\nexport type Translate = (key: string, vars?: Record<string, string | number>) => string;\n\n/** Everything a guide is allowed to know about the deployment. */\nexport interface GuideContext {\n  /** Absolute origin of the server, e.g. `https://fm.example.com`. */\n  origin: string;\n  /** The caller's own account e-mail — the username on every protocol. */\n  user: string;\n  /** Storage names the caller may see. */\n  storages: string[];\n  /** The storage the page is currently focused on, when any. */\n  storage?: string;\n  /**\n   * The S3 endpoint, as the server computes it.\n   *\n   * ⚠ NOT derived from `origin` here. With a dedicated host the endpoint is\n   * that host's root; without one it lives under `/s3`, and a client pointed\n   * at the application root reaches the web app — rclone reported\n   * \"XML syntax error on line 10\" against an HTML redirect page. The server\n   * returns this with every key, and the guide repeats it verbatim.\n   */\n  s3Endpoint?: string;\n  /** True when clients must be told to force path-style addressing. */\n  s3PathStyle?: boolean;\n  /** The access key id to write into the examples, when the caller has one. */\n  s3AccessKeyID?: string;\n  /** The freshly minted secret, shown only while the user is looking at it. */\n  s3Secret?: string;\n  /** The SFTP endpoint, as the server reports it. */\n  sftpHost?: string;\n  sftpPort?: number;\n  /** False when the operator has the endpoint switched off. */\n  sftpEnabled?: boolean;\n  /** The login name a client must use — the username when there is one. */\n  sftpLogin?: string;\n  /** True when the account has at least one usable key registered. */\n  sftpHasKey?: boolean;\n  /** The FTPS endpoint, as the server reports it. */\n  ftpsHost?: string;\n  ftpsPort?: number;\n  ftpsEnabled?: boolean;\n  /** The passive data-port range, which the client's firewall must allow. */\n  ftpsPasvMin?: number;\n  ftpsPasvMax?: number;\n  /** True when the server is using a self-signed certificate. */\n  ftpsSelfSigned?: boolean;\n  /** The NFS endpoint, as the server reports it. */\n  nfsHost?: string;\n  nfsPort?: number;\n  nfsEnabled?: boolean;\n  /** The freshly minted export path — the credential, shown once. */\n  nfsPath?: string;\n  /** True when the active export refuses writes. */\n  nfsReadOnly?: boolean;\n}\n\nexport type GuideBlockKind = 'text' | 'steps' | 'code' | 'note' | 'warn';\n\nexport interface GuideBlock {\n  kind: GuideBlockKind;\n  /** Prose for `text` / `note` / `warn`. */\n  text?: string;\n  /** Ordered instructions for `steps`. */\n  steps?: string[];\n  /** Copyable payload for `code`. */\n  code?: string;\n  /** Syntax hint / file name shown above a code block. */\n  caption?: string;\n}\n\nexport interface GuideClient {\n  id: string;\n  /** Product name — never translated (\"Cyberduck\" is Cyberduck). */\n  name: string;\n  platform: 'windows' | 'macos' | 'linux' | 'any';\n  blocks: GuideBlock[];\n}\n\n/** One connection fact, rendered as a copyable row. */\nexport interface GuideFact {\n  label: string;\n  value: string;\n  hint?: string;\n  /** Rendered as a hint rather than a value — filex never has the\n   *  plaintext of your password and must not pretend otherwise. */\n  placeholderOnly?: boolean;\n}\n\nexport interface ProtocolGuide {\n  id: string;\n  /** Protocol name — a wire protocol is not translated either. */\n  name: string;\n  summary: string;\n  /** Server + credential, filled in from this deployment. */\n  facts: GuideFact[];\n  clients: GuideClient[];\n  notes: GuideBlock[];\n}\n\nexport type GuideBuilder = (ctx: GuideContext, t: Translate) => ProtocolGuide;\n\n/** `https://fm.example.com` → `fm.example.com`; anything unparseable comes back whole. */\nexport function hostOf(origin: string): string {\n  try {\n    return new URL(origin).host;\n  } catch {\n    return origin.replace(/^https?:\\/\\//i, '').replace(/\\/+$/, '');\n  }\n}\n\n/** True when the deployment is not on TLS — several clients refuse that,\n *  and Windows refuses it silently, which is worse. */\nexport function isPlainHttp(origin: string): boolean {\n  return /^http:\\/\\//i.test(origin);\n}\n\n/**\n * The username a client should be given. Falls back to a placeholder so a\n * guide rendered before `/api/auth/me` answers is still readable rather\n * than showing `undefined` in the middle of a command line.\n */\nfunction userOf(ctx: GuideContext, t: Translate): string {\n  return ctx.user || t('conn.guide.userPlaceholder');\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// WebDAV\n// ─────────────────────────────────────────────────────────────────────\n\nexport const buildWebdavGuide: GuideBuilder = (ctx, t) => {\n  const origin = ctx.origin.replace(/\\/+$/, '');\n  const root = `${origin}/dav/`;\n  const target = ctx.storage ? `${origin}/dav/${ctx.storage}/` : root;\n  const user = userOf(ctx, t);\n  const secret = t('conn.guide.secretPlaceholder');\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.fact.url'), value: target, hint: ctx.storage ? t('conn.guide.fact.urlStorageHint', { storage: ctx.storage }) : t('conn.guide.fact.urlRootHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.webdav.userHint') },\n    { label: t('conn.guide.fact.password'), value: secret, hint: t('conn.guide.webdav.passwordHint'), placeholderOnly: true },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'windows',\n      name: 'Windows Explorer',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.win.s1'),\n            t('conn.guide.webdav.win.s2', { url: target }),\n            t('conn.guide.webdav.win.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.win.cmdCaption'),\n          code: `net use Z: \"${target}\" /user:${user} ${secret} /persistent:yes`,\n        },\n        {\n          kind: 'warn',\n          text: t('conn.guide.webdav.win.limits'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.win.regCaption'),\n          code: [\n            'reg add \"HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\WebClient\\\\Parameters\" /v FileSizeLimitInBytes /t REG_DWORD /d 4294967295 /f',\n            'reg add \"HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\WebClient\\\\Parameters\" /v FileAttributesLimitInBytes /t REG_DWORD /d 20000000 /f',\n            'net stop webclient && net start webclient',\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.webdav.win.https') },\n        { kind: 'note', text: t('conn.guide.webdav.win.persist') },\n        { kind: 'note', text: t('conn.guide.webdav.win.service') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS Finder',\n      platform: 'macos',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.mac.s1'),\n            t('conn.guide.webdav.mac.s2', { url: target }),\n            t('conn.guide.webdav.mac.s3'),\n          ],\n        },\n        { kind: 'note', text: t('conn.guide.webdav.mac.note') },\n      ],\n    },\n    {\n      id: 'linux',\n      name: 'Linux (davfs2 / GNOME / KDE)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.linux.mountCaption'),\n          code: [\n            `sudo mount -t davfs ${target} /mnt/filex`,\n            '',\n            `# ${t('conn.guide.webdav.linux.gvfsComment')}`,\n            `gio mount ${target.replace(/^https:/i, 'davs:').replace(/^http:/i, 'dav:')}`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'warn',\n          text: t('conn.guide.webdav.linux.locks'),\n        },\n        {\n          kind: 'code',\n          caption: '/etc/davfs2/davfs2.conf',\n          code: 'use_locks 0',\n        },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.rclone.obscureCaption'),\n          code: `rclone obscure \"${secret}\"`,\n        },\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex]',\n            'type = webdav',\n            `url = ${origin}/dav`,\n            'vendor = other',\n            `user = ${user}`,\n            `pass = ${t('conn.guide.webdav.rclone.passPlaceholder')}`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.webdav.rclone.useCaption'),\n          code: [\n            'rclone lsd filex:',\n            ctx.storage ? `rclone lsl filex:${ctx.storage}` : 'rclone lsl filex:<storage>',\n            ctx.storage\n              ? `rclone copy ./local filex:${ctx.storage}/backup`\n              : 'rclone copy ./local filex:<storage>/backup',\n            'rclone mount filex: /mnt/filex',\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'cyberduck',\n      name: 'Cyberduck / Mountain Duck',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.webdav.duck.s1'),\n            t('conn.guide.webdav.duck.s2', { host: hostOf(origin) }),\n            t('conn.guide.webdav.duck.s3', { path: ctx.storage ? `/dav/${ctx.storage}/` : '/dav/' }),\n            t('conn.guide.webdav.duck.s4', { user }),\n          ],\n        },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.webdav.note.delete') },\n    { kind: 'note', text: t('conn.guide.webdav.note.locks') },\n    { kind: 'note', text: t('conn.guide.webdav.note.permissions') },\n  ];\n\n  if (isPlainHttp(origin)) {\n    // Not decoration: over plain HTTP Windows refuses to send Basic\n    // credentials at all, and says nothing useful about why.\n    notes.unshift({ kind: 'warn', text: t('conn.guide.webdav.note.http') });\n  }\n\n  return {\n    id: 'webdav',\n    name: 'WebDAV',\n    summary: t('conn.guide.webdav.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// S3\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16, not copied\n * from a vendor page: rclone 1.73.5, aws-cli 2.11.6, restic 0.19.1, mc\n * 2025-08-13 and s3fs 1.93 each did a full round trip, and the flags below are\n * the ones those runs actually needed. Five of the endpoint's bugs were found\n * that way — a guide assembled from documentation would have shipped them.\n */\nexport const buildS3Guide: GuideBuilder = (ctx, t) => {\n  const endpoint = (ctx.s3Endpoint || `${ctx.origin.replace(/\\/+$/, '')}/s3`).replace(/\\/+$/, '');\n  const bucket = ctx.storage || ctx.storages[0] || '<bucket>';\n  const akid = ctx.s3AccessKeyID || t('conn.guide.s3.keyPlaceholder');\n  const secret = ctx.s3Secret || t('conn.guide.s3.secretPlaceholder');\n  const pathStyle = ctx.s3PathStyle !== false;\n  const host = hostOf(endpoint);\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.s3.fact.endpoint'), value: endpoint, hint: t('conn.guide.s3.fact.endpointHint') },\n    { label: t('conn.guide.s3.fact.bucket'), value: bucket, hint: t('conn.guide.s3.fact.bucketHint') },\n    { label: t('conn.guide.s3.fact.key'), value: akid, hint: t('conn.guide.s3.fact.keyHint') },\n    {\n      label: t('conn.guide.s3.fact.secret'),\n      value: secret,\n      hint: t('conn.guide.s3.fact.secretHint'),\n      // ⚠ Only real right after minting. filex stores the secret sealed and\n      // cannot show it again, and a guide that printed something secret-shaped\n      // would be teaching a value that authenticates as nothing.\n      placeholderOnly: !ctx.s3Secret,\n    },\n    { label: t('conn.guide.s3.fact.region'), value: 'us-east-1', hint: t('conn.guide.s3.fact.regionHint') },\n    {\n      label: t('conn.guide.s3.fact.addressing'),\n      value: pathStyle ? t('conn.guide.s3.fact.pathStyle') : t('conn.guide.s3.fact.virtualHosted'),\n      hint: pathStyle ? t('conn.guide.s3.fact.pathStyleHint') : t('conn.guide.s3.fact.virtualHostedHint'),\n    },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex]',\n            'type = s3',\n            'provider = Other',\n            `endpoint = ${endpoint}`,\n            `access_key_id = ${akid}`,\n            `secret_access_key = ${secret}`,\n            'region = us-east-1',\n            ...(pathStyle ? ['force_path_style = true'] : []),\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.rclone.useCaption'),\n          code: [\n            'rclone lsd filex:',\n            `rclone copy ./local filex:${bucket}/backup -P`,\n            `rclone sync ./local filex:${bucket}/backup`,\n            `rclone mount filex:${bucket} /mnt/filex`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.rclone.mtime') },\n      ],\n    },\n    {\n      id: 'awscli',\n      name: 'AWS CLI',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.aws.configureCaption'),\n          code: [\n            'aws configure set aws_access_key_id ' + akid,\n            'aws configure set aws_secret_access_key ' + secret,\n            'aws configure set region us-east-1',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.aws.useCaption'),\n          code: [\n            `aws --endpoint-url ${endpoint} s3 ls`,\n            `aws --endpoint-url ${endpoint} s3 cp ./file.pdf s3://${bucket}/file.pdf`,\n            `aws --endpoint-url ${endpoint} s3 sync ./local s3://${bucket}/backup`,\n            `aws --endpoint-url ${endpoint} s3 presign s3://${bucket}/file.pdf --expires-in 300`,\n          ].join('\\n'),\n        },\n        ...(pathStyle\n          ? [\n              {\n                kind: 'note' as GuideBlockKind,\n                text: t('conn.guide.s3.aws.pathStyle'),\n              },\n              {\n                kind: 'code' as GuideBlockKind,\n                caption: '~/.aws/config',\n                code: ['[default]', 's3 =', '    addressing_style = path'].join('\\n'),\n              },\n            ]\n          : []),\n      ],\n    },\n    {\n      id: 'restic',\n      name: 'restic',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.restic.envCaption'),\n          code: [\n            `export AWS_ACCESS_KEY_ID=${akid}`,\n            `export AWS_SECRET_ACCESS_KEY=${secret}`,\n            `export RESTIC_REPOSITORY=\"s3:${endpoint}/${bucket}/restic\"`,\n            'export RESTIC_PASSWORD=…',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.restic.useCaption'),\n          code: [\n            `restic init${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic backup ~/Documents${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic check --read-data${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n            `restic forget --keep-daily 7 --prune${pathStyle ? ' -o s3.bucket-lookup=path' : ''}`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.restic.verified') },\n      ],\n    },\n    {\n      id: 'mc',\n      name: 'MinIO Client (mc)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.mc.aliasCaption'),\n          code: `mc alias set filex ${endpoint} ${akid} ${secret} --api S3v4${pathStyle ? ' --path on' : ''}`,\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.mc.useCaption'),\n          code: [\n            'mc ls filex',\n            `mc cp ./file.pdf filex/${bucket}/file.pdf`,\n            `mc mirror ./local filex/${bucket}/backup`,\n            `mc du filex/${bucket}`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 's3fs',\n      name: 's3fs (Linux / macOS)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.s3fs.credsCaption'),\n          code: [\n            `echo \"${akid}:${secret}\" > ~/.passwd-s3fs`,\n            'chmod 600 ~/.passwd-s3fs',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.s3.s3fs.mountCaption'),\n          code: [\n            `s3fs ${bucket} /mnt/filex \\\\`,\n            '  -o passwd_file=~/.passwd-s3fs \\\\',\n            `  -o url=${endpoint} \\\\`,\n            ...(pathStyle ? ['  -o use_path_request_style'] : []),\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.s3fs.note') },\n      ],\n    },\n    {\n      id: 'cyberduck',\n      name: 'Cyberduck / Mountain Duck',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.s3.duck.s1'),\n            t('conn.guide.s3.duck.s2', { host }),\n            t('conn.guide.s3.duck.s3', { key: akid }),\n            t('conn.guide.s3.duck.s4'),\n          ],\n        },\n        ...(pathStyle ? [{ kind: 'warn' as GuideBlockKind, text: t('conn.guide.s3.duck.pathStyle') }] : []),\n      ],\n    },\n    {\n      id: 'sdk',\n      name: 'SDK (Go / Python / JS)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: 'boto3',\n          code: [\n            'import boto3',\n            's3 = boto3.client(',\n            '    \"s3\",',\n            `    endpoint_url=\"${endpoint}\",`,\n            `    aws_access_key_id=\"${akid}\",`,\n            `    aws_secret_access_key=\"${secret}\",`,\n            '    region_name=\"us-east-1\",',\n            ...(pathStyle\n              ? [\n                  '    config=boto3.session.Config(s3={\"addressing_style\": \"path\"}),',\n                ]\n              : []),\n            ')',\n            `print([o[\"Key\"] for o in s3.list_objects_v2(Bucket=\"${bucket}\").get(\"Contents\", [])])`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.s3.sdk.note') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.s3.note.buckets') },\n    { kind: 'note', text: t('conn.guide.s3.note.permissions') },\n    { kind: 'note', text: t('conn.guide.s3.note.trash') },\n    { kind: 'note', text: t('conn.guide.s3.note.mtime') },\n  ];\n\n  if (pathStyle) {\n    // First, because it is the one setting that makes a current SDK fail with\n    // a DNS error that names neither filex nor the cause.\n    notes.unshift({ kind: 'warn', text: t('conn.guide.s3.note.pathStyle') });\n  }\n  if (isPlainHttp(endpoint)) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.s3.note.http') });\n  }\n\n  return {\n    id: 's3',\n    name: 'S3',\n    summary: t('conn.guide.s3.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// SFTP\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with OpenSSH\n * 9.6 and rclone 1.73 — including the two settings rclone needs because filex\n * has no shell, which are the difference between a clean run and a pile of\n * warnings about a missing `md5sum`.\n */\nexport const buildSftpGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.sftpHost || hostOf(ctx.origin);\n  const port = ctx.sftpPort || 2022;\n  const user = ctx.sftpLogin || userOf(ctx, t);\n  const target = ctx.storage ? `/${ctx.storage}` : '/<storage>';\n  const portFlag = port === 22 ? '' : ` -P ${port}`;\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.sftp.fact.host'), value: host, hint: t('conn.guide.sftp.fact.hostHint') },\n    { label: t('conn.guide.sftp.fact.port'), value: String(port), hint: t('conn.guide.sftp.fact.portHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.sftp.fact.userHint') },\n    {\n      label: t('conn.guide.sftp.fact.auth'),\n      value: ctx.sftpHasKey ? t('conn.guide.sftp.fact.authKey') : t('conn.guide.sftp.fact.authPassword'),\n      hint: t('conn.guide.sftp.fact.authHint'),\n      placeholderOnly: true,\n    },\n    { label: t('conn.guide.sftp.fact.path'), value: target, hint: t('conn.guide.sftp.fact.pathHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'openssh',\n      name: 'OpenSSH (sftp / scp)',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.openssh.connectCaption'),\n          code: [\n            `sftp${portFlag} ${user}@${host}`,\n            `scp${portFlag} ./report.pdf ${user}@${host}:${target}/report.pdf`,\n            `scp${portFlag} ${user}@${host}:${target}/report.pdf ./`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: '~/.ssh/config',\n          code: [\n            'Host filex',\n            `  HostName ${host}`,\n            `  Port ${port}`,\n            `  User ${user}`,\n            '  # IdentityFile ~/.ssh/id_ed25519',\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.sftp.openssh.noShell') },\n      ],\n    },\n    {\n      id: 'key',\n      name: t('conn.guide.sftp.key.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.key.s1'),\n            t('conn.guide.sftp.key.s2'),\n            t('conn.guide.sftp.key.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.key.genCaption'),\n          code: ['ssh-keygen -t ed25519 -C \"filex\"', 'cat ~/.ssh/id_ed25519.pub'].join('\\n'),\n        },\n        // ⚠ The one command people reach for, and the one that cannot work.\n        { kind: 'warn', text: t('conn.guide.sftp.key.noCopyId') },\n      ],\n    },\n    {\n      id: 'winscp',\n      name: 'WinSCP',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.winscp.s1'),\n            t('conn.guide.sftp.winscp.s2', { host, port: String(port) }),\n            t('conn.guide.sftp.winscp.s3', { user }),\n            t('conn.guide.sftp.winscp.s4'),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'filezilla',\n      name: 'FileZilla',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.sftp.filezilla.s1'),\n            t('conn.guide.sftp.filezilla.s2', { host: `sftp://${host}`, port: String(port) }),\n            t('conn.guide.sftp.filezilla.s3', { user }),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex-sftp]',\n            'type = sftp',\n            `host = ${host}`,\n            `port = ${port}`,\n            `user = ${user}`,\n            'key_file = ~/.ssh/id_ed25519',\n            '# filex has no shell, so tell rclone not to look for one:',\n            'shell_type = none',\n            'md5sum_command = none',\n            'sha1sum_command = none',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.rclone.useCaption'),\n          code: [\n            'rclone lsd filex-sftp:',\n            `rclone copy ./local filex-sftp:${target}/backup -P`,\n            `rclone sync ./local filex-sftp:${target}/backup`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'sshfs',\n      name: 'sshfs (Linux / macOS)',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.sftp.sshfs.mountCaption'),\n          code: [\n            `sshfs -p ${port} ${user}@${host}:${target} /mnt/filex`,\n            'fusermount -u /mnt/filex',\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.sftp.sshfs.note') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.sftp.note.storages') },\n    { kind: 'note', text: t('conn.guide.sftp.note.permissions') },\n    { kind: 'note', text: t('conn.guide.sftp.note.trash') },\n    { kind: 'note', text: t('conn.guide.sftp.note.totp') },\n  ];\n  if (ctx.sftpEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.sftp.note.disabled') });\n  }\n\n  return {\n    id: 'sftp',\n    name: 'SFTP',\n    summary: t('conn.guide.sftp.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// FTPS\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with curl\n * 8.5, lftp 4.9 and rclone 1.73 — including the settings each of them needs to\n * negotiate explicit TLS, which is the half of FTPS that goes wrong quietly.\n */\nexport const buildFtpsGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.ftpsHost || hostOf(ctx.origin);\n  const port = ctx.ftpsPort || 2121;\n  const user = ctx.sftpLogin || userOf(ctx, t);\n  const secret = t('conn.guide.secretPlaceholder');\n  const target = ctx.storage ? `/${ctx.storage}` : '/<storage>';\n  const pasv =\n    ctx.ftpsPasvMin && ctx.ftpsPasvMax ? `${ctx.ftpsPasvMin}-${ctx.ftpsPasvMax}` : '30000-30100';\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.ftps.fact.host'), value: host, hint: t('conn.guide.ftps.fact.hostHint') },\n    { label: t('conn.guide.ftps.fact.port'), value: String(port), hint: t('conn.guide.ftps.fact.portHint') },\n    { label: t('conn.guide.ftps.fact.mode'), value: t('conn.guide.ftps.fact.modeValue'), hint: t('conn.guide.ftps.fact.modeHint') },\n    { label: t('conn.guide.fact.user'), value: user, hint: t('conn.guide.ftps.fact.userHint') },\n    { label: t('conn.guide.fact.password'), value: secret, hint: t('conn.guide.ftps.fact.passwordHint'), placeholderOnly: true },\n    { label: t('conn.guide.ftps.fact.pasv'), value: pasv, hint: t('conn.guide.ftps.fact.pasvHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'filezilla',\n      name: 'FileZilla',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.filezilla.s1'),\n            t('conn.guide.ftps.filezilla.s2', { host, port: String(port) }),\n            t('conn.guide.ftps.filezilla.s3', { user }),\n            t('conn.guide.ftps.filezilla.s4'),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'winscp',\n      name: 'WinSCP',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.winscp.s1'),\n            t('conn.guide.ftps.winscp.s2', { host, port: String(port) }),\n            t('conn.guide.ftps.winscp.s3', { user }),\n          ],\n        },\n      ],\n    },\n    {\n      id: 'curl',\n      name: 'curl',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.curl.caption'),\n          code: [\n            `curl --ssl-reqd --ftp-pasv --user ${user} \\\\`,\n            `  -T ./report.pdf \"ftp://${host}:${port}${target}/report.pdf\"`,\n            '',\n            `curl --ssl-reqd --ftp-pasv --user ${user} \\\\`,\n            `  -o ./report.pdf \"ftp://${host}:${port}${target}/report.pdf\"`,\n          ].join('\\n'),\n        },\n        // ⚠ The flag that matters. Without it curl will happily fall back to\n        // plaintext against a server that allows it — this one does not, but\n        // the habit is what protects you against the ones that do.\n        { kind: 'note', text: t('conn.guide.ftps.curl.sslReqd') },\n      ],\n    },\n    {\n      id: 'lftp',\n      name: 'lftp',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.lftprc',\n          code: [\n            'set ftp:ssl-force true',\n            'set ftp:ssl-protect-data true',\n            'set ftp:passive-mode true',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.lftp.caption'),\n          code: [\n            `lftp -u ${user} ftp://${host}:${port}`,\n            `# then: cd ${target}; put ./report.pdf; ls`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.ftps.lftp.protectData') },\n      ],\n    },\n    {\n      id: 'rclone',\n      name: 'rclone',\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'code',\n          caption: '~/.config/rclone/rclone.conf',\n          code: [\n            '[filex-ftp]',\n            'type = ftp',\n            `host = ${host}`,\n            `port = ${port}`,\n            `user = ${user}`,\n            '# rclone obscure \"<your password>\"',\n            'pass = …',\n            'explicit_tls = true',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.ftps.rclone.useCaption'),\n          code: [\n            'rclone lsd filex-ftp:',\n            `rclone copy ./local filex-ftp:${target}/backup -P`,\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'printer',\n      name: t('conn.guide.ftps.printer.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.ftps.printer.s1', { host, port: String(port) }),\n            t('conn.guide.ftps.printer.s2', { user }),\n            t('conn.guide.ftps.printer.s3', { path: target }),\n            t('conn.guide.ftps.printer.s4'),\n          ],\n        },\n        // ⚠ The honest warning: plenty of scan-to-FTP firmware cannot do TLS\n        // at all, and this endpoint will not talk to it. Saying so beats an\n        // afternoon spent debugging a device that was never going to connect.\n        { kind: 'warn', text: t('conn.guide.ftps.printer.noTLS') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'warn', text: t('conn.guide.ftps.note.tls') },\n    { kind: 'note', text: t('conn.guide.ftps.note.passive') },\n    { kind: 'note', text: t('conn.guide.ftps.note.storages') },\n    { kind: 'note', text: t('conn.guide.ftps.note.trash') },\n    { kind: 'note', text: t('conn.guide.ftps.note.prefer') },\n  ];\n  if (ctx.ftpsSelfSigned) {\n    notes.push({ kind: 'warn', text: t('conn.guide.ftps.note.selfSigned') });\n  }\n  if (ctx.ftpsEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.ftps.note.disabled') });\n  }\n\n  return {\n    id: 'ftps',\n    name: 'FTPS',\n    summary: t('conn.guide.ftps.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// NFS\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Every command here was RUN against the endpoint on 2026-08-16 with the LINUX\n * KERNEL's own NFSv3 client — including the two options a mount fails silently\n * without (`port=` and `mountport=`, because filex serves both on one port and\n * runs no portmapper).\n */\nexport const buildNfsGuide: GuideBuilder = (ctx, t) => {\n  const host = ctx.nfsHost || hostOf(ctx.origin);\n  const port = ctx.nfsPort || 2049;\n  const path = ctx.nfsPath || t('conn.guide.nfs.pathPlaceholder');\n  const ro = ctx.nfsReadOnly ? ',ro' : '';\n  const opts = `nfsvers=3,tcp,port=${port},mountport=${port},nolock${ro}`;\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.nfs.fact.host'), value: host, hint: t('conn.guide.nfs.fact.hostHint') },\n    { label: t('conn.guide.nfs.fact.port'), value: String(port), hint: t('conn.guide.nfs.fact.portHint') },\n    {\n      label: t('conn.guide.nfs.fact.export'),\n      value: path,\n      hint: t('conn.guide.nfs.fact.exportHint'),\n      // ⚠ Only real right after minting: the path is stored hashed and cannot\n      // be shown again, and printing something path-shaped would produce a\n      // mount line that fails with no clue why.\n      placeholderOnly: !ctx.nfsPath,\n    },\n    { label: t('conn.guide.nfs.fact.options'), value: opts, hint: t('conn.guide.nfs.fact.optionsHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'linux',\n      name: 'Linux',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.linux.mountCaption'),\n          code: [\n            'sudo mkdir -p /mnt/filex',\n            `sudo mount -t nfs -o ${opts} ${host}:${path} /mnt/filex`,\n            '',\n            '# and to unmount:',\n            'sudo umount /mnt/filex',\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: '/etc/fstab',\n          code: `${host}:${path}  /mnt/filex  nfs  ${opts},_netdev,noauto,x-systemd.automount  0  0`,\n        },\n        // ⚠ The warning that belongs next to the fstab line rather than in a\n        // document: that file is world-readable on most systems.\n        { kind: 'warn', text: t('conn.guide.nfs.linux.fstabSecret') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS',\n      platform: 'macos',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.mac.mountCaption'),\n          code: [\n            'sudo mkdir -p /Volumes/filex',\n            `sudo mount -t nfs -o vers=3,tcp,port=${port},mountport=${port},nolock${ro},resvport ${host}:${path} /Volumes/filex`,\n          ].join('\\n'),\n        },\n        { kind: 'note', text: t('conn.guide.nfs.mac.resvport') },\n      ],\n    },\n    {\n      id: 'windows',\n      name: 'Windows (Client for NFS)',\n      platform: 'windows',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.nfs.win.s1'),\n            t('conn.guide.nfs.win.s2'),\n            t('conn.guide.nfs.win.s3'),\n          ],\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.nfs.win.cmdCaption'),\n          code: `mount -o anon nolock ${host}:${path} Z:`,\n        },\n        // ⚠ Windows' client has no way to say \"the mount service is on this\n        // port\", so it only works when filex is on 2049.\n        { kind: 'warn', text: t('conn.guide.nfs.win.port') },\n      ],\n    },\n    {\n      id: 'synology',\n      name: t('conn.guide.nfs.nas.tab'),\n      platform: 'any',\n      blocks: [\n        {\n          kind: 'steps',\n          steps: [\n            t('conn.guide.nfs.nas.s1', { host, port: String(port) }),\n            t('conn.guide.nfs.nas.s2'),\n            t('conn.guide.nfs.nas.s3'),\n          ],\n        },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'warn', text: t('conn.guide.nfs.note.unencrypted') },\n    { kind: 'warn', text: t('conn.guide.nfs.note.pathIsSecret') },\n    { kind: 'note', text: t('conn.guide.nfs.note.noPortmapper') },\n    { kind: 'note', text: t('conn.guide.nfs.note.uid') },\n    { kind: 'note', text: t('conn.guide.nfs.note.trash') },\n    { kind: 'note', text: t('conn.guide.nfs.note.revoke') },\n  ];\n  if (ctx.nfsEnabled === false) {\n    notes.unshift({ kind: 'warn', text: t('conn.guide.nfs.note.disabled') });\n  }\n\n  return {\n    id: 'nfs',\n    name: 'NFS',\n    summary: t('conn.guide.nfs.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n\n// ─────────────────────────────────────────────────────────────────────\n// filex mount (FUSE)\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * `filex mount` is the odd one out here: there is no server to point a\n * third-party client at, because filex's OWN binary is the client. It speaks\n * the REST API over the same HTTPS the browser uses, which is what makes it\n * the only one of these that works from anywhere — NFS needs a LAN, SFTP needs\n * sshfs or WinFsp already configured, and this needs a URL and a token.\n *\n * ⚠ It is not a sync. Nothing is copied except a bounded read cache, so it\n * opens one file out of a hundred thousand without downloading the rest;\n * `filex sync` is still the answer for having the files offline. The guide says\n * so, because somebody who picks the wrong one finds out slowly.\n */\nexport const buildMountGuide: GuideBuilder = (ctx, t) => {\n  const origin = ctx.origin.replace(/\\/+$/, '');\n  const storage = ctx.storage || ctx.storages[0] || 'main';\n\n  const facts: GuideFact[] = [\n    { label: t('conn.guide.mount.fact.url'), value: origin, hint: t('conn.guide.mount.fact.urlHint') },\n    {\n      label: t('conn.guide.mount.fact.token'),\n      value: t('conn.guide.mount.fact.tokenPlaceholder'),\n      hint: t('conn.guide.mount.fact.tokenHint'),\n      // filex never has the plaintext of a token after it is minted, and a\n      // fact row that looked like one would be a lie the user pastes.\n      placeholderOnly: true,\n    },\n    { label: t('conn.guide.mount.fact.remote'), value: `${storage}://`, hint: t('conn.guide.mount.fact.remoteHint') },\n  ];\n\n  const clients: GuideClient[] = [\n    {\n      id: 'linux',\n      name: 'Linux',\n      platform: 'linux',\n      blocks: [\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.mountCaption'),\n          code: [\n            `export FILEX_URL=${origin}`,\n            'export FILEX_TOKEN=<token>',\n            '',\n            'mkdir -p ~/filex',\n            'filex mount ~/filex',\n            '',\n            `# one storage only, or a subfolder of it:`,\n            `filex mount --remote '${storage}://' ~/filex`,\n            `filex mount --remote '${storage}://projects/acme' --read-only ~/acme`,\n          ].join('\\n'),\n        },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.umountCaption'),\n          code: 'fusermount -u ~/filex',\n        },\n        // ⚠ The one that costs an afternoon if it is not said: killing the\n        // process leaves a directory where every `ls` hangs.\n        { kind: 'warn', text: t('conn.guide.mount.linux.umountWarn') },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.linux.systemdCaption'),\n          code: [\n            '# ~/.config/systemd/user/filex-mount.service',\n            '[Unit]',\n            'Description=filex mount',\n            'After=network-online.target',\n            '',\n            '[Service]',\n            `Environment=FILEX_URL=${origin}`,\n            'Environment=FILEX_TOKEN=<token>',\n            'ExecStart=%h/.local/bin/filex mount %h/filex',\n            'ExecStop=/bin/fusermount -u %h/filex',\n            'Restart=on-failure',\n            '',\n            '[Install]',\n            'WantedBy=default.target',\n          ].join('\\n'),\n        },\n      ],\n    },\n    {\n      id: 'windows',\n      name: 'Windows',\n      platform: 'windows',\n      blocks: [\n        { kind: 'note', text: t('conn.guide.mount.win.winfsp') },\n        {\n          kind: 'code',\n          caption: t('conn.guide.mount.win.mountCaption'),\n          code: [\n            `$env:FILEX_URL   = \"${origin}\"`,\n            '$env:FILEX_TOKEN = \"<token>\"',\n            '',\n            'filex mount Z:',\n          ].join('\\n'),\n        },\n        // ⚠ The drive letter is CREATED, not reused — pointing it at one that\n        // already exists is the commonest way this fails, and the message the\n        // driver gives for it says nothing useful.\n        { kind: 'warn', text: t('conn.guide.mount.win.freeLetter') },\n        { kind: 'note', text: t('conn.guide.mount.win.stop') },\n      ],\n    },\n    {\n      id: 'macos',\n      name: 'macOS',\n      platform: 'macos',\n      blocks: [\n        // ⚠⚠ A refusal stated up front rather than discovered. macFUSE's Go\n        // binding needs a C toolchain filex deliberately does not use, and its\n        // licence forbids a commercial program from installing it. Pretending\n        // otherwise would mean a command that appears to work and does nothing.\n        { kind: 'warn', text: t('conn.guide.mount.mac.unsupported') },\n        { kind: 'note', text: t('conn.guide.mount.mac.alternatives') },\n      ],\n    },\n  ];\n\n  const notes: GuideBlock[] = [\n    { kind: 'note', text: t('conn.guide.mount.note.notASync') },\n    { kind: 'note', text: t('conn.guide.mount.note.reachable') },\n    { kind: 'note', text: t('conn.guide.mount.note.wholeFileWrites') },\n    { kind: 'note', text: t('conn.guide.mount.note.trash') },\n    { kind: 'note', text: t('conn.guide.mount.note.revoke') },\n  ];\n\n  return {\n    id: 'mount',\n    name: 'filex mount',\n    summary: t('conn.guide.mount.summary'),\n    facts,\n    clients,\n    notes,\n  };\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Registry\n// ─────────────────────────────────────────────────────────────────────\n\n/**\n * Protocol id → builder.\n *\n * S3 and SFTP land here as one entry each once their servers exist; the\n * panel, the copy buttons, the client tabs and the i18n plumbing are\n * already written for them. That is the whole point of the shape.\n */\nexport const GUIDE_BUILDERS: Record<string, GuideBuilder> = {\n  webdav: buildWebdavGuide,\n  s3: buildS3Guide,\n  sftp: buildSftpGuide,\n  ftps: buildFtpsGuide,\n  nfs: buildNfsGuide,\n  mount: buildMountGuide,\n};\n\n/**\n * Display name per protocol id.\n *\n * ⚠ Not `id.toUpperCase()`, which the picker used to do. That reads fine for\n * S3 and NFS and turns `filex mount` into \"MOUNT\" — a name for a thing that is\n * not a protocol at all, in a list where every other entry is one.\n */\nexport const GUIDE_NAMES: Record<string, string> = {\n  webdav: 'WebDAV',\n  s3: 'S3',\n  sftp: 'SFTP',\n  ftps: 'FTPS',\n  nfs: 'NFS',\n  mount: 'filex mount',\n};\n\n/** The label to show for a protocol id in a picker. */\nexport function guideName(id: string): string {\n  return GUIDE_NAMES[id] || id.toUpperCase();\n}\n\n/** Protocol ids that have a guide, in display order. */\nexport function guideProtocols(): string[] {\n  return Object.keys(GUIDE_BUILDERS);\n}\n\nexport function buildGuide(\n  protocol: string,\n  ctx: GuideContext,\n  t: Translate,\n): ProtocolGuide | null {\n  const builder = GUIDE_BUILDERS[protocol];\n  return builder ? builder(ctx, t) : null;\n}\n","<script setup lang=\"ts\">\n/**\n * StorageFields — a driver's config form, rendered from the driver's own\n * descriptor (`GET /api/admin/storage-drivers`) and from nothing else.\n *\n * ⚠ There is no per-driver template here and there must never be one. The\n * form this replaces on the web was a `v-if` chain that drifted away from\n * the backend it posted to — it asked for `base_path` where the driver read\n * `root` and never offered the s3 `prefix` at all, so three of the four\n * drivers it offered answered 400 ROOT_PATH_FORBIDDEN on every submit. The\n * descriptor fixes the class; a hand-written form re-opens it.\n *\n * It lives in the shared package so the desktop app and the web app render\n * the same fields, in the same order, with the same help text, from the\n * same declaration — which is the only way \"the same form on every surface\"\n * survives the next driver.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { StorageField, StorageFieldOption } from '../types/Connections';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  fields: StorageField[];\n  modelValue: Record<string, unknown>;\n  locale: LocaleCode;\n  /** Keys to mark as failing validation (missing required). */\n  invalid?: string[];\n  disabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:modelValue', v: Record<string, unknown>): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst showAdvanced = ref(false);\nconst revealed = ref<Record<string, boolean>>({});\n\nconst basic = computed(() => props.fields.filter((f) => !f.advanced));\nconst advanced = computed(() => props.fields.filter((f) => f.advanced));\n\n/**\n * Translation first, the driver's English fallback second.\n *\n * A driver shipped after this bundle carries labels the catalogue has never\n * heard of. Falling back to the descriptor's own English is how the field\n * still reads as a field instead of as `storages.fields.something`.\n */\nfunction label(f: StorageField): string {\n  const s = t(f.i18n_key);\n  return s === f.i18n_key ? f.label : s;\n}\n\nfunction help(f: StorageField): string {\n  if (!f.help_i18n_key) return f.help ?? '';\n  const s = t(f.help_i18n_key);\n  return s === f.help_i18n_key ? (f.help ?? '') : s;\n}\n\nfunction optionLabel(o: StorageFieldOption): string {\n  if (!o.i18n_key) return o.label;\n  const s = t(o.i18n_key);\n  return s === o.i18n_key ? o.label : s;\n}\n\nfunction set(key: string, value: unknown) {\n  emit('update:modelValue', { ...props.modelValue, [key]: value });\n}\n\n/** Current value, honouring the legacy spellings the driver still reads —\n *  an old row keyed `base_path` shows up in the `root` box rather than as\n *  an empty field the operator would refill by hand. */\nfunction raw(f: StorageField): unknown {\n  const v = props.modelValue?.[f.key];\n  if (v !== undefined && v !== null) return v;\n  for (const alias of f.aliases ?? []) {\n    const a = props.modelValue?.[alias];\n    if (a !== undefined && a !== null) return a;\n  }\n  return f.default ?? undefined;\n}\n\nfunction str(f: StorageField): string {\n  const v = raw(f);\n  return v === undefined || v === null ? '' : String(v);\n}\n\nfunction num(f: StorageField): string {\n  const v = raw(f);\n  return v === '' || v === undefined || v === null ? '' : String(v);\n}\n\nfunction bool(f: StorageField): boolean {\n  return raw(f) === true;\n}\n\nfunction isInvalid(f: StorageField): boolean {\n  return (props.invalid ?? []).includes(f.key);\n}\n\nfunction inputType(f: StorageField): string {\n  if (f.type === 'int') return 'number';\n  if (f.type === 'password' && !revealed.value[f.key]) return 'password';\n  return 'text';\n}\n\nfunction toggleReveal(key: string) {\n  revealed.value = { ...revealed.value, [key]: !revealed.value[key] };\n}\n</script>\n\n<template>\n  <div class=\"fe-cfield\">\n    <p v-if=\"!fields.length\" class=\"fe-cfield__empty\">{{ t('conn.form.noFields') }}</p>\n\n    <template v-for=\"f in basic\" :key=\"f.key\">\n      <div class=\"fe-cfield__row\" :class=\"{ 'is-invalid': isInvalid(f) }\">\n        <!-- bool: the label belongs next to the box, not above it -->\n        <label v-if=\"f.type === 'bool'\" class=\"fe-cfield__check\">\n          <input\n            type=\"checkbox\"\n            :checked=\"bool(f)\"\n            :disabled=\"disabled\"\n            @change=\"set(f.key, ($event.target as HTMLInputElement).checked)\"\n          />\n          <span>{{ label(f) }}</span>\n        </label>\n        <label v-else class=\"fe-cfield__label\" :for=\"`fe-cf-${f.key}`\">\n          {{ label(f) }}<span v-if=\"f.required\" class=\"fe-cfield__req\" aria-hidden=\"true\">*</span>\n        </label>\n\n        <select\n          v-if=\"f.type === 'select'\"\n          :id=\"`fe-cf-${f.key}`\"\n          class=\"fe-cfield__input\"\n          :value=\"str(f)\"\n          :disabled=\"disabled\"\n          @change=\"set(f.key, ($event.target as HTMLSelectElement).value)\"\n        >\n          <option v-for=\"o in f.options ?? []\" :key=\"o.value\" :value=\"o.value\">\n            {{ optionLabel(o) }}\n          </option>\n        </select>\n\n        <textarea\n          v-else-if=\"f.multiline\"\n          :id=\"`fe-cf-${f.key}`\"\n          class=\"fe-cfield__input fe-cfield__input--area\"\n          :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n          rows=\"4\"\n          :value=\"str(f)\"\n          :placeholder=\"f.placeholder\"\n          :disabled=\"disabled\"\n          @input=\"set(f.key, ($event.target as HTMLTextAreaElement).value)\"\n        ></textarea>\n\n        <div v-else-if=\"f.type === 'password'\" class=\"fe-cfield__secret\">\n          <input\n            :id=\"`fe-cf-${f.key}`\"\n            class=\"fe-cfield__input fe-cfield__input--mono\"\n            :type=\"inputType(f)\"\n            autocomplete=\"new-password\"\n            spellcheck=\"false\"\n            :value=\"str(f)\"\n            :placeholder=\"f.placeholder\"\n            :disabled=\"disabled\"\n            @input=\"set(f.key, ($event.target as HTMLInputElement).value)\"\n          />\n          <button\n            type=\"button\"\n            class=\"fe-cfield__eye\"\n            :title=\"revealed[f.key] ? t('conn.form.hide') : t('conn.form.reveal')\"\n            :aria-label=\"revealed[f.key] ? t('conn.form.hide') : t('conn.form.reveal')\"\n            @click=\"toggleReveal(f.key)\"\n          >\n            <!-- ikon:emoji — the two states of a secret field. 👁/🙈 were a\n                 hairline dingbat beside a full-colour monkey, i.e. two\n                 different fonts for one toggle; these are the same eye the\n                 context menu's Preview row uses, with and without its slash.\n                 The state is named on the button (title + aria-label). -->\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n            <span\n              aria-hidden=\"true\"\n              v-html=\"actionIconSvg(revealed[f.key] ? 'toggle-hidden' : 'preview')\"\n            ></span>\n          </button>\n        </div>\n\n        <input\n          v-else-if=\"f.type !== 'bool'\"\n          :id=\"`fe-cf-${f.key}`\"\n          class=\"fe-cfield__input\"\n          :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n          :type=\"inputType(f)\"\n          :value=\"f.type === 'int' ? num(f) : str(f)\"\n          :placeholder=\"f.placeholder\"\n          :min=\"f.min\"\n          :max=\"f.max\"\n          :disabled=\"disabled\"\n          @input=\"\n            set(\n              f.key,\n              f.type === 'int'\n                ? ($event.target as HTMLInputElement).value === ''\n                  ? null\n                  : Number(($event.target as HTMLInputElement).value)\n                : ($event.target as HTMLInputElement).value,\n            )\n          \"\n        />\n\n        <p v-if=\"help(f)\" class=\"fe-cfield__help\">{{ help(f) }}</p>\n        <p v-if=\"isInvalid(f)\" class=\"fe-cfield__error\">{{ t('conn.form.required') }}</p>\n      </div>\n    </template>\n\n    <div v-if=\"advanced.length\" class=\"fe-cfield__adv\">\n      <button type=\"button\" class=\"fe-cfield__advtoggle\" @click=\"showAdvanced = !showAdvanced\">\n        {{ showAdvanced ? '▾' : '▸' }} {{ t('conn.form.advanced') }}\n      </button>\n      <div v-if=\"showAdvanced\" class=\"fe-cfield__advbody\">\n        <div v-for=\"f in advanced\" :key=\"f.key\" class=\"fe-cfield__row\">\n          <label v-if=\"f.type === 'bool'\" class=\"fe-cfield__check\">\n            <input\n              type=\"checkbox\"\n              :checked=\"bool(f)\"\n              :disabled=\"disabled\"\n              @change=\"set(f.key, ($event.target as HTMLInputElement).checked)\"\n            />\n            <span>{{ label(f) }}</span>\n          </label>\n          <template v-else>\n            <label class=\"fe-cfield__label\" :for=\"`fe-cfa-${f.key}`\">{{ label(f) }}</label>\n            <input\n              :id=\"`fe-cfa-${f.key}`\"\n              class=\"fe-cfield__input\"\n              :class=\"{ 'fe-cfield__input--mono': f.monospace }\"\n              :type=\"inputType(f)\"\n              :value=\"f.type === 'int' ? num(f) : str(f)\"\n              :placeholder=\"f.placeholder\"\n              :disabled=\"disabled\"\n              @input=\"\n                set(\n                  f.key,\n                  f.type === 'int'\n                    ? ($event.target as HTMLInputElement).value === ''\n                      ? null\n                      : Number(($event.target as HTMLInputElement).value)\n                    : ($event.target as HTMLInputElement).value,\n                )\n              \"\n            />\n          </template>\n          <p v-if=\"help(f)\" class=\"fe-cfield__help\">{{ help(f) }}</p>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n.fe-cfield {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n}\n.fe-cfield__empty {\n  margin: 0;\n  color: var(--fe-text-muted);\n  font-size: 13px;\n}\n.fe-cfield__row {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n.fe-cfield__label {\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--fe-text);\n}\n.fe-cfield__req {\n  color: var(--fe-danger);\n  margin-left: 3px;\n}\n.fe-cfield__input {\n  font: inherit;\n  font-size: 13.5px;\n  padding: 8px 10px;\n  border-radius: var(--fe-radius);\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  width: 100%;\n  /* ⚠ Explicit, because the host's own form styling reaches in here\n     (shadowRoot: false). The desktop shell sets `input[type=\"text\"]\n     { min-width: 260px }` for its settings rows; inherited, that floors\n     every field in this form and overflows a narrow embed. */\n  min-width: 0;\n  box-sizing: border-box;\n}\n.fe-cfield__input:focus {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: -1px;\n}\n.fe-cfield__input--mono {\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n}\n.fe-cfield__input--area {\n  resize: vertical;\n}\n.fe-cfield__row.is-invalid .fe-cfield__input {\n  border-color: var(--fe-danger);\n}\n.fe-cfield__secret {\n  display: flex;\n  gap: 6px;\n  align-items: stretch;\n}\n.fe-cfield__eye {\n  flex: 0 0 auto;\n  /* ikon:emoji — it holds an SVG now, not a 👁, so it centres the box\n     instead of a text baseline. */\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg-elev);\n  color: var(--fe-text);\n  border-radius: var(--fe-radius);\n  padding: 0 10px;\n  cursor: pointer;\n  font-size: 14px;\n}\n.fe-cfield__eye .fe-aicon {\n  color: currentColor;\n}\n.fe-cfield__check {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13.5px;\n  color: var(--fe-text);\n  cursor: pointer;\n}\n.fe-cfield__help {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n  line-height: 1.45;\n}\n.fe-cfield__error {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-danger);\n}\n.fe-cfield__advtoggle {\n  border: 0;\n  background: none;\n  color: var(--fe-text-muted);\n  font: inherit;\n  font-size: 12.5px;\n  font-weight: 600;\n  cursor: pointer;\n  padding: 2px 0;\n}\n.fe-cfield__advtoggle:hover {\n  color: var(--fe-text);\n}\n.fe-cfield__advbody {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  margin-top: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ConnectionGuideView — renders one `ProtocolGuide`.\n *\n * The guide itself is generated from the live deployment\n * (`lib/connectionGuides.ts`); this component only draws it. Keeping the\n * two apart is what lets S3 and SFTP arrive as a builder each rather than\n * as a second page with its own copy buttons and its own bugs.\n */\nimport { computed, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { GuideBlock, ProtocolGuide } from '../lib/connectionGuides';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  guide: ProtocolGuide;\n  locale: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst activeClient = ref<string>(props.guide.clients[0]?.id ?? '');\nconst copied = ref<string | null>(null);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst client = computed(\n  () => props.guide.clients.find((c) => c.id === activeClient.value) ?? props.guide.clients[0],\n);\n\n/**\n * Copy, with a fallback.\n *\n * `navigator.clipboard` needs a secure context. The desktop app's `app://`\n * scheme is registered secure, and the web app is on https — but an embed\n * on plain http is a real deployment too, and a copy button that silently\n * does nothing there is worse than no button.\n */\nasync function copy(text: string, id: string) {\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  copied.value = ok ? id : null;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => {\n    copied.value = null;\n  }, 1600);\n}\n\nfunction blockId(prefix: string, i: number): string {\n  return `${prefix}-${i}`;\n}\n\nfunction isCode(b: GuideBlock): boolean {\n  return b.kind === 'code';\n}\n</script>\n\n<template>\n  <div class=\"fe-guide\">\n    <p class=\"fe-guide__summary\">{{ guide.summary }}</p>\n\n    <!-- The facts. This is the part that makes the page worth generating:\n         the real host, the real storage, the caller's own username. -->\n    <section class=\"fe-guide__facts\" data-testid=\"guide-facts\">\n      <div v-for=\"(f, i) in guide.facts\" :key=\"f.label\" class=\"fe-guide__fact\">\n        <span class=\"fe-guide__factlabel\">{{ f.label }}</span>\n        <span class=\"fe-guide__factvalue\">\n          <code :class=\"{ 'fe-guide__ph': f.placeholderOnly }\">{{ f.value }}</code>\n          <button\n            v-if=\"!f.placeholderOnly\"\n            type=\"button\"\n            class=\"fe-guide__copy\"\n            :data-testid=\"`copy-fact-${i}`\"\n            @click=\"copy(f.value, blockId('fact', i))\"\n          >\n            {{ copied === blockId('fact', i) ? t('conn.guide.copied') : t('conn.guide.copy') }}\n          </button>\n        </span>\n        <span v-if=\"f.hint\" class=\"fe-guide__facthint\">{{ f.hint }}</span>\n      </div>\n    </section>\n\n    <!-- One tab per client. A \"how to connect\" page that covers one OS is a\n         page most readers bounce off. -->\n    <nav class=\"fe-guide__tabs\" role=\"tablist\">\n      <button\n        v-for=\"c in guide.clients\"\n        :key=\"c.id\"\n        type=\"button\"\n        role=\"tab\"\n        class=\"fe-guide__tab\"\n        :class=\"{ 'is-active': client && c.id === client.id }\"\n        :aria-selected=\"client && c.id === client.id\"\n        :data-testid=\"`guide-tab-${c.id}`\"\n        @click=\"activeClient = c.id\"\n      >\n        {{ c.name }}\n      </button>\n    </nav>\n\n    <div v-if=\"client\" class=\"fe-guide__body\" role=\"tabpanel\">\n      <template v-for=\"(b, i) in client.blocks\" :key=\"i\">\n        <ol v-if=\"b.kind === 'steps'\" class=\"fe-guide__steps\">\n          <li v-for=\"(s, j) in b.steps ?? []\" :key=\"j\">{{ s }}</li>\n        </ol>\n        <div v-else-if=\"isCode(b)\" class=\"fe-guide__codewrap\">\n          <div class=\"fe-guide__codehead\">\n            <span class=\"fe-guide__caption\">{{ b.caption }}</span>\n            <button\n              type=\"button\"\n              class=\"fe-guide__copy\"\n              :data-testid=\"`copy-code-${i}`\"\n              @click=\"copy(b.code ?? '', blockId(client.id, i))\"\n            >\n              {{ copied === blockId(client.id, i) ? t('conn.guide.copied') : t('conn.guide.copy') }}\n            </button>\n          </div>\n          <pre class=\"fe-guide__code\"><code>{{ b.code }}</code></pre>\n        </div>\n        <p v-else-if=\"b.kind === 'warn'\" class=\"fe-guide__warn\">{{ b.text }}</p>\n        <p v-else-if=\"b.kind === 'note'\" class=\"fe-guide__note\">{{ b.text }}</p>\n        <p v-else class=\"fe-guide__text\">{{ b.text }}</p>\n      </template>\n    </div>\n\n    <section v-if=\"guide.notes.length\" class=\"fe-guide__notes\">\n      <h4 class=\"fe-guide__notestitle\">{{ t('conn.guide.goodToKnow') }}</h4>\n      <p\n        v-for=\"(n, i) in guide.notes\"\n        :key=\"i\"\n        :class=\"n.kind === 'warn' ? 'fe-guide__warn' : 'fe-guide__note'\"\n      >\n        {{ n.text }}\n      </p>\n    </section>\n  </div>\n</template>\n\n<style>\n.fe-guide {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n.fe-guide__summary {\n  margin: 0;\n  color: var(--fe-text-muted);\n  font-size: 13.5px;\n  line-height: 1.55;\n}\n.fe-guide__facts {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n  padding: 12px 14px;\n}\n.fe-guide__fact {\n  display: grid;\n  grid-template-columns: minmax(120px, 180px) 1fr;\n  gap: 4px 14px;\n  align-items: baseline;\n}\n.fe-guide__factlabel {\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--fe-text-muted);\n}\n.fe-guide__factvalue {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  flex-wrap: wrap;\n}\n.fe-guide__factvalue code {\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n  color: var(--fe-text);\n  background: var(--fe-bg);\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius-sm);\n  padding: 2px 6px;\n  overflow-wrap: anywhere;\n}\n.fe-guide__ph {\n  color: var(--fe-text-muted) !important;\n  font-style: italic;\n}\n.fe-guide__facthint {\n  grid-column: 2;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n}\n.fe-guide__tabs {\n  display: flex;\n  gap: 4px;\n  flex-wrap: wrap;\n  border-bottom: 1px solid var(--fe-border);\n  padding-bottom: 2px;\n}\n.fe-guide__tab {\n  font: inherit;\n  font-size: 13px;\n  border: 0;\n  background: none;\n  color: var(--fe-text-muted);\n  padding: 6px 10px;\n  border-radius: var(--fe-radius-sm) var(--fe-radius-sm) 0 0;\n  cursor: pointer;\n  border-bottom: 2px solid transparent;\n}\n.fe-guide__tab:hover {\n  color: var(--fe-text);\n  background: var(--fe-bg-hover);\n}\n.fe-guide__tab.is-active {\n  color: var(--fe-primary);\n  border-bottom-color: var(--fe-primary);\n  font-weight: 600;\n}\n.fe-guide__body {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n.fe-guide__steps {\n  margin: 0;\n  padding-left: 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  font-size: 13.5px;\n  line-height: 1.55;\n  color: var(--fe-text);\n}\n.fe-guide__codewrap {\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  overflow: hidden;\n  background: var(--fe-bg-elev);\n}\n.fe-guide__codehead {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  padding: 6px 10px;\n  border-bottom: 1px solid var(--fe-border);\n}\n.fe-guide__caption {\n  font-size: 12px;\n  color: var(--fe-text-muted);\n  font-family: var(--fe-font-mono);\n  overflow-wrap: anywhere;\n}\n.fe-guide__code {\n  margin: 0;\n  padding: 10px 12px;\n  /* Wide command lines scroll INSIDE the block. Without this the whole\n     settings surface grows a horizontal scrollbar and the layout around\n     it breaks — the same failure the tab strip had. */\n  overflow-x: auto;\n  font-family: var(--fe-font-mono);\n  font-size: 12.5px;\n  line-height: 1.6;\n  color: var(--fe-text);\n  white-space: pre;\n}\n.fe-guide__copy {\n  font: inherit;\n  font-size: 12px;\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  border-radius: var(--fe-radius-sm);\n  padding: 3px 9px;\n  cursor: pointer;\n  flex: 0 0 auto;\n}\n.fe-guide__copy:hover {\n  border-color: var(--fe-primary);\n  color: var(--fe-primary);\n}\n.fe-guide__note,\n.fe-guide__warn,\n.fe-guide__text {\n  margin: 0;\n  font-size: 12.5px;\n  line-height: 1.55;\n}\n.fe-guide__text {\n  color: var(--fe-text);\n}\n.fe-guide__note {\n  color: var(--fe-text-muted);\n}\n.fe-guide__warn {\n  color: var(--fe-danger);\n}\n.fe-guide__notes {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  border-top: 1px solid var(--fe-border);\n  padding-top: 12px;\n}\n.fe-guide__notestitle {\n  margin: 0;\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  color: var(--fe-text-muted);\n}\n</style>\n","/**\n * useS3Keys — the one client for the S3 access-key surface.\n *\n * It goes through `useFileApi`, the same auth plumbing the explorer uses, so\n * the desktop app's function-token, the web app's cookie and an embedder's\n * bearer all work here without this file knowing which is which.\n *\n * ⚠ Every surface mounts THIS, not a copy. The keys panel, the guide and the\n * copy buttons exist once in `packages/core`; the web app and the desktop app\n * render the same component. That is the standing rule (\"never write\n * surface-specific behaviour\") applied to a credential surface, where a\n * divergence would mean one surface handing out keys the other cannot revoke.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { S3AccessKey, S3Connection, S3KeyCreated, S3KeyRequest } from '../types/S3Keys';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\n\nexport function useS3Keys(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const keys = shallowRef<S3AccessKey[]>([]);\n  const connection = ref<S3Connection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /**\n   * null until the first load answers. False means the caller may not mint\n   * keys (anonymous, or a token without the right to) — the guide is still\n   * worth showing, so this is a fact rather than an error.\n   */\n  const canMint = ref<boolean | null>(null);\n\n  /** The secret, held in memory for exactly as long as the user is looking. */\n  const revealed = ref<S3KeyCreated | null>(null);\n\n  function messageOf(e: unknown): string {\n    const err = e as { message?: string; detail?: string } | null;\n    // The backend's own words beat a status line: \"access keys are not\n    // available on this install\" tells an operator what to fix; \"503\" does not.\n    if (err?.detail) {\n      try {\n        const parsed = JSON.parse(err.detail) as { error?: string };\n        if (parsed?.error) return parsed.error;\n      } catch {\n        /* not JSON — fall through */\n      }\n    }\n    return err?.message || String(e);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ keys: S3AccessKey[] } & S3Connection>(\n        url('/api/auth/s3-keys'),\n      );\n      keys.value = Array.isArray(body?.keys) ? body.keys : [];\n      connection.value = {\n        endpoint: body?.endpoint ?? '',\n        enabled: body?.enabled !== false,\n        path_style: body?.path_style !== false,\n      };\n      canMint.value = true;\n    } catch (e) {\n      keys.value = [];\n      const st = statusOf(e);\n      if (st === 401 || st === 403) {\n        canMint.value = false;\n      } else {\n        canMint.value = false;\n        error.value = messageOf(e);\n      }\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  /**\n   * Mint a key. The secret comes back once and is held in `revealed` until\n   * the caller dismisses it — there is no second chance, so the UI must not\n   * navigate away from it on its own.\n   */\n  async function create(req: S3KeyRequest): Promise<S3KeyCreated | null> {\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<S3KeyCreated>(url('/api/auth/s3-keys'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      if (body?.endpoint) {\n        connection.value = {\n          endpoint: body.endpoint,\n          enabled: body.enabled !== false,\n          path_style: body.path_style !== false,\n        };\n      }\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/s3-keys/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/s3-keys/${id}`), { method: 'DELETE' });\n      // A revealed secret belonging to the key just revoked must go with it.\n      if (revealed.value?.key?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  function dismissSecret() {\n    revealed.value = null;\n  }\n\n  /**\n   * The key a guide should be rendered with: the one just minted, else the\n   * newest usable one. A guide showing a DISABLED key's id would produce a\n   * paste that authenticates as nothing.\n   */\n  const guideKey = computed<S3AccessKey | null>(() => {\n    if (revealed.value?.key) return revealed.value.key;\n    const usable = keys.value.filter((k) => !k.disabled_at);\n    if (!usable.length) return null;\n    return usable.reduce((a, b) => (a.created_at >= b.created_at ? a : b));\n  });\n\n  return {\n    keys,\n    connection,\n    loading,\n    loaded,\n    error,\n    canMint,\n    revealed,\n    guideKey,\n    load,\n    create,\n    setDisabled,\n    remove,\n    dismissSecret,\n  };\n}\n","import { ref } from 'vue';\n\n/**\n * \"Is this box scrolled sideways at all?\" — the one fact a pinned column\n * needs in order to draw its left divider only while something is actually\n * sliding underneath it. A permanent divider would claim the column is\n * floating when it is simply the last cell of a table that fits.\n *\n * Bind `onScroll` to the scroll container and `scrolledX` to its\n * `is-scrolled-x` class; the stylesheet does the rest (base.css,\n * `.fe-s3keys__scroll.is-scrolled-x`).\n */\nexport function useScrolledX() {\n  const scrolledX = ref(false);\n  function onScroll(ev: Event) {\n    const el = ev.currentTarget as HTMLElement | null;\n    const on = (el?.scrollLeft ?? 0) > 0;\n    if (on !== scrolledX.value) scrolledX.value = on;\n  }\n  return { scrolledX, onScroll };\n}\n","<script setup lang=\"ts\">\n/**\n * S3KeysPanel — mint, list and revoke the caller's own S3 access keys.\n *\n * It sits above the S3 guide because the guide is only worth anything with a\n * real key in it: the commands below fill in the access key id automatically,\n * and the secret right after minting, which is the difference between a\n * document and a working paste.\n *\n * ⚠⚠ One component, every surface. The desktop app and the web app mount this\n * same file; neither owns a copy of the form or the revoke button. A credential\n * surface is the worst possible place for two implementations — one of them\n * would eventually hand out keys the other cannot revoke.\n *\n * ⚠ The secret leaves the server exactly once. Nothing here re-fetches it,\n * nothing stores it, and it is dropped from memory when the user dismisses it\n * or revokes the key — so the panel cannot become a place where a credential\n * quietly persists.\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { S3AccessKey } from '../types/S3Keys';\nimport { useLocale } from '../composables/useLocale';\nimport { useS3Keys } from '../composables/useS3Keys';\nimport { useScrolledX } from '../composables/useScrolledX';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Storage names the caller may see, for the confinement picker. */\n  storages: string[];\n}>();\n\nconst emit = defineEmits<{\n  /** The key a guide should render with, and its one-time secret. */\n  (e: 'active', v: { accessKeyID: string; secret?: string; endpoint: string; pathStyle: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\nconst { scrolledX, onScroll } = useScrolledX();\n\nconst {\n  keys,\n  connection,\n  loading,\n  error,\n  canMint,\n  revealed,\n  guideKey,\n  load,\n  create,\n  setDisabled,\n  remove,\n  dismissSecret,\n} = useS3Keys(props.config);\n\nconst label = ref('');\nconst bucket = ref('');\nconst prefix = ref('');\nconst busy = ref(false);\nconst confirmRevoke = ref<number | null>(null);\nconst copied = ref<string | null>(null);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\n/** Publish whatever the guide should render with, whenever it changes. */\nfunction publish() {\n  const conn = connection.value;\n  if (!conn) return;\n  emit('active', {\n    accessKeyID: guideKey.value?.access_key_id ?? '',\n    // Only the freshly minted one. Re-emitting a stale secret would put a\n    // dead credential into the commands.\n    secret: revealed.value?.key?.id === guideKey.value?.id ? revealed.value?.secret : undefined,\n    endpoint: conn.endpoint,\n    pathStyle: conn.path_style,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function mint() {\n  busy.value = true;\n  try {\n    await create({\n      label: label.value.trim() || t('conn.s3keys.defaultLabel'),\n      bucket: bucket.value.trim() || undefined,\n      prefix: prefix.value.trim() || undefined,\n    });\n    label.value = '';\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function toggle(k: S3AccessKey) {\n  busy.value = true;\n  try {\n    await setDisabled(k.id, !k.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function revoke(k: S3AccessKey) {\n  if (confirmRevoke.value !== k.id) {\n    confirmRevoke.value = k.id;\n    return;\n  }\n  confirmRevoke.value = null;\n  busy.value = true;\n  try {\n    await remove(k.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/**\n * Copy, with the same fallback the guide uses: `navigator.clipboard` needs a\n * secure context, and an embed on plain http is a real deployment.\n */\nasync function copy(text: string, id: string) {\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  if (!ok) return;\n  copied.value = id;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => (copied.value = null), 1600);\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\n/** What a key is limited to, in one line. */\nfunction scopeOf(k: S3AccessKey): string {\n  if (!k.bucket) return t('conn.s3keys.scopeAll');\n  return k.prefix ? `${k.bucket}/${k.prefix}` : k.bucket;\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"s3-keys\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.s3keys.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.s3keys.lead') }}</p>\n    </header>\n\n    <!-- The operator turned the endpoint off. Saying so beats handing out a\n         key that authenticates against a 404. -->\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.s3keys.disabled') }}\n    </p>\n\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.s3keys.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <!-- ── mint ─────────────────────────────────────────────────── -->\n    <div v-if=\"canMint\" class=\"fe-s3keys__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.s3keys.label')\"\n        data-testid=\"s3-key-label\"\n      />\n      <select v-model=\"bucket\" class=\"fe-cfield__input\" data-testid=\"s3-key-bucket\">\n        <option value=\"\">{{ t('conn.s3keys.everyBucket') }}</option>\n        <option v-for=\"s in storages\" :key=\"s\" :value=\"s\">{{ s }}</option>\n      </select>\n      <input\n        v-model=\"prefix\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.s3keys.prefix')\"\n        :disabled=\"!bucket\"\n        data-testid=\"s3-key-prefix\"\n      />\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"s3-key-mint\" @click=\"mint\">\n        {{ t('conn.s3keys.mint') }}\n      </button>\n    </div>\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.s3keys.inheritNote') }}</p>\n\n    <!-- ── the one-time secret ──────────────────────────────────── -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"s3-key-secret\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.s3keys.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <span class=\"fe-s3keys__k\">{{ t('conn.s3keys.accessKeyID') }}</span>\n        <code>{{ revealed.key.access_key_id }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copy(revealed.key.access_key_id, 'akid')\">\n          {{ copied === 'akid' ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <div class=\"fe-s3keys__pair\">\n        <span class=\"fe-s3keys__k\">{{ t('conn.s3keys.secret') }}</span>\n        <code>{{ revealed.secret }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copy(revealed.secret, 'secret')\">\n          {{ copied === 'secret' ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismissSecret\">\n        {{ t('conn.s3keys.dismiss') }}\n      </button>\n    </div>\n\n    <!-- ── the keys ─────────────────────────────────────────────── -->\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <div v-else-if=\"keys.length\" class=\"fe-s3keys__scroll\" :class=\"{ 'is-scrolled-x': scrolledX }\" @scroll.passive=\"onScroll\">\n      <table class=\"fe-s3keys__table\">\n        <thead>\n          <tr>\n            <th>{{ t('conn.s3keys.col.label') }}</th>\n            <th>{{ t('conn.s3keys.col.key') }}</th>\n            <th>{{ t('conn.s3keys.col.scope') }}</th>\n            <th>{{ t('conn.s3keys.col.lastUsed') }}</th>\n            <th></th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"k in keys\" :key=\"k.id\" :class=\"{ 'is-off': !!k.disabled_at }\">\n            <td>{{ k.label || t('conn.s3keys.noLabel') }}</td>\n            <td><code>{{ k.access_key_id }}</code></td>\n            <td>{{ scopeOf(k) }}</td>\n            <td>{{ k.last_used_at ? shortDate(k.last_used_at) : t('conn.s3keys.neverUsed') }}</td>\n            <td class=\"fe-s3keys__actions\">\n              <button class=\"fe-s3keys__link\" :disabled=\"busy\" @click=\"toggle(k)\">\n                {{ k.disabled_at ? t('conn.s3keys.enable') : t('conn.s3keys.disable') }}\n              </button>\n              <button class=\"fe-s3keys__link is-danger\" :disabled=\"busy\" @click=\"revoke(k)\">\n                {{ confirmRevoke === k.id ? t('conn.s3keys.confirm') : t('conn.s3keys.revoke') }}\n              </button>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n    <p v-else-if=\"canMint\" class=\"fe-s3keys__muted\">{{ t('conn.s3keys.empty') }}</p>\n  </section>\n</template>\n\n<style>\n/* ⚠ Only tokens that packages/core/src/styles/variables.css declares. This\n   block shipped with `--fe-surface`, `--fe-muted`, `--fe-accent`,\n   `--fe-surface-2` and `--fe-mono` — none of them exist — so the box had no\n   ground, the muted text was full-strength, and the mint button wore a\n   hardcoded blue that ignored the dark palette while the button beside it\n   used --fe-primary. web/tests/api/themeTokens.test.ts now refuses a token\n   that variables.css does not declare. */\n.fe-s3keys {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  padding: 14px;\n  border: 1px solid var(--fe-border);\n  border-radius: 10px;\n  background: var(--fe-bg-elev);\n}\n.fe-s3keys__title {\n  margin: 0;\n  font-size: 14px;\n  font-weight: 600;\n}\n.fe-s3keys__lead,\n.fe-s3keys__hint,\n.fe-s3keys__muted {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-text-muted);\n}\n.fe-s3keys__warn {\n  margin: 0;\n  font-size: 12px;\n  color: var(--fe-danger);\n}\n.fe-s3keys__form {\n  display: grid;\n  grid-template-columns: 1.4fr 1fr 1fr auto;\n  gap: 8px;\n  align-items: center;\n}\n@media (max-width: 640px) {\n  .fe-s3keys__form {\n    grid-template-columns: 1fr;\n  }\n}\n.fe-s3keys__btn {\n  padding: 7px 12px;\n  border-radius: 8px;\n  border: 1px solid transparent;\n  background: var(--fe-primary);\n  color: #fff;\n  font-size: 13px;\n  cursor: pointer;\n}\n.fe-s3keys__btn:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n.fe-s3keys__secret {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  padding: 10px;\n  border-radius: 8px;\n  border: 1px solid var(--fe-primary);\n  background: var(--fe-bg-selected);\n}\n.fe-s3keys__once {\n  margin: 0;\n  font-size: 12px;\n  font-weight: 600;\n}\n.fe-s3keys__pair {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  min-width: 0;\n}\n.fe-s3keys__pair code {\n  flex: 1;\n  overflow-wrap: anywhere;\n  font-family: var(--fe-font-mono);\n}\n.fe-s3keys__k {\n  min-width: 96px;\n  color: var(--fe-text-muted);\n}\n.fe-s3keys__copy,\n.fe-s3keys__dismiss,\n.fe-s3keys__link {\n  background: none;\n  border: none;\n  padding: 0 4px;\n  color: var(--fe-primary);\n  font-size: 12px;\n  cursor: pointer;\n}\n.fe-s3keys__link.is-danger {\n  color: var(--fe-danger);\n}\n.fe-s3keys__dismiss {\n  align-self: flex-start;\n}\n.fe-s3keys__table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: 12px;\n}\n.fe-s3keys__table th {\n  text-align: left;\n  font-weight: 500;\n  color: var(--fe-text-muted);\n  padding: 4px 6px;\n}\n.fe-s3keys__table td {\n  padding: 5px 6px;\n  border-top: 1px solid var(--fe-border);\n  overflow-wrap: anywhere;\n}\n.fe-s3keys__table tr.is-off {\n  opacity: 0.55;\n}\n.fe-s3keys__actions {\n  white-space: nowrap;\n  text-align: right;\n}\n/* Its pinning (sticky right, ground, scroll divider) is in styles/base.css\n   next to the list view's `.fe-list__col--menu`, so the two stay one model. */\n</style>\n","/**\n * useSSHKeys — the one client for the SSH key surface.\n *\n * Same shape as useS3Keys and for the same reason: the panel, the guide and\n * the buttons exist once in `packages/core`, and the desktop app and the web\n * app mount the same component. A credential surface with two implementations\n * eventually hands out access one of them cannot take back.\n *\n * ⚠ There is no secret to reveal here. The user pastes the PUBLIC half; the\n * private key never touches filex, which is the entire point of preferring\n * keys over a password on a file server.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { SSHConnection, SSHPublicKey } from '../types/SSHKeys';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\n\nexport function useSSHKeys(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const keys = shallowRef<SSHPublicKey[]>([]);\n  const connection = ref<SSHConnection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  const canAdd = ref<boolean | null>(null);\n\n  function messageOf(e: unknown): string {\n    const err = e as { message?: string; detail?: string } | null;\n    if (err?.detail) {\n      try {\n        const parsed = JSON.parse(err.detail) as { error?: string };\n        if (parsed?.error) return parsed.error;\n      } catch {\n        /* not JSON */\n      }\n    }\n    return err?.message || String(e);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ keys: SSHPublicKey[] } & SSHConnection>(\n        url('/api/auth/ssh-keys'),\n      );\n      keys.value = Array.isArray(body?.keys) ? body.keys : [];\n      connection.value = {\n        enabled: body?.enabled !== false,\n        host: body?.host ?? '',\n        port: body?.port ?? 2022,\n        login: body?.login ?? '',\n        ftps: body?.ftps,\n      };\n      canAdd.value = true;\n    } catch (e) {\n      keys.value = [];\n      canAdd.value = false;\n      if (statusOf(e) !== 401 && statusOf(e) !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  async function add(key: string, name?: string): Promise<boolean> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url('/api/auth/ssh-keys'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ key, name }),\n      });\n      await load();\n      return true;\n    } catch (e) {\n      error.value = messageOf(e);\n      return false;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/ssh-keys/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/ssh-keys/${id}`), { method: 'DELETE' });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  /** True when at least one key can actually be used to sign in. */\n  const hasUsableKey = computed(() => keys.value.some((k) => !k.disabled_at));\n\n  return { keys, connection, loading, loaded, error, canAdd, hasUsableKey, load, add, setDisabled, remove };\n}\n","<script setup lang=\"ts\">\n/**\n * SSHKeysPanel — register, disable and remove the keys this account signs in\n * with over SFTP.\n *\n * ⚠⚠ This is not a convenience screen. `ssh-copy-id` — the command everybody\n * reaches for — appends to `~/.ssh/authorized_keys` over a shell, and filex has\n * no shell. Without a box to paste a key into, public-key authentication is\n * unreachable and every user ends up sending their account password to a file\n * server instead. That is why the screen shipped WITH the endpoint rather than\n * after it.\n *\n * One component, every surface: the desktop app and the web app mount this same\n * file (see S3KeysPanel for the same rule stated at length).\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { FTPSFacts, SSHPublicKey } from '../types/SSHKeys';\nimport { useLocale } from '../composables/useLocale';\nimport { useSSHKeys } from '../composables/useSSHKeys';\nimport { useScrolledX } from '../composables/useScrolledX';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /**\n   * Draw the key list and the paste box.\n   *\n   * ⚠ False for FTPS, which authenticates with a password or an API token and\n   * has no use for an SSH key — the panel is still MOUNTED there because it is\n   * the call that reports where the FTP endpoint listens and under what login\n   * name. Showing a key box on the FTPS page would invite somebody to register\n   * a key that protocol will never look at.\n   */\n  keysVisible?: boolean;\n}>();\n\nconst showKeys = computed(() => props.keysVisible !== false);\n\nconst emit = defineEmits<{\n  /** What the guide should render with: where to connect and as whom. */\n  (e: 'active', v: {\n    host: string;\n    port: number;\n    login: string;\n    enabled: boolean;\n    hasKey: boolean;\n    ftps?: FTPSFacts;\n  }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\nconst { scrolledX, onScroll } = useScrolledX();\n\nconst { keys, connection, loading, error, canAdd, hasUsableKey, load, add, setDisabled, remove } =\n  useSSHKeys(props.config);\n\nconst pasted = ref('');\nconst name = ref('');\nconst busy = ref(false);\nconst confirmRemove = ref<number | null>(null);\n\nfunction publish() {\n  const c = connection.value;\n  if (!c) return;\n  emit('active', {\n    host: c.host,\n    port: c.port,\n    login: c.login,\n    enabled: c.enabled,\n    hasKey: hasUsableKey.value,\n    // The FTPS endpoint travels with the SSH facts: for the user this is one\n    // question (\"how do I reach this from a program?\"), and two calls to\n    // answer it would be two chances to disagree.\n    ftps: c.ftps,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function submit() {\n  if (!pasted.value.trim()) return;\n  busy.value = true;\n  try {\n    if (await add(pasted.value.trim(), name.value.trim() || undefined)) {\n      pasted.value = '';\n      name.value = '';\n    }\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function toggle(k: SSHPublicKey) {\n  busy.value = true;\n  try {\n    await setDisabled(k.id, !k.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function drop(k: SSHPublicKey) {\n  if (confirmRemove.value !== k.id) {\n    confirmRemove.value = k.id;\n    return;\n  }\n  confirmRemove.value = null;\n  busy.value = true;\n  try {\n    await remove(k.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\n/** Shown the way OpenSSH prints it, so it can be compared with `ssh-keygen -lf`. */\nfunction fingerprintOf(k: SSHPublicKey): string {\n  return 'SHA256:' + k.fingerprint;\n}\n</script>\n\n<template>\n  <section v-if=\"showKeys\" class=\"fe-s3keys\" data-testid=\"ssh-keys\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.sshkeys.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.sshkeys.lead') }}</p>\n    </header>\n\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.sshkeys.disabled') }}\n    </p>\n    <p v-if=\"canAdd === false\" class=\"fe-s3keys__muted\">{{ t('conn.sshkeys.cannotAdd') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canAdd\" class=\"fe-sshkeys__form\">\n      <textarea\n        v-model=\"pasted\"\n        class=\"fe-cfield__input fe-sshkeys__paste\"\n        rows=\"2\"\n        spellcheck=\"false\"\n        :placeholder=\"t('conn.sshkeys.paste')\"\n        data-testid=\"ssh-key-input\"\n      ></textarea>\n      <div class=\"fe-sshkeys__row\">\n        <input\n          v-model=\"name\"\n          class=\"fe-cfield__input\"\n          :placeholder=\"t('conn.sshkeys.name')\"\n          data-testid=\"ssh-key-name\"\n        />\n        <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"ssh-key-add\" @click=\"submit\">\n          {{ t('conn.sshkeys.add') }}\n        </button>\n      </div>\n      <p class=\"fe-s3keys__hint\">{{ t('conn.sshkeys.noCopyId') }}</p>\n    </div>\n\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <div v-else-if=\"keys.length\" class=\"fe-s3keys__scroll\" :class=\"{ 'is-scrolled-x': scrolledX }\" @scroll.passive=\"onScroll\">\n      <table class=\"fe-s3keys__table\">\n        <thead>\n          <tr>\n            <th>{{ t('conn.sshkeys.col.name') }}</th>\n            <th>{{ t('conn.sshkeys.col.fingerprint') }}</th>\n            <th>{{ t('conn.sshkeys.col.lastUsed') }}</th>\n            <th></th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"k in keys\" :key=\"k.id\" :class=\"{ 'is-off': !!k.disabled_at }\">\n            <td>{{ k.name || t('conn.sshkeys.noName') }}</td>\n            <td><code>{{ fingerprintOf(k) }}</code></td>\n            <td>{{ k.last_used_at ? shortDate(k.last_used_at) : t('conn.sshkeys.neverUsed') }}</td>\n            <td class=\"fe-s3keys__actions\">\n              <button class=\"fe-s3keys__link\" :disabled=\"busy\" @click=\"toggle(k)\">\n                {{ k.disabled_at ? t('conn.sshkeys.enable') : t('conn.sshkeys.disable') }}\n              </button>\n              <button class=\"fe-s3keys__link is-danger\" :disabled=\"busy\" @click=\"drop(k)\">\n                {{ confirmRemove === k.id ? t('conn.sshkeys.confirm') : t('conn.sshkeys.remove') }}\n              </button>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n    <p v-else-if=\"canAdd\" class=\"fe-s3keys__muted\">{{ t('conn.sshkeys.empty') }}</p>\n  </section>\n</template>\n\n<style>\n/* The layout is shared with the access-key panel (fe-s3keys__*); only the\n   paste box is different, because a public key is two lines long. */\n.fe-sshkeys__form {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n.fe-sshkeys__paste {\n  width: 100%;\n  font-family: var(--fe-font-mono);\n  font-size: 12px;\n  resize: vertical;\n  overflow-wrap: anywhere;\n}\n.fe-sshkeys__row {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n}\n.fe-sshkeys__row .fe-cfield__input {\n  flex: 1;\n}\n</style>\n","/**\n * useNFSExports — the one client for the NFS export surface.\n *\n * Same shape as useS3Keys and useSSHKeys, and mounted by every surface from\n * packages/core for the same reason: a credential screen with two\n * implementations eventually hands out access one of them cannot revoke.\n */\n\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { NFSConnection, NFSExport, NFSExportCreated } from '../types/NFSExports';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\n\nexport function useNFSExports(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const exports = shallowRef<NFSExport[]>([]);\n  const connection = ref<NFSConnection | null>(null);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  const canMint = ref<boolean | null>(null);\n  /** The path, held only while the user is looking at it. */\n  const revealed = ref<NFSExportCreated | null>(null);\n\n  function messageOf(e: unknown): string {\n    const err = e as { message?: string; detail?: string } | null;\n    if (err?.detail) {\n      try {\n        const parsed = JSON.parse(err.detail) as { error?: string };\n        if (parsed?.error) return parsed.error;\n      } catch {\n        /* not JSON */\n      }\n    }\n    return err?.message || String(e);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ exports: NFSExport[] } & NFSConnection>(\n        url('/api/auth/nfs-exports'),\n      );\n      exports.value = Array.isArray(body?.exports) ? body.exports : [];\n      connection.value = {\n        enabled: body?.enabled !== false,\n        host: body?.host ?? '',\n        port: body?.port ?? 2049,\n      };\n      canMint.value = true;\n    } catch (e) {\n      exports.value = [];\n      canMint.value = false;\n      if (statusOf(e) !== 401 && statusOf(e) !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  async function create(req: {\n    label: string;\n    storage?: string;\n    prefix?: string;\n    read_only?: boolean;\n    allow_cidrs?: string;\n  }): Promise<NFSExportCreated | null> {\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<NFSExportCreated>(url('/api/auth/nfs-exports'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      if (body?.host) {\n        connection.value = { enabled: body.enabled !== false, host: body.host, port: body.port };\n      }\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function setDisabled(id: number, disabled: boolean): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/nfs-exports/${id}/state`), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ disabled }),\n      });\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/auth/nfs-exports/${id}`), { method: 'DELETE' });\n      if (revealed.value?.export?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  function dismissPath() {\n    revealed.value = null;\n  }\n\n  /** The export a guide should render a mount line for. */\n  const guideExport = computed<NFSExport | null>(() => {\n    if (revealed.value?.export) return revealed.value.export;\n    const usable = exports.value.filter((e) => !e.disabled_at);\n    if (!usable.length) return null;\n    return usable.reduce((a, b) => (a.created_at >= b.created_at ? a : b));\n  });\n\n  return {\n    exports,\n    connection,\n    loading,\n    loaded,\n    error,\n    canMint,\n    revealed,\n    guideExport,\n    load,\n    create,\n    setDisabled,\n    remove,\n    dismissPath,\n  };\n}\n","<script setup lang=\"ts\">\n/**\n * NFSExportsPanel — mint, disable and revoke the NFS exports this account can\n * be mounted through.\n *\n * ⚠⚠ The path this hands back IS the credential, and that is unusual enough to\n * say twice. NFSv3 cannot authenticate a request without Kerberos, so filex\n * binds the identity to a high-entropy export path: whoever knows it mounts as\n * this account. It goes into an /etc/fstab line or a NAS admin page — places\n * nobody treats as a password store — so the panel says so where the path is\n * shown, not in a document somebody will not read.\n *\n * One component, every surface (see S3KeysPanel for the rule at length).\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { NFSExport } from '../types/NFSExports';\nimport { useLocale } from '../composables/useLocale';\nimport { useNFSExports } from '../composables/useNFSExports';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Storage names the caller may see, for the confinement picker. */\n  storages: string[];\n}>();\n\nconst emit = defineEmits<{\n  (e: 'active', v: { host: string; port: number; enabled: boolean; path?: string; readOnly: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\n\nconst {\n  exports,\n  connection,\n  loading,\n  error,\n  canMint,\n  revealed,\n  guideExport,\n  load,\n  create,\n  setDisabled,\n  remove,\n  dismissPath,\n} = useNFSExports(props.config);\n\nconst label = ref('');\nconst storage = ref('');\nconst prefix = ref('');\nconst readOnly = ref(true);\nconst allowCidrs = ref('');\nconst busy = ref(false);\nconst confirmRemove = ref<number | null>(null);\nconst copied = ref(false);\nlet copyTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction publish() {\n  const c = connection.value;\n  if (!c) return;\n  emit('active', {\n    host: c.host,\n    port: c.port,\n    enabled: c.enabled,\n    // Only the freshly minted path — the stored ones cannot be recovered, and\n    // printing a placeholder in a mount line somebody copies would produce a\n    // command that fails with no clue why.\n    path: revealed.value?.path,\n    readOnly: guideExport.value?.read_only ?? readOnly.value,\n  });\n}\n\nonMounted(async () => {\n  await load();\n  publish();\n});\n\nasync function mint() {\n  busy.value = true;\n  try {\n    await create({\n      label: label.value.trim() || t('conn.nfs.defaultLabel'),\n      storage: storage.value.trim() || undefined,\n      prefix: prefix.value.trim() || undefined,\n      read_only: readOnly.value,\n      allow_cidrs: allowCidrs.value.trim() || undefined,\n    });\n    label.value = '';\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function toggle(e: NFSExport) {\n  busy.value = true;\n  try {\n    await setDisabled(e.id, !e.disabled_at);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function drop(e: NFSExport) {\n  if (confirmRemove.value !== e.id) {\n    confirmRemove.value = e.id;\n    return;\n  }\n  confirmRemove.value = null;\n  busy.value = true;\n  try {\n    await remove(e.id);\n    publish();\n  } finally {\n    busy.value = false;\n  }\n}\n\n/** The mount line for the path just minted — the thing to copy. */\nconst mountLine = computed(() => {\n  const c = connection.value;\n  const p = revealed.value?.path;\n  if (!c || !p) return '';\n  const ro = revealed.value?.export?.read_only ? ',ro' : '';\n  return `sudo mount -t nfs -o nfsvers=3,tcp,port=${c.port},mountport=${c.port},nolock${ro} ${c.host}:${p} /mnt/filex`;\n});\n\nasync function copyLine() {\n  const text = mountLine.value;\n  if (!text) return;\n  let ok = false;\n  try {\n    await navigator.clipboard.writeText(text);\n    ok = true;\n  } catch {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n    } catch {\n      ok = false;\n    }\n  }\n  if (!ok) return;\n  copied.value = true;\n  if (copyTimer) clearTimeout(copyTimer);\n  copyTimer = setTimeout(() => (copied.value = false), 1600);\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction shortDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\nfunction scopeOf(e: NFSExport): string {\n  if (!e.storage_name) return t('conn.nfs.scopeAll');\n  return e.prefix ? `${e.storage_name}/${e.prefix}` : e.storage_name;\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"nfs-exports\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.nfs.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.nfs.lead') }}</p>\n    </header>\n\n    <!-- ⚠⚠ The one thing somebody must read before they mint one. -->\n    <p class=\"fe-s3keys__warn\">{{ t('conn.nfs.pathIsSecret') }}</p>\n    <p v-if=\"connection && !connection.enabled\" class=\"fe-s3keys__warn\">\n      {{ t('conn.nfs.disabled') }}\n    </p>\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.nfs.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canMint\" class=\"fe-s3keys__form fe-nfs__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.label')\"\n        data-testid=\"nfs-label\"\n      />\n      <select v-model=\"storage\" class=\"fe-cfield__input\" data-testid=\"nfs-storage\">\n        <option value=\"\">{{ t('conn.nfs.everyStorage') }}</option>\n        <option v-for=\"s in storages\" :key=\"s\" :value=\"s\">{{ s }}</option>\n      </select>\n      <input\n        v-model=\"prefix\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.prefix')\"\n        :disabled=\"!storage\"\n        data-testid=\"nfs-prefix\"\n      />\n      <input\n        v-model=\"allowCidrs\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"t('conn.nfs.allowCidrs')\"\n        data-testid=\"nfs-cidrs\"\n      />\n      <label class=\"fe-nfs__ro\">\n        <input type=\"checkbox\" v-model=\"readOnly\" data-testid=\"nfs-readonly\" />\n        {{ t('conn.nfs.readOnly') }}\n      </label>\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"nfs-mint\" @click=\"mint\">\n        {{ t('conn.nfs.mint') }}\n      </button>\n    </div>\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.nfs.readOnlyHint') }}</p>\n\n    <!-- The path, once. -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"nfs-path\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.nfs.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <code>{{ mountLine }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copyLine\">\n          {{ copied ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismissPath\">\n        {{ t('conn.nfs.dismiss') }}\n      </button>\n    </div>\n\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <table v-else-if=\"exports.length\" class=\"fe-s3keys__table\">\n      <thead>\n        <tr>\n          <th>{{ t('conn.nfs.col.label') }}</th>\n          <th>{{ t('conn.nfs.col.scope') }}</th>\n          <th>{{ t('conn.nfs.col.mode') }}</th>\n          <th>{{ t('conn.nfs.col.lastUsed') }}</th>\n          <th></th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr v-for=\"e in exports\" :key=\"e.id\" :class=\"{ 'is-off': !!e.disabled_at }\">\n          <td>{{ e.label || t('conn.nfs.noLabel') }}</td>\n          <td>{{ scopeOf(e) }}</td>\n          <td>{{ e.read_only ? t('conn.nfs.modeRead') : t('conn.nfs.modeWrite') }}</td>\n          <td>{{ e.last_used_at ? shortDate(e.last_used_at) : t('conn.nfs.neverUsed') }}</td>\n          <td class=\"fe-s3keys__actions\">\n            <button class=\"fe-s3keys__link\" :disabled=\"busy\" @click=\"toggle(e)\">\n              {{ e.disabled_at ? t('conn.nfs.enable') : t('conn.nfs.disable') }}\n            </button>\n            <button class=\"fe-s3keys__link is-danger\" :disabled=\"busy\" @click=\"drop(e)\">\n              {{ confirmRemove === e.id ? t('conn.nfs.confirm') : t('conn.nfs.revoke') }}\n            </button>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n    <p v-else-if=\"canMint\" class=\"fe-s3keys__muted\">{{ t('conn.nfs.empty') }}</p>\n  </section>\n</template>\n\n<style>\n/* Shares the access-key panel's layout; only the form is wider, because an\n   export has one more field than a key does. */\n.fe-nfs__form {\n  grid-template-columns: 1.2fr 1fr 1fr 1fr auto auto;\n}\n@media (max-width: 900px) {\n  .fe-nfs__form {\n    grid-template-columns: 1fr;\n  }\n}\n.fe-nfs__ro {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 12px;\n  white-space: nowrap;\n}\n</style>\n","/**\n * useTokens — the one client for the self-service API-token surface.\n *\n * It goes through `useFileApi`, the same auth plumbing the explorer uses, so\n * the desktop app's function-token, the web app's cookie and an embedder's\n * bearer all work here without this file knowing which is which.\n *\n * ⚠ `/api/tokens`, NOT `/api/admin/ai-tokens`. The admin route needs an admin;\n * this one is open to every account and caps what it hands out to the caller's\n * own role and grants. Pointing this at the admin route would put the panel on\n * three surfaces and have it fail with 403 on two of them.\n *\n * ⚠ Every surface mounts THIS, not a copy — the standing rule applied to a\n * credential surface, where a divergence would mean one surface minting\n * tokens the other cannot see or revoke.\n */\n\nimport { ref, shallowRef } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { ApiToken, ApiTokenCreated, ApiTokenRequest } from '../types/Tokens';\nimport { connectionsBase } from './useConnections';\nimport { useFileApi } from './useFileApi';\n\nexport function useTokens(config: ExplorerConfig) {\n  const api = useFileApi(config);\n  const base = connectionsBase(config);\n  const url = (path: string) => `${base}${path}`;\n\n  const tokens = shallowRef<ApiToken[]>([]);\n  const loading = ref(false);\n  const loaded = ref(false);\n  const error = ref<string | null>(null);\n  /**\n   * null until the first load answers. False means the caller may not mint\n   * one (anonymous, or a share/proxy session) — the guide around it is still\n   * worth showing, so this is a fact rather than an error.\n   */\n  const canMint = ref<boolean | null>(null);\n\n  /** The secret, held in memory for exactly as long as the user is looking. */\n  const revealed = ref<ApiTokenCreated | null>(null);\n\n  function messageOf(e: unknown): string {\n    const err = e as { message?: string; detail?: string } | null;\n    // The backend's own words beat a status line: \"scope 'admin' is not\n    // available here\" tells the user what to change; \"403\" does not.\n    if (err?.detail) {\n      try {\n        const parsed = JSON.parse(err.detail) as { error?: string };\n        if (parsed?.error) return parsed.error;\n      } catch {\n        /* not JSON — fall through */\n      }\n    }\n    return err?.message || String(e);\n  }\n\n  function statusOf(e: unknown): number | undefined {\n    return (e as { status?: number } | null)?.status;\n  }\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<{ tokens: ApiToken[] }>(url('/api/tokens'));\n      tokens.value = Array.isArray(body?.tokens) ? body.tokens : [];\n      canMint.value = true;\n    } catch (e) {\n      tokens.value = [];\n      const st = statusOf(e);\n      canMint.value = false;\n      // 401/403 is \"not for you\", which the panel says in its own words. Any\n      // other status is a fault worth showing verbatim.\n      if (st !== 401 && st !== 403) error.value = messageOf(e);\n    } finally {\n      loading.value = false;\n      loaded.value = true;\n    }\n  }\n\n  /**\n   * Mint a token. The secret comes back once and is held in `revealed` until\n   * the caller dismisses it — there is no second chance, so the UI must not\n   * navigate away from it on its own.\n   */\n  async function create(req: ApiTokenRequest): Promise<ApiTokenCreated | null> {\n    error.value = null;\n    try {\n      const body = await api.jsonFetch<ApiTokenCreated>(url('/api/tokens'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n      });\n      revealed.value = body;\n      await load();\n      return body;\n    } catch (e) {\n      error.value = messageOf(e);\n      return null;\n    }\n  }\n\n  async function remove(id: number): Promise<void> {\n    error.value = null;\n    try {\n      await api.jsonFetch(url(`/api/tokens/${id}`), { method: 'DELETE' });\n      // A revealed secret belonging to the token just revoked goes with it.\n      if (revealed.value?.row?.id === id) revealed.value = null;\n      await load();\n    } catch (e) {\n      error.value = messageOf(e);\n    }\n  }\n\n  function dismiss(): void {\n    revealed.value = null;\n  }\n\n  return { tokens, loading, loaded, error, canMint, revealed, load, create, remove, dismiss };\n}\n","<script setup lang=\"ts\">\n/**\n * TokensPanel — mint and revoke the API tokens this account signs in with on\n * the protocols whose credential IS a token.\n *\n * ⚠⚠ Why this had to exist. FTPS, WebDAV and `filex mount` all take an API\n * token as the password — the guides next to this panel say so in as many\n * words. Until 2026-08-17 the only place to mint one was the admin panel's\n * `/api/admin/ai-tokens` screen, so a normal user read \"use an API token\" and\n * had nowhere to get one. The route it calls (`/api/tokens`) has always been\n * open to every account and caps what it hands out to the caller's own role\n * and grants; only the UI was missing.\n *\n * One component, every surface (see S3KeysPanel for the rule at length): the\n * admin panel, the web explorer and the desktop app render THIS.\n *\n * Two shapes, one implementation. `full` adds what a person managing their own\n * API keys needs — which scopes, confined to which folder, expiring when — and\n * without it the panel is the compact minter that sits inside a protocol guide,\n * byte for byte as before.\n *\n * ⚠ `full` exists because the rich version had been written a second time, in\n * `web/src/components/SelfTokensModal.vue`, against the same `/api/tokens`\n * route. That copy was reachable only from our own web app: an embedder\n * mounting the explorer got users with no way to mint the credential WebDAV,\n * FTPS and `filex mount` ask for. The copy is gone; this is the surface.\n */\nimport { computed, onMounted, ref } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { ApiToken } from '../types/Tokens';\nimport { useLocale } from '../composables/useLocale';\nimport { useTokens } from '../composables/useTokens';\nimport { useScrolledX } from '../composables/useScrolledX';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /**\n   * Render the full self-service key manager (scopes, folder confinement,\n   * expiry) instead of the one-field minter the guides embed.\n   */\n  full?: boolean;\n  /**\n   * Which protocol the surrounding guide is showing. It only changes the\n   * default label — a token minted here works on all of them, and pretending\n   * otherwise would have people mint one per protocol.\n   */\n  protocol?: string;\n  /**\n   * The host the surrounding guide tells people to connect to. Given by the\n   * connection guides, which know the server's own public address; without\n   * it the label falls back to where this panel was loaded from. ⚠ The\n   * default label used to be built from apiBase / the page while the guide\n   * right under it printed the server's address — one screen, two machines.\n   */\n  host?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'active', v: { hasToken: boolean }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t, formatDate } = useLocale(locale);\nconst { scrolledX, onScroll } = useScrolledX();\n\nconst { tokens, loading, error, canMint, revealed, load, create, remove, dismiss } = useTokens(\n  props.config,\n);\n\nconst label = ref('');\nconst busy = ref(false);\nconst copied = ref(false);\nconst confirming = ref<number | null>(null);\n\n/* ── full mode ──────────────────────────────────────────────────────────\n * ⚠ All four verbs are offered to everyone on purpose. The old copy of this\n * screen hid `write`/`delete` from viewer accounts by reading a store that\n * only the web app has — which is precisely the coupling that kept this\n * surface out of every embed. The server caps each scope against the caller's\n * own role and grants and answers in words worth showing (\"scope 'write' is\n * not available here\"), so asking is never granting and the refusal explains\n * itself. `admin` is not offered at all: the server rejects it outright. */\nconst FULL_SCOPES = ['read', 'write', 'delete', 'mcp'] as const;\nconst scopeState = ref<Record<string, boolean>>({\n  read: true,\n  write: false,\n  delete: false,\n  mcp: false,\n});\nconst rootPath = ref('');\nconst expiresInDays = ref<number | null>(null);\n\nfunction buildScopes(): string {\n  const parts = FULL_SCOPES.filter((s) => scopeState.value[s]) as string[];\n  const root = rootPath.value.trim();\n  if (root) parts.push('root:' + root);\n  return parts.join(',');\n}\n\nonMounted(async () => {\n  await load();\n  emit('active', { hasToken: tokens.value.length > 0 });\n});\n\n/**\n * The name a token gets when the field is left empty — one the user will\n * recognise in the list later.\n *\n * A protocol guide knows both halves: `WebDAV — files.example.com`, the host\n * being the PUBLIC address the guide resolved (connectionsOrigin). The API\n * keys page knows neither, and it used to make a host up from `apiBase`,\n * which is whatever the page happens to talk to: every key on a local\n * instance was called `127.0.0.1:5297`, and that address was printed as the\n * placeholder in the README screenshots. It names the key by the day it was\n * made instead.\n */\nfunction defaultLabel(): string {\n  const p = (props.protocol || '').toUpperCase();\n  if (p) return props.host ? `${p} — ${props.host}` : p;\n  return t('conn.tokens.defaultName', { date: new Date().toISOString().slice(0, 10) });\n}\n\n/** What the empty name field suggests: the saved default on a protocol guide,\n *  an example of a useful name on the API keys page. */\nfunction labelPlaceholder(): string {\n  return props.protocol ? defaultLabel() : t('conn.tokens.namePlaceholder');\n}\n\nasync function mint(): Promise<void> {\n  if (busy.value) return;\n  busy.value = true;\n  copied.value = false;\n  try {\n    if (props.full) {\n      // At least one verb, or the token can do nothing and the server's\n      // refusal would be about the wrong thing.\n      const scopes = buildScopes() || 'read';\n      await create({\n        label: label.value.trim() || defaultLabel(),\n        scopes,\n        expires_in_days: expiresInDays.value && expiresInDays.value > 0\n          ? expiresInDays.value\n          : undefined,\n      });\n      await load();\n      emit('active', { hasToken: tokens.value.length > 0 });\n      label.value = '';\n      rootPath.value = '';\n      return;\n    }\n    // ⚠ `read,write,delete` and nothing more. `share` is a web-surface verb\n    // and `admin` is refused by the server anyway; a token for mounting a\n    // drive should not be able to publish public links. The server caps this\n    // again against the caller's own role, so asking is not granting.\n    await create({ label: label.value.trim() || defaultLabel(), scopes: 'read,write,delete' });\n    await load();\n    emit('active', { hasToken: tokens.value.length > 0 });\n    label.value = '';\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function revoke(row: ApiToken): Promise<void> {\n  if (confirming.value !== row.id) {\n    confirming.value = row.id;\n    return;\n  }\n  confirming.value = null;\n  busy.value = true;\n  try {\n    await remove(row.id);\n    emit('active', { hasToken: tokens.value.length > 0 });\n  } finally {\n    busy.value = false;\n  }\n}\n\nasync function copySecret(): Promise<void> {\n  if (!revealed.value?.token) return;\n  try {\n    await navigator.clipboard.writeText(revealed.value.token);\n    copied.value = true;\n    window.setTimeout(() => (copied.value = false), 1600);\n  } catch {\n    /* clipboard refused (insecure origin, no permission) — the value is on\n       screen and selectable, which is the fallback that always works. */\n  }\n}\n\n/* zaman:z1 — one date formatter for the package. This was a bare\n * `toLocaleDateString()`: the browser's locale and the browser's zone, so a\n * key minted at 23:30 in Istanbul was dated a day early for a viewer reading\n * UTC and came out in the wrong language besides. */\nfunction fmtDate(v?: string | null): string {\n  const ms = new Date(v ?? '').getTime();\n  return Number.isNaN(ms) ? '' : formatDate(ms);\n}\n\nfunction usedLabel(row: ApiToken): string {\n  return row.last_used_at ? fmtDate(row.last_used_at) : t('conn.tokens.neverUsed');\n}\n</script>\n\n<template>\n  <section class=\"fe-s3keys\" data-testid=\"api-tokens\">\n    <header class=\"fe-s3keys__head\">\n      <h4 class=\"fe-s3keys__title\">{{ t('conn.tokens.title') }}</h4>\n      <p class=\"fe-s3keys__lead\">{{ t('conn.tokens.lead') }}</p>\n    </header>\n\n    <p v-if=\"canMint === false\" class=\"fe-s3keys__muted\">{{ t('conn.tokens.cannotMint') }}</p>\n    <p v-if=\"error\" class=\"fe-s3keys__warn\">{{ error }}</p>\n\n    <div v-if=\"canMint && !full\" class=\"fe-s3keys__form\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"labelPlaceholder()\"\n        data-testid=\"token-label\"\n      />\n      <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"token-mint\" @click=\"mint\">\n        {{ t('conn.tokens.mint') }}\n      </button>\n    </div>\n\n    <!-- full — the self-service key manager. Same route, same composable, same\n         list below; only the mint form is richer. -->\n    <div v-else-if=\"canMint\" class=\"fe-tokform\" data-testid=\"token-form-full\">\n      <input\n        v-model=\"label\"\n        class=\"fe-cfield__input\"\n        :placeholder=\"labelPlaceholder()\"\n        data-testid=\"token-label\"\n      />\n\n      <fieldset class=\"fe-tokform__scopes\">\n        <legend class=\"fe-tokform__legend\">{{ t('conn.tokens.scopes') }}</legend>\n        <label v-for=\"s in FULL_SCOPES\" :key=\"s\" class=\"fe-tokform__scope\">\n          <input v-model=\"scopeState[s]\" type=\"checkbox\" :data-testid=\"`token-scope-${s}`\" />\n          <span>{{ s }}</span>\n        </label>\n      </fieldset>\n\n      <label class=\"fe-tokform__field\">\n        <span class=\"fe-tokform__label\">{{ t('conn.tokens.root') }}</span>\n        <input\n          v-model=\"rootPath\"\n          class=\"fe-cfield__input\"\n          :placeholder=\"t('conn.tokens.rootPlaceholder')\"\n          data-testid=\"token-root\"\n        />\n      </label>\n\n      <div class=\"fe-tokform__row\">\n        <label class=\"fe-tokform__field fe-tokform__field--narrow\">\n          <span class=\"fe-tokform__label\">{{ t('conn.tokens.expiry') }}</span>\n          <input\n            v-model.number=\"expiresInDays\"\n            type=\"number\"\n            min=\"0\"\n            class=\"fe-cfield__input\"\n            :placeholder=\"t('conn.tokens.expiryNever')\"\n            data-testid=\"token-expiry\"\n          />\n        </label>\n        <button class=\"fe-s3keys__btn\" :disabled=\"busy\" data-testid=\"token-mint\" @click=\"mint\">\n          {{ t('conn.tokens.mint') }}\n        </button>\n      </div>\n\n      <!-- Said before the refusal rather than after it: the server caps every\n           scope against the account's own role and grants. -->\n      <p class=\"fe-s3keys__hint\">{{ t('conn.tokens.capNote') }}</p>\n    </div>\n\n    <!-- The secret, once. -->\n    <div v-if=\"revealed\" class=\"fe-s3keys__secret\" data-testid=\"token-secret\">\n      <p class=\"fe-s3keys__once\">{{ t('conn.tokens.once') }}</p>\n      <div class=\"fe-s3keys__pair\">\n        <code>{{ revealed.token }}</code>\n        <button class=\"fe-s3keys__copy\" @click=\"copySecret\">\n          {{ copied ? t('conn.guide.copied') : t('conn.guide.copy') }}\n        </button>\n      </div>\n      <button class=\"fe-s3keys__dismiss\" @click=\"dismiss\">\n        {{ t('conn.tokens.dismiss') }}\n      </button>\n    </div>\n\n    <p v-if=\"loading\" class=\"fe-s3keys__muted\">…</p>\n    <div v-else-if=\"tokens.length\" class=\"fe-s3keys__scroll\" :class=\"{ 'is-scrolled-x': scrolledX }\" @scroll.passive=\"onScroll\">\n      <table class=\"fe-s3keys__table\">\n        <thead>\n          <tr>\n            <th>{{ t('conn.tokens.col.label') }}</th>\n            <th>{{ t('conn.tokens.col.scopes') }}</th>\n            <th>{{ t('conn.tokens.col.used') }}</th>\n            <th></th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"row in tokens\" :key=\"row.id\">\n            <td>{{ row.label || '—' }}</td>\n            <td><code>{{ row.scopes }}</code></td>\n            <td>{{ usedLabel(row) }}</td>\n            <td class=\"fe-s3keys__actions\">\n              <button class=\"fe-s3keys__link is-danger\" :disabled=\"busy\" @click=\"revoke(row)\">\n                {{ confirming === row.id ? t('conn.tokens.confirm') : t('conn.tokens.revoke') }}\n              </button>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n    <p v-else-if=\"canMint\" class=\"fe-s3keys__muted\">{{ t('conn.tokens.empty') }}</p>\n\n    <!-- ⚠ Said next to the button rather than in a document nobody opens: a\n         revoked token stops a session that is already open, not only the next\n         login. That is a change in behaviour worth knowing before relying on\n         it, and it is the honest answer to \"how do I stop this machine\". -->\n    <p v-if=\"canMint\" class=\"fe-s3keys__hint\">{{ t('conn.tokens.revokeHint') }}</p>\n  </section>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ConnectionsPanel — storage connections, and how to connect to them.\n *\n * ⚠⚠ This component is the reason the feature exists ONCE. The desktop\n * app, the web app and any embed mount this same file; none of them owns a\n * hand-written copy of the form, the list or the instructions. A fix here\n * lands everywhere on the next release of the package, which is precisely\n * the standing rule (\"never write surface-specific behaviour\") applied to a\n * feature that was asked for on three surfaces at once.\n *\n * Two halves, because they are two different questions:\n *\n *   • INWARD  — \"connect filex to a bucket / a share / a server\". Rendered\n *     entirely from the backend's driver descriptors, so a driver added on\n *     the server needs no frontend release and no surface can drift.\n *   • OUTWARD — \"connect my computer to filex\". Generated from the live\n *     deployment: the real host, the storage name, the caller's own\n *     username, with a copy button.\n *\n * A user who may not manage storages is told so plainly and still gets the\n * outward half — which is the half they actually need. Rendering a form\n * whose every submit 403s would be the dishonest alternative.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { ExplorerConfig, LocaleCode } from '../types/ExplorerConfig';\nimport type { StorageRow } from '../types/Connections';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { useConnections, connectionsOrigin } from '../composables/useConnections';\nimport {\n  buildGuide,\n  guideName,\n  guideProtocols,\n  hostOf,\n  type ProtocolGuide,\n} from '../lib/connectionGuides';\nimport StorageFields from './StorageFields.vue';\nimport ConnectionGuideView from './ConnectionGuideView.vue';\nimport S3KeysPanel from './S3KeysPanel.vue';\nimport SSHKeysPanel from './SSHKeysPanel.vue';\nimport NFSExportsPanel from './NFSExportsPanel.vue';\nimport TokensPanel from './TokensPanel.vue';\nimport { resolveLocale } from '../locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n  /** Which half to open on. */\n  initialTab?: 'storages' | 'connect';\n  /** Draw a close control — the desktop app opens this as a full surface\n   *  and needs a way out; a page-embedded copy has the page's own chrome. */\n  closable?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'changed'): void;\n  (e: 'close'): void;\n  (e: 'error', err: { message: string }): void;\n}>();\n\nconst locale = computed<LocaleCode>(() => resolveLocale(props.config.locale));\nconst { t } = useLocale(locale);\n\n// Destructured on purpose: Vue only auto-unwraps refs that are top-level in\n// the setup scope, so `conn.storages` inside a template would render a Ref\n// object rather than its value.\nconst {\n  drivers,\n  storages,\n  visible,\n  me,\n  publicUrl,\n  loading,\n  loaded,\n  error,\n  canManage,\n  denial,\n  load,\n  createStorage,\n  updateStorage,\n  deleteStorage,\n  testStorage,\n  descriptor,\n  fields,\n  defaults,\n  missingRequired,\n} = useConnections(props.config);\n\n// ── theme ────────────────────────────────────────────────────────────\n// Resolved in JS rather than left to `prefers-color-scheme`, because the\n// stylesheet's auto rule keys off the explorer's own `.fe` root and this\n// panel is mounted on its own.\nconst mq =\n  typeof window !== 'undefined' && window.matchMedia\n    ? window.matchMedia('(prefers-color-scheme: dark)')\n    : undefined;\nconst osDark = ref(!!mq?.matches);\nfunction onMq(e: MediaQueryListEvent) {\n  osDark.value = e.matches;\n}\nconst themeResolved = computed(() => {\n  const mode = props.config.theme ?? 'auto';\n  if (mode === 'light' || mode === 'dark') return mode;\n  return osDark.value ? 'dark' : 'light';\n});\n\n// ── tabs ─────────────────────────────────────────────────────────────\nconst tab = ref<'storages' | 'connect'>(props.initialTab ?? 'storages');\n\n// ── inward: the storage form ─────────────────────────────────────────\ntype FormMode = { kind: 'none' } | { kind: 'new' } | { kind: 'edit'; row: StorageRow };\nconst form = ref<FormMode>({ kind: 'none' });\nconst fName = ref('');\nconst fDriver = ref('');\nconst fReadOnly = ref(false);\nconst fEnabled = ref(true);\nconst fConfig = ref<Record<string, unknown>>({});\nconst fInvalid = ref<string[]>([]);\nconst saving = ref(false);\nconst testing = ref(false);\nconst testResult = ref<{ ok: boolean; error?: string; object_count?: number } | null>(null);\n\n/** What the NFS panel published: where to mount, and the path just minted. */\nconst nfs = ref<{ host: string; port: number; enabled: boolean; path?: string; readOnly: boolean } | null>(\n  null,\n);\nconst formError = ref<string | null>(null);\nconst confirmDelete = ref<number | null>(null);\n\nconst driverOptions = computed(() =>\n  drivers.value.map((d) => {\n    const translated = t(d.i18n_key);\n    return { value: d.driver, label: translated === d.i18n_key ? d.label : translated };\n  }),\n);\n\nconst formFields = computed(() => fields(fDriver.value));\n\nfunction openNew() {\n  const first = drivers.value[0]?.driver ?? '';\n  fDriver.value = first;\n  fName.value = '';\n  fReadOnly.value = false;\n  fEnabled.value = true;\n  fConfig.value = defaults(first);\n  fInvalid.value = [];\n  testResult.value = null;\n  formError.value = null;\n  form.value = { kind: 'new' };\n}\n\nfunction openEdit(row: StorageRow) {\n  fDriver.value = row.driver;\n  fName.value = row.name;\n  fReadOnly.value = !!row.read_only;\n  fEnabled.value = row.enabled !== false;\n  // A copy: editing must not mutate the list row under the user while\n  // they type, and cancelling must actually cancel.\n  fConfig.value = { ...(row.config ?? {}) };\n  fInvalid.value = [];\n  testResult.value = null;\n  formError.value = null;\n  form.value = { kind: 'edit', row };\n}\n\nfunction closeForm() {\n  form.value = { kind: 'none' };\n  testResult.value = null;\n  formError.value = null;\n}\n\nfunction onDriverChange(next: string) {\n  fDriver.value = next;\n  // Descriptor defaults, wholesale. Carrying keys over from the previous\n  // driver is how a config ends up with fields nothing reads.\n  fConfig.value = defaults(next);\n  fInvalid.value = [];\n  testResult.value = null;\n}\n\nfunction validate(): boolean {\n  const missing = missingRequired(fDriver.value, fConfig.value).map((f) => f.key);\n  fInvalid.value = missing;\n  if (!fName.value.trim()) formError.value = t('conn.form.nameRequired');\n  else if (missing.length) formError.value = t('conn.form.fillRequired');\n  else formError.value = null;\n  return !formError.value;\n}\n\nasync function runTest() {\n  testing.value = true;\n  testResult.value = null;\n  try {\n    testResult.value = await testStorage({\n      driver: fDriver.value,\n      config: fConfig.value,\n    });\n  } finally {\n    testing.value = false;\n  }\n}\n\nasync function save() {\n  if (!validate()) return;\n  saving.value = true;\n  formError.value = null;\n  try {\n    const body = {\n      name: fName.value.trim(),\n      driver: fDriver.value,\n      config: fConfig.value,\n      read_only: fReadOnly.value,\n      enabled: fEnabled.value,\n    };\n    if (form.value.kind === 'edit') await updateStorage(form.value.row.id, body);\n    else await createStorage(body);\n    closeForm();\n    emit('changed');\n  } catch (e) {\n    const msg = (e as { detail?: string; message?: string }) ?? {};\n    // The backend's own words beat a generic status line: \"400\" says\n    // nothing, `ROOT_PATH_FORBIDDEN` says exactly which field is wrong.\n    let detail = '';\n    try {\n      detail = msg.detail ? (JSON.parse(msg.detail) as { error?: string }).error ?? '' : '';\n    } catch {\n      detail = msg.detail ?? '';\n    }\n    formError.value = detail || msg.message || String(e);\n    emit('error', { message: formError.value });\n  } finally {\n    saving.value = false;\n  }\n}\n\nasync function remove(row: StorageRow) {\n  if (confirmDelete.value !== row.id) {\n    confirmDelete.value = row.id;\n    return;\n  }\n  confirmDelete.value = null;\n  try {\n    await deleteStorage(row.id);\n    emit('changed');\n  } catch (e) {\n    emit('error', { message: (e as Error).message });\n  }\n}\n\n/** The one line under a storage's name: where it actually points. */\nfunction summaryOf(row: StorageRow): string {\n  const d = descriptor(row.driver);\n  const cfg = row.config ?? {};\n  const parts: string[] = [];\n  const rootField = d?.fields.find((f) => f.root);\n  const pick = (key: string, aliases: string[] = []): string => {\n    for (const k of [key, ...aliases]) {\n      const v = cfg[k];\n      if (typeof v === 'string' && v.trim()) return v;\n    }\n    return '';\n  };\n  const host = pick('endpoint') || pick('url') || pick('host');\n  if (host) parts.push(host);\n  const bucket = pick('bucket');\n  if (bucket) parts.push(bucket);\n  if (rootField) {\n    const r = pick(rootField.key, rootField.aliases ?? []);\n    if (r) parts.push(r);\n  }\n  return parts.join(' · ');\n}\n\n// ── outward: the guides ──────────────────────────────────────────────\nconst protocols = guideProtocols();\nconst protocol = ref(protocols[0] ?? 'webdav');\nconst guideStorage = ref<string>('');\n\nconst origin = computed(() => connectionsOrigin(props.config, publicUrl.value));\n\n/**\n * What the S3 key panel published: the caller's own key, the endpoint the\n * SERVER computed, and whether path-style is mandatory.\n *\n * ⚠ The endpoint is not derived here. With a dedicated host it is a different\n * host from the application, and a guide that assembled it from the page\n * origin would print a URL that reaches the web app — which is exactly how the\n * first real-client run failed.\n */\nconst s3 = ref<{ accessKeyID: string; secret?: string; endpoint: string; pathStyle: boolean } | null>(\n  null,\n);\n\n/**\n * What the SSH key panel published: where the SFTP endpoint listens, the login\n * name the account actually uses, and whether a key is registered.\n *\n * ⚠ The port comes from the SERVER. SFTP is raw TCP on a port of its own, and a\n * page that printed the web port would send every client at a proxy that speaks\n * only HTTP.\n */\nconst sftp = ref<{\n  host: string;\n  port: number;\n  login: string;\n  enabled: boolean;\n  hasKey: boolean;\n  ftps?: { enabled: boolean; host: string; port: number; pasv_min: number; pasv_max: number; self_signed: boolean };\n} | null>(null);\n\nconst guide = computed<ProtocolGuide | null>(() =>\n  buildGuide(\n    protocol.value,\n    {\n      origin: origin.value,\n      user: me.value?.email ?? '',\n      storages: visible.value,\n      storage: guideStorage.value || undefined,\n      s3Endpoint: s3.value?.endpoint,\n      s3PathStyle: s3.value?.pathStyle,\n      s3AccessKeyID: s3.value?.accessKeyID || undefined,\n      s3Secret: s3.value?.secret,\n      sftpHost: sftp.value?.host || undefined,\n      sftpPort: sftp.value?.port,\n      sftpEnabled: sftp.value?.enabled,\n      sftpLogin: sftp.value?.login || undefined,\n      sftpHasKey: sftp.value?.hasKey,\n      ftpsHost: sftp.value?.ftps?.host || undefined,\n      ftpsPort: sftp.value?.ftps?.port,\n      ftpsEnabled: sftp.value?.ftps?.enabled,\n      ftpsPasvMin: sftp.value?.ftps?.pasv_min,\n      ftpsPasvMax: sftp.value?.ftps?.pasv_max,\n      ftpsSelfSigned: sftp.value?.ftps?.self_signed,\n      nfsHost: nfs.value?.host || undefined,\n      nfsPort: nfs.value?.port,\n      nfsEnabled: nfs.value?.enabled,\n      nfsPath: nfs.value?.path,\n      nfsReadOnly: nfs.value?.readOnly,\n    },\n    t,\n  ),\n);\n\nwatch(\n  () => visible.value,\n  (names) => {\n    if (!guideStorage.value && names.length === 1) guideStorage.value = names[0];\n  },\n);\n\n// ── lifecycle ────────────────────────────────────────────────────────\nonMounted(() => {\n  mq?.addEventListener?.('change', onMq);\n  void load();\n});\nonBeforeUnmount(() => mq?.removeEventListener?.('change', onMq));\n\n// The panel is often mounted once and re-pointed (the desktop app switches\n// accounts without tearing the window down), so a changed server must\n// re-fetch rather than keep showing the previous one's storages.\nwatch(\n  () => [props.config.apiBase, props.config.endpoint],\n  () => {\n    closeForm();\n    void load();\n  },\n);\n</script>\n\n<template>\n  <div\n    class=\"fe-conn\"\n    :class=\"{\n      'fe--theme-dark': themeResolved === 'dark',\n      'fe--theme-light': themeResolved === 'light',\n    }\"\n    data-testid=\"connections-panel\"\n  >\n    <header class=\"fe-conn__head\">\n      <div>\n        <h2 class=\"fe-conn__title\">{{ t('conn.title') }}</h2>\n        <p class=\"fe-conn__sub\">{{ t('conn.subtitle', { host: hostOf(origin) }) }}</p>\n      </div>\n      <button\n        v-if=\"closable\"\n        type=\"button\"\n        class=\"fe-conn__btn\"\n        data-testid=\"connections-close\"\n        :aria-label=\"t('conn.close')\"\n        @click=\"emit('close')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n      </button>\n    </header>\n\n    <nav class=\"fe-conn__tabs\" role=\"tablist\">\n      <button\n        type=\"button\"\n        role=\"tab\"\n        class=\"fe-conn__tab\"\n        :class=\"{ 'is-active': tab === 'storages' }\"\n        :aria-selected=\"tab === 'storages'\"\n        data-testid=\"tab-storages\"\n        @click=\"tab = 'storages'\"\n      >\n        {{ t('conn.tab.storages') }}\n      </button>\n      <button\n        type=\"button\"\n        role=\"tab\"\n        class=\"fe-conn__tab\"\n        :class=\"{ 'is-active': tab === 'connect' }\"\n        :aria-selected=\"tab === 'connect'\"\n        data-testid=\"tab-connect\"\n        @click=\"tab = 'connect'\"\n      >\n        {{ t('conn.tab.connect') }}\n      </button>\n    </nav>\n\n    <!-- ══ inward ════════════════════════════════════════════════ -->\n    <section v-if=\"tab === 'storages'\" class=\"fe-conn__body\" role=\"tabpanel\">\n      <p v-if=\"loading && !loaded\" class=\"fe-conn__muted\">\n        {{ t('conn.loading') }}\n      </p>\n\n      <template v-else>\n        <!-- The honest non-admin state. Not a disabled form: a form you\n             cannot submit teaches the wrong thing about whose install this\n             is. -->\n        <div\n          v-if=\"canManage === false\"\n          class=\"fe-conn__card fe-conn__card--notice\"\n          data-testid=\"no-admin\"\n        >\n          <strong>{{ t('conn.denied.title') }}</strong>\n          <p class=\"fe-conn__muted\">\n            {{\n              denial === 'anonymous'\n                ? t('conn.denied.anonymous')\n                : denial === 'unreachable'\n                  ? t('conn.denied.unreachable', { error: error ?? '' })\n                  : t('conn.denied.none')\n            }}\n          </p>\n          <p class=\"fe-conn__muted\">{{ t('conn.denied.guideHint') }}</p>\n          <button type=\"button\" class=\"fe-conn__btn fe-conn__btn--primary\" @click=\"tab = 'connect'\">\n            {{ t('conn.denied.guideCta') }}\n          </button>\n        </div>\n\n        <!-- What they CAN see, even without admin: the storages they may\n             browse. Otherwise this half of the panel is blank for them. -->\n        <div v-if=\"canManage === false && visible.length\" class=\"fe-conn__list\">\n          <div v-for=\"name in visible\" :key=\"name\" class=\"fe-conn__card\">\n            <div class=\"fe-conn__rowmain\">\n              <strong class=\"fe-conn__name\">{{ name }}</strong>\n              <span class=\"fe-conn__muted\">{{ t('conn.visibleOnly') }}</span>\n            </div>\n          </div>\n        </div>\n\n        <template v-if=\"canManage\">\n          <p v-if=\"error\" class=\"fe-conn__error\">{{ error }}</p>\n\n          <!-- ── the form ── -->\n          <div v-if=\"form.kind !== 'none'\" class=\"fe-conn__card fe-conn__form\" data-testid=\"storage-form\">\n            <h3 class=\"fe-conn__formtitle\">\n              {{ form.kind === 'edit' ? t('conn.form.editTitle', { name: fName }) : t('conn.form.newTitle') }}\n            </h3>\n\n            <div class=\"fe-cfield__row\">\n              <label class=\"fe-cfield__label\" for=\"fe-conn-name\">\n                {{ t('conn.form.name') }}<span class=\"fe-cfield__req\">*</span>\n              </label>\n              <input\n                id=\"fe-conn-name\"\n                v-model=\"fName\"\n                class=\"fe-cfield__input\"\n                data-testid=\"storage-name\"\n                :placeholder=\"t('conn.form.namePlaceholder')\"\n              />\n              <p class=\"fe-cfield__help\">{{ t('conn.form.nameHelp') }}</p>\n            </div>\n\n            <div class=\"fe-cfield__row\">\n              <label class=\"fe-cfield__label\" for=\"fe-conn-driver\">{{ t('conn.form.driver') }}</label>\n              <select\n                id=\"fe-conn-driver\"\n                class=\"fe-cfield__input\"\n                data-testid=\"storage-driver\"\n                :value=\"fDriver\"\n                :disabled=\"form.kind === 'edit'\"\n                @change=\"onDriverChange(($event.target as HTMLSelectElement).value)\"\n              >\n                <option v-for=\"o in driverOptions\" :key=\"o.value\" :value=\"o.value\">\n                  {{ o.label }}\n                </option>\n              </select>\n              <p v-if=\"form.kind === 'edit'\" class=\"fe-cfield__help\">\n                {{ t('conn.form.driverLocked') }}\n              </p>\n            </div>\n\n            <StorageFields\n              v-model=\"fConfig\"\n              :fields=\"formFields\"\n              :locale=\"locale\"\n              :invalid=\"fInvalid\"\n            />\n\n            <label class=\"fe-cfield__check\">\n              <input v-model=\"fReadOnly\" type=\"checkbox\" data-testid=\"storage-readonly\" />\n              <span>{{ t('conn.form.readOnly') }}</span>\n            </label>\n            <label class=\"fe-cfield__check\">\n              <input v-model=\"fEnabled\" type=\"checkbox\" />\n              <span>{{ t('conn.form.enabled') }}</span>\n            </label>\n\n            <p v-if=\"formError\" class=\"fe-conn__error\" data-testid=\"form-error\">{{ formError }}</p>\n            <p\n              v-if=\"testResult\"\n              class=\"fe-conn__testresult\"\n              :class=\"testResult.ok ? 'is-ok' : 'is-bad'\"\n              data-testid=\"test-result\"\n            >\n              {{\n                testResult.ok\n                  ? t('conn.form.testOk', { count: testResult.object_count ?? 0 })\n                  : t('conn.form.testFail', { error: testResult.error ?? '' })\n              }}\n            </p>\n\n            <div class=\"fe-conn__actions\">\n              <button\n                type=\"button\"\n                class=\"fe-conn__btn\"\n                data-testid=\"storage-test\"\n                :disabled=\"testing\"\n                @click=\"runTest\"\n              >\n                {{ testing ? t('conn.form.testing') : t('conn.form.test') }}\n              </button>\n              <button\n                type=\"button\"\n                class=\"fe-conn__btn fe-conn__btn--primary\"\n                data-testid=\"storage-save\"\n                :disabled=\"saving\"\n                @click=\"save\"\n              >\n                {{ saving ? t('conn.form.saving') : t('conn.form.save') }}\n              </button>\n              <button type=\"button\" class=\"fe-conn__btn\" @click=\"closeForm\">\n                {{ t('conn.form.cancel') }}\n              </button>\n            </div>\n          </div>\n\n          <!-- ── the list ── -->\n          <div v-else>\n            <div class=\"fe-conn__listhead\">\n              <span class=\"fe-conn__muted\">\n                {{ t('conn.list.count', { n: storages.length }) }}\n              </span>\n              <button\n                type=\"button\"\n                class=\"fe-conn__btn fe-conn__btn--primary\"\n                data-testid=\"storage-add\"\n                @click=\"openNew\"\n              >\n                + {{ t('conn.list.add') }}\n              </button>\n            </div>\n\n            <p v-if=\"!storages.length\" class=\"fe-conn__empty\">\n              {{ t('conn.list.empty') }}\n            </p>\n\n            <div class=\"fe-conn__list\" data-testid=\"storage-list\">\n              <div v-for=\"row in storages\" :key=\"row.id\" class=\"fe-conn__card\">\n                <div class=\"fe-conn__rowmain\">\n                  <div class=\"fe-conn__rowtext\">\n                    <strong class=\"fe-conn__name\">{{ row.name }}</strong>\n                    <span class=\"fe-conn__badge\">{{ row.driver }}</span>\n                    <span v-if=\"row.read_only\" class=\"fe-conn__badge fe-conn__badge--warn\">\n                      {{ t('conn.list.readOnly') }}\n                    </span>\n                    <span v-if=\"row.enabled === false\" class=\"fe-conn__badge\">\n                      {{ t('conn.list.disabled') }}\n                    </span>\n                    <div v-if=\"summaryOf(row)\" class=\"fe-conn__muted fe-conn__summary\">\n                      {{ summaryOf(row) }}\n                    </div>\n                  </div>\n                  <div class=\"fe-conn__rowbtns\">\n                    <button\n                      type=\"button\"\n                      class=\"fe-conn__btn\"\n                      :data-testid=\"`storage-edit-${row.name}`\"\n                      @click=\"openEdit(row)\"\n                    >\n                      {{ t('conn.list.edit') }}\n                    </button>\n                    <button\n                      type=\"button\"\n                      class=\"fe-conn__btn fe-conn__btn--danger\"\n                      @click=\"remove(row)\"\n                    >\n                      {{ confirmDelete === row.id ? t('conn.list.confirm') : t('conn.list.remove') }}\n                    </button>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </template>\n      </template>\n    </section>\n\n    <!-- ══ outward ═══════════════════════════════════════════════ -->\n    <section v-else class=\"fe-conn__body\" role=\"tabpanel\">\n      <div class=\"fe-conn__guidebar\">\n        <label v-if=\"protocols.length > 1\" class=\"fe-conn__pick\">\n          <span class=\"fe-cfield__label\">{{ t('conn.guide.protocol') }}</span>\n          <select v-model=\"protocol\" class=\"fe-cfield__input\" data-testid=\"guide-protocol\">\n            <option v-for=\"p in protocols\" :key=\"p\" :value=\"p\">{{ guideName(p) }}</option>\n          </select>\n        </label>\n        <label class=\"fe-conn__pick\">\n          <span class=\"fe-cfield__label\">{{ t('conn.guide.storage') }}</span>\n          <select v-model=\"guideStorage\" class=\"fe-cfield__input\" data-testid=\"guide-storage\">\n            <option value=\"\">{{ t('conn.guide.allStorages') }}</option>\n            <option v-for=\"s in visible\" :key=\"s\" :value=\"s\">{{ s }}</option>\n          </select>\n        </label>\n      </div>\n\n      <!-- The keys come first: the guide below is filled in from whichever\n           key is active, so minting one rewrites every command on the page. -->\n      <S3KeysPanel\n        v-if=\"protocol === 's3'\"\n        :config=\"config\"\n        :storages=\"visible\"\n        @active=\"s3 = $event\"\n      />\n\n      <!-- The same shape for SFTP: the credential first, because the commands\n           below are only worth anything with a real login name in them. -->\n      <!-- Mounted for FTPS too: it is the same call that reports where the FTP\n           endpoint listens, and the login name is the same one. -->\n      <SSHKeysPanel\n        v-if=\"protocol === 'sftp' || protocol === 'ftps'\"\n        :config=\"config\"\n        :keys-visible=\"protocol === 'sftp'\"\n        @active=\"sftp = $event\"\n      />\n\n      <NFSExportsPanel\n        v-if=\"protocol === 'nfs'\"\n        :config=\"config\"\n        :storages=\"visible\"\n        @active=\"nfs = $event\"\n      />\n\n      <!-- ⚠⚠ The credential for the other three. FTPS, WebDAV and `filex\n           mount` all take an API TOKEN as the password — the guides below say\n           so — and until this panel existed the only place to mint one was the\n           admin panel, so a normal user read the instruction and had nowhere\n           to follow it. Same component on all three surfaces. -->\n      <TokensPanel\n        v-if=\"protocol === 'ftps' || protocol === 'webdav' || protocol === 'mount'\"\n        :config=\"config\"\n        :protocol=\"protocol\"\n        :host=\"hostOf(origin)\"\n      />\n\n      <ConnectionGuideView v-if=\"guide\" :guide=\"guide\" :locale=\"locale\" />\n    </section>\n  </div>\n</template>\n\n<style>\n.fe-conn {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  font-family: var(--fe-font);\n  font-size: 14px;\n  color: var(--fe-text);\n  /* ⚠ No painted ground. This is a SECTION of whatever page mounts it, not a\n     full-bleed app like the explorer, and every host paints its own page:\n     the web admin's dark shell is zinc #09090b, the desktop's is #14181d,\n     the light shells are #fafafa / #ffffff. `background: var(--fe-bg)`\n     (#0f1419 / #ffffff) drew a slightly-different rectangle behind the\n     panel that ended where the panel ended — measured on demo.filex.sh\n     2026-08-18 in dark mode: a blue-black box on a zinc page, cards and\n     inputs inside it on their own tint. The tokens still colour the cards,\n     inputs and buttons; only the page ground belongs to the host. */\n  background: transparent;\n  min-width: 0;\n}\n/* An explicit light palette, so a panel asked for light stays light even\n   inside a host that publishes dark tokens at :root (the admin shell sets\n   `.dark` on <html>). Without this, \"light\" only means \"not dark\". */\n.fe-conn.fe--theme-light {\n  --fe-bg: #ffffff;\n  --fe-bg-elev: #f7f8fa;\n  --fe-bg-hover: #edf0f5;\n  --fe-border: #e2e6ed;\n  --fe-border-strong: #c7ced9;\n  --fe-text: #1a1e27;\n  --fe-text-muted: #5a6475;\n  --fe-primary: #2f6fe0;\n  --fe-danger: #dc2626;\n}\n.fe-conn__head {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 16px;\n}\n/* ⚠ The component renders into the HOST's document (shadowRoot: false, on\n   purpose — Tailwind, OS dark mode and the host's fonts are meant to reach\n   it). That also means the host's element selectors reach it: the desktop\n   shell styles `h2 { text-transform: uppercase; letter-spacing: .05em }`\n   for its own section headings, and the panel's title came out\n   \"STORAGE CONNECTIONS\" there while the web app rendered\n   \"Storage connections\". Same component, two typographies, decided by\n   whichever page it landed on — which is the split this package exists to\n   prevent. Headings state their own type. */\n.fe-conn h2,\n.fe-conn h3,\n.fe-conn h4 {\n  text-transform: none;\n  letter-spacing: normal;\n}\n.fe-conn__title {\n  margin: 0;\n  font-size: 17px;\n  font-weight: 650;\n}\n.fe-conn__sub {\n  margin: 3px 0 0;\n  color: var(--fe-text-muted);\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__tabs {\n  display: flex;\n  gap: 4px;\n  border-bottom: 1px solid var(--fe-border);\n}\n.fe-conn__tab {\n  font: inherit;\n  font-size: 13.5px;\n  border: 0;\n  background: none;\n  color: var(--fe-text-muted);\n  padding: 7px 12px;\n  cursor: pointer;\n  border-bottom: 2px solid transparent;\n}\n.fe-conn__tab:hover {\n  color: var(--fe-text);\n}\n.fe-conn__tab.is-active {\n  color: var(--fe-primary);\n  border-bottom-color: var(--fe-primary);\n  font-weight: 600;\n}\n.fe-conn__body {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  min-width: 0;\n}\n.fe-conn__card {\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg-elev);\n  padding: 12px 14px;\n}\n.fe-conn__card--notice {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  align-items: flex-start;\n}\n.fe-conn__form {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n}\n.fe-conn__formtitle {\n  margin: 0;\n  font-size: 14px;\n  font-weight: 650;\n}\n.fe-conn__list {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n.fe-conn__listhead {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  margin-bottom: 4px;\n}\n.fe-conn__rowmain {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.fe-conn__rowtext {\n  min-width: 0;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n.fe-conn__rowbtns {\n  display: flex;\n  gap: 6px;\n  flex: 0 0 auto;\n}\n.fe-conn__name {\n  font-size: 14px;\n}\n.fe-conn__summary {\n  flex-basis: 100%;\n  font-family: var(--fe-font-mono);\n  font-size: 12px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__badge {\n  font-size: 11px;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  border: 1px solid var(--fe-border-strong);\n  border-radius: 999px;\n  padding: 1px 8px;\n  color: var(--fe-text-muted);\n}\n.fe-conn__badge--warn {\n  color: var(--fe-danger);\n  border-color: var(--fe-danger);\n}\n.fe-conn__muted {\n  color: var(--fe-text-muted);\n  font-size: 12.5px;\n  margin: 0;\n  line-height: 1.5;\n}\n.fe-conn__empty {\n  border: 1px dashed var(--fe-border-strong);\n  border-radius: var(--fe-radius);\n  padding: 16px;\n  color: var(--fe-text-muted);\n  font-size: 13px;\n  margin: 0;\n}\n.fe-conn__error {\n  margin: 0;\n  color: var(--fe-danger);\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__testresult {\n  margin: 0;\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.fe-conn__testresult.is-ok {\n  color: #16a34a;\n}\n.fe-conn__testresult.is-bad {\n  color: var(--fe-danger);\n}\n.fe-conn__actions {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n.fe-conn__btn {\n  font: inherit;\n  font-size: 13px;\n  padding: 6px 12px;\n  border-radius: var(--fe-radius);\n  border: 1px solid var(--fe-border-strong);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  cursor: pointer;\n}\n.fe-conn__btn:hover:not(:disabled) {\n  border-color: var(--fe-primary);\n}\n.fe-conn__btn:disabled {\n  opacity: 0.55;\n  cursor: default;\n}\n.fe-conn__btn--primary {\n  background: var(--fe-primary);\n  border-color: var(--fe-primary);\n  color: #fff;\n}\n.fe-conn__btn--danger {\n  color: var(--fe-danger);\n}\n.fe-conn__guidebar {\n  display: flex;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.fe-conn__pick {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  min-width: 180px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * CommandPalette — Ctrl/Cmd+K quick launcher.\n *\n * Sources (no new backend calls — everything comes from props):\n *   1. Files/folders of the CURRENT listing (`files` prop), filtered by a\n *      tiny scored-includes matcher (no fuzzy-search dependency).\n *   2. Commands mapped 1:1 onto existing FileExplorer actions, surfaced as\n *      individual emits so the host wires each to code it already has.\n *   3. Path jump: any query containing `/` offers a \"go to path\" entry.\n *\n * Keyboard: ↑/↓ move, Enter selects, Esc closes; the listener sits on the\n * document in CAPTURE phase so it wins over useKeyboardShortcuts' window\n * handler (otherwise Enter would also fire the explorer's own onOpen).\n *\n * bul:s3 additions:\n *   4. \"Everywhere\" group — ≥3-char queries also hit the global files-search\n *      endpoint (debounced 250ms, max 8 rows) via the `globalSearch` prop.\n *      Content matches get an \"In content\" badge + a «»-highlighted snippet\n *      rendered as pure text nodes (no innerHTML).\n *   5. Saved searches — localStorage-backed (`filex.saved-searches`, max 10);\n *      \"save current query\" command + per-row delete.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { GlobalSearchHit } from '../composables/useFileApi';\nimport { matchedInContent, snippetSegments } from '../lib/snippet';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  files: FileNode[];\n  viewMode: ViewMode;\n  /** Gates the mutating commands (new folder / upload). */\n  canWrite?: boolean;\n  /** Gates the \"up one level\" command. */\n  canGoUp?: boolean;\n  /* bul:s3 — global search callback; absent = older host, group hidden. */\n  globalSearch?: (q: string) => Promise<GlobalSearchHit[]>;\n  /* wiring:d1 — false hides the split command (narrow embeds). */\n  splitEnabled?: boolean;\n  /**\n   * surucu:d1 — the query this palette opens WITH.\n   *\n   * The drive shell's header field searches the folder you are in; ⌘K from\n   * inside it opens this palette carrying the same words, so \"not in this\n   * folder — try everywhere\" costs no retyping. Empty (the default) is the\n   * behaviour every other caller has had: a blank palette.\n   */\n  initialQuery?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'open-node', node: FileNode): void;\n  (e: 'navigate', path: string): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'toggle-view'): void;\n  (e: 'open-trash'): void;\n  (e: 'refresh'): void;\n  (e: 'go-up'): void;\n  /* bul:s3 — an \"everywhere\" hit was chosen. */\n  (e: 'open-hit', hit: GlobalSearchHit): void;\n  /* wiring:int — settings surfaces reachable from anywhere via the palette */\n  (e: 'open-theme'): void;\n  (e: 'open-shortcut-settings'): void;\n  (e: 'start-tour'): void;\n  /* wiring:d1 — tab / split commands */\n  (e: 'tab-new'): void;\n  (e: 'split-toggle'): void;\n}>();\n\nconst { t, nodeDisplayName } = useLocale(() => props.locale);\n\nconst query = ref('');\nconst active = ref(0);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\ntype PaletteItem =\n  | { kind: 'goto'; id: string; label: string; icon: string; path: string }\n  | { kind: 'file'; id: string; label: string; icon: string; node: FileNode }\n  | { kind: 'command'; id: string; label: string; icon: string; command: string }\n  /* bul:s3 — everywhere hit / saved search / save-current-query. */\n  | { kind: 'hit'; id: string; label: string; icon: string; hit: GlobalSearchHit; crumb: string; inContent: boolean; snippet: string }\n  | { kind: 'saved'; id: string; label: string; icon: string; query: string }\n  | { kind: 'save'; id: string; label: string; icon: string; query: string };\n\n/* bul:s3 — narrowed aliases so the template doesn't need kind-guards. */\ntype HitItem = Extract<PaletteItem, { kind: 'hit' }>;\ntype SavedGroupItem = Extract<PaletteItem, { kind: 'saved' | 'save' }>;\n\n/* === ikon:emoji — the palette's marks =================================\n *\n * `icon` used to be the glyph itself and the template printed it as TEXT:\n * `➜ 📁 📄 ⬆ ▦ 🗑 ⟳ ↑ 🎨 ⌨ 🎓 ⧉ ◫ 💾 🔖`, i.e. two colour-emoji sets, a\n * geometric-shapes set and an arrows set, in one 20px column — beside a\n * context menu and a toolbar that draw the same actions from\n * `lib/actionIcons`. It is a KEY now, resolved the way ContextMenu resolves\n * a row's key, and the two groups that list FILES resolve through\n * `lib/fileIcons` instead, so a result row in the palette wears the same\n * tile as the same file in the listing behind it.\n */\n\n/** `name.ext` → `ext`, for a search hit (which carries no `extension`). */\nfunction extOf(name: string): string {\n  const dot = name.lastIndexOf('.');\n  return dot > 0 ? name.slice(dot + 1) : '';\n}\n\n/**\n * The row's mark. Static markup from our own two icon modules — never a\n * string that came off the wire, which is what lets the template v-html it.\n */\nfunction iconHtml(it: PaletteItem): string {\n  if (it.kind === 'file') return fileIconTile(it.node);\n  if (it.kind === 'hit') {\n    const name = String(it.hit.name ?? '');\n    return fileIconTile({\n      type: it.hit.type === 'dir' ? 'dir' : 'file',\n      extension: extOf(name),\n      basename: name,\n    });\n  }\n  return actionIconSvg(it.icon);\n}\n\n/**\n * Scored includes: -1 = no match; otherwise earlier + prefix matches rank\n * higher and shorter names get a small edge. Good enough without a fuzzy\n * dependency.\n */\nfunction matchScore(label: string, q: string): number {\n  if (!q) return 0;\n  const n = label.toLocaleLowerCase();\n  const s = q.toLocaleLowerCase();\n  const i = n.indexOf(s);\n  if (i === -1) return -1;\n  let sc = 100 - Math.min(i, 50);\n  if (i === 0) sc += 40;\n  sc -= Math.min(n.length, 40) / 4;\n  return sc;\n}\n\nconst gotoItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  if (!q.includes('/')) return [];\n  const clean = q.replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return [];\n  return [\n    { kind: 'goto', id: `goto:${clean}`, label: `${t('palette.goto')}: ${clean}`, icon: 'goto', path: clean },\n  ];\n});\n\nconst fileItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  const scored = props.files\n    .map((f) => ({ f, name: nodeDisplayName(f), s: matchScore(nodeDisplayName(f), q) }))\n    .filter((r) => r.s >= 0);\n  if (q) scored.sort((a, b) => b.s - a.s);\n  return scored.slice(0, 8).map((r) => ({\n    kind: 'file' as const,\n    id: `file:${r.f.path}`,\n    label: r.name,\n    icon: '', // file rows draw their real tile — see iconHtml()\n    node: r.f,\n  }));\n});\n\nconst commandItems = computed<PaletteItem[]>(() => {\n  const q = query.value.trim();\n  const defs: Array<{ command: string; label: string; icon: string; enabled: boolean }> = [\n    { command: 'new-folder', label: t('toolbar.new_folder'), icon: 'new-folder', enabled: props.canWrite !== false },\n    { command: 'upload', label: t('toolbar.upload'), icon: 'upload', enabled: props.canWrite !== false },\n    /* wiring:d2 — the mark is the NEXT mode (list→grid→gallery→list), which is\n       what pressing the row gets you; the three keys are the ViewSwitcher's own. */\n    { command: 'toggle-view', label: t('cmd.view_toggle'), icon: props.viewMode === 'list' ? 'view-grid' : props.viewMode === 'grid' ? 'view-gallery' : 'view-list', enabled: true },\n    { command: 'open-trash', label: t('cmd.trash'), icon: 'open-trash', enabled: true },\n    { command: 'refresh', label: t('toolbar.refresh'), icon: 'refresh', enabled: true },\n    { command: 'go-up', label: t('toolbar.go_up'), icon: 'go-up', enabled: props.canGoUp !== false },\n    /* wiring:int */\n    { command: 'open-theme', label: t('theme.menu'), icon: 'theme', enabled: true },\n    { command: 'open-shortcut-settings', label: t('shortcuts.settings.menu'), icon: 'shortcut-settings', enabled: true },\n    { command: 'start-tour', label: t('tour.restart'), icon: 'tour', enabled: true },\n    /* wiring:d1 — tabs + split */\n    { command: 'tab-new', label: t('cmd.tab_new'), icon: 'tab-new', enabled: true },\n    { command: 'split-toggle', label: t('cmd.split_toggle'), icon: 'split', enabled: props.splitEnabled !== false },\n  ];\n  return defs\n    .filter((d) => d.enabled && matchScore(d.label, q) >= 0)\n    .map((d) => ({ kind: 'command' as const, id: `cmd:${d.command}`, label: d.label, icon: d.icon, command: d.command }));\n});\n\n/* === bul:s3 — \"everywhere\" global search ================================ */\n\nconst EVERYWHERE_MIN_CHARS = 3;\nconst EVERYWHERE_LIMIT = 8;\nconst EVERYWHERE_DEBOUNCE_MS = 250;\n\nconst everywhere = ref<GlobalSearchHit[]>([]);\nconst everywhereLoading = ref(false);\nlet everywhereTimer: ReturnType<typeof setTimeout> | undefined;\nlet everywhereSeq = 0;\n\nfunction scheduleEverywhere(q: string) {\n  if (everywhereTimer) clearTimeout(everywhereTimer);\n  const fn = props.globalSearch;\n  if (!fn || q.length < EVERYWHERE_MIN_CHARS) {\n    everywhere.value = [];\n    everywhereLoading.value = false;\n    return;\n  }\n  everywhereLoading.value = true;\n  everywhereTimer = setTimeout(async () => {\n    const seq = ++everywhereSeq;\n    try {\n      const hits = await fn(q);\n      if (seq !== everywhereSeq) return; // stale response — a newer query won\n      everywhere.value = Array.isArray(hits) ? hits.slice(0, EVERYWHERE_LIMIT) : [];\n    } catch {\n      if (seq === everywhereSeq) everywhere.value = [];\n    } finally {\n      if (seq === everywhereSeq) everywhereLoading.value = false;\n    }\n  }, EVERYWHERE_DEBOUNCE_MS);\n}\n\n/** Parent-path crumb for a hit row (storage label when the hit carries one). */\nfunction hitCrumb(h: GlobalSearchHit): string {\n  const rel = String(h.path ?? '').replace(/^\\/+|\\/+$/g, '');\n  const slash = rel.lastIndexOf('/');\n  const parent = slash === -1 ? '' : rel.slice(0, slash);\n  const storage =\n    (typeof h.storage === 'string' && h.storage) ||\n    (typeof h.storage_name === 'string' && h.storage_name) ||\n    '';\n  if (storage && parent) return `${storage}/${parent}`;\n  if (storage) return storage;\n  return parent || '/';\n}\n\nconst hitItems = computed<HitItem[]>(() =>\n  everywhere.value.map((h) => ({\n    kind: 'hit' as const,\n    id: `hit:${h.storage_id ?? ''}:${h.path ?? ''}:${h.id ?? ''}`,\n    label: String(h.name ?? h.path ?? ''),\n    icon: '', // hit rows draw their real tile — see iconHtml()\n    hit: h,\n    crumb: hitCrumb(h),\n    inContent: matchedInContent(h.matched),\n    snippet: typeof h.snippet === 'string' ? h.snippet : '',\n  })),\n);\n\n/* === bul:s3 — saved searches (localStorage) ============================= */\n\nconst SAVED_LS_KEY = 'filex.saved-searches';\nconst SAVED_MAX = 10;\n\nconst savedSearches = ref<string[]>([]);\n\nfunction readSavedSearches(): string[] {\n  try {\n    const raw = localStorage.getItem(SAVED_LS_KEY);\n    if (!raw) return [];\n    const parsed: unknown = JSON.parse(raw);\n    if (!Array.isArray(parsed)) return [];\n    return parsed.filter((x): x is string => typeof x === 'string' && x.trim() !== '').slice(0, SAVED_MAX);\n  } catch {\n    return [];\n  }\n}\n\nfunction writeSavedSearches(list: string[]) {\n  savedSearches.value = list.slice(0, SAVED_MAX);\n  try {\n    localStorage.setItem(SAVED_LS_KEY, JSON.stringify(savedSearches.value));\n  } catch {\n    /* private mode / quota — the in-memory list still works this session */\n  }\n}\n\nfunction saveSearch(q: string) {\n  const clean = q.trim();\n  if (!clean) return;\n  const list = savedSearches.value.filter((s) => s !== clean);\n  list.unshift(clean); // newest first; cap enforced by writeSavedSearches\n  writeSavedSearches(list);\n}\n\nfunction removeSavedSearch(q: string) {\n  writeSavedSearches(savedSearches.value.filter((s) => s !== q));\n  if (active.value >= flat.value.length) active.value = Math.max(0, flat.value.length - 1);\n}\n\nconst savedItems = computed<SavedGroupItem[]>(() => {\n  const q = query.value.trim();\n  const out: SavedGroupItem[] = [];\n  // \"Save this query\" command — only when there IS a query and it isn't saved yet.\n  if (q && !savedSearches.value.includes(q)) {\n    out.push({ kind: 'save', id: `save:${q}`, label: `${t('palette.save')}: ${q}`, icon: 'save-search', query: q });\n  }\n  const scored = savedSearches.value\n    .map((s) => ({ s, sc: matchScore(s, q) }))\n    .filter((r) => r.sc >= 0 || !q);\n  for (const r of scored) {\n    out.push({ kind: 'saved', id: `saved:${r.s}`, label: r.s, icon: 'bookmark', query: r.s });\n  }\n  return out;\n});\n\n/* ======================================================================== */\n\nconst flat = computed<PaletteItem[]>(() => [\n  ...gotoItems.value,\n  ...fileItems.value,\n  ...hitItems.value,\n  ...savedItems.value,\n  ...commandItems.value,\n]);\nconst fileOffset = computed(() => gotoItems.value.length);\nconst hitOffset = computed(() => fileOffset.value + fileItems.value.length);\nconst savedOffset = computed(() => hitOffset.value + hitItems.value.length);\nconst cmdOffset = computed(() => savedOffset.value + savedItems.value.length);\n\nwatch(query, (q) => {\n  active.value = 0;\n  scheduleEverywhere(q.trim()); /* bul:s3 */\n});\n\nfunction move(delta: number) {\n  const n = flat.value.length;\n  if (!n) return;\n  active.value = (active.value + delta + n) % n;\n  void nextTick(() => {\n    listEl.value?.querySelector('.is-active')?.scrollIntoView({ block: 'nearest' });\n  });\n}\n\nfunction choose(item?: PaletteItem) {\n  const it = item ?? flat.value[active.value];\n  if (!it) return;\n  /* bul:s3 — saved-search rows keep the palette OPEN: picking one re-runs\n   * the palette with that query; saving just persists it. */\n  if (it.kind === 'saved') {\n    query.value = it.query;\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  if (it.kind === 'save') {\n    saveSearch(it.query);\n    void nextTick(() => inputEl.value?.focus());\n    return;\n  }\n  emit('close');\n  if (it.kind === 'hit') {\n    emit('open-hit', it.hit);\n    return;\n  }\n  if (it.kind === 'file') {\n    emit('open-node', it.node);\n  } else if (it.kind === 'goto') {\n    emit('navigate', it.path);\n  } else {\n    switch (it.command) {\n      case 'new-folder': emit('new-folder'); break;\n      case 'upload': emit('upload'); break;\n      case 'toggle-view': emit('toggle-view'); break;\n      case 'open-trash': emit('open-trash'); break;\n      case 'refresh': emit('refresh'); break;\n      case 'go-up': emit('go-up'); break;\n      /* wiring:int */\n      case 'open-theme': emit('open-theme'); break;\n      case 'open-shortcut-settings': emit('open-shortcut-settings'); break;\n      case 'start-tour': emit('start-tour'); break;\n      /* wiring:d1 */\n      case 'tab-new': emit('tab-new'); break;\n      case 'split-toggle': emit('split-toggle'); break;\n    }\n  }\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n  if (!props.open) return;\n  switch (e.key) {\n    case 'ArrowDown':\n      e.preventDefault();\n      e.stopPropagation();\n      move(1);\n      break;\n    case 'ArrowUp':\n      e.preventDefault();\n      e.stopPropagation();\n      move(-1);\n      break;\n    case 'Enter':\n      e.preventDefault();\n      e.stopPropagation();\n      choose();\n      break;\n    case 'Escape':\n      e.preventDefault();\n      e.stopPropagation();\n      emit('close');\n      break;\n  }\n}\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      // ⚠ Read at OPEN, not watched: a seed that kept overwriting the field\n      // would undo every keystroke of whoever is typing here now.\n      query.value = props.initialQuery ?? '';\n      active.value = 0;\n      /* bul:s3 — fresh session state for the new groups. */\n      everywhere.value = [];\n      everywhereLoading.value = false;\n      savedSearches.value = readSavedSearches();\n      document.addEventListener('keydown', onDocKeydown, true);\n      void nextTick(() => {\n        inputEl.value?.focus();\n        // Selected, not appended to: the seed is a starting point, and the\n        // next keystroke should be able to replace it outright.\n        inputEl.value?.select();\n      });\n    } else {\n      if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n      document.removeEventListener('keydown', onDocKeydown, true);\n    }\n  },\n);\n\nonBeforeUnmount(() => {\n  if (everywhereTimer) clearTimeout(everywhereTimer); /* bul:s3 */\n  document.removeEventListener('keydown', onDocKeydown, true);\n});\n</script>\n\n<template>\n  <transition name=\"fe-modal\">\n    <div\n      v-if=\"open\"\n      class=\"fe-modal__backdrop fe-cmdp__backdrop\"\n      role=\"presentation\"\n      @click=\"emit('close')\"\n    >\n      <div\n        class=\"fe-cmdp\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-label=\"t('palette.placeholder')\"\n        @click.stop\n      >\n        <div class=\"fe-cmdp__inputwrap\">\n          <svg\n            class=\"fe-cmdp__glyph\"\n            width=\"16\"\n            height=\"16\"\n            viewBox=\"0 0 16 16\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.5\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n          >\n            <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n            <path d=\"m10.5 10.5 3.5 3.5\" />\n          </svg>\n          <input\n            ref=\"inputEl\"\n            v-model=\"query\"\n            type=\"text\"\n            class=\"fe-cmdp__input\"\n            :placeholder=\"t('palette.placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n          />\n        </div>\n\n        <div ref=\"listEl\" class=\"fe-cmdp__list\" role=\"listbox\">\n          <button\n            v-for=\"(it, i) in gotoItems\"\n            :key=\"it.id\"\n            type=\"button\"\n            class=\"fe-cmdp__item\"\n            :class=\"{ 'is-active': i === active }\"\n            role=\"option\"\n            :aria-selected=\"i === active\"\n            @mouseenter=\"active = i\"\n            @click=\"choose(it)\"\n          >\n            <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n            <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n            <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n          </button>\n\n          <template v-if=\"fileItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.files') }}</div>\n            <button\n              v-for=\"(it, i) in fileItems\"\n              :key=\"it.id\"\n              type=\"button\"\n              class=\"fe-cmdp__item\"\n              :class=\"{ 'is-active': fileOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"fileOffset + i === active\"\n              @mouseenter=\"active = fileOffset + i\"\n              @click=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n            </button>\n          </template>\n\n          <!-- bul:s3 — \"Everywhere\" global-search hits -->\n          <template v-if=\"hitItems.length || everywhereLoading\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.everywhere') }}</div>\n            <div v-if=\"everywhereLoading && !hitItems.length\" class=\"fe-cmdp__loading\">\n              {{ t('palette.searching') }}\n            </div>\n            <button\n              v-for=\"(it, i) in hitItems\"\n              :key=\"it.id\"\n              type=\"button\"\n              class=\"fe-cmdp__item fe-cmdp__item--hit\"\n              :class=\"{ 'is-active': hitOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"hitOffset + i === active\"\n              @mouseenter=\"active = hitOffset + i\"\n              @click=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__hitbody\">\n                <span class=\"fe-cmdp__hitline\">\n                  <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n                  <span v-if=\"it.inContent\" class=\"fe-cmdp__badge\">{{ t('search.in_content') }}</span>\n                </span>\n                <span v-if=\"it.crumb\" class=\"fe-cmdp__crumb\" :title=\"it.crumb\">{{ it.crumb }}</span>\n                <!-- Snippet: «»-highlights become <mark> via TEXT segments — never innerHTML. -->\n                <span v-if=\"it.snippet\" class=\"fe-cmdp__snippet\">\n                  <template v-for=\"(seg, si) in snippetSegments(it.snippet)\" :key=\"si\">\n                    <mark v-if=\"seg.match\" class=\"fe-cmdp__mark\">{{ seg.text }}</mark>\n                    <template v-else>{{ seg.text }}</template>\n                  </template>\n                </span>\n              </span>\n            </button>\n          </template>\n\n          <!-- bul:s3 — saved searches -->\n          <template v-if=\"savedItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.saved') }}</div>\n            <div\n              v-for=\"(it, i) in savedItems\"\n              :key=\"it.id\"\n              class=\"fe-cmdp__item fe-cmdp__item--saved\"\n              :class=\"{ 'is-active': savedOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"savedOffset + i === active\"\n              tabindex=\"-1\"\n              @mouseenter=\"active = savedOffset + i\"\n              @click=\"choose(it)\"\n              @keydown.enter.prevent=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n              <button\n                v-if=\"it.kind === 'saved'\"\n                type=\"button\"\n                class=\"fe-cmdp__del\"\n                :title=\"t('palette.saved.delete')\"\n                :aria-label=\"t('palette.saved.delete')\"\n                @click.stop=\"removeSavedSearch(it.query)\"\n              ><!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons --><span aria-hidden=\"true\" v-html=\"actionIconSvg('delete')\"></span></button>\n            </div>\n          </template>\n\n          <template v-if=\"commandItems.length\">\n            <div class=\"fe-cmdp__group\">{{ t('palette.commands') }}</div>\n            <button\n              v-for=\"(it, i) in commandItems\"\n              :key=\"it.id\"\n              type=\"button\"\n              class=\"fe-cmdp__item\"\n              :class=\"{ 'is-active': cmdOffset + i === active }\"\n              role=\"option\"\n              :aria-selected=\"cmdOffset + i === active\"\n              @mouseenter=\"active = cmdOffset + i\"\n              @click=\"choose(it)\"\n            >\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons + lib/fileIcons -->\n              <span class=\"fe-cmdp__icon\" aria-hidden=\"true\" v-html=\"iconHtml(it)\"></span>\n              <span class=\"fe-cmdp__label\">{{ it.label }}</span>\n            </button>\n          </template>\n\n          <div v-if=\"flat.length === 0 && !everywhereLoading\" class=\"fe-cmdp__empty\">\n            {{ t('palette.empty') }}\n          </div>\n        </div>\n\n        <div class=\"fe-cmdp__hint\">{{ t('palette.hint') }}</div>\n      </div>\n    </div>\n  </transition>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Modal — tiny headless wrapper. Backdrop + centered card + ESC + autofocus.\n */\nimport { watch, onBeforeUnmount, ref } from 'vue';\n\nconst props = defineProps<{\n  open: boolean;\n  title?: string;\n  size?: 'sm' | 'md' | 'lg' | 'xl';\n  closeOnBackdrop?: boolean;\n  /** When true, drop the dialog chrome (backdrop tint, header, footer,\n   *  centered card with border-radius) and render the slot full-bleed.\n   *  Used by the standalone /files/edit route where the browser tab IS\n   *  the container — a modal frame on top of it just steals real estate\n   *  from the editor. ESC + emit('close') still wire through so the\n   *  parent route can window.close() the tab. */\n  chromeless?: boolean;\n  /**\n   * gorunum:v1 — full-bleed overlay. Like `chromeless` it drops the dialog\n   * head and footer and lets the card own the whole viewport, but it KEEPS\n   * the modal identity: the card still paints a ground and the caller draws\n   * its own chrome inside the slot (see PreviewModal's viewer bar).\n   *\n   * ⚠ Deliberately a second flag rather than a reuse of `chromeless`.\n   * `chromeless` means \"the browser tab IS the container\" (the standalone\n   * /files/edit route) and e2e/tests/83 asserts on exactly that class; an\n   * in-page preview that borrowed it would start claiming to be that route.\n   */\n  fullbleed?: boolean;\n  /** Explicit theme. When set the modal stamps the appropriate\n   *  `.fe--theme-{light,dark}` class on its `.fe` backdrop so the CSS\n   *  variable cascade matches the host shell regardless of OS\n   *  preference (Modal is a portal-shaped descendant of `<body>`\n   *  rather than a child of the parent component, so plain DOM\n   *  inheritance isn't always enough). */\n  theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\nconst cardEl = ref<HTMLElement | null>(null);\n\n/* wiring:c4 — a11y: unique title id for aria-labelledby + focus restore.\n * The element focused before the modal opened gets focus back on close so\n * keyboard users return to where they were instead of <body>. */\nlet modalSeq = 0;\nconst titleId = `fe-modal-title-${++modalSeq}-${Math.random().toString(36).slice(2, 7)}`;\nlet prevFocus: HTMLElement | null = null;\n\nconst FOCUSABLE =\n  'input:not([disabled]),select:not([disabled]),textarea:not([disabled]),' +\n  'button:not([disabled]),a[href],[tabindex]:not([tabindex=\"-1\"])';\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      prevFocus = (document.activeElement as HTMLElement | null) ?? null; /* wiring:c4 */\n      document.addEventListener('keydown', onKey);\n      setTimeout(() => {\n        const focusable = cardEl.value?.querySelector<HTMLElement>(FOCUSABLE);\n        focusable?.focus();\n      }, 30);\n    } else {\n      document.removeEventListener('keydown', onKey);\n      /* wiring:c4 — return focus to the opener. */\n      prevFocus?.focus?.();\n      prevFocus = null;\n    }\n  },\n);\n\nonBeforeUnmount(() => document.removeEventListener('keydown', onKey));\n\nfunction onKey(e: KeyboardEvent) {\n  if (e.key === 'Escape') {\n    emit('close');\n    return;\n  }\n  /* wiring:c4 — focus trap: Tab cycles inside the card (WAI-ARIA dialog).\n   * Without it, Tab walked out into the host page behind the backdrop. */\n  if (e.key === 'Tab' && cardEl.value) {\n    const nodes = Array.from(cardEl.value.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n      (el) => el.offsetParent !== null || el === document.activeElement,\n    );\n    if (nodes.length === 0) return;\n    const first = nodes[0];\n    const last = nodes[nodes.length - 1];\n    const active = document.activeElement as HTMLElement | null;\n    if (e.shiftKey && (active === first || !cardEl.value.contains(active))) {\n      e.preventDefault();\n      last.focus();\n    } else if (!e.shiftKey && (active === last || !cardEl.value.contains(active))) {\n      e.preventDefault();\n      first.focus();\n    }\n  }\n}\n\nfunction onBackdrop() {\n  if (props.closeOnBackdrop !== false) emit('close');\n}\n</script>\n\n<template>\n  <transition name=\"fe-modal\">\n    <div\n      v-if=\"open\"\n      class=\"fe fe-modal__backdrop\"\n      :class=\"[\n        { 'fe-modal__backdrop--chromeless': chromeless },\n        { 'fe-modal__backdrop--fullbleed': fullbleed && !chromeless },\n        theme === 'light' ? 'fe--theme-light' : '',\n        theme === 'dark' ? 'fe--theme-dark' : '',\n      ]\"\n      role=\"presentation\"\n      @click=\"onBackdrop\"\n    >\n      <div\n        ref=\"cardEl\"\n        class=\"fe-modal__card\"\n        :class=\"[\n          `fe-modal__card--${size || 'md'}`,\n          chromeless && 'fe-modal__card--chromeless',\n          fullbleed && !chromeless && 'fe-modal__card--fullbleed',\n        ]\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-labelledby=\"title && !chromeless && !fullbleed ? titleId : undefined\"\n        :aria-label=\"!title || chromeless || fullbleed ? title || undefined : undefined\"\n        @click.stop\n      >\n        <header v-if=\"title && !chromeless && !fullbleed\" class=\"fe-modal__head\">\n          <h2 :id=\"titleId\" class=\"fe-modal__title\">{{ title }}</h2>\n          <button\n            type=\"button\"\n            class=\"fe-modal__close\"\n            aria-label=\"Close\"\n            @click=\"emit('close')\"\n          >×</button>\n        </header>\n        <div class=\"fe-modal__body\">\n          <slot />\n        </div>\n        <footer v-if=\"$slots.actions && !chromeless && !fullbleed\" class=\"fe-modal__actions\">\n          <slot name=\"actions\" />\n        </footer>\n      </div>\n    </div>\n  </transition>\n</template>\n","/**\n * gorunum:v1-advsearch — the model behind the Advanced search dialog.\n *\n * Kept out of the component so the two halves of a search can be read (and\n * tested) side by side, because the honesty of the whole feature lives in the\n * split:\n *\n *   SERVER — `text`, `tags`, `excludeTags`, `scope`. These are the ONLY things\n *   filex's search endpoints actually read. `GET|POST /api/files/search` takes\n *   `q`/`query`, `storage_id`, `limit` and `scope` (name|content|all) and\n *   nothing else (handlers/search.go `searchRequest`); the query text may carry\n *   `tag:x` / `-tag:x`, which the backend parses out and resolves against the\n *   database (docs/SEARCH.md, \"Filtering by tag\"). The manager's\n *   `?action=search&filter=…` speaks the same query language.\n *\n *   CLIENT — everything in `filters` (`lib/fileFilters.ts`). There is no date,\n *   size, mime or path parameter on either endpoint, so those four narrow the\n *   rows that came back. That is the same bargain the filter row already makes\n *   and is documented at the top of fileFilters.ts.\n *\n * ⚠ The one thing that is NOT the same bargain: over a folder listing the rows\n * in hand ARE the folder, so a client-side filter is a complete answer. Over a\n * SEARCH result they are the first N hits the ranker returned (50 by default on\n * `/api/files/search`, 250 on the manager's search action). A size range over\n * that is a filter over what came back — true of the rows shown, not a\n * statement about the storage. The dialog prints that rather than implying a\n * full scan; see `advSearchTruncated`.\n *\n * ⚠ Owner USED to be on this list, with the reason \"there is no per-node owner\n * on the wire at all\". Migration 00038 made ownership a real fact on the row\n * and the listing projection carries `owner_id` / `owner_name` / `owner_self`,\n * so `filters.people` is now a client-side filter over a field the rows\n * ALREADY carry — exactly the bargain the other four make. The rule did not\n * bend; the data arrived.\n *\n * What is still NOT modelled here, because nothing could carry it:\n *   - A \"paths\" scope. `scope` accepts exactly name|content|all\n *     (search.ParseScope); paths are matched *within* the name scope and cannot\n *     be selected on their own. Measured against the reference build on\n *     2026-09-13: its `scope:\"path\"` returns the byte-identical result set its\n *     `scope:\"name\"` returns, over every query tried.\n *   - \"Match whole phrase\". The query language has no phrase operator — the\n *     only quoting the parser knows keeps a `tag:\"two words\"` value together\n *     (search.splitQuery/unquote), and a quoted free-text token keeps its\n *     quotes and is matched with them.\n */\nimport type { DriveFilters, PeopleOption } from './fileFilters';\nimport { EMPTY_FILTERS } from './fileFilters';\n\n/** Which fields the backend consults. Mirrors `search.ParseScope`. */\nexport type AdvScope = 'name' | 'content' | 'all';\n\n/**\n * What one live-count run reports back.\n *\n * `capped` is the honest half: true when the server returned as many hits as\n * it was allowed to, so the client-side filters narrowed a window rather than\n * the whole result set and the number is \"N of the first page\", not \"N in the\n * storage\". The dialog prints a different sentence for each.\n */\nexport interface AdvCountResult {\n  count: number;\n  capped: boolean;\n  /**\n   * The per-account People members the counted rows actually contained\n   * (`peopleOptions(rows)` minus the three fixed ones), so the Owner select\n   * can offer a name without asking for a user directory it must not have.\n   *\n   * ⚠ Optional. A caller that does not report them — the explorer does not\n   * yet — leaves the select with `Anyone` / `You` / `System`, which is three\n   * working members, not a broken menu. The field exists so the follow-up is\n   * one change in the shell that owns the API client, not a second change in\n   * this component.\n   */\n  people?: PeopleOption[];\n}\n\nexport interface AdvSearchRequest {\n  /** Free text. Never carries `tag:` tokens — those live in the two arrays. */\n  text: string;\n  /** ANDed include filters, emitted as `tag:x`. */\n  tags: string[];\n  /** Exclusions, emitted as `-tag:x`. Applied after the includes. */\n  excludeTags: string[];\n  scope: AdvScope;\n  /** The client-side half. Same model and same predicate as the filter row. */\n  filters: DriveFilters;\n}\n\nexport function emptyAdvSearch(pathBase = ''): AdvSearchRequest {\n  return {\n    text: '',\n    tags: [],\n    excludeTags: [],\n    scope: 'name',\n    filters: { ...EMPTY_FILTERS, pathBase },\n  };\n}\n\n/** A tag value only needs quoting when it contains whitespace — the parser\n *  splits on spaces unless a double quote is open (search.splitQuery). */\nfunction tagToken(tag: string, negated: boolean): string {\n  const v = tag.trim();\n  if (!v) return '';\n  const body = /\\s/.test(v) ? `\"${v}\"` : v;\n  return `${negated ? '-' : ''}tag:${body}`;\n}\n\n/**\n * The string that actually goes on the wire, as `q` / `filter`.\n *\n * Text first so the free-text half reads the way the user typed it, then the\n * tag filters. A bare `tag:x` with no text is legal and means \"list the files\n * carrying that tag, newest first\" — the backend says so explicitly, so an\n * empty `text` is not an empty search.\n */\nexport function advQueryString(req: AdvSearchRequest): string {\n  const parts: string[] = [];\n  const text = req.text.trim();\n  if (text) parts.push(text);\n  for (const t of req.tags) {\n    const tok = tagToken(t, false);\n    if (tok) parts.push(tok);\n  }\n  for (const t of req.excludeTags) {\n    const tok = tagToken(t, true);\n    if (tok) parts.push(tok);\n  }\n  return parts.join(' ');\n}\n\n/** Nothing for the server to answer — no text and no tag filter. */\nexport function advSearchEmpty(req: AdvSearchRequest): boolean {\n  return advQueryString(req) === '';\n}\n\n/**\n * Split a comma/newline separated tag box into values.\n *\n * Commas rather than spaces, because a tag may contain a space\n * (`quarterly report`) and splitting on whitespace would turn one filter that\n * matches into two that do not — and a tag that does not exist returns the\n * empty set by design, so the mistake would look like \"there is nothing here\".\n */\nexport function parseTagList(raw: string): string[] {\n  return raw\n    .split(/[,\\n]/)\n    .map((s) => s.trim())\n    .filter((s) => s !== '');\n}\n\n/**\n * True when the hit list came back at the cap, so the client-side filters ran\n * over a window rather than over everything that matches.\n *\n * The dialog and the count line say this out loud. A count that silently\n * describes \"the first 50 hits, then filtered\" as \"N matching items\" is the\n * exact shape of a number that looks measured and is not.\n */\nexport function advSearchTruncated(returned: number, limit: number): boolean {\n  return returned >= limit;\n}\n","<script setup lang=\"ts\">\n/**\n * gorunum:v1-advsearch — the Advanced search dialog.\n *\n * ⚠⚠ The rule this component was built under: **only offer what the backend\n * can actually do.** A control wired to a parameter the server never reads\n * looks identical to one that works and quietly changes nothing, which is\n * worse than not shipping it (the same sentence already governs the filter\n * row — see the header of `lib/fileFilters.ts`).\n *\n * The split is still real, and it is still said ON SCREEN — but as one\n * sentence under the count rather than as two half-page captions over two\n * stacked halves (the reference shell's layout, owner's call 2026-09-12:\n * \"görüntü birebir yapalım\"). What the halves are:\n *\n *   1. What the SERVER answers — the text, the tag filters and the scope.\n *      Those are the whole of filex's search surface (`handlers/search.go`\n *      `searchRequest`: q/query, storage_id, limit, scope; the query text may\n *      carry `tag:` / `-tag:`). Drawn at the top: one wide field, one row of\n *      scope tabs, and the tag boxes.\n *   2. What NARROWS THE ROWS THAT CAME BACK — type, modified, size, folder.\n *      No endpoint reads a date, size, mime or path parameter, so these run\n *      here, over the hits. Drawn in the two columns, and named for what they\n *      are by `advsearch.count.cost` directly under the number they produced:\n *      \"Type, date, size and folder are applied to the rows that come back,\n *      not by the server.\"\n *\n * ⚠ Moving that sentence, or letting a redesign drop it, turns four honest\n * controls into four that quietly promise a search the server never runs.\n *\n * **Owner IS drawn now, and the reason it was not is gone.** This block used\n * to read \"there is no per-node owner on the wire\". Migration 00038 made\n * ownership a real fact on the row and the listing projection carries\n * `owner_id` / `owner_name` / `owner_self` on every row that has one, so the\n * Owner select answers from a field the rows ALREADY carry — the same bargain\n * as type, date and size, and it is named in the same sentence under the\n * count. ⚠ It is offered on NAME searches only: the explorer maps a content\n * hit onto the listing shape by hand (`FileExplorer.advHitToNode`) and that\n * mapping does not carry the owner through, so under the content scopes every\n * row would read as \"System\" — a wrong answer, which is worse than a control\n * that says why it is off.\n *\n * Still not drawn, each for a reason that was MEASURED against the reference\n * build on 2026-09-13 rather than assumed:\n *   - **A \"Paths\" scope tab.** The reference sends `scope:\"path\"` and its own\n *     server answers it with the byte-identical result set `scope:\"name\"`\n *     returns — measured over four queries incl. `Code/api`, which matches a\n *     path and no name. Paths are matched INSIDE the name scope (the index\n *     queries the `path` field there, `search.nameQuery`), so the tab renames\n *     a search rather than adding one.\n *   - **A \"Tags\" scope tab.** `search.ParseScope` is name|content|all; the\n *     reference's `scope:\"tags\"` returns nothing for every query on its own\n *     install. Ours has the stronger thing already: two boxes that become\n *     `tag:` / `-tag:` tokens the backend resolves against the database.\n *   - **\"Match whole phrase\".** The query language has no phrase operator. The\n *     only quoting the parser knows keeps a `tag:\"two words\"` value together\n *     (`search.splitQuery`); quotes around free text stay in the text.\n *   - **A storage chooser and a \"search in / all storages\" scope.** Both need\n *     the explorer to send the search somewhere else — `api.search(target, …)`\n *     builds the target from where the explorer is standing, and only the\n *     multi-storage virtual root searches across drives. A picker drawn here\n *     could narrow the rows that came back, which for a single-storage search\n *     can only ever mean \"the drive you are already on\". The endpoint half is\n *     ready (see `handlers/search.go`: a hit now carries its storage NAME);\n *     the routing half is `FileExplorer.advTarget`, and is not this\n *     component's to write.\n *\n * The live count is a REAL query, debounced — the same search the button runs,\n * counted after the client-side half. That costs a round trip, so the dialog\n * prints that it does instead of presenting the number as free.\n */\nimport { computed, ref, watch, onBeforeUnmount } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from '../modals/Modal.vue';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport {\n  EMPTY_FILTERS,\n  type AroundSpan,\n  type ModifiedFilter,\n  type PathMode,\n  type PeopleFilter,\n  type PeopleOption,\n  type SizeFilter,\n  type TypeFilter,\n} from '../lib/fileFilters';\nimport {\n  advQueryString,\n  advSearchEmpty,\n  emptyAdvSearch,\n  parseTagList,\n  type AdvCountResult,\n  type AdvScope,\n  type AdvSearchRequest,\n} from '../lib/advSearch';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: 'light' | 'dark' | 'auto';\n  /** Seeded from the toolbar field so the dialog continues the search in progress. */\n  initialQuery?: string;\n  /** Human name of the folder the dialog was opened from (\"Documents\"). */\n  folderLabel?: string;\n  /** Adapter-qualified folder the \"only here\" / \"skip here\" choice measures\n   *  against (`qldemo://Documents`). Captured at open: a search rebases the\n   *  explorer to the storage root, so by the time the filter runs the folder\n   *  the user meant is no longer where the explorer is standing. */\n  pathBase?: string;\n  /**\n   * Whether the content scopes may be offered.\n   *\n   * ⚠ Not a preference. Content search exists only on `/api/files/search`,\n   * and a hit from there reaches the explorer without the drive it came from —\n   * with more than one storage mounted the explorer cannot tell which drive a\n   * hit is on, and a row labelled with the wrong drive is worse than a missing\n   * feature. With one storage every hit is necessarily that storage's, so the\n   * scopes are exact. The caller decides; this component only draws it.\n   *\n   * ⚠ The ENDPOINT half of that gap is closed as of 2026-09-13: a hit now\n   * carries `storage` (the drive's name) as well as its id, the same way the\n   * starred and recently-opened handlers have always answered\n   * (`handlers/search.go` `describeHits`). What is left is the explorer's own\n   * hand-written mapping, `FileExplorer.advHitToNode`, which builds a listing\n   * row from the hit and does not read that field — so the caller still has to\n   * pass `false` on a multi-storage install until it does.\n   */\n  contentSearch?: boolean;\n  /** Runs the real query and returns what it found. Owned by the explorer,\n   *  which is the only thing holding the API client. */\n  count: (req: AdvSearchRequest) => Promise<AdvCountResult>;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', req: AdvSearchRequest): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ── form state ──────────────────────────────────────────────────────────── */\n\n/**\n * The query box, focused when the dialog opens.\n *\n * ⚠ Not a flourish — it replaces something that broke. Modal autofocuses the\n * first focusable element inside its card, which used to be the × in its own\n * title bar; this dialog folds that bar away (it draws its own head), and a\n * `display:none` button cannot take focus, so opening the dialog left focus on\n * the opener and nothing in the dialog was focused at all. The field is the\n * right answer anyway: a search dialog opens ready to be typed into. The delay\n * clears Modal's own 30ms autofocus attempt rather than racing it.\n */\nconst queryEl = ref<HTMLInputElement | null>(null);\n\nconst text = ref('');\nconst scope = ref<AdvScope>('name');\nconst tagsRaw = ref('');\nconst excludeRaw = ref('');\nconst type = ref<TypeFilter>('any');\nconst modified = ref<ModifiedFilter>('any');\nconst aroundDate = ref('');\nconst aroundSpan = ref<AroundSpan>('d1');\n/**\n * Whose rows to keep.\n *\n * ⚠ The same `PeopleFilter` the filter row's People pill uses, narrowed by the\n * same `matchesPeople` predicate — two definitions of \"files you put here\"\n * would be two products. `any` / `me` / `system` are offered unconditionally\n * because a menu whose members appear and disappear is a menu nobody can\n * learn; the per-account members are the ones that would be inert, so they are\n * the ones that have to come from data (`peopleOptions`, below, reads them off\n * the run that produced the count).\n */\nconst people = ref<PeopleFilter>('any');\nconst size = ref<SizeFilter>('any');\n/* ⚠ `string | number`, not `string`. Vue's v-model casts the value of an\n   `<input type=\"number\">` to a NUMBER on its own — no `.number` modifier\n   needed (`runtime-dom`: `castToNumber = number || vnode.props.type ===\n   'number'`) — and hands back the raw string only when it does not parse, so\n   an empty field is `''` and a typed one is `1`. Typing these as `string` and\n   calling a string method on the value is not a type error the compiler can\n   see, and the failure is silent: see `bytes()` below. */\nconst sizeFrom = ref<string | number>('');\nconst sizeTo = ref<string | number>('');\nconst sizeUnit = ref<'kb' | 'mb' | 'gb'>('mb');\nconst pathMode = ref<PathMode>('any');\n\nconst TYPE_OPTIONS: TypeFilter[] = [\n  'any', 'folder', 'document', 'spreadsheet', 'presentation', 'pdf',\n  'image', 'video', 'audio', 'archive', 'code',\n];\nconst MODIFIED_OPTIONS: ModifiedFilter[] = ['any', 'today', '7d', '30d', 'year', 'around'];\nconst SIZE_OPTIONS: SizeFilter[] = ['any', 'lt1', '1to10', '10to100', 'gt100', 'range'];\nconst SPAN_OPTIONS: AroundSpan[] = ['h1', 'd1', 'w1'];\nconst UNIT_FACTOR: Record<'kb' | 'mb' | 'gb', number> = {\n  kb: 1024,\n  mb: 1024 ** 2,\n  gb: 1024 ** 3,\n};\n\n/**\n * Scopes in the order they are OFFERED — which is not the same thing as which\n * one is selected. `reset()` picks `name` either way, because it is the only\n * scope the folder-search endpoint can serve; the order below is the reference\n * shell's (widest first), and when content search is off the list collapses to\n * the single scope that exists rather than drawing two tabs that would do the\n * same thing.\n */\nconst scopeOptions = computed<AdvScope[]>(() =>\n  props.contentSearch ? ['all', 'content', 'name'] : ['name'],\n);\n\n/**\n * The tab glyph. Keys from `lib/actionIcons` only — the reference shell puts a\n * mark on every scope tab, and an icon per tab drawn from the shared set keeps\n * this row in the same voice as the menus rather than inventing a second one.\n */\nconst SCOPE_ICON: Record<AdvScope, string> = {\n  all: 'search',\n  content: 'preview',\n  name: 'copy-path',\n};\n\n/** The three answers to \"where does the folder come into it\". */\nconst PATH_MODES: PathMode[] = ['any', 'here', 'skip'];\n\n/** The People members that need no data behind them. Named by the catalogue,\n *  not by the directory — which is also why offering them cannot leak one. */\nconst PEOPLE_FIXED: PeopleFilter[] = ['any', 'me', 'system'];\n\n/**\n * Whether the Owner select can be trusted right now.\n *\n * ⚠ A capability check, not a preference — the same shape as `contentSearch`.\n * A NAME search comes back through the manager's search action, whose rows are\n * the listing projection and carry `owner_id` / `owner_name` / `owner_self`.\n * The content scopes come back through `/api/files/search`, and the explorer\n * maps those hits onto the listing shape by hand; that mapping carries no\n * owner, so every row would read as \"System\" and both `me` and `system` would\n * answer the wrong question confidently. Off, and it says so, until the\n * mapping carries it (`FileExplorer.advHitToNode`).\n */\nconst ownerFilterable = computed(() => scope.value === 'name');\n\n/** Leaving the name scope takes the Owner filter with it — a disabled control\n *  that goes on filtering is the dishonest half of disabling it. */\nwatch(ownerFilterable, (ok) => {\n  if (!ok) people.value = 'any';\n});\n\nfunction reset() {\n  text.value = '';\n  scope.value = 'name';\n  tagsRaw.value = '';\n  excludeRaw.value = '';\n  type.value = 'any';\n  modified.value = 'any';\n  aroundDate.value = '';\n  aroundSpan.value = 'd1';\n  size.value = 'any';\n  sizeFrom.value = '';\n  sizeTo.value = '';\n  sizeUnit.value = 'mb';\n  pathMode.value = 'any';\n  people.value = 'any';\n}\n\n/* ── continuing the search that is actually running ───────────────────────\n *\n * ⚠⚠ The bug this exists for. Opening the dialog over a live advanced filter\n * called `reset()`, so it came up saying `Type = any` and printed a count for\n * a search NOBODY had run — measured at \"14 matching items\" over a listing\n * holding 1. Worse than the wrong number: pressing Search from that state\n * submitted the reset form and silently dropped the filter that was in force.\n * The dialog could restart a search and never continue one.\n *\n * The fix is self-contained on purpose. The applied state lives in the\n * explorer (`advFilters` / `advScope`) and could be handed back as a prop, but\n * then the dialog would only remember in the ONE shell that passed it — the\n * desktop app, the fm.example.com explorer and the work/fishapp embeds all mount\n * this same component, and a continuity that works in one of them is two\n * products. So the dialog remembers what IT submitted.\n *\n * `query` is the honesty check, not a nicety. The toolbar field holds exactly\n * the wire query a submit produced (`applyAdvancedSearch` writes it there),\n * and typing in that field CLEARS the advanced filters (`onToolbarSearch`).\n * So \"the seed still equals what I submitted\" is the strongest available\n * evidence that the filter we remember is the filter in force; anything else\n * — a cleared box, an edited query, a plain search — falls back to `reset()`.\n */\ninterface FormState {\n  text: string;\n  scope: AdvScope;\n  tagsRaw: string;\n  excludeRaw: string;\n  type: TypeFilter;\n  modified: ModifiedFilter;\n  aroundDate: string;\n  aroundSpan: AroundSpan;\n  size: SizeFilter;\n  sizeFrom: string | number;\n  sizeTo: string | number;\n  sizeUnit: 'kb' | 'mb' | 'gb';\n  pathMode: PathMode;\n  people: PeopleFilter;\n}\n\nfunction snapshot(): FormState {\n  return {\n    text: text.value,\n    scope: scope.value,\n    tagsRaw: tagsRaw.value,\n    excludeRaw: excludeRaw.value,\n    type: type.value,\n    modified: modified.value,\n    aroundDate: aroundDate.value,\n    aroundSpan: aroundSpan.value,\n    size: size.value,\n    sizeFrom: sizeFrom.value,\n    sizeTo: sizeTo.value,\n    sizeUnit: sizeUnit.value,\n    pathMode: pathMode.value,\n    people: people.value,\n  };\n}\n\nfunction restore(s: FormState) {\n  text.value = s.text;\n  scope.value = s.scope;\n  tagsRaw.value = s.tagsRaw;\n  excludeRaw.value = s.excludeRaw;\n  type.value = s.type;\n  modified.value = s.modified;\n  aroundDate.value = s.aroundDate;\n  aroundSpan.value = s.aroundSpan;\n  size.value = s.size;\n  sizeFrom.value = s.sizeFrom;\n  sizeTo.value = s.sizeTo;\n  sizeUnit.value = s.sizeUnit;\n  pathMode.value = s.pathMode;\n  people.value = s.people;\n}\n\n/** The form as it stood when Search was last pressed, with the wire query it\n *  produced. Not a ref: nothing renders it, and a reactive copy of the whole\n *  form would re-run the count watcher for a value the user cannot see. */\nlet submitted: { query: string; form: FormState } | null = null;\n\n// Opening either CONTINUES the advanced search that is running, or seeds a\n// fresh one from whatever the toolbar held.\nwatch(\n  () => props.open,\n  (v) => {\n    if (!v) return;\n    const seed = props.initialQuery ?? '';\n    if (submitted && submitted.query !== '' && submitted.query === seed) {\n      restore(submitted.form);\n    } else {\n      reset();\n      text.value = seed;\n    }\n    counted.value = null;\n    countError.value = false;\n    setTimeout(() => queryEl.value?.focus(), 60);\n  },\n);\n\n/**\n * Bytes for one end of the custom range, or null when it is left open.\n *\n * ⚠⚠ Takes `unknown` on purpose. This read `raw.trim()` and typed the\n * parameter `string`, which is what the ref was declared as — and Vue casts a\n * number input's value to a NUMBER, so `trim` was not a function. The throw\n * happened inside the `request` computed, which is what the count watcher\n * reads, so the watcher's getter threw before it could fire: the dialog kept\n * printing the PREVIOUS count and looked like a filter that simply did not\n * narrow. Measured in a real browser on 2026-09-12 — \"to = 0 MB\" over two\n * files of 16 and 184 bytes still said \"2 matching items\". Nothing in the\n * console of the page under test, nothing in vue-tsc, nothing in the unit\n * suite: a filter that is a no-op is indistinguishable from a filter that\n * matched everything unless you check it against rows you know it must drop.\n *\n * An empty field is `''` and must stay \"open end\", never `Number('') === 0` —\n * a zero ceiling means nothing passes.\n */\nfunction bytes(raw: unknown): number | null {\n  const s = String(raw ?? '').trim();\n  if (!s) return null;\n  const n = Number(s);\n  if (!Number.isFinite(n) || n < 0) return null;\n  return Math.round(n * UNIT_FACTOR[sizeUnit.value]);\n}\n\nconst request = computed<AdvSearchRequest>(() => ({\n  ...emptyAdvSearch(props.pathBase ?? ''),\n  text: text.value,\n  tags: parseTagList(tagsRaw.value),\n  excludeTags: parseTagList(excludeRaw.value),\n  scope: scope.value,\n  filters: {\n    ...EMPTY_FILTERS,\n    type: type.value,\n    modified: modified.value,\n    aroundDate: aroundDate.value,\n    aroundSpan: aroundSpan.value,\n    size: size.value,\n    sizeMin: size.value === 'range' ? bytes(sizeFrom.value) : null,\n    sizeMax: size.value === 'range' ? bytes(sizeTo.value) : null,\n    pathMode: pathMode.value,\n    pathBase: props.pathBase ?? '',\n    /* ⚠ Read through the guard, not off the ref. The `ownerFilterable` watch\n       below already clears the choice when the scope leaves `name`, so this is\n       the SECOND lock, not the first: a disabled select cannot be changed but\n       it can still hold a value chosen before the scope moved, and a filter\n       that outlives its own control narrows a search nobody asked it to. The\n       two are worth keeping apart — one is what the user sees change, the\n       other is what actually reaches the predicate. */\n    people: ownerFilterable.value ? people.value : 'any',\n  },\n}));\n\nconst nothingToAsk = computed(() => advSearchEmpty(request.value));\n\n/** Exactly what would go on the wire, shown to the user. The tag box becomes\n *  `tag:` tokens and there is no reason to hide that — somebody who learns the\n *  syntax here can type it straight into the toolbar next time. */\nconst wireQuery = computed(() => advQueryString(request.value));\n\n/* ── the live count: a real search, debounced ────────────────────────────── */\n\nconst counted = ref<AdvCountResult | null>(null);\nconst counting = ref(false);\nconst countError = ref(false);\n\n/**\n * The per-account People members, offered only when a real search actually\n * returned rows belonging to somebody else.\n *\n * ⚠ Derived from the count run, never from a directory. The dialog holds no\n * listing of its own, and offering every account on the install would put\n * names in the menu that cannot narrow anything here — the same reason\n * `peopleOptions` in `lib/fileFilters.ts` derives the pill's members from the\n * rows in hand. A count result that does not report them (the field is\n * optional, and the explorer does not fill it yet) simply offers the three\n * that need no data.\n */\nconst peopleOptions = computed<PeopleOption[]>(() => [\n  ...PEOPLE_FIXED.map((value) => ({ value })),\n  ...(counted.value?.people ?? []),\n]);\n\n/** The label for one member: the fixed three are named by the catalogue, an\n *  account by itself. A nameless account falls back to the neutral word rather\n *  than printing `u:7` at somebody. */\nfunction peopleLabel(o: PeopleOption): string {\n  if (o.value === 'any' || o.value === 'me' || o.value === 'system') {\n    return t(`filter.people.${o.value}`);\n  }\n  return o.name || t('filter.people.someone');\n}\n\n/**\n * ⚠ A member can leave the menu — a later count over different rows may not\n * contain that account at all — and a `<select>` whose value is no longer one\n * of its options renders BLANK while it goes on filtering. Falling back to\n * `any` keeps what is shown and what is applied the same thing.\n */\nwatch(peopleOptions, (opts) => {\n  if (!opts.some((o) => o.value === people.value)) people.value = 'any';\n});\nlet timer: ReturnType<typeof setTimeout> | null = null;\n/** Only the newest run may write the answer — a slow early query landing after\n *  a fast later one would print a count for a search nobody is looking at. */\nlet seq = 0;\n\nfunction scheduleCount() {\n  if (timer) clearTimeout(timer);\n  countError.value = false;\n  if (nothingToAsk.value) {\n    counted.value = null;\n    counting.value = false;\n    return;\n  }\n  counting.value = true;\n  timer = setTimeout(run, 450);\n}\n\nasync function run() {\n  const mine = ++seq;\n  const req = request.value;\n  try {\n    const res = await props.count(req);\n    if (mine !== seq) return;\n    counted.value = res;\n  } catch {\n    if (mine !== seq) return;\n    counted.value = null;\n    countError.value = true;\n  } finally {\n    if (mine === seq) counting.value = false;\n  }\n}\n\n/**\n * ⚠ The guard the `bytes()` bug earned. A throw while building `request` used\n * to happen inside this watcher's own getter, so the watcher never fired and\n * the dialog went on showing the count from before the change — a broken\n * filter wearing the face of a filter that matched everything. A failure is\n * now REPORTED (the count line says it could not run) instead of leaving a\n * stale number on screen. `'ERR'` is a constant, not a timestamp: a value that\n * changed every evaluation would re-trigger the watcher forever.\n */\nwatch(\n  () => {\n    if (!props.open) return '';\n    try {\n      return JSON.stringify(request.value);\n    } catch {\n      return 'ERR';\n    }\n  },\n  (v) => {\n    if (!v) return;\n    if (v === 'ERR') {\n      if (timer) clearTimeout(timer);\n      seq++;\n      counted.value = null;\n      counting.value = false;\n      countError.value = true;\n      return;\n    }\n    scheduleCount();\n  },\n);\n\nonBeforeUnmount(() => {\n  if (timer) clearTimeout(timer);\n});\n\n/**\n * The count sentence.\n *\n * ⚠ This dialog's most common real answer on a small folder IS one, and \"1\n * matching items\" is what a bare `{n}` message produces. Both keys have a\n * `_one` form, and `t()` picks it from `n` (composables/useLocale →\n * countedKey) — the rule that used to be written out here, once per caller.\n */\nconst countLabel = computed(() => {\n  const c = counted.value;\n  if (!c) return '';\n  return t(c.capped ? 'advsearch.count.capped' : 'advsearch.count.result', { n: String(c.count) });\n});\n\nfunction submit() {\n  if (nothingToAsk.value) return;\n  // Remember BEFORE emitting: the parent closes the dialog synchronously, and\n  // the `open` watcher that reads this runs on the next opening.\n  submitted = { query: wireQuery.value, form: snapshot() };\n  emit('submit', request.value);\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"t('advsearch.title')\"\n    size=\"lg\"\n    :theme=\"theme\"\n    @close=\"emit('close')\"\n  >\n    <form class=\"fe-advsearch\" @submit.prevent=\"submit\">\n      <!-- ── the dialog's own head ───────────────────────────────────────\n           Modal draws a plain title bar; this dialog needs the mark, the\n           title and the sentence under it as ONE block across the full\n           width, so it draws its own and the stylesheet folds Modal's away\n           (`.fe-modal__card:has(.fe-advsearch) .fe-modal__head`). The h2 up\n           there stays in the DOM on purpose — it is what `aria-labelledby`\n           on the dialog points at, so the name survives the fold. -->\n      <header class=\"fe-advsearch__head\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__head-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        <div class=\"fe-advsearch__head-text\">\n          <p class=\"fe-advsearch__head-title\">{{ t('advsearch.title') }}</p>\n          <p class=\"fe-advsearch__head-sub\">{{ t('advsearch.subtitle') }}</p>\n        </div>\n        <button\n          type=\"button\"\n          class=\"fe-advsearch__head-close\"\n          :title=\"t('advsearch.close')\"\n          :aria-label=\"t('advsearch.close')\"\n          @click=\"emit('close')\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </header>\n\n      <!-- ── what the server answers: the text and the scope ─────────────\n           One wide field and one row of tabs, because this is the whole of\n           the question that leaves the browser. -->\n      <label class=\"fe-advsearch__box\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__glass\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        <input\n          ref=\"queryEl\"\n          v-model=\"text\"\n          type=\"search\"\n          class=\"fe-advsearch__input\"\n          :placeholder=\"t('advsearch.query.placeholder')\"\n          :aria-label=\"t('advsearch.query.label')\"\n          data-testid=\"advsearch-query\"\n        />\n      </label>\n\n      <div\n        class=\"fe-advsearch__seg fe-advsearch__seg--tabs\"\n        role=\"tablist\"\n        :aria-label=\"t('advsearch.scope.label')\"\n      >\n        <button\n          v-for=\"s in scopeOptions\"\n          :key=\"s\"\n          type=\"button\"\n          role=\"tab\"\n          class=\"fe-advsearch__seg-btn\"\n          :class=\"{ 'is-active': scope === s }\"\n          :aria-selected=\"scope === s\"\n          :data-testid=\"`advsearch-scope-${s}`\"\n          @click=\"scope = s\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-advsearch__seg-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg(SCOPE_ICON[s])\"></span>\n          {{ t(`advsearch.scope.${s}`) }}\n        </button>\n      </div>\n\n      <!-- ── the two columns ─────────────────────────────────────────────\n           ⚠ Every control below the tabs narrows the rows that CAME BACK —\n           no endpoint reads a date, a size, a mime or a path. The dialog\n           says so in one sentence under the count rather than shouting it\n           over two half-page captions; the sentence is the part that has to\n           survive, not the caption. -->\n      <div class=\"fe-advsearch__cols\">\n        <div class=\"fe-advsearch__col\">\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.modified') }}</span>\n              <select v-model=\"modified\" class=\"fe-input\" data-testid=\"advsearch-modified\">\n                <option v-for=\"o in MODIFIED_OPTIONS\" :key=\"o\" :value=\"o\">\n                  {{ t(`filter.modified.${o}`) }}\n                </option>\n              </select>\n            </label>\n            <div v-if=\"modified === 'around'\" class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__sublabel\">{{ t('advsearch.around.label') }}</span>\n              <div class=\"fe-advsearch__pair\">\n                <input\n                  v-model=\"aroundDate\"\n                  type=\"datetime-local\"\n                  class=\"fe-input\"\n                  :aria-label=\"t('advsearch.around.date')\"\n                  data-testid=\"advsearch-around-date\"\n                />\n                <div class=\"fe-advsearch__seg\" role=\"group\" :aria-label=\"t('advsearch.around.label')\">\n                  <button\n                    v-for=\"s in SPAN_OPTIONS\"\n                    :key=\"s\"\n                    type=\"button\"\n                    class=\"fe-advsearch__seg-btn\"\n                    :class=\"{ 'is-active': aroundSpan === s }\"\n                    :aria-pressed=\"aroundSpan === s\"\n                    @click=\"aroundSpan = s\"\n                  >\n                    {{ t(`advsearch.around.${s}`) }}\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <label class=\"fe-advsearch__field\">\n            <span class=\"fe-advsearch__label\">{{ t('filter.type') }}</span>\n            <select v-model=\"type\" class=\"fe-input\" data-testid=\"advsearch-type\">\n              <option v-for=\"o in TYPE_OPTIONS\" :key=\"o\" :value=\"o\">{{ t(`filter.type.${o}`) }}</option>\n            </select>\n          </label>\n\n          <!-- Whose it is. Same union and same predicate as the filter row's\n               People pill, so \"files you put here\" means one thing in this\n               product. Off under the content scopes, and it says why rather\n               than vanishing — see `ownerFilterable`. -->\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.people') }}</span>\n              <select\n                v-model=\"people\"\n                class=\"fe-input\"\n                :disabled=\"!ownerFilterable\"\n                data-testid=\"advsearch-people\"\n              >\n                <option v-for=\"o in peopleOptions\" :key=\"o.value\" :value=\"o.value\">\n                  {{ peopleLabel(o) }}\n                </option>\n              </select>\n            </label>\n            <p v-if=\"!ownerFilterable\" class=\"fe-advsearch__hint fe-advsearch__hint--block\">\n              {{ t('advsearch.people.name_only') }}\n            </p>\n          </div>\n\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('advsearch.tags.label') }}</span>\n              <input\n                v-model=\"tagsRaw\"\n                type=\"text\"\n                class=\"fe-input\"\n                :placeholder=\"t('advsearch.tags.placeholder')\"\n                data-testid=\"advsearch-tags\"\n              />\n            </label>\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('advsearch.tags.exclude') }}</span>\n              <input\n                v-model=\"excludeRaw\"\n                type=\"text\"\n                class=\"fe-input\"\n                :placeholder=\"t('advsearch.tags.exclude_placeholder')\"\n                data-testid=\"advsearch-extags\"\n              />\n            </label>\n            <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">{{ t('advsearch.tags.hint') }}</p>\n          </div>\n        </div>\n\n        <div class=\"fe-advsearch__col\">\n          <div class=\"fe-advsearch__group\">\n            <label class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__label\">{{ t('filter.size') }}</span>\n              <select v-model=\"size\" class=\"fe-input\" data-testid=\"advsearch-size\">\n                <option v-for=\"o in SIZE_OPTIONS\" :key=\"o\" :value=\"o\">{{ t(`filter.size.${o}`) }}</option>\n              </select>\n            </label>\n            <div v-if=\"size === 'range'\" class=\"fe-advsearch__field\">\n              <span class=\"fe-advsearch__sublabel\">{{ t('advsearch.size.range_label') }}</span>\n              <div class=\"fe-advsearch__pair\">\n                <input\n                  v-model=\"sizeFrom\"\n                  type=\"number\"\n                  min=\"0\"\n                  class=\"fe-input fe-advsearch__num\"\n                  :placeholder=\"t('advsearch.size.from')\"\n                  :aria-label=\"t('advsearch.size.from')\"\n                  data-testid=\"advsearch-size-from\"\n                />\n                <span class=\"fe-advsearch__dash\" aria-hidden=\"true\">–</span>\n                <input\n                  v-model=\"sizeTo\"\n                  type=\"number\"\n                  min=\"0\"\n                  class=\"fe-input fe-advsearch__num\"\n                  :placeholder=\"t('advsearch.size.to')\"\n                  :aria-label=\"t('advsearch.size.to')\"\n                  data-testid=\"advsearch-size-to\"\n                />\n                <select v-model=\"sizeUnit\" class=\"fe-input fe-advsearch__unit\" :aria-label=\"t('filter.size')\">\n                  <option value=\"kb\">{{ t('unit.kb') }}</option>\n                  <option value=\"mb\">{{ t('unit.mb') }}</option>\n                  <option value=\"gb\">{{ t('unit.gb') }}</option>\n                </select>\n              </div>\n            </div>\n          </div>\n\n          <!-- The folder. A segmented trio rather than a menu, because the\n               three answers are the whole of the choice and the sentence\n               under it then names the folder the choice is about — the\n               folder captured when the dialog opened, not wherever the\n               explorer has since been rebased to. -->\n          <div class=\"fe-advsearch__group\">\n            <span class=\"fe-advsearch__label\">{{ t('advsearch.where.label') }}</span>\n            <div\n              class=\"fe-advsearch__seg fe-advsearch__seg--wide\"\n              role=\"group\"\n              :aria-label=\"t('advsearch.where.label')\"\n              data-testid=\"advsearch-where\"\n            >\n              <button\n                v-for=\"m in PATH_MODES\"\n                :key=\"m\"\n                type=\"button\"\n                class=\"fe-advsearch__seg-btn\"\n                :class=\"{ 'is-active': pathMode === m }\"\n                :aria-pressed=\"pathMode === m\"\n                :data-testid=\"`advsearch-where-${m}`\"\n                @click=\"pathMode = m\"\n              >\n                {{ t(`advsearch.where.${m}_short`) }}\n              </button>\n            </div>\n            <span class=\"fe-advsearch__hint\">\n              {{ t(`advsearch.where.${pathMode}`, { folder: folderLabel || '' }) }}\n            </span>\n          </div>\n\n          <!-- What \"contents\" means here. This is the 200 KB sentence, kept\n               where the reference shell keeps its content options: a reader\n               who picks the Content tab has to learn what the index covers\n               BEFORE an empty result teaches them. -->\n          <div class=\"fe-advsearch__group\">\n            <p class=\"fe-advsearch__grouphead\">\n              <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n              <span class=\"fe-advsearch__grouphead-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('preview')\"></span>\n              {{ t('advsearch.content.heading') }}\n            </p>\n            <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">\n              {{ contentSearch ? t('advsearch.scope.hint') : t('advsearch.scope.name_only') }}\n            </p>\n          </div>\n        </div>\n      </div>\n\n      <!-- ── the live count ──────────────────────────────────────────────\n           A real query, debounced, and the line under it says both what\n           that cost and which half of the form the server never saw. -->\n      <div class=\"fe-advsearch__count\" data-testid=\"advsearch-count\">\n        <div class=\"fe-advsearch__count-top\">\n          <p class=\"fe-advsearch__count-line\">\n            <span v-if=\"nothingToAsk\">{{ t('advsearch.count.idle') }}</span>\n            <span v-else-if=\"counting\">{{ t('advsearch.count.counting') }}</span>\n            <span v-else-if=\"countError\">{{ t('advsearch.count.error') }}</span>\n            <strong v-else-if=\"counted\">{{ countLabel }}</strong>\n          </p>\n          <button\n            v-if=\"!nothingToAsk\"\n            type=\"button\"\n            class=\"fe-advsearch__viewall\"\n            data-testid=\"advsearch-viewall\"\n            @click=\"submit\"\n          >{{ t('advsearch.viewall') }}</button>\n        </div>\n        <p class=\"fe-advsearch__hint fe-advsearch__hint--block\">{{ t('advsearch.count.cost') }}</p>\n        <p v-if=\"wireQuery\" class=\"fe-advsearch__wire\">\n          {{ t('advsearch.wire') }} <code>{{ wireQuery }}</code>\n        </p>\n      </div>\n    </form>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-advsearch__reset\" @click=\"reset\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__btn-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('refresh')\"></span>\n        {{ t('advsearch.reset') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('advsearch.cancel') }}</button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"nothingToAsk\"\n        data-testid=\"advsearch-submit\"\n        @click=\"submit\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-advsearch__btn-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('search')\"></span>\n        {{ t('advsearch.submit') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ShortcutsHelp — \"?\" cheat-sheet modal.\n *\n * wiring:c2 — renders the live shortcut registry (useShortcutList) so\n * user remaps show up here too, grouped by section. Unbound actions are\n * listed with an \"unassigned\" chip. The footer carries a \"Customize\"\n * button that asks the host to open ShortcutSettings. Modal.vue\n * supplies Esc handling, backdrop, focus and the close button.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { useShortcutList, type ShortcutView } from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'customize'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n  const order: string[] = [];\n  const map = new Map<string, ShortcutView[]>();\n  for (const s of list.value) {\n    if (!map.has(s.groupKey)) {\n      map.set(s.groupKey, []);\n      order.push(s.groupKey);\n    }\n    map.get(s.groupKey)!.push(s);\n  }\n  return order.map((key) => ({ key, items: map.get(key)! }));\n});\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('shortcuts.title')\" size=\"md\" @close=\"emit('close')\">\n    <div class=\"fe-shortcuts\">\n      <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortcuts__group\">\n        <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n        <div class=\"fe-shortcuts__table\">\n          <div v-for=\"s in g.items\" :key=\"s.id\" class=\"fe-shortcuts__row\">\n            <span class=\"fe-shortcuts__keys\">\n              <template v-if=\"s.keys.length === 0\">\n                <span class=\"fe-shortcuts__unbound\">{{ t('shortcuts.settings.unbound') }}</span>\n              </template>\n              <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n                <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n                <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n              </template>\n            </span>\n            <span class=\"fe-shortcuts__desc\">\n              {{ t(s.labelKey) }}\n              <span\n                v-if=\"s.overridden\"\n                class=\"fe-shortcuts__custom\"\n                :title=\"t('shortcuts.settings.customized')\"\n              >●</span>\n            </span>\n          </div>\n        </div>\n      </section>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('customize')\">\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('shortcut-settings')\"></span>\n        {{ t('shortcuts.customize') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">{{ t('viewer.close') }}</button>\n    </template>\n  </Modal>\n</template>\n","/**\n * themes.ts — wiring:c1 theme registry + application engine.\n *\n * A \"theme\" is a palette-only preset: a map of `--fe-*` CSS custom\n * properties in TWO variants (light + dark). Picking a theme is fully\n * independent from the light/dark MODE — the mode (config.theme prop /\n * OS preference) keeps deciding which variant of the selected theme is\n * active, exactly like the stock palette in styles/variables.css.\n *\n * Application strategy (two cooperating layers):\n *\n *  1. Inline `--fe-*` variables on the explorer ROOT element\n *     (`applyThemeToEl`) — the documented \"consumer overrides by setting\n *     --fe-* on a higher scope\" philosophy, resolved to the currently\n *     active variant. Covers the whole `.fe` subtree, works in embeds\n *     without touching the host page's own theme.\n *\n *  2. A singleton injected `<style data-filex-theme>` (`syncThemeStyle`)\n *     that mirrors variables.css' EXACT selector cascade with the\n *     selected theme's values. This is required because some surfaces\n *     re-declare the variables on themselves and would otherwise shadow\n *     the inherited inline values back to the stock palette:\n *       - the Teleport-ed context menu backdrop (`.fe-ctx-backdrop…`\n *         lives under <body>, outside the root element entirely), and\n *       - modal backdrops, which carry their own `.fe` /\n *         `.fe--theme-dark` classes (dark-mode selectors like\n *         `.dark .fe` re-set the tokens on those descendants).\n *     Because the injected element is appended to <head> at runtime it\n *     always comes AFTER the bundled stylesheet, so equal-specificity\n *     rules win by source order — the same mechanism variables.css uses\n *     internally. No `!important` needed.\n *\n * The `default` theme applies NOTHING (inline vars removed, style\n * element emptied) so host-level `--fe-*` overrides keep working\n * untouched — its token maps below exist only to render the gallery\n * preview card.\n *\n * Persistence: localStorage `filex.palette` (absent/invalid → default),\n * shared reactively across every explorer instance on the page and\n * synced across tabs via the `storage` event.\n *\n * All palettes were contrast-checked (WCAG 2.1): text/bg ≥ 7:1,\n * text on elevated/hover/selected surfaces + muted text + text-on-primary\n * ≥ 4.5:1, primary & danger vs bg ≥ 3:1 — in BOTH variants.\n */\n\nimport { ref, type Ref } from 'vue';\n\n/** Map of `--fe-*` custom property → value. */\nexport type ThemeTokenMap = Record<string, string>;\n\nexport interface ThemeDef {\n  /** Stable id — persisted in localStorage, never shown to users. */\n  id: string;\n  /** i18n catalogue key for the display name (tr + en). */\n  nameKey: string;\n  /** Palette applied when the resolved mode is light. */\n  light: ThemeTokenMap;\n  /** Palette applied when the resolved mode is dark. */\n  dark: ThemeTokenMap;\n}\n\n/**\n * ⚠⚠ `filex.palette`, NOT `filex.theme` — and the rename is a BUG FIX, not\n * tidying.\n *\n * `web/src/lib/theme.ts` has always stored the admin app's light/dark/auto\n * MODE under `filex.theme`, and this module stored the PALETTE id under the\n * same name. Two writers, one key, neither aware of the other — and because\n * both readers fall back silently on a value they do not recognise, nothing\n * ever threw: picking \"Night Blue\" in the explorer reset the panel's\n * light/dark choice to auto, and choosing Dark in the panel reset the palette\n * to default. It went unseen for as long as the two controls lived on\n * opposite sides of the product; putting them both in the settings modal\n * makes it a one-click round trip.\n */\nexport const THEME_LS_KEY = 'filex.palette';\n\n/** The key this preference used to share with the app's mode. Read once, to\n *  carry a palette across the rename; never written. */\nconst LEGACY_THEME_LS_KEY = 'filex.theme';\n\nexport const DEFAULT_THEME_ID = 'default';\n\n/* ------------------------------------------------------------------ */\n/* Registry                                                            */\n/* ------------------------------------------------------------------ */\n\n/**\n * ⚠⚠ Every theme declares the SAME key set, and there is a test for it\n * (`web/tests/api/themeTokenParity.test.ts`). That test exists because of a\n * bug whose whole nature is that nothing notices:\n *\n *   `--fe-primary-soft` was declared by variables.css and used by nine rules\n *   in base.css — the active tab of a segmented control, a filter chip that is\n *   set, an active toolbar button, the advanced-search tabs — and by NO theme\n *   map at all. So somebody on Forest, Amber or Lilac got their palette\n *   everywhere except the one token that marks \"this is the selected thing\",\n *   which stayed stock blue and clashed with the palette they had just picked.\n *   `--fe-border-soft` (ten rules, the quieter separators inside panels) was\n *   missing the same way. Neither errored, neither looked broken in the\n *   gallery card, and the only way to see it was to pick a theme and look.\n *\n * How the two are derived, so a new theme fills them the same way:\n *\n *   --fe-primary-soft = the theme's OWN primary mixed into its OWN background,\n *     at the fraction that reproduces the STOCK tint's separation from its\n *     background (1.184:1 light, 1.207:1 dark). Separation is the invariant,\n *     not the mix fraction: the palettes' primaries run from a near-black\n *     green to a pale grey, so a fixed 13% lands anywhere between invisible\n *     and a slab. Held that way, every palette's tint reads with the same\n *     weight as the stock one. Measured: text on it is 9.44:1 (Terminal dark)\n *     to 17.85:1 (High Contrast light), so the 4.5 bar is never in question.\n *   --fe-border-soft = the theme's own border mixed toward its own background\n *     at the stock fraction (0.60 light / 0.68 dark), which reproduces the\n *     stock value exactly. ⚠ High Contrast is the deliberate exception: it\n *     takes its own `--fe-border` unchanged, because a *soft* separator is the\n *     one thing that theme exists to not have.\n *\n * ⚠ What is deliberately NOT themed, and why:\n *   `--fe-ok` / `--fe-warning` / `--fe-keep-ok` — status signals, not taste.\n *     They are identical in light and dark on purpose; \"ok\" that is green in\n *     one palette and amber in another stops being a signal.\n *   `--fe-icon-*` — file-type accents. A PDF is red and a folder is yellow in\n *     every palette, and they are never the only cue (the row carries its name\n *     in `--fe-text` too).\n *   radii, control heights, the type scale, gaps, `--fe-sidenav-w`,\n *     `--fe-font-mono` — metrics, not a palette.\n *   `--fe-shadow` / `--fe-shadow-sm` / `--fe-font` — depth and face rather\n *     than colour, and the two themes that DO override them (High Contrast's\n *     hard 1px outlines, Terminal's monospace face) are extras on top of the\n *     shared set, not holes in it. The parity test allows extras and requires\n *     the shared set.\n */\nexport const THEMES: ThemeDef[] = [\n  {\n    // Stock palette — the maps duplicate variables.css ONLY for the\n    // gallery preview; applying this theme clears all overrides.\n    id: DEFAULT_THEME_ID,\n    nameKey: 'theme.name.default',\n    light: {\n      /* ⚠ Mirrors styles/variables.css exactly — web/tests/api/themeContrast.test.ts\n       * fails on any drift. It has drifted before: the stock primary was\n       * darkened for contrast and this preview map kept the old blue, so the\n       * gallery card advertised a colour the product no longer used. */\n      '--fe-bg': '#ffffff',\n      '--fe-bg-elev': '#f7f8fb',\n      '--fe-bg-hover': '#f3f4f6',\n      '--fe-bg-selected': '#eef3ff',\n      '--fe-border': '#e5e7eb',\n      '--fe-border-soft': '#eef0f4',\n      '--fe-border-strong': '#d1d5db',\n      '--fe-text': '#1f2937',\n      '--fe-text-muted': '#6b7280',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2f6ceb',\n      '--fe-primary-hover': '#2559c9',\n      '--fe-primary-soft': '#e6ecfa',\n      '--fe-primary-ink': '#2559c9',\n      '--fe-danger': '#dc2626',\n      '--fe-danger-hover': '#b91c1c',\n    },\n    dark: {\n      '--fe-bg': '#15171c',\n      '--fe-bg-elev': '#1a1d23',\n      '--fe-bg-hover': '#1f232a',\n      '--fe-bg-selected': '#1c2740',\n      '--fe-border': '#2e333c',\n      '--fe-border-soft': '#262a32',\n      '--fe-border-strong': '#3d444f',\n      '--fe-text': '#e6e8ec',\n      '--fe-text-muted': '#888f9b',\n      /* Dark ink, not white: white on the button measures 3.16 against the 4.5\n       * this file claims. Mirrors styles/variables.css. */\n      '--fe-text-on-primary': '#15171c',\n      '--fe-primary': '#5b8cff',\n      '--fe-primary-hover': '#7ba3ff',\n      '--fe-primary-soft': '#1c2740',\n      '--fe-primary-ink': '#7ba3ff',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Night Blue — deep indigo/navy.\n    id: 'night',\n    nameKey: 'theme.name.night',\n    light: {\n      '--fe-bg': '#f6f8fd',\n      '--fe-bg-elev': '#edf1fa',\n      '--fe-bg-hover': '#e2e9f7',\n      '--fe-bg-selected': '#d2ddf4',\n      '--fe-border': '#d6deee',\n      '--fe-border-soft': '#e3e8f4',\n      '--fe-border-strong': '#aebfda',\n      '--fe-text': '#151f38',\n      '--fe-text-muted': '#49587a',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2c4a9e',\n      '--fe-primary-hover': '#213a80',\n      '--fe-primary-soft': '#e0e6f4',\n      '--fe-primary-ink': '#213a80',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#0a1024',\n      '--fe-bg-elev': '#111a35',\n      '--fe-bg-hover': '#1a2547',\n      '--fe-bg-selected': '#243665',\n      '--fe-border': '#26335a',\n      '--fe-border-soft': '#1d2748',\n      '--fe-border-strong': '#3c4e84',\n      '--fe-text': '#dfe6f7',\n      '--fe-text-muted': '#96a5cc',\n      '--fe-text-on-primary': '#050b26',\n      '--fe-primary': '#6d8dfc',\n      '--fe-primary-hover': '#5273f2',\n      '--fe-primary-soft': '#182243',\n      '--fe-primary-ink': '#6d8dfc',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Forest — calm greens.\n    id: 'forest',\n    nameKey: 'theme.name.forest',\n    light: {\n      '--fe-bg': '#f5faf5',\n      '--fe-bg-elev': '#eaf3eb',\n      '--fe-bg-hover': '#dcecdf',\n      '--fe-bg-selected': '#c8e2ce',\n      '--fe-border': '#d2e2d4',\n      '--fe-border-soft': '#e0ece1',\n      '--fe-border-strong': '#a2c3a8',\n      '--fe-text': '#182b1d',\n      '--fe-text-muted': '#42604a',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#2b7a41',\n      '--fe-primary-hover': '#226334',\n      '--fe-primary-soft': '#dbe9dc',\n      '--fe-primary-ink': '#226334',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#0d1611',\n      '--fe-bg-elev': '#132019',\n      '--fe-bg-hover': '#1b2d23',\n      '--fe-bg-selected': '#264532',\n      '--fe-border': '#28402f',\n      '--fe-border-soft': '#1f3225',\n      '--fe-border-strong': '#3e5f49',\n      '--fe-text': '#dcebe0',\n      '--fe-text-muted': '#93b09b',\n      '--fe-text-on-primary': '#04180b',\n      '--fe-primary': '#54c17a',\n      '--fe-primary-hover': '#3fae66',\n      '--fe-primary-soft': '#16291d',\n      '--fe-primary-ink': '#54c17a',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Amber — warm amber/bronze.\n    id: 'amber',\n    nameKey: 'theme.name.amber',\n    light: {\n      '--fe-bg': '#fdf9f0',\n      '--fe-bg-elev': '#f7efdd',\n      '--fe-bg-hover': '#f0e3c8',\n      '--fe-bg-selected': '#ead6ab',\n      '--fe-border': '#e6dabf',\n      '--fe-border-soft': '#efe6d3',\n      '--fe-border-strong': '#c6b184',\n      '--fe-text': '#33270f',\n      '--fe-text-muted': '#655631',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#9a4b00',\n      '--fe-primary-hover': '#7c3c00',\n      '--fe-primary-soft': '#f3e5d7',\n      '--fe-primary-ink': '#7c3c00',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#191307',\n      '--fe-bg-elev': '#231a0c',\n      '--fe-bg-hover': '#2f2312',\n      '--fe-bg-selected': '#44331b',\n      '--fe-border': '#3b2e17',\n      '--fe-border-soft': '#302512',\n      '--fe-border-strong': '#5b4a29',\n      '--fe-text': '#f2e7d4',\n      '--fe-text-muted': '#bda887',\n      '--fe-text-on-primary': '#2a1c02',\n      '--fe-primary': '#f5a524',\n      '--fe-primary-hover': '#ffb84d',\n      '--fe-primary-soft': '#31230c',\n      '--fe-primary-ink': '#ffb84d',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Lilac — soft purple.\n    id: 'lilac',\n    nameKey: 'theme.name.lilac',\n    light: {\n      '--fe-bg': '#faf7fd',\n      '--fe-bg-elev': '#f2ecfa',\n      '--fe-bg-hover': '#e8ddf5',\n      '--fe-bg-selected': '#dccaf0',\n      '--fe-border': '#e1d6ee',\n      '--fe-border-soft': '#ebe3f4',\n      '--fe-border-strong': '#bda6d9',\n      '--fe-text': '#241a33',\n      '--fe-text-muted': '#584871',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#7231e0',\n      '--fe-primary-hover': '#5f21c4',\n      '--fe-primary-soft': '#e9e3fc',\n      '--fe-primary-ink': '#5f21c4',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#130f1c',\n      '--fe-bg-elev': '#1b1527',\n      '--fe-bg-hover': '#261d37',\n      '--fe-bg-selected': '#37294f',\n      '--fe-border': '#302546',\n      '--fe-border-soft': '#261e38',\n      '--fe-border-strong': '#4b3a6d',\n      '--fe-text': '#e9e2f5',\n      '--fe-text-muted': '#a999c5',\n      '--fe-text-on-primary': '#180d33',\n      '--fe-primary': '#b197fa',\n      '--fe-primary-hover': '#9c7cf4',\n      '--fe-primary-soft': '#272038',\n      '--fe-primary-ink': '#b197fa',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // High Contrast — black/white with strong borders, saturated accents.\n    id: 'contrast',\n    nameKey: 'theme.name.contrast',\n    light: {\n      '--fe-bg': '#ffffff',\n      '--fe-bg-elev': '#f2f2f2',\n      '--fe-bg-hover': '#e0e0e0',\n      '--fe-bg-selected': '#c9dcff',\n      '--fe-border': '#5c5c5c',\n      '--fe-border-soft': '#5c5c5c',\n      '--fe-border-strong': '#000000',\n      '--fe-text': '#000000',\n      '--fe-text-muted': '#3d3d3d',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#003d99',\n      '--fe-primary-hover': '#002a6b',\n      '--fe-primary-soft': '#e7edf7',\n      '--fe-primary-ink': '#002a6b',\n      '--fe-danger': '#a80000',\n      '--fe-danger-hover': '#7d0000',\n      '--fe-shadow': '0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)',\n      '--fe-shadow-sm': '0 0 0 1px #000000',\n    },\n    dark: {\n      '--fe-bg': '#000000',\n      '--fe-bg-elev': '#0d0d0d',\n      '--fe-bg-hover': '#212121',\n      '--fe-bg-selected': '#003d80',\n      '--fe-border': '#8f8f8f',\n      '--fe-border-soft': '#8f8f8f',\n      '--fe-border-strong': '#ffffff',\n      '--fe-text': '#ffffff',\n      '--fe-text-muted': '#d6d6d6',\n      '--fe-text-on-primary': '#001430',\n      '--fe-primary': '#7ab8ff',\n      '--fe-primary-hover': '#9ccaff',\n      '--fe-primary-soft': '#0e1a29',\n      '--fe-primary-ink': '#9ccaff',\n      '--fe-danger': '#ff7575',\n      '--fe-danger-hover': '#ff9999',\n      '--fe-shadow': '0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)',\n      '--fe-shadow-sm': '0 0 0 1px #ffffff',\n    },\n  },\n  {\n    // Soft Gray — desaturated, quiet neutral.\n    id: 'gray',\n    nameKey: 'theme.name.gray',\n    light: {\n      '--fe-bg': '#f7f7f8',\n      '--fe-bg-elev': '#efeff1',\n      '--fe-bg-hover': '#e4e4e7',\n      '--fe-bg-selected': '#d6d7db',\n      '--fe-border': '#dfdfe2',\n      '--fe-border-soft': '#e9e9eb',\n      '--fe-border-strong': '#b9b9c0',\n      '--fe-text': '#26272b',\n      '--fe-text-muted': '#585a63',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#4b4b54',\n      '--fe-primary-hover': '#38383f',\n      '--fe-primary-soft': '#e4e4e6',\n      '--fe-primary-ink': '#38383f',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n    },\n    dark: {\n      '--fe-bg': '#131316',\n      '--fe-bg-elev': '#1b1b1f',\n      '--fe-bg-hover': '#26262b',\n      '--fe-bg-selected': '#35353c',\n      '--fe-border': '#2d2d33',\n      '--fe-border-soft': '#242429',\n      '--fe-border-strong': '#4a4a52',\n      '--fe-text': '#e6e6e9',\n      '--fe-text-muted': '#a4a4ad',\n      '--fe-text-on-primary': '#17171b',\n      '--fe-primary': '#b0b0ba',\n      '--fe-primary-hover': '#c4c4cd',\n      '--fe-primary-soft': '#242428',\n      '--fe-primary-ink': '#c4c4cd',\n      '--fe-danger': '#f87171',\n      '--fe-danger-hover': '#ef4444',\n    },\n  },\n  {\n    // Terminal Green — phosphor green, monospace face for the full CRT vibe.\n    id: 'terminal',\n    nameKey: 'theme.name.terminal',\n    light: {\n      '--fe-bg': '#f3f9f4',\n      '--fe-bg-elev': '#e5f2e8',\n      '--fe-bg-hover': '#d5ead9',\n      '--fe-bg-selected': '#bce3c6',\n      '--fe-border': '#cbe2d1',\n      '--fe-border-soft': '#dbebdf',\n      '--fe-border-strong': '#94c2a0',\n      '--fe-text': '#0c2913',\n      '--fe-text-muted': '#31573c',\n      '--fe-text-on-primary': '#ffffff',\n      '--fe-primary': '#116b33',\n      '--fe-primary-hover': '#0c5427',\n      '--fe-primary-soft': '#dbe9dd',\n      '--fe-primary-ink': '#0c5427',\n      '--fe-danger': '#c62828',\n      '--fe-danger-hover': '#a51f1f',\n      '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n    },\n    dark: {\n      '--fe-bg': '#050d07',\n      '--fe-bg-elev': '#0a1710',\n      '--fe-bg-hover': '#112418',\n      '--fe-bg-selected': '#1a3a26',\n      '--fe-border': '#1c3a2a',\n      '--fe-border-soft': '#142b1e',\n      '--fe-border-strong': '#316144',\n      '--fe-text': '#4fdd8b',\n      '--fe-text-muted': '#38a668',\n      '--fe-text-on-primary': '#03180a',\n      '--fe-primary': '#25c95e',\n      '--fe-primary-hover': '#4fdd8b',\n      '--fe-primary-soft': '#0c2412',\n      '--fe-primary-ink': '#4fdd8b',\n      '--fe-danger': '#ff6b62',\n      '--fe-danger-hover': '#ff8d86',\n      '--fe-font': 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace',\n    },\n  },\n];\n\nexport function themeById(id: string | null | undefined): ThemeDef | undefined {\n  return THEMES.find((t) => t.id === id);\n}\n\n/** Every token key ANY theme touches — used to fully clear inline overrides\n *  when switching themes (a theme that skips a token must not inherit the\n *  previous theme's value for it). */\nconst ALL_TOKEN_KEYS: string[] = Array.from(\n  new Set(THEMES.flatMap((t) => [...Object.keys(t.light), ...Object.keys(t.dark)])),\n);\n\n/* ------------------------------------------------------------------ */\n/* Shared reactive state + persistence                                 */\n/* ------------------------------------------------------------------ */\n\nfunction readStoredThemeId(): string {\n  try {\n    const v = localStorage.getItem(THEME_LS_KEY);\n    if (v && themeById(v)) return v;\n    // One-time carry-over from the shared key. `themeById` is what makes this\n    // safe: 'light' / 'dark' / 'auto' are not palette ids, so a value the app's\n    // mode wrote can never be mistaken for a palette here.\n    const legacy = localStorage.getItem(LEGACY_THEME_LS_KEY);\n    if (legacy && themeById(legacy)) {\n      localStorage.setItem(THEME_LS_KEY, legacy);\n      localStorage.removeItem(LEGACY_THEME_LS_KEY);\n      return legacy;\n    }\n    return DEFAULT_THEME_ID;\n  } catch {\n    return DEFAULT_THEME_ID;\n  }\n}\n\n// Module-level singleton so every explorer instance on the page follows the\n// same selection instantly.\nconst themeId: Ref<string> = ref(\n  typeof window === 'undefined' ? DEFAULT_THEME_ID : readStoredThemeId(),\n);\n\nexport function setTheme(id: string): void {\n  const valid = themeById(id) ? id : DEFAULT_THEME_ID;\n  themeId.value = valid;\n  try {\n    if (valid === DEFAULT_THEME_ID) localStorage.removeItem(THEME_LS_KEY);\n    else localStorage.setItem(THEME_LS_KEY, valid);\n  } catch {\n    /* quota / private mode */\n  }\n}\n\n/** Reactive handle for components: `{ themeId, setTheme }`. */\nexport function useThemeState(): { themeId: Ref<string>; setTheme: (id: string) => void } {\n  return { themeId, setTheme };\n}\n\n/* ------------------------------------------------------------------ */\n/* Light / dark MODE preference                                        */\n/* ------------------------------------------------------------------ */\n\n/**\n * The user's own light/dark choice — a different question from WHICH theme\n * paints (that is `themeId` above).\n *\n * `'host'` is the default and means \"whatever the embedder passed in\n * `config.theme`\". That is what keeps every existing embed unchanged: work and\n * the fishapp hand the explorer the mode their own page is in, and an explorer\n * that silently overrode it would sit as a dark rectangle inside a light page.\n * The other three are an explicit choice by the person looking at it and\n * outrank the host: `'auto'` follows the operating system, `'light'`/`'dark'`\n * are fixed.\n */\nexport type ThemeModePref = 'host' | 'auto' | 'light' | 'dark';\n\nexport const THEME_MODE_LS_KEY = 'filex.thememode';\n\nconst MODE_VALUES: ThemeModePref[] = ['host', 'auto', 'light', 'dark'];\n\nfunction readStoredThemeMode(): ThemeModePref {\n  try {\n    const v = localStorage.getItem(THEME_MODE_LS_KEY) as ThemeModePref | null;\n    return v && MODE_VALUES.includes(v) ? v : 'host';\n  } catch {\n    return 'host';\n  }\n}\n\nconst themeMode: Ref<ThemeModePref> = ref(\n  typeof window === 'undefined' ? 'host' : readStoredThemeMode(),\n);\n\nexport function setThemeMode(mode: ThemeModePref): void {\n  const valid = MODE_VALUES.includes(mode) ? mode : 'host';\n  themeMode.value = valid;\n  try {\n    if (valid === 'host') localStorage.removeItem(THEME_MODE_LS_KEY);\n    else localStorage.setItem(THEME_MODE_LS_KEY, valid);\n  } catch {\n    /* quota / private mode */\n  }\n}\n\n/** Reactive handle for components: `{ themeMode, setThemeMode }`. */\nexport function useThemeModeState(): {\n  themeMode: Ref<ThemeModePref>;\n  setThemeMode: (mode: ThemeModePref) => void;\n} {\n  return { themeMode, setThemeMode };\n}\n\n// Cross-tab sync, same contract as the theme id above.\nif (typeof window !== 'undefined') {\n  try {\n    window.addEventListener('storage', (e) => {\n      if (e.key !== THEME_MODE_LS_KEY) return;\n      const v = e.newValue as ThemeModePref | null;\n      themeMode.value = v && MODE_VALUES.includes(v) ? v : 'host';\n    });\n  } catch {\n    /* non-browser env */\n  }\n}\n\n// Cross-tab sync — another tab changing the preference updates this one live.\nif (typeof window !== 'undefined') {\n  try {\n    window.addEventListener('storage', (e) => {\n      if (e.key !== THEME_LS_KEY) return;\n      themeId.value = e.newValue && themeById(e.newValue) ? e.newValue : DEFAULT_THEME_ID;\n    });\n  } catch {\n    /* non-browser env */\n  }\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 1: inline vars on the explorer root             */\n/* ------------------------------------------------------------------ */\n\n/**\n * Set (or clear, for the default theme) the selected theme's tokens as\n * inline CSS variables on the explorer root element, resolved to the\n * active variant. Inline style wins over every stylesheet rule, so the\n * root subtree is always correct regardless of host CSS.\n */\nexport function applyThemeToEl(el: HTMLElement, id: string, dark: boolean): void {\n  for (const key of ALL_TOKEN_KEYS) el.style.removeProperty(key);\n  if (id === DEFAULT_THEME_ID) return;\n  const theme = themeById(id);\n  if (!theme) return;\n  const map = dark ? theme.dark : theme.light;\n  for (const [key, value] of Object.entries(map)) el.style.setProperty(key, value);\n}\n\n/* ------------------------------------------------------------------ */\n/* Application — layer 2: injected stylesheet for shadowed surfaces    */\n/* ------------------------------------------------------------------ */\n\nconst STYLE_ATTR = 'data-filex-theme';\n\nfunction cssDecls(map: ThemeTokenMap): string {\n  return Object.entries(map)\n    .map(([k, v]) => `${k}:${v};`)\n    .join('');\n}\n\n/**\n * Generate a stylesheet that mirrors styles/variables.css' selector\n * cascade 1:1 (light base → explicit-dark selectors → prefers-dark media\n * block) with the theme's palette. Appended after the bundled CSS it\n * overrides every surface — teleported context menus, modal backdrops —\n * in whichever mode they resolve to, without JS having to track them.\n */\nexport function generateThemeCss(theme: ThemeDef): string {\n  const light = cssDecls(theme.light);\n  const dark = cssDecls(theme.dark);\n  const darkSelectors = [\n    '.fe--theme-dark',\n    \":root[data-theme='dark'] .fe\",\n    '.fe.fe--theme-dark',\n    ':root.dark',\n    '.dark',\n    ':root.dark .fe',\n    '.dark .fe',\n    '.fe-ctx-backdrop--theme-dark',\n    \".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']\",\n  ].join(',');\n  const autoDarkSelectors = [\n    '.fe:not(.fe--theme-light)',\n    '.fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)',\n  ].join(',');\n  return (\n    `/* filex theme: ${theme.id} */` +\n    `:root,.fe{${light}}` +\n    `${darkSelectors}{${dark}}` +\n    `@media (prefers-color-scheme: dark){${autoDarkSelectors}{${dark}}}`\n  );\n}\n\n/**\n * Create/update/empty the singleton `<style data-filex-theme>` element in\n * <head>. Idempotent — safe to call from every explorer instance.\n */\nexport function syncThemeStyle(id: string): void {\n  if (typeof document === 'undefined') return;\n  let el = document.head.querySelector<HTMLStyleElement>(`style[${STYLE_ATTR}]`);\n  const theme = id === DEFAULT_THEME_ID ? undefined : themeById(id);\n  if (!theme) {\n    if (el) el.textContent = '';\n    return;\n  }\n  if (!el) {\n    el = document.createElement('style');\n    el.setAttribute(STYLE_ATTR, '');\n    document.head.appendChild(el);\n  } else if (el !== document.head.lastElementChild) {\n    // Keep it AFTER any stylesheet injected later (e.g. the webcomponent's\n    // own core-CSS injection) so equal-specificity rules keep losing to us.\n    document.head.appendChild(el);\n  }\n  const css = generateThemeCss(theme);\n  if (el.textContent !== css) el.textContent = css;\n}\n","<script setup lang=\"ts\">\n/**\n * ThemePalette — the grid of palette cards, and nothing else.\n *\n * Each card is a mini live preview (surface + toolbar chips + sample rows)\n * painted with that palette's own tokens for the currently resolved light/dark\n * mode, so the card shows exactly what you would get. Click emits `select`;\n * the selected card carries a ✓.\n *\n * ⚠ Split out of `ThemeGallery.vue` rather than copied: the appearance\n * controls now have TWO hosts — the explorer's own gallery modal, and the web\n * app's user-settings modal, which cannot mount the gallery because the\n * gallery IS a modal (`modals/Modal.vue`, a fixed full-viewport backdrop) and\n * a dialog inside a dialog is not a settings pane. Duplicating thirty lines of\n * card markup into `web/` would have meant the two pickers drift apart the\n * first time a token is added to a preview — the same split this package\n * exists to prevent. One component, two hosts.\n *\n * Presentational only. Selection state + persistence live in lib/themes.ts,\n * shared across every instance on the page; the host forwards `select` to it.\n *\n * `default` is the first card and IS the reset: applying it clears every\n * override. A host therefore needs no separate \"reset\" control (the gallery\n * keeps one in its footer because a modal has a footer to keep it in).\n */\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { THEMES, type ThemeDef } from '../lib/themes';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  /** Resolved mode — decides which variant the preview cards paint. */\n  dark: boolean;\n  /** Currently selected theme id. */\n  current: string;\n  /** Draw the explanatory line above the grid. Default true. */\n  hint?: boolean;\n}>();\n\nconst emit = defineEmits<{ (e: 'select', id: string): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** Inline variables for one card — a self-contained mini `--fe-*` scope,\n *  so the preview markup can use the exact same tokens the real UI uses. */\nfunction cardVars(th: ThemeDef): Record<string, string> {\n  return props.dark ? th.dark : th.light;\n}\n</script>\n\n<template>\n  <p v-if=\"hint !== false\" class=\"fe-themes__hint\">{{ t('theme.hint') }}</p>\n  <div class=\"fe-themes\" role=\"listbox\" :aria-label=\"t('theme.title')\">\n    <button\n      v-for=\"th in THEMES\"\n      :key=\"th.id\"\n      type=\"button\"\n      class=\"fe-themecard\"\n      :class=\"{ 'is-selected': th.id === current }\"\n      role=\"option\"\n      :aria-selected=\"th.id === current\"\n      :data-theme-id=\"th.id\"\n      :style=\"cardVars(th)\"\n      @click=\"emit('select', th.id)\"\n    >\n      <span class=\"fe-themecard__preview\" aria-hidden=\"true\">\n        <span class=\"fe-themecard__topbar\">\n          <span class=\"fe-themecard__chip fe-themecard__chip--primary\"></span>\n          <span class=\"fe-themecard__chip\"></span>\n          <span class=\"fe-themecard__chip fe-themecard__chip--ghost\"></span>\n        </span>\n        <span class=\"fe-themecard__row\">\n          <span class=\"fe-themecard__dot\"></span>\n          <span class=\"fe-themecard__line\" style=\"width: 62%\"></span>\n        </span>\n        <span class=\"fe-themecard__row fe-themecard__row--selected\">\n          <span class=\"fe-themecard__dot fe-themecard__dot--primary\"></span>\n          <span class=\"fe-themecard__line\" style=\"width: 44%\"></span>\n        </span>\n        <span class=\"fe-themecard__row\">\n          <span class=\"fe-themecard__dot fe-themecard__dot--muted\"></span>\n          <span class=\"fe-themecard__line fe-themecard__line--muted\" style=\"width: 74%\"></span>\n        </span>\n      </span>\n      <span class=\"fe-themecard__name\">\n        {{ t(th.nameKey) }}\n        <span v-if=\"th.id === current\" class=\"fe-themecard__check\" :title=\"t('theme.selected')\">✓</span>\n      </span>\n    </button>\n  </div>\n</template>\n\n<!-- Deliberately NOT scoped: the webcomponent injects the CORE package's\n     built style.css, whose data-v scope ids don't match the ids the\n     webcomponent's own compile assigns (verified: fe-themecard got\n     data-v-99a95ed7 in core vs data-v-5d4cc1fd in the wc bundle) — scoped\n     rules would silently not apply in embeds. Class names are fe-*\n     namespaced, so global is collision-safe (same approach as base.css). -->\n<style>\n.fe-themes__hint {\n  margin: 0 0 12px;\n  font-size: 12.5px;\n  color: var(--fe-text-muted);\n}\n\n.fe-themes {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n  gap: 12px;\n}\n\n/* Each card is its own mini token scope (inline --fe-* vars from the theme\n   definition), so every color below refers to the CARD's theme — not the\n   active page theme. */\n.fe-themecard {\n  display: flex;\n  flex-direction: column;\n  padding: 0;\n  border: 2px solid var(--fe-border-strong);\n  border-radius: var(--fe-radius, 8px);\n  background: var(--fe-bg);\n  cursor: pointer;\n  overflow: hidden;\n  text-align: left;\n  transition: transform 0.12s ease, box-shadow 0.12s ease;\n  font: inherit;\n}\n\n.fe-themecard:hover {\n  transform: translateY(-2px);\n  box-shadow: var(--fe-shadow-sm, 0 2px 6px rgba(15, 23, 42, 0.08));\n}\n\n.fe-themecard:focus-visible {\n  outline: 2px solid var(--fe-primary);\n  outline-offset: 2px;\n}\n\n.fe-themecard.is-selected {\n  border-color: var(--fe-primary);\n  box-shadow: 0 0 0 2px var(--fe-primary);\n}\n\n.fe-themecard__preview {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  padding: 10px;\n  background: var(--fe-bg);\n  border-bottom: 1px solid var(--fe-border);\n  min-height: 84px;\n}\n\n.fe-themecard__topbar {\n  display: flex;\n  gap: 4px;\n  margin-bottom: 2px;\n}\n\n.fe-themecard__chip {\n  height: 8px;\n  width: 22px;\n  border-radius: 4px;\n  background: var(--fe-bg-hover);\n  border: 1px solid var(--fe-border);\n}\n\n.fe-themecard__chip--primary {\n  background: var(--fe-primary);\n  border-color: var(--fe-primary);\n}\n\n.fe-themecard__chip--ghost {\n  background: var(--fe-bg-elev);\n}\n\n.fe-themecard__row {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 3px 4px;\n  border-radius: 4px;\n}\n\n.fe-themecard__row--selected {\n  background: var(--fe-bg-selected);\n}\n\n.fe-themecard__dot {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: var(--fe-text);\n  opacity: 0.75;\n  flex: none;\n}\n\n.fe-themecard__dot--primary {\n  background: var(--fe-primary);\n  opacity: 1;\n}\n\n.fe-themecard__dot--muted {\n  background: var(--fe-text-muted);\n}\n\n.fe-themecard__line {\n  height: 6px;\n  border-radius: 3px;\n  background: var(--fe-text);\n  opacity: 0.55;\n}\n\n.fe-themecard__line--muted {\n  background: var(--fe-text-muted);\n}\n\n.fe-themecard__name {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  padding: 8px 10px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--fe-text);\n  background: var(--fe-bg-elev);\n  font-family: var(--fe-font, inherit);\n}\n\n.fe-themecard__check {\n  flex: none;\n  width: 18px;\n  height: 18px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  background: var(--fe-primary);\n  color: var(--fe-text-on-primary);\n  font-size: 11px;\n  line-height: 1;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ThemeGallery — wiring:c1 theme picker modal.\n *\n * A grid of theme cards, each rendering a mini live preview (surface +\n * toolbar chips + sample rows) painted with that theme's tokens for the\n * CURRENTLY resolved light/dark mode — so the card shows exactly what\n * you'd get. Click applies instantly (live preview behind the modal) and\n * persists; the selected card carries a ✓. \"Reset to default\" resets.\n *\n * Presentational only — selection state + persistence live in\n * lib/themes.ts (shared across instances); the parent forwards `select`.\n *\n * ⚠ The cards themselves live in `ThemePalette.vue` and are mounted, not\n * copied: the web app's user-settings modal shows the same grid inside a pane\n * and cannot mount this component, because this one IS a modal. See that\n * file's header.\n */\nimport { computed } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { DEFAULT_THEME_ID, type ThemeModePref } from '../lib/themes';\nimport Modal from '../modals/Modal.vue';\nimport ThemePalette from './ThemePalette.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** Host mode (forwarded to Modal so the backdrop themes correctly). */\n  theme?: ThemeMode;\n  /** Resolved mode — decides which variant the preview cards paint. */\n  dark: boolean;\n  /** Currently selected theme id. */\n  current: string;\n  /** The user's own light/dark preference; 'host' = never chosen. */\n  mode: ThemeModePref;\n  /** What the embedder asked for — what 'host' resolves to. */\n  hostMode: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'select', id: string): void;\n  (e: 'mode', mode: ThemeModePref): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ---- light / dark / auto -------------------------------------------\n * A theme says which palette; this says whether it paints its light or its\n * dark variant. Two separate questions, one place to answer both — the theme\n * button is where people come looking for \"night mode\".\n *\n * Only three choices are ever offered. 'host' is an internal default, not an\n * option: when it is still in force the control highlights whichever of the\n * three the embedder asked for, so the strip always shows the truth, and the\n * first click pins an explicit choice. */\nconst MODES: { id: Exclude<ThemeModePref, 'host'>; labelKey: string }[] = [\n  { id: 'light', labelKey: 'theme.mode.light' },\n  { id: 'dark', labelKey: 'theme.mode.dark' },\n  { id: 'auto', labelKey: 'theme.mode.auto' },\n];\n\nconst shownMode = computed(() => (props.mode === 'host' ? props.hostMode : props.mode));\n\nconst DEFAULT_ID = DEFAULT_THEME_ID;\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('theme.title')\" size=\"lg\" :theme=\"theme\" @close=\"emit('close')\">\n    <div class=\"fe-thememode\" role=\"group\" :aria-label=\"t('theme.mode.label')\">\n      <span class=\"fe-thememode__label\">{{ t('theme.mode.label') }}</span>\n      <div class=\"fe-thememode__seg\">\n        <button\n          v-for=\"m in MODES\"\n          :key=\"m.id\"\n          type=\"button\"\n          class=\"fe-thememode__opt\"\n          :class=\"{ 'is-active': shownMode === m.id }\"\n          :aria-pressed=\"shownMode === m.id\"\n          @click=\"emit('mode', m.id)\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <template v-if=\"m.id === 'light'\">\n              <circle cx=\"12\" cy=\"12\" r=\"4\" />\n              <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n            </template>\n            <template v-else-if=\"m.id === 'dark'\">\n              <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n            </template>\n            <template v-else>\n              <!-- Half-filled disc: the mode that is neither, decided elsewhere. -->\n              <circle cx=\"12\" cy=\"12\" r=\"9\" />\n              <path d=\"M12 3a9 9 0 0 1 0 18z\" fill=\"currentColor\" stroke=\"none\" />\n            </template>\n          </svg>\n          <span>{{ t(m.labelKey) }}</span>\n        </button>\n      </div>\n    </div>\n    <ThemePalette\n      :locale=\"locale\"\n      :dark=\"dark\"\n      :current=\"current\"\n      @select=\"(id: string) => emit('select', id)\"\n    />\n    <template #actions>\n      <button\n        type=\"button\"\n        class=\"fe-btn\"\n        :disabled=\"current === DEFAULT_ID\"\n        @click=\"emit('select', DEFAULT_ID)\"\n      >\n        {{ t('theme.reset') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"emit('close')\">\n        {{ t('theme.close') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TimeZonePicker — a search box that opens a ranked list of zones.\n *\n * ⚠⚠ ONE picker, two hosts. It was written inside the web app's user-settings\n * modal (`web/src/components/UserSettingsModal.vue`), and then the embed\n * needed the same control — an embed has no settings dialog, so its \"⋯\" menu\n * opens `TimeZoneDialog`, which mounts this. `packages/core` cannot import from\n * `web/`, so the picker moved here and both surfaces render it from this one\n * definition. A second copy would be the duplication the owner has ruled out\n * (*\"tekrar eden şeyler tek yerden eklenmeli\"*) and the first thing the two\n * would disagree about is which zones they find.\n *\n * Presentational: `modelValue` is `''` or an IANA id, a pick emits\n * `update:modelValue`, and the HOST decides what a pick writes — the web app\n * writes the account, the embed writes this browser's own choice\n * (`lib/timezone`, tier `viewer`). What `''` stands for differs between them,\n * so the host says it through `fallback` and the first row names it.\n *\n * ⚠ A half-typed string never becomes the value: `query` (what you typed) and\n * `modelValue` (what is in force) are separate, and only `commit` crosses\n * between them.\n */\nimport { computed, nextTick, onBeforeUnmount, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { localeTag, useLocale } from '../composables/useLocale';\nimport {\n  deviceTimeZone,\n  supportedTimeZones,\n  type ResolvedTimeZone,\n} from '../lib/timezone';\n\nconst props = defineProps<{\n  locale: LocaleCode;\n  /** `''` = the default row; otherwise an IANA id. */\n  modelValue: string;\n  /** What `''` resolves to on this surface — the zone and the tier. */\n  fallback: ResolvedTimeZone;\n  disabled?: boolean;\n  /** Id for the input, so the host's own `<label for>` names the control. */\n  inputId?: string;\n  /** Accessible name for the list (the host's visible label, usually). */\n  label?: string;\n  /** `data-testid` prefix: `-filter`, `-list`, `-opt-<zone|device>`. */\n  testid?: string;\n}>();\n\nconst emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>();\n\nconst { t } = useLocale(() => props.locale);\nconst tag = computed(() => localeTag(props.locale));\nconst tid = computed(() => props.testid || 'fe-tz');\n\nlet seq = 0;\nconst uid = `fe-tz-${++seq}-${Math.random().toString(36).slice(2, 7)}`;\nconst inputDomId = computed(() => props.inputId || `${uid}-input`);\nconst listId = `${uid}-list`;\n\n/* ── the zone index ──────────────────────────────────────────────────────\n *\n * ⚠⚠ NOT a hand-written list of zones. The ids come from the platform\n * (`Intl.supportedValuesOf('timeZone')`, wrapped by `supportedTimeZones()`,\n * which falls back to a small canonical set on an engine that answers\n * nothing — so a person on such a browser still gets a usable list and, above\n * all, KEEPS the zone they already have).\n *\n * Everything a row shows or is searched by is derived from `Intl`:\n *\n *   • the offset  — `timeZoneName: 'shortOffset'` → \"GMT+03:00\";\n *   • the region name — `timeZoneName: 'longGeneric'` → \"Turkey Time\", built\n *     in BOTH English and the interface language, so \"turkey\" and \"Türkiye\"\n *     both find `Europe/Istanbul` whichever catalogue is loaded. That one line\n *     is why the alias table below is eight entries and not four hundred;\n *   • the city — the id's own last segment.\n *\n * Built lazily, the first time the field is opened: ~420 zones × two\n * formatters is work worth doing zero times for the people who never touch\n * this control. Re-built when the language or the default row changes.\n */\ninterface TzRow {\n  /** The value that gets emitted. `''` = the default row. */\n  value: string;\n  /** The city, or the default sentence. What the eye lands on. */\n  label: string;\n  /** \"Europe\" — drawn muted beside the city. */\n  region: string;\n  /** \"GMT+03:00\". */\n  offset: string;\n  /** Folded text the query is matched against. */\n  haystack: string;\n  /** The city alone, folded — the strongest thing a query can hit. */\n  cityFold: string;\n  /** Every word of the haystack, folded — for \"starts a word\" matches. */\n  words: string[];\n  /** Clock for this zone, or null when the engine refuses the id. */\n  fmt: Intl.DateTimeFormat | null;\n}\n\n/**\n * Fold a string down to something a person's typing can be compared against:\n * case, Turkish letters, accents and the id's punctuation all removed.\n *\n * ⚠ The Turkish map is explicit and comes FIRST. `'İ'.toLowerCase()` is\n * \"i̇\" (an i plus a combining dot) in every locale-independent lowercase,\n * and `'I'.toLowerCase()` is \"i\" — so a person typing İstanbul on a Turkish\n * keyboard and the id `Europe/Istanbul` do not meet unless the dot is dealt\n * with by hand. Stripping combining marks afterwards catches the rest.\n */\nfunction fold(input: string): string {\n  return input\n    .replace(/[\\u0130\\u0131]/g, 'i')\n    .replace(/[\\u015e\\u015f]/g, 's')\n    .replace(/[\\u011e\\u011f]/g, 'g')\n    .replace(/[\\u00dc\\u00fc]/g, 'u')\n    .replace(/[\\u00d6\\u00f6]/g, 'o')\n    .replace(/[\\u00c7\\u00e7]/g, 'c')\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[_/\\-.]+/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n/**\n * The handful of names `Intl` does not say.\n *\n * ⚠ Deliberately tiny, and deliberately not a zone list: the generic names\n * already carry the country for every zone that has one. These are the words\n * people type that are not a city, a country or an offset — mostly the\n * abbreviations a support ticket arrives written in.\n */\nconst ALIASES: Record<string, string> = {\n  UTC: 'utc gmt zulu z greenwich universal',\n  'Etc/UTC': 'utc gmt zulu greenwich universal',\n  'Etc/GMT': 'utc gmt greenwich',\n  'Europe/Istanbul': 'turkey turkiye ist constantinople',\n  'Europe/London': 'uk britain england gmt bst',\n  'America/New_York': 'usa united states eastern est edt nyc',\n  'America/Los_Angeles': 'usa united states pacific pst pdt la',\n  'Asia/Kolkata': 'india calcutta ist',\n};\n\n/** Every way a person might type an offset the platform prints as \"GMT+03:00\". */\nfunction offsetAliases(offset: string): string {\n  const m = /GMT([+-])(\\d{1,2})(?::?(\\d{2}))?/.exec(offset);\n  if (!m) return 'gmt utc';\n  const [, sign, hRaw, minRaw] = m;\n  const h = String(Number(hRaw));\n  const hh = h.padStart(2, '0');\n  const mm = minRaw ?? '00';\n  const forms = [`${sign}${h}`, `${sign}${hh}`, `${sign}${hh}:${mm}`, `${sign}${hh}${mm}`];\n  return [...forms.map((f) => `gmt${f}`), ...forms.map((f) => `utc${f}`), ...forms].join(' ');\n}\n\n/** The `timeZoneName` part alone, e.g. \"GMT+03:00\" or \"Turkey Time\". */\nfunction namePart(zone: string, locale: string, style: 'shortOffset' | 'longGeneric'): string {\n  try {\n    const parts = new Intl.DateTimeFormat(locale, {\n      timeZone: zone,\n      timeZoneName: style,\n    }).formatToParts(new Date());\n    return parts.find((x) => x.type === 'timeZoneName')?.value ?? '';\n  } catch {\n    return '';\n  }\n}\n\nfunction clockFor(zone: string): Intl.DateTimeFormat | null {\n  try {\n    return new Intl.DateTimeFormat(tag.value, { timeZone: zone, hour: '2-digit', minute: '2-digit' });\n  } catch {\n    return null;\n  }\n}\n\n/** The zone `''` stands for, spelled out (the device's name when it is the device). */\nconst fallbackZone = computed(() => props.fallback.zone ?? deviceTimeZone());\n\n/**\n * The first row's sentence. It names the TIER as well as the zone, because\n * \"use the default\" is a promise about what happens next and the person\n * choosing it should not have to guess whose default that is.\n */\nconst defaultLabel = computed(() => {\n  const zone = fallbackZone.value;\n  if (props.fallback.tier === 'host') return t('tz.default.host', { zone });\n  if (props.fallback.tier === 'account') return t('tz.default.account', { zone });\n  return t('tz.default.device', { zone });\n});\n\nconst index = ref<TzRow[] | null>(null);\nlet indexKey = '';\n\nfunction buildIndex(): TzRow[] {\n  const loc = tag.value;\n  const fz = fallbackZone.value;\n  const defaultHay = fold(\n    `${fz} ${defaultLabel.value} default automatic device local system account site`,\n  );\n  const rows: TzRow[] = [\n    {\n      value: '',\n      label: defaultLabel.value,\n      region: '',\n      offset: namePart(fz, loc, 'shortOffset'),\n      haystack: defaultHay,\n      cityFold: fold(fz.split('/').pop() ?? ''),\n      words: defaultHay.split(' ').filter(Boolean),\n      fmt: clockFor(fz),\n    },\n  ];\n  /* ⚠ The zone in force is guaranteed a row even when the platform's list\n     does not contain it — an engine without `Intl.supportedValuesOf` falls\n     back to the small canonical set, and somebody whose zone is outside it\n     must still see it, find it highlighted, and be able to land back on it\n     after wandering the list. Nothing is rewritten either way: only `commit`\n     emits. */\n  const ids = supportedTimeZones();\n  if (props.modelValue && !ids.includes(props.modelValue)) ids.unshift(props.modelValue);\n  for (const zone of ids) {\n    const segs = zone.split('/');\n    const city = (segs[segs.length - 1] ?? zone).replace(/_/g, ' ');\n    const region = segs.length > 1 ? segs[0].replace(/_/g, ' ') : '';\n    const offset = namePart(zone, loc, 'shortOffset');\n    const genericLocal = namePart(zone, loc, 'longGeneric');\n    const genericEn = loc === 'en-US' ? '' : namePart(zone, 'en-US', 'longGeneric');\n    const haystack = fold(\n      [zone, city, region, genericLocal, genericEn, ALIASES[zone] ?? '', offsetAliases(offset)]\n        .filter(Boolean)\n        .join(' '),\n    );\n    rows.push({\n      value: zone,\n      label: city,\n      region,\n      offset,\n      haystack,\n      cityFold: fold(city),\n      words: haystack.split(' ').filter(Boolean),\n      fmt: clockFor(zone),\n    });\n  }\n  return rows;\n}\n\nfunction ensureIndex(): void {\n  const key = `${props.locale}|${props.fallback.tier}|${fallbackZone.value}|${props.modelValue}`;\n  if (index.value && indexKey === key) return;\n  indexKey = key;\n  index.value = buildIndex();\n}\n\n/* ── the combobox ──────────────────────────────────────────────────────── */\n\nconst open = ref(false);\nconst query = ref('');\nconst active = ref(0);\nconst inputEl = ref<HTMLInputElement | null>(null);\nconst listEl = ref<HTMLElement | null>(null);\n\n/** The instant every row's clock is formatted from — one shared tick rather\n *  than 50 rows each calling `new Date()` and disagreeing by a millisecond. */\nconst tick = ref(new Date());\nlet timer: ReturnType<typeof setInterval> | undefined;\nfunction startTick(): void {\n  tick.value = new Date();\n  if (!timer) timer = setInterval(() => (tick.value = new Date()), 1000);\n}\nfunction stopTick(): void {\n  if (timer) clearInterval(timer);\n  timer = undefined;\n}\nonBeforeUnmount(stopTick);\n\n/**\n * Where the list goes and how tall it may be — MEASURED, not assumed.\n *\n * ⚠ The host usually scrolls (a settings pane, a dialog body), so the list\n * cannot escape it: a fixed 264px drop opened straight through the settings\n * modal's footer and the bottom rows were cut off mid-word (measured at\n * 1280×900 with the field near the bottom of Preferences). So the drop takes\n * whichever side of the field has room inside its nearest scrolling ancestor\n * — the viewport when there is none — and never asks for more than that.\n */\nconst drop = ref<{ maxHeight: string; above: boolean }>({ maxHeight: '264px', above: false });\n\nfunction scrollBox(el: HTMLElement): { top: number; bottom: number } {\n  let p = el.parentElement;\n  while (p) {\n    const oy = getComputedStyle(p).overflowY;\n    if (oy === 'auto' || oy === 'scroll') {\n      const r = p.getBoundingClientRect();\n      return { top: r.top, bottom: r.bottom };\n    }\n    p = p.parentElement;\n  }\n  return { top: 0, bottom: window.innerHeight };\n}\n\nfunction measureDrop(): void {\n  const input = inputEl.value;\n  if (!input) return;\n  const ir = input.getBoundingClientRect();\n  const box = scrollBox(input);\n  const gap = 12;\n  const below = box.bottom - ir.bottom - gap;\n  const above = ir.top - box.top - gap;\n  /* A floor, because a two-row list is worse than one that overlaps the field\n     it belongs to; and a ceiling, because past ~7 rows people type instead of\n     scrolling. */\n  const MIN = 132;\n  const MAX = 264;\n  const useAbove = below < MIN && above > below;\n  const room = useAbove ? above : below;\n  drop.value = {\n    maxHeight: `${Math.round(Math.max(MIN, Math.min(MAX, room)))}px`,\n    above: useAbove,\n  };\n}\n\n/** How many rows are drawn. Unfiltered this list is ~420 long and every row\n *  carries a live clock; past the first screenful nobody is reading, they are\n *  typing. The count that was left out is SAID, so a short list is never\n *  mistaken for the whole answer. */\nconst LIMIT = 50;\n\n/**\n * How well one row answers one query — `-1` when it does not.\n *\n * ⚠⚠ RANKED, not merely filtered. A plain substring match over the haystack\n * is what this had first, and typing \"ist\" returned Boa V*ist*a, Ashgabat\n * (Turkmen*ist*an Time) and Dushanbe — with Istanbul nowhere in the visible\n * rows. Measured in a real browser before the fix:\n *\n *   the city, exactly       → it IS the answer\n *   the city, as a prefix   → \"ist\" → Istanbul\n *   the start of any word   → \"new y\" → New York, \"gmt+3\" → the +3 zones\n *   anywhere at all         → kept, but last\n *\n * Every term has to hit something, so two words narrow instead of widening.\n */\nfunction score(row: TzRow, terms: string[]): number {\n  let total = 0;\n  for (const term of terms) {\n    let best = 0;\n    if (row.cityFold === term) best = 120;\n    else if (row.cityFold.startsWith(term)) best = 100;\n    else if (row.words.some((w) => w.startsWith(term))) best = 70;\n    else if (row.haystack.includes(term)) best = 30;\n    if (best === 0) return -1;\n    total += best;\n  }\n  return total;\n}\n\nconst matches = computed<TzRow[]>(() => {\n  const all = index.value ?? [];\n  const q = fold(query.value);\n  if (!q) {\n    /* ⚠ The zone in force is PINNED to the top of the unfiltered list. Only\n       the first `LIMIT` rows are rendered, so a zone at index 338 of 420 could\n       not be highlighted on open, and `aria-activedescendant` pointed at an id\n       that was not in the document. Measured with Europe/London stored. */\n    const cur = all.find((r) => r.value === props.modelValue);\n    if (!cur || cur === all[0]) return all;\n    return [all[0], cur, ...all.slice(1).filter((r) => r !== cur)];\n  }\n  const terms = q.split(' ').filter(Boolean);\n  const scored: Array<{ row: TzRow; score: number; i: number }> = [];\n  all.forEach((row, i) => {\n    const s = score(row, terms);\n    if (s >= 0) scored.push({ row, score: s, i });\n  });\n  // Ties keep the platform's own order, which is alphabetical by id — so a\n  // list of equally-good answers does not reshuffle itself between keystrokes.\n  scored.sort((a, b) => b.score - a.score || a.i - b.i);\n  return scored.map((x) => x.row);\n});\n\nconst visible = computed(() => matches.value.slice(0, LIMIT));\nconst hidden = computed(() => Math.max(0, matches.value.length - visible.value.length));\n\n/** The closed field's text. Never a query: a control that keeps your typing\n *  on screen after you walk away looks like it saved it.\n *\n *  ⚠ It reads correctly BEFORE the index exists — the field is drawn the\n *  moment its pane is, and the index is only built when it is focused. */\nconst display = computed(() => {\n  if (!props.modelValue) return defaultLabel.value;\n  const zone = props.modelValue;\n  const city = (zone.split('/').pop() ?? zone).replace(/_/g, ' ');\n  const off = namePart(zone, tag.value, 'shortOffset');\n  return off ? `${city} — ${off}` : city;\n});\n\nfunction rowTime(row: TzRow): string {\n  try {\n    return row.fmt ? row.fmt.format(tick.value) : '';\n  } catch {\n    return '';\n  }\n}\n\nfunction openList(): void {\n  ensureIndex();\n  open.value = true;\n  query.value = '';\n  startTick();\n  const idx = visible.value.findIndex((r) => r.value === props.modelValue);\n  active.value = idx >= 0 ? idx : 0;\n  void nextTick(() => {\n    measureDrop();\n    scrollActiveIntoView();\n  });\n}\n\n/** Close WITHOUT choosing: the field goes back to saying what is in force. */\nfunction closeList(): void {\n  open.value = false;\n  query.value = '';\n  active.value = 0;\n  stopTick();\n}\n\nfunction onInput(ev: Event): void {\n  ensureIndex();\n  if (!open.value) startTick();\n  open.value = true;\n  query.value = (ev.target as HTMLInputElement).value;\n  active.value = 0;\n}\n\nfunction commit(row: TzRow): void {\n  closeList();\n  inputEl.value?.blur();\n  if (row.value === props.modelValue) return;\n  emit('update:modelValue', row.value);\n}\n\nfunction scrollActiveIntoView(): void {\n  const el = listEl.value?.querySelector<HTMLElement>('[data-tz-active=\"1\"]');\n  el?.scrollIntoView({ block: 'nearest' });\n}\n\nfunction moveActive(delta: number): void {\n  const n = visible.value.length;\n  if (n === 0) return;\n  // Clamp first: a filter that shrank the list can leave the cursor past its\n  // end, and `aria-activedescendant` would then name a row nobody can see.\n  const from = Math.min(active.value, n - 1);\n  active.value = (from + delta + n) % n;\n  void nextTick(() => scrollActiveIntoView());\n}\n\nfunction onKeydown(ev: KeyboardEvent): void {\n  switch (ev.key) {\n    case 'ArrowDown':\n      ev.preventDefault();\n      if (!open.value) openList();\n      else moveActive(1);\n      break;\n    case 'ArrowUp':\n      ev.preventDefault();\n      if (!open.value) openList();\n      else moveActive(-1);\n      break;\n    case 'Home':\n      if (!open.value) return;\n      ev.preventDefault();\n      active.value = 0;\n      void nextTick(() => scrollActiveIntoView());\n      break;\n    case 'End':\n      if (!open.value) return;\n      ev.preventDefault();\n      active.value = Math.max(0, visible.value.length - 1);\n      void nextTick(() => scrollActiveIntoView());\n      break;\n    case 'Enter': {\n      if (!open.value) return;\n      ev.preventDefault();\n      const row = visible.value[active.value];\n      if (row) commit(row);\n      break;\n    }\n    case 'Escape':\n      if (!open.value) return;\n      // ⚠ Stopped here. Both hosts are dialogs that close on Escape, and the\n      // first Escape belongs to the list that is open on top of them.\n      ev.preventDefault();\n      ev.stopPropagation();\n      closeList();\n      break;\n    case 'Tab':\n      closeList();\n      break;\n  }\n}\n</script>\n\n<template>\n  <!-- A real combobox (`role=\"combobox\"` + `aria-expanded` + `aria-controls`\n       + `aria-activedescendant`), not a div that listens for clicks: the list\n       is reachable by arrow keys and announced to a screen reader as what it\n       is. -->\n  <div class=\"fe-tzpick\">\n    <input\n      :id=\"inputDomId\"\n      ref=\"inputEl\"\n      class=\"fe-tzpick__input\"\n      type=\"text\"\n      role=\"combobox\"\n      autocomplete=\"off\"\n      spellcheck=\"false\"\n      aria-autocomplete=\"list\"\n      :aria-expanded=\"open\"\n      :aria-controls=\"listId\"\n      :aria-activedescendant=\"open && visible.length ? `${listId}-opt-${active}` : undefined\"\n      :disabled=\"disabled\"\n      :data-testid=\"`${tid}-filter`\"\n      :placeholder=\"t('tz.search')\"\n      :value=\"open ? query : display\"\n      @focus=\"openList\"\n      @input=\"onInput\"\n      @keydown=\"onKeydown\"\n      @blur=\"closeList\"\n    />\n    <ul\n      v-if=\"open\"\n      :id=\"listId\"\n      ref=\"listEl\"\n      class=\"fe-tzpick__list\"\n      :class=\"{ 'is-above': drop.above }\"\n      :style=\"{ maxHeight: drop.maxHeight }\"\n      role=\"listbox\"\n      :aria-label=\"label || t('tz.title')\"\n      :data-testid=\"`${tid}-list`\"\n    >\n      <li\n        v-for=\"(row, i) in visible\"\n        :id=\"`${listId}-opt-${i}`\"\n        :key=\"row.value || '__default'\"\n        class=\"fe-tzpick__opt\"\n        :class=\"{ 'is-active': i === active, 'is-current': row.value === modelValue }\"\n        :data-tz-active=\"i === active ? '1' : '0'\"\n        :data-testid=\"`${tid}-opt-${row.value || 'device'}`\"\n        role=\"option\"\n        :aria-selected=\"row.value === modelValue\"\n        :title=\"row.value || fallbackZone\"\n        @mousedown.prevent=\"commit(row)\"\n        @mousemove=\"active = i\"\n      >\n        <span class=\"fe-tzpick__main\">\n          <span class=\"fe-tzpick__city\">{{ row.label }}</span>\n          <span v-if=\"row.region\" class=\"fe-tzpick__region\">{{ row.region }}</span>\n        </span>\n        <span class=\"fe-tzpick__meta\">\n          <span v-if=\"rowTime(row)\" class=\"fe-tzpick__time\">{{ rowTime(row) }}</span>\n          <span class=\"fe-tzpick__offset\">{{ row.offset }}</span>\n        </span>\n      </li>\n      <li v-if=\"visible.length === 0\" class=\"fe-tzpick__empty\" role=\"presentation\">\n        {{ t('tz.no_match', { query }) }}\n      </li>\n      <li v-else-if=\"hidden > 0\" class=\"fe-tzpick__empty\" role=\"presentation\">\n        {{ t('tz.more', { n: hidden }) }}\n      </li>\n    </ul>\n  </div>\n</template>\n\n<!-- Deliberately NOT scoped: the webcomponent injects the CORE package's built\n     style.css, whose data-v scope ids do not match the ids the webcomponent's\n     own compile assigns, so scoped rules would silently not apply in embeds.\n     Class names are fe-* namespaced (same approach as ThemePalette). -->\n<style>\n/* The list is absolutely positioned so it OVERLAYS what is under it instead of\n   pushing the rest of the pane down: opening a zone list must not move the\n   next control out from under the pointer. */\n.fe-tzpick {\n  position: relative;\n  z-index: 2;\n}\n.fe-tzpick__input {\n  box-sizing: border-box;\n  width: 100%;\n  height: var(--fe-h-md);\n  padding: 0 10px;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  color: var(--fe-text);\n  font: inherit;\n  font-size: var(--fe-text-sm);\n}\n.fe-tzpick__input:focus {\n  outline: none;\n  border-color: var(--fe-primary);\n}\n.fe-tzpick__input:disabled {\n  background: var(--fe-bg-elev);\n  color: var(--fe-text-muted);\n}\n.fe-tzpick__list {\n  position: absolute;\n  top: calc(100% + 4px);\n  left: 0;\n  right: 0;\n  z-index: 5;\n  box-sizing: border-box;\n  margin: 0;\n  padding: var(--fe-gap-xs);\n  list-style: none;\n  overflow-y: auto;\n  border: 1px solid var(--fe-border);\n  border-radius: var(--fe-radius);\n  background: var(--fe-bg);\n  box-shadow: var(--fe-shadow-sm);\n}\n.fe-tzpick__list.is-above {\n  top: auto;\n  bottom: calc(100% + 4px);\n}\n.fe-tzpick__opt {\n  display: flex;\n  align-items: center;\n  gap: var(--fe-gap-sm);\n  min-height: var(--fe-h-md);\n  padding: 0 var(--fe-gap-sm);\n  border-radius: var(--fe-radius-sm);\n  color: var(--fe-text);\n  cursor: pointer;\n}\n/* Two separate states, and they are different things: `is-active` is where\n   the keyboard is, `is-current` is what is actually in force. A list that\n   painted only one of them cannot answer \"which one am I on?\" and \"which one\n   did I choose?\" at the same time. */\n.fe-tzpick__opt.is-active {\n  background: var(--fe-bg-hover);\n}\n.fe-tzpick__opt.is-current {\n  color: var(--fe-primary);\n  font-weight: 600;\n}\n.fe-tzpick__opt.is-current.is-active {\n  background: var(--fe-primary-soft);\n}\n.fe-tzpick__main {\n  display: flex;\n  align-items: baseline;\n  gap: var(--fe-gap-sm);\n  flex: 1 1 auto;\n  min-width: 0;\n}\n.fe-tzpick__city {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  font-size: var(--fe-text-sm);\n}\n.fe-tzpick__region {\n  flex: 0 0 auto;\n  font-size: var(--fe-text-xs);\n  font-weight: 400;\n  color: var(--fe-text-muted);\n}\n/* The offset, and the clock beside it, are the reason a row is readable\n   without knowing IANA ids. Tabular figures so the column does not jitter as\n   the minutes tick. */\n.fe-tzpick__meta {\n  flex: 0 0 auto;\n  display: flex;\n  align-items: baseline;\n  gap: var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n  color: var(--fe-text-muted);\n  font-variant-numeric: tabular-nums;\n}\n.fe-tzpick__time {\n  color: var(--fe-text);\n}\n.fe-tzpick__empty {\n  padding: var(--fe-gap-sm);\n  font-size: var(--fe-text-xs);\n  line-height: 1.45;\n  color: var(--fe-text-muted);\n}\n/* On a phone the offset stays and the clock goes: 390px minus a pane's\n   padding leaves a city column too narrow to truncate politely otherwise. */\n@media (max-width: 480px) {\n  .fe-tzpick__time {\n    display: none;\n  }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * TimeZoneDialog — zaman:z3, the embed's own time-zone setting.\n *\n * The owner, 2026-09-14: *\"gömme için ayar bırakmamız lazım; basitçe tarayıcıda\n * tutulan bir ayar olması lazım.\"* An embed has no user-settings dialog — its\n * \"⋯\" menu (theme, density, shortcuts) is where its settings live — so the menu\n * opens this, and a pick is stored in THIS browser (`lib/timezone`, tier\n * `viewer`). Nothing is sent anywhere: an embed's credential may be shared by\n * every visitor, and there is no account of the visitor's to write to.\n *\n * ⚠ The picker is `TimeZonePicker`, the same component the web app's settings\n * modal mounts. Not a second one.\n *\n * ⚠ The first row is \"use the default\", and it names what the default IS on\n * this page — the zone the embedder configured, the account's zone, or this\n * device's — by asking the resolver with the viewer tier blanked. A reset\n * whose outcome you have to guess is not a reset.\n */\nimport { computed, inject, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { formatInstant, useLocale } from '../composables/useLocale';\nimport {\n  EXPLORER_CLOCK,\n  deviceTimeZone,\n  resolveTimeZone,\n  resolvedTimeZoneFor,\n  setViewerTimeZone,\n  timeZoneSourcesFor,\n  viewerTimeZone,\n} from '../lib/timezone';\nimport Modal from '../modals/Modal.vue';\nimport TimeZonePicker from './TimeZonePicker.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst inputId = `fe-tzdialog-${Math.random().toString(36).slice(2, 9)}`;\n\n// This explorer's clock, not the page's newest (lib/timezone, timeZoneSourcesFor).\nconst clock = inject(EXPLORER_CLOCK, undefined);\nconst fallback = computed(() => resolveTimeZone({ ...timeZoneSourcesFor(clock), viewer: '' }));\nconst inForce = computed(() => resolvedTimeZoneFor(clock));\nconst inForceZone = computed(() => inForce.value.zone ?? deviceTimeZone());\n\n/** \"Right now in Asia/Tokyo: 14:05:09\" — the fastest way to see a wrong pick. */\nconst now = ref('');\nlet timer: ReturnType<typeof setInterval> | undefined;\nfunction refresh(): void {\n  // Through the shared formatter, which reads the RESOLVED zone — the readout\n  // must say what every date on the page is actually drawn in, not what this\n  // dialog thinks it chose.\n  now.value = formatInstant(\n    new Date(),\n    props.locale,\n    {\n      hour: '2-digit',\n      minute: '2-digit',\n      second: '2-digit',\n    },\n    clock,\n  );\n}\nwatch(\n  () => props.open,\n  (open) => {\n    if (timer) clearInterval(timer);\n    timer = undefined;\n    if (!open) return;\n    refresh();\n    timer = setInterval(refresh, 1000);\n  },\n  { immediate: true },\n);\nwatch(inForce, refresh);\nonBeforeUnmount(() => {\n  if (timer) clearInterval(timer);\n});\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('tz.title')\" size=\"md\" :theme=\"theme\" @close=\"emit('close')\">\n    <div class=\"fe-tzdialog\" data-testid=\"fe-tz-dialog\">\n      <label class=\"fe-tzdialog__label\" :for=\"inputId\">{{ t('tz.label') }}</label>\n      <TimeZonePicker\n        :input-id=\"inputId\"\n        :locale=\"locale\"\n        :model-value=\"viewerTimeZone()\"\n        :fallback=\"fallback\"\n        :label=\"t('tz.label')\"\n        testid=\"fe-tz\"\n        @update:model-value=\"setViewerTimeZone\"\n      />\n      <p class=\"fe-tzdialog__hint\">{{ t('tz.hint') }}</p>\n      <p class=\"fe-tzdialog__now\" data-testid=\"fe-tz-now\" :data-tier=\"inForce.tier\">\n        {{ t('tz.now', { zone: inForceZone, time: now }) }}\n      </p>\n    </div>\n  </Modal>\n</template>\n\n<!-- Not scoped — see TimeZonePicker.vue / ThemePalette.vue. -->\n<style>\n/* Tall enough that the zone list opens downward inside the dialog instead of\n   being clipped by the body's own scroll box. */\n.fe-tzdialog {\n  display: flex;\n  flex-direction: column;\n  gap: var(--fe-gap-sm);\n  min-height: 340px;\n}\n.fe-tzdialog__label {\n  font-size: var(--fe-text-sm);\n  font-weight: 500;\n  color: var(--fe-text);\n}\n.fe-tzdialog__hint,\n.fe-tzdialog__now {\n  margin: 0;\n  font-size: var(--fe-text-xs);\n  line-height: 1.45;\n  color: var(--fe-text-muted);\n}\n.fe-tzdialog__now {\n  font-size: var(--fe-text-sm);\n  font-variant-numeric: tabular-nums;\n}\n</style>\n","/**\n * useExplorerTimeZone — what ONE explorer instance knows about the clock, fed\n * into `lib/timezone`'s resolver.\n *\n * An explorer knows two of the four tiers and nobody else can know them for\n * it: the zone its host configured (`config.timeZone`, tier `host`) and the\n * account behind the credential it holds (tier `account`). The viewer tier is\n * the browser's and the device tier is `Intl`'s; neither needs an instance.\n *\n * How the account is learned — nothing new on the server:\n *\n *   1. the credential's KIND, from `GET /api/files/capabilities`\n *      (`caller_kind`, migration 00030), which the explorer already fetches —\n *      or `config.callerKind`, which a host may set to answer sooner and which\n *      wins over the server's, exactly as it does for the panel's surfaces;\n *   2. for a person, `GET /api/auth/me` — the route every role may call, open\n *      to a bearer token (MiddlewareWithToken) and to cross-origin callers\n *      (CORS allows `Authorization`), and already used by the Connections\n *      panel for the caller's own e-mail. `user.timezone` is the zone.\n *\n * ⚠⚠ An `app` token skips the tier. It authenticates AS its owner, so\n * `/api/auth/me` would happily answer with that owner's zone — and the embeds\n * we run authenticate every visitor with ONE such token. Imposing its owner's\n * clock on all of them is the exact thing the owner ruled out.\n *\n * ⚠ Unknown kind also skips. When capabilities never lands (an old server, a\n * host that routes nothing but the manager), nobody can say whether the key is\n * a person's, and guessing \"person\" would be guessing the dangerous way.\n *\n * ⚠ Every failure is silent and falls through: a 401, a 404 from a host that\n * does not proxy `/api/auth/me`, a network error. The tier is withdrawn and\n * the browser's zone answers. A clock must never throw.\n */\n\nimport { onBeforeUnmount, provide, watch, type Ref } from 'vue';\nimport type { ExplorerConfig } from '../types/ExplorerConfig';\nimport type { Capabilities } from '../types/FileNode';\nimport { EXPLORER_CLOCK, releaseTimeZoneOwner, setAccountTimeZone, setHostTimeZone } from '../lib/timezone';\n\nexport interface ExplorerTimeZoneDeps {\n  config: () => ExplorerConfig;\n  /** The explorer's capabilities answer; `null` until (and unless) it lands. */\n  capabilities: Ref<Capabilities | null>;\n  /** `GET /api/auth/me` with this explorer's credential. */\n  fetchMe: () => Promise<{ user?: { timezone?: unknown } | null } | undefined>;\n}\n\nexport function useExplorerTimeZone(deps: ExplorerTimeZoneDeps): symbol {\n  const owner = Symbol('filex-explorer');\n  // Every component under this explorer reads its dates on this owner's\n  // tiers, not the page's newest (lib/timezone, timeZoneSourcesFor).\n  provide(EXPLORER_CLOCK, owner);\n\n  watch(\n    () => deps.config().timeZone,\n    (tz) => setHostTimeZone(owner, tz),\n    { immediate: true },\n  );\n\n  const kind = (): 'user' | 'app' | undefined =>\n    deps.config().callerKind ?? deps.capabilities.value?.caller_kind;\n\n  let asked = false;\n  watch(\n    kind,\n    (k) => {\n      if (k !== 'user') {\n        // `app`: nobody's account. Unknown: cannot tell. Either way, withdraw.\n        setAccountTimeZone(owner, null);\n        return;\n      }\n      if (asked) return;\n      asked = true;\n      deps\n        .fetchMe()\n        .then((body) => {\n          // The kind may have changed while the request was out.\n          if (kind() !== 'user') return;\n          const tz = body?.user?.timezone;\n          setAccountTimeZone(owner, typeof tz === 'string' ? tz : null);\n        })\n        .catch(() => setAccountTimeZone(owner, null));\n    },\n    { immediate: true },\n  );\n\n  onBeforeUnmount(() => releaseTimeZoneOwner(owner));\n  return owner;\n}\n","<script setup lang=\"ts\">\n/**\n * ShortcutSettings — wiring:c2 keyboard-shortcut customization modal.\n *\n * Category-grouped rows from the shortcut registry; each row shows the\n * action label + current combo badge(s) + \"Change\" (press-to-capture:\n * the next key combination is recorded, Esc cancels) + a per-row\n * \"reset to default\" and a header \"reset all\".\n *\n * Conflicts: assigning a combo that another action already uses turns\n * the row into a red warning with two choices — unbind the old action\n * and take the combo, or cancel. Combos reserved by fixed shortcuts\n * (Backspace, Esc) can never be taken.\n *\n * While the modal is open a window-level CAPTURE listener swallows\n * keydowns (except Esc/Tab) so experimenting with keys can't trigger\n * explorer actions behind the modal; native button activation (Enter/\n * Space on a focused button) is a default action and still works.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport {\n  comboFromEvent,\n  effectiveCombo,\n  findShortcutConflict,\n  isReservedCombo,\n  resetAllShortcuts,\n  resetShortcut,\n  setShortcutOverride,\n  useShortcutList,\n  SHORTCUT_ACTIONS,\n  type ShortcutView,\n} from '../composables/useKeyboardShortcuts';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: 'light' | 'dark' | 'auto';\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst list = useShortcutList();\n\nconst groups = computed(() => {\n  const order: string[] = [];\n  const map = new Map<string, ShortcutView[]>();\n  for (const s of list.value) {\n    if (!map.has(s.groupKey)) {\n      map.set(s.groupKey, []);\n      order.push(s.groupKey);\n    }\n    map.get(s.groupKey)!.push(s);\n  }\n  return order.map((key) => ({ key, items: map.get(key)! }));\n});\n\nconst anyOverridden = computed(() => list.value.some((s) => s.overridden));\n\n// --- capture / conflict state ---\n\nconst capturingId = ref<string | null>(null);\nconst conflict = ref<{ id: string; combo: string; conflictId: string; fixed: boolean } | null>(null);\n/* tus:t1 — the user pressed something the browser keeps for itself. */\nconst reserved = ref<{ id: string; combo: string } | null>(null);\n\nfunction labelOf(id: string): string {\n  const def = SHORTCUT_ACTIONS.find((a) => a.id === id);\n  return def ? t(def.labelKey) : id;\n}\n\nfunction beginCapture(id: string) {\n  conflict.value = null;\n  reserved.value = null;\n  capturingId.value = id;\n}\n\nfunction cancelCapture() {\n  capturingId.value = null;\n}\n\nfunction attemptAssign(id: string, combo: string) {\n  capturingId.value = null;\n  if (combo === effectiveCombo(id)) return; // unchanged\n  /* tus:t1 — a combo the browser takes before the page sees it would be a key\n   * that does nothing where the user is standing. Refuse it and say why,\n   * rather than storing a binding that never fires. */\n  if (isReservedCombo(combo)) {\n    reserved.value = { id, combo };\n    return;\n  }\n  const clash = findShortcutConflict(combo, id);\n  if (clash) {\n    conflict.value = { id, combo, conflictId: clash.id, fixed: clash.fixed };\n    return;\n  }\n  setShortcutOverride(id, combo);\n}\n\nfunction confirmConflictTake() {\n  const c = conflict.value;\n  if (!c || c.fixed) return;\n  setShortcutOverride(c.conflictId, ''); // unbind the old owner\n  setShortcutOverride(c.id, c.combo);\n  conflict.value = null;\n}\n\nfunction dismissConflict() {\n  conflict.value = null;\n}\n\nfunction dismissReserved() {\n  reserved.value = null;\n}\n\nfunction onReset(id: string) {\n  conflict.value = null;\n  reserved.value = null;\n  resetShortcut(id);\n}\n\nfunction onResetAll() {\n  conflict.value = null;\n  reserved.value = null;\n  capturingId.value = null;\n  resetAllShortcuts();\n}\n\n// --- window capture listener (only while open) ---\n\nfunction onWindowKeydown(e: KeyboardEvent) {\n  if (capturingId.value) {\n    e.preventDefault();\n    e.stopPropagation();\n    if (e.key === 'Escape') {\n      cancelCapture();\n      return;\n    }\n    const combo = comboFromEvent(e);\n    if (!combo) return; // bare modifier — keep listening\n    attemptAssign(capturingId.value, combo);\n    return;\n  }\n  // Modal open but idle: let Esc (close) and Tab (focus nav) through,\n  // swallow everything else so explorer shortcuts can't fire behind us.\n  if (e.key === 'Escape' || e.key === 'Tab') return;\n  e.stopPropagation();\n}\n\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) {\n      window.addEventListener('keydown', onWindowKeydown, true);\n    } else {\n      window.removeEventListener('keydown', onWindowKeydown, true);\n      capturingId.value = null;\n      conflict.value = null;\n      reserved.value = null;\n    }\n  },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onWindowKeydown, true));\n\nfunction onClose() {\n  if (capturingId.value) {\n    cancelCapture();\n    return;\n  }\n  emit('close');\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('shortcuts.settings.title')\" size=\"lg\" :theme=\"theme\" @close=\"onClose\">\n    <div class=\"fe-shortset\">\n      <div class=\"fe-shortset__topbar\">\n        <p class=\"fe-shortset__hint\">{{ t('shortcuts.settings.hint') }}</p>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-shortset__reset-all\"\n          :disabled=\"!anyOverridden\"\n          @click=\"onResetAll\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('restore')\"></span>\n          {{ t('shortcuts.settings.reset_all') }}\n        </button>\n      </div>\n\n      <section v-for=\"g in groups\" :key=\"g.key\" class=\"fe-shortset__group\">\n        <h3 class=\"fe-shortcuts__heading\">{{ t(g.key) }}</h3>\n        <div\n          v-for=\"s in g.items\"\n          :key=\"s.id\"\n          class=\"fe-shortset__item\"\n          :class=\"{\n            'is-capturing': capturingId === s.id,\n            'is-conflict': conflict?.id === s.id,\n          }\"\n        >\n          <div class=\"fe-shortset__row\">\n            <span class=\"fe-shortset__label\">\n              {{ t(s.labelKey) }}\n              <span v-if=\"s.overridden\" class=\"fe-shortcuts__custom\" :title=\"t('shortcuts.settings.customized')\">●</span>\n            </span>\n            <span class=\"fe-shortset__keys\">\n              <span v-if=\"capturingId === s.id\" class=\"fe-shortset__capture\" role=\"status\">\n                {{ t('shortcuts.settings.capture') }}\n              </span>\n              <template v-else>\n                <span v-if=\"s.keys.length === 0\" class=\"fe-shortcuts__unbound\">\n                  {{ t('shortcuts.settings.unbound') }}\n                </span>\n                <template v-for=\"(combo, i) in s.keys\" v-else :key=\"combo\">\n                  <kbd class=\"fe-kbd\">{{ combo }}</kbd>\n                  <!-- tus:t1 — this combo never reaches a browser tab. Say so\n                       on the row rather than letting the user discover it by\n                       pressing the key and watching nothing happen. -->\n                  <span\n                    v-if=\"isReservedCombo(combo)\"\n                    class=\"fe-shortset__reserved\"\n                    :title=\"t('shortcuts.settings.reserved_title')\"\n                  >{{ t('shortcuts.settings.reserved_badge') }}</span>\n                  <span v-if=\"i < s.keys.length - 1\" class=\"fe-shortcuts__or\" aria-hidden=\"true\">/</span>\n                </template>\n              </template>\n            </span>\n            <span class=\"fe-shortset__actions\">\n              <template v-if=\"s.customizable\">\n                <button\n                  v-if=\"capturingId !== s.id\"\n                  type=\"button\"\n                  class=\"fe-btn fe-shortset__btn\"\n                  @click=\"beginCapture(s.id)\"\n                >\n                  {{ t('shortcuts.settings.change') }}\n                </button>\n                <button\n                  v-else\n                  type=\"button\"\n                  class=\"fe-btn fe-shortset__btn\"\n                  @click=\"cancelCapture\"\n                >\n                  {{ t('shortcuts.settings.conflict_cancel') }}\n                </button>\n                <button\n                  v-if=\"s.overridden\"\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--icon-only fe-shortset__btn\"\n                  :title=\"t('shortcuts.settings.reset')\"\n                  :aria-label=\"t('shortcuts.settings.reset')\"\n                  @click=\"onReset(s.id)\"\n                >\n                  <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('restore')\"></span>\n                </button>\n              </template>\n              <span v-else class=\"fe-shortset__fixed\">{{ t('shortcuts.settings.fixed') }}</span>\n            </span>\n          </div>\n          <div v-if=\"conflict && conflict.id === s.id\" class=\"fe-shortset__conflict\" role=\"alert\">\n            <span class=\"fe-shortset__conflict-msg\">\n              <kbd class=\"fe-kbd\">{{ conflict.combo }}</kbd>\n              {{\n                conflict.fixed\n                  ? t('shortcuts.settings.conflict_fixed', { name: labelOf(conflict.conflictId) })\n                  : t('shortcuts.settings.conflict', { name: labelOf(conflict.conflictId) })\n              }}\n            </span>\n            <span class=\"fe-shortset__conflict-actions\">\n              <button\n                v-if=\"!conflict.fixed\"\n                type=\"button\"\n                class=\"fe-btn fe-btn--danger fe-shortset__btn\"\n                @click=\"confirmConflictTake\"\n              >\n                {{ t('shortcuts.settings.conflict_take') }}\n              </button>\n              <button type=\"button\" class=\"fe-btn fe-shortset__btn\" @click=\"dismissConflict\">\n                {{ t('shortcuts.settings.conflict_cancel') }}\n              </button>\n            </span>\n          </div>\n          <div v-if=\"reserved && reserved.id === s.id\" class=\"fe-shortset__conflict\" role=\"alert\">\n            <span class=\"fe-shortset__conflict-msg\">\n              <kbd class=\"fe-kbd\">{{ reserved.combo }}</kbd>\n              {{ t('shortcuts.settings.reserved') }}\n            </span>\n            <span class=\"fe-shortset__conflict-actions\">\n              <button type=\"button\" class=\"fe-btn fe-shortset__btn\" @click=\"dismissReserved\">\n                {{ t('shortcuts.settings.conflict_cancel') }}\n              </button>\n            </span>\n          </div>\n        </div>\n      </section>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"onClose\">{{ t('viewer.close') }}</button>\n    </template>\n  </Modal>\n</template>\n","/**\n * externalReach — \"can THIS browser reach the external service?\"\n *\n * # Why this exists\n *\n * Three machines must reach three addresses before the Office editor works,\n * and until now only one of them was ever checked:\n *\n * | address                | who must reach it                     | who checked it   |\n * | ---------------------- | ------------------------------------- | ---------------- |\n * | the Document Server URL| the **browser** (loads the editor JS) | nobody           |\n * | the Document Server URL| the filex process                     | the Test button  |\n * | `FILEX_PUBLIC_URL`     | the **document server** (fetch + save)| nobody           |\n *\n * So an operator on podman types `http://onlyoffice`, filex reaches it, Test\n * goes green, and the browser cannot resolve that name at all. The editor then\n * fails with the same message as a missing configuration — issue #17, twice.\n *\n * The admin page runs **in the browser that will actually open the editor**,\n * so it can answer the first row directly instead of disclaiming it. That is\n * what this module does.\n *\n * # Mechanism, and why not `fetch`\n *\n * ⚠ A plain `fetch()` is the obvious choice and the wrong one: a document\n * server that works perfectly will usually answer without CORS headers, the\n * promise rejects, and a naive `catch` reports failure for a healthy service.\n *\n * Instead each service is probed **the same way the real viewer loads it**:\n *\n * - **onlyoffice** — a `<script>` pointing at\n *   `<base>/web-apps/apps/api/documents/api.js`. Script `load`/`error` is not\n *   subject to CORS for load detection, and a successful load leaves\n *   `window.DocsAPI.DocEditor` defined, which proves the thing that answered\n *   really is a Document Server. (Verified against a live OnlyOffice Docs\n *   instance: `load` + `DocsAPI` in ~0.5 s.)\n * - **drawio** — a hidden `<iframe>` at `<base>/?embed=1&proto=json`, which\n *   posts `{\"event\":\"init\"}` to its parent when the editor is ready. Same\n *   handshake `DrawioViewer.vue` uses. (Verified against a live drawio.)\n *\n * Both distinguish **\"could not reach\"** from **\"reached, wrong thing\"** with\n * a second signal: a `no-cors` `fetch`, whose promise resolves for any HTTP\n * status and rejects only on a network-level failure. Reached + no editor =\n * `wrong-content`; not reached at all = `unreachable`.\n *\n * Every probe is bounded by a timeout and reports the timeout as its own\n * state, so a black-holed address stops the spinner instead of hanging.\n */\n\n/** The result of one probe. Each value is a different sentence to the operator. */\nexport type BrowserProbeState =\n  /** Loaded, and it really is the service it claims to be. */\n  | 'ok'\n  /** Something answered at that address, but it is not this service. */\n  | 'wrong-content'\n  /** Nothing answered: DNS failure, connection refused, blocked. */\n  | 'unreachable'\n  /** Nothing answered and nothing refused either — a black hole. */\n  | 'timeout'\n  /** The admin page is HTTPS and the service URL is HTTP; the browser will refuse. */\n  | 'blocked-mixed-content'\n  /** No URL configured, or a service with no browser-side entry point to probe. */\n  | 'skipped';\n\nexport interface BrowserProbeResult {\n  service: string;\n  state: BrowserProbeState;\n  /** The exact URL attempted — the same one the real viewer loads. */\n  url: string;\n  /** Milliseconds elapsed. Worth showing: a 6 s \"unreachable\" is a DNS story. */\n  ms: number;\n  mechanism: 'script' | 'iframe' | 'none';\n}\n\n/**\n * Injection seam. The defaults touch the DOM and the network; tests replace\n * them so the classification logic can be asserted without either.\n */\nexport interface BrowserProbeDeps {\n  loadScript(url: string, timeoutMs: number): Promise<'load' | 'error' | 'timeout'>;\n  loadFramed(url: string, timeoutMs: number): Promise<'ready' | 'timeout'>;\n  reachable(url: string): Promise<boolean>;\n  hasDocsAPI(): boolean;\n  pageProtocol(): string;\n  now(): number;\n}\n\nconst ONLYOFFICE_API_PATH = '/web-apps/apps/api/documents/api.js';\nconst DRAWIO_EMBED_QUERY = '/?embed=1&proto=json';\n\n/**\n * Default timeout. ⚠ Measured, not guessed: a browser takes ~5 s to give up on\n * a DNS name that does not exist (`http://onlyoffice`), and that case must\n * report `unreachable`, not `timeout`. 10 s leaves room and still bounds a\n * black hole.\n */\nexport const DEFAULT_PROBE_TIMEOUT_MS = 10_000;\n\nfunction trimBase(base: string): string {\n  return base.trim().replace(/\\/+$/, '');\n}\n\nfunction domLoadScript(url: string, timeoutMs: number): Promise<'load' | 'error' | 'timeout'> {\n  return new Promise((resolve) => {\n    const el = document.createElement('script');\n    let done = false;\n    const finish = (r: 'load' | 'error' | 'timeout') => {\n      if (done) return;\n      done = true;\n      clearTimeout(tid);\n      el.remove();\n      resolve(r);\n    };\n    const tid = setTimeout(() => finish('timeout'), timeoutMs);\n    el.async = true;\n    el.src = url;\n    el.onload = () => finish('load');\n    el.onerror = () => finish('error');\n    document.head.appendChild(el);\n  });\n}\n\nfunction domLoadFramed(url: string, timeoutMs: number): Promise<'ready' | 'timeout'> {\n  return new Promise((resolve) => {\n    let origin: string | null = null;\n    try {\n      origin = new URL(url, window.location.href).origin;\n    } catch {\n      origin = null;\n    }\n    const frame = document.createElement('iframe');\n    frame.setAttribute('aria-hidden', 'true');\n    frame.style.cssText = 'position:absolute;left:-9999px;width:1px;height:1px;border:0';\n    let done = false;\n    const finish = (r: 'ready' | 'timeout') => {\n      if (done) return;\n      done = true;\n      clearTimeout(tid);\n      window.removeEventListener('message', onMessage);\n      frame.remove();\n      resolve(r);\n    };\n    const onMessage = (e: MessageEvent) => {\n      // ⚠ Origin check first: any page may postMessage to us, and a probe that\n      // accepts an unfiltered message would report a healthy drawio because\n      // something else on the page said so.\n      if (origin && e.origin !== origin) return;\n      let data: unknown = e.data;\n      if (typeof data === 'string') {\n        try {\n          data = JSON.parse(data);\n        } catch {\n          return;\n        }\n      }\n      if (data && typeof data === 'object' && (data as { event?: string }).event === 'init') {\n        finish('ready');\n      }\n    };\n    window.addEventListener('message', onMessage);\n    const tid = setTimeout(() => finish('timeout'), timeoutMs);\n    frame.src = url;\n    document.body.appendChild(frame);\n  });\n}\n\nasync function domReachable(url: string): Promise<boolean> {\n  try {\n    // `no-cors` gives an opaque response we cannot read — which is fine, the\n    // only question is whether the request completed at all. It resolves for\n    // any HTTP status (including 404) and rejects on a network failure, which\n    // is exactly the \"reached, wrong thing\" vs \"could not reach\" split.\n    await fetch(url, { mode: 'no-cors', cache: 'no-store' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nconst domDeps: BrowserProbeDeps = {\n  loadScript: domLoadScript,\n  loadFramed: domLoadFramed,\n  reachable: domReachable,\n  hasDocsAPI: () =>\n    !!(window as unknown as { DocsAPI?: { DocEditor?: unknown } }).DocsAPI?.DocEditor,\n  pageProtocol: () => window.location.protocol,\n  now: () => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n};\n\n/** The URL each service is probed at — the same one its viewer loads. */\nexport function browserProbeURL(service: string, base: string): string {\n  const b = trimBase(base);\n  if (!b) return '';\n  if (service === 'onlyoffice') return b + ONLYOFFICE_API_PATH;\n  if (service === 'drawio') return b + DRAWIO_EMBED_QUERY;\n  return '';\n}\n\n/**\n * Probe one external service from the browser running this page.\n *\n * Returns `skipped` — never a failure — for a service with no URL and for a\n * service filex does not load in the browser at all (the converter), because\n * reporting \"unreachable\" for something the browser never fetches would be a\n * new lie in place of the old one.\n */\nexport async function probeExternalFromBrowser(\n  service: string,\n  base: string | null | undefined,\n  opts: { timeoutMs?: number; deps?: Partial<BrowserProbeDeps> } = {},\n): Promise<BrowserProbeResult> {\n  const deps: BrowserProbeDeps = { ...domDeps, ...(opts.deps ?? {}) };\n  const timeoutMs = opts.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;\n  const url = browserProbeURL(service, base ?? '');\n  const mechanism: BrowserProbeResult['mechanism'] =\n    service === 'onlyoffice' ? 'script' : service === 'drawio' ? 'iframe' : 'none';\n  if (!url) {\n    return { service, state: 'skipped', url: '', ms: 0, mechanism };\n  }\n\n  // ⚠ Pre-empt mixed content rather than reporting it as \"unreachable\". The\n  // browser blocks an http:// subresource on an https:// page before a packet\n  // leaves, and \"unreachable\" would send the operator to check firewalls.\n  if (deps.pageProtocol() === 'https:' && url.startsWith('http://')) {\n    return { service, state: 'blocked-mixed-content', url, ms: 0, mechanism };\n  }\n\n  const t0 = deps.now();\n  const elapsed = () => Math.round(deps.now() - t0);\n\n  if (mechanism === 'script') {\n    const ev = await deps.loadScript(url, timeoutMs);\n    if (ev === 'timeout') return { service, state: 'timeout', url, ms: elapsed(), mechanism };\n    if (ev === 'load') {\n      // Loaded AND it defined the global only a Document Server defines.\n      return {\n        service,\n        state: deps.hasDocsAPI() ? 'ok' : 'wrong-content',\n        url,\n        ms: elapsed(),\n        mechanism,\n      };\n    }\n    const reached = await deps.reachable(url);\n    return {\n      service,\n      state: reached ? 'wrong-content' : 'unreachable',\n      url,\n      ms: elapsed(),\n      mechanism,\n    };\n  }\n\n  if (mechanism === 'iframe') {\n    const ev = await deps.loadFramed(url, timeoutMs);\n    if (ev === 'ready') return { service, state: 'ok', url, ms: elapsed(), mechanism };\n    // No handshake. An iframe fires `load` for error pages too, so the frame\n    // itself cannot tell us why — ask the network instead.\n    const reached = await deps.reachable(url);\n    return {\n      service,\n      state: reached ? 'wrong-content' : 'unreachable',\n      url,\n      ms: elapsed(),\n      mechanism,\n    };\n  }\n\n  return { service, state: 'skipped', url: '', ms: 0, mechanism };\n}\n","<script setup lang=\"ts\">\n/**\n * PreviewModal — inline file preview.\n *\n * Strategy by extension:\n *   image / video / audio / pdf  → native browser elements\n *   md / markdown                 → markdown-it (lazy) → rendered HTML\n *   code (js/ts/php/py/json/...)  → Monaco when ready, highlight.js\n *                                    fallback while it's still loading,\n *                                    plain `<pre>` when neither is\n *                                    installed\n *   office (docx/xlsx/pptx)       → OnlyOffice iframe (config.onlyOfficeBase)\n *   plain text (txt/log/conf)     → CodeMirror when saveText is set,\n *                                    `<pre>` otherwise\n *   anything else                 → \"Download\" fallback\n *\n * Monaco is dynamic-imported at FileExplorer onMounted; by the time the\n * user clicks an editable code file the chunk is usually already cached.\n * We probe `getMonaco()` synchronously when the modal opens — if it's\n * not yet loaded we render the highlight.js read-only view immediately,\n * then upgrade to Monaco once the import resolves.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';\nimport type { Component } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport Modal from './Modal.vue';\nimport StarButton from '../components/StarButton.vue';\nimport { ensureMonaco, getMonaco, ensureHighlight } from '../composables/useMonacoLoader';\nimport { useLocale } from '../composables/useLocale';\nimport { browserProbeURL } from '../lib/externalReach';\nimport { fileIconTile } from '../lib/fileIcons';\nimport { actionIconSvg } from '../lib/actionIcons';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  file: FileNode | null;\n  previewUrl: (path: string) => string;\n  downloadUrl: (path: string) => string;\n  onlyOfficeBase?: string | null;\n  onlyOfficeConfigEndpoint?: string | null;\n  saveTextEndpoint?: string | null;\n  /** Endpoint for the archive (zip/rar/7z/tar) member list. Forwarded to\n   *  ArchiveViewer, which otherwise assumes a same-origin path. */\n  archiveListEndpoint?: string | null;\n  openMode?: 'edit' | 'view';\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** New rich-viewer config (forwarded by FileExplorer from ExplorerConfig). */\n  drawioUrl?: string | null;\n  pdfWorkerUrl?: string | null;\n  pdfSaveUrl?: string | null;\n  /** Standalone full-screen viewer route — `?path=…&storage=…&type=…`. */\n  viewerBaseUrl?: string | null;\n  /* wiring:e2 — false hides the \"Edit\" / \"Open in New Tab\" buttons.\n   * The standalone route fetches RAW server bytes, which inside an\n   * E2E-encrypted folder is ciphertext (and its save path could clobber\n   * the encrypted blob) — the host disables the escape hatches there. */\n  newTabEnabled?: boolean;\n  /** Drop the dialog chrome (backdrop tint, header bar, footer actions)\n   *  so the viewer fills the full viewport. Used by the standalone\n   *  /files/edit route where the browser tab IS the container — a\n   *  modal frame on top of the editor just steals real estate. */\n  chromeless?: boolean;\n  /** When the dynamic-viewer chunk fails to load, fall back to the\n   *  legacy native renderer (e.g. native `<object>` for PDFs). */\n  /** Explicit theme. Forwarded to the underlying Modal (which tags\n   *  its backdrop with `.fe--theme-{light,dark}` so the CSS variable\n   *  override matches the host admin shell) and to Monaco (vs vs\n   *  vs-dark). When unset Monaco falls back to `prefers-color-scheme`\n   *  and the modal cascade follows whatever `.fe` parent it gets. */\n  theme?: 'light' | 'dark' | 'auto';\n  /* === gorunum:v1-viewer — the full-bleed overlay's own contract ===\n   * Everything below is OPTIONAL and answered by the host, because the\n   * modal cannot invent any of it: it is handed ONE file and has no idea\n   * what list that file came out of, nor where the API lives. */\n  /** 1-based position of `file` in the host's current file list. */\n  index?: number;\n  /** How many files that list holds. `index` + `total` draw \"1 of 9\";\n   *  with either missing the counter is simply absent — a counter that\n   *  guesses is worse than no counter. */\n  total?: number;\n  /** Draw the prev/next chevrons even when index/total are unknown.\n   *  QuickLook sets it because its host already answers `nav`. */\n  navEnabled?: boolean;\n  /** API origin for the star toggle — same meaning as ExplorerConfig.apiBase.\n   *  Omitted = same origin, which is what the admin UI wants. */\n  apiBase?: string;\n  /** Draw the share action. Off by default on purpose: a share button with\n   *  no host listening to `@share` is a control that lies. */\n  shareEnabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** Previous / next file. −1 and +1, the SAME contract QuickLook already\n   *  emits upward — the chevrons are a second trigger for it, not a second\n   *  navigation mechanism. The host keeps the `file` prop in sync. */\n  (e: 'nav', delta: number): void;\n  /** The host opens its own share dialog. Only reachable when `shareEnabled`. */\n  (e: 'share'): void;\n  /** The star toggle succeeded — so the host can update its listing row. */\n  (e: 'starred', value: boolean): void;\n}>();\n\nconst { t, formatSize, formatDate, nodeDisplayName } = useLocale(() => props.locale);\n\nfunction ext(f: FileNode | null): string {\n  return (f?.extension || '').toLowerCase();\n}\n\nconst IMAGE = ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic'];\nconst VIDEO = ['mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv'];\nconst AUDIO = ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus'];\n\nconst CODE_LANGS: Record<string, string> = {\n  md: 'markdown', markdown: 'markdown',\n  txt: 'plaintext', log: 'plaintext',\n  js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n  ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n  vue: 'xml', svelte: 'xml', html: 'xml', htm: 'xml', xml: 'xml', svg: 'xml',\n  css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n  json: 'json', jsonc: 'json',\n  yml: 'yaml', yaml: 'yaml',\n  php: 'php', py: 'python', rb: 'ruby', go: 'go', rs: 'rust',\n  java: 'java', kt: 'kotlin', swift: 'swift', cpp: 'cpp', c: 'c',\n  h: 'cpp', hpp: 'cpp', cs: 'csharp', dart: 'dart',\n  sh: 'bash', bash: 'bash', zsh: 'bash', fish: 'bash',\n  sql: 'sql',\n  toml: 'ini', ini: 'ini', conf: 'ini', env: 'bash', cfg: 'ini',\n  dockerfile: 'dockerfile',\n  graphql: 'graphql', gql: 'graphql',\n  diff: 'diff', patch: 'diff',\n};\n// CSV/TSV land in the rich viewer (`csv` kind below) instead of the\n// legacy plain-text path so the user gets a proper table preview.\nconst TEXT_PLAIN = ['txt', 'log'];\nconst OFFICE = ['docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt', 'odt', 'ods', 'odp', 'rtf'];\n\n/**\n * Lazy viewer map — extension → component loader. Each loader is a\n * dynamic import so the viewer chunk only ships when the file type\n * is actually opened. The PreviewModal mounts the resolved component\n * via `<component :is=\"ViewerCmp\" />` once the dynamic import settles.\n */\nconst VIEWER_MAP: Record<string, () => Promise<Component>> = {\n  glb: () => import('../viewers/Viewer3D.vue'),\n  gltf: () => import('../viewers/Viewer3D.vue'),\n  obj: () => import('../viewers/Viewer3D.vue'),\n  stl: () => import('../viewers/Viewer3D.vue'),\n  fbx: () => import('../viewers/Viewer3D.vue'),\n  '3ds': () => import('../viewers/Viewer3D.vue'),\n\n  epub: () => import('../viewers/EpubViewer.vue'),\n\n  mmd: () => import('../viewers/MermaidViewer.vue'),\n  mermaid: () => import('../viewers/MermaidViewer.vue'),\n\n  drawio: () => import('../viewers/DrawioViewer.vue'),\n  dio: () => import('../viewers/DrawioViewer.vue'),\n\n  tif: () => import('../viewers/TiffViewer.vue'),\n  tiff: () => import('../viewers/TiffViewer.vue'),\n\n  psd: () => import('../viewers/PsdViewer.vue'),\n\n  // PDF deliberately uses the native browser viewer (`kind === 'pdf'`\n  // branch in the template). PdfViewer.vue still exists for callers\n  // that want the rich custom UI but the SFC default keeps things\n  // minimal — the browser already paints search/zoom/page UI for free.\n\n  ipynb: () => import('../viewers/IpynbViewer.vue'),\n\n  csv: () => import('../viewers/CsvViewer.vue'),\n  tsv: () => import('../viewers/CsvViewer.vue'),\n\n  zip: () => import('../viewers/ArchiveViewer.vue'),\n};\n\ntype PreviewKind =\n  | 'image' | 'video' | 'audio' | 'pdf' | 'markdown' | 'code'\n  | 'office' | 'text' | 'viewer' | 'other';\n\nconst kind = computed<PreviewKind>(() => {\n  const e = ext(props.file);\n  if (!e) return 'other';\n  if (IMAGE.includes(e)) return 'image';\n  if (VIDEO.includes(e)) return 'video';\n  if (AUDIO.includes(e)) return 'audio';\n  // PDF always uses the native browser <object> renderer. The\n  // PdfViewer SFC is no longer wired into the default map — the\n  // browser-bundled toolbar is enough and removes a 600 KB pdfjs\n  // worker chunk + a custom toolbar layer for parity with the rest\n  // of the read-only viewers.\n  if (e === 'pdf') return 'pdf';\n  // Markdown stays in its own branch (gets the split view in edit mode);\n  // plain text → code editor in edit mode, raw <pre> in view mode.\n  const wantEdit = props.openMode !== 'view';\n  if (e === 'md' || e === 'markdown') return 'markdown';\n  if (e in CODE_LANGS) return 'code';\n  if (e in VIEWER_MAP) return 'viewer';\n  if (OFFICE.includes(e)) return 'office';\n  if (TEXT_PLAIN.includes(e)) return wantEdit ? 'code' : 'text';\n  return 'other';\n});\n\n// --- Rich viewer plumbing ---\n//\n// `viewerCmp` holds the dynamically-imported component once the load\n// resolves. Stored in a `shallowRef` because the component itself\n// shouldn't be deep-watched.\nconst viewerCmp = shallowRef<Component | null>(null);\nconst viewerLoadError = ref<string | null>(null);\nconst pdfFallbackToNative = ref(false);\n\nasync function loadViewerFor(extension: string): Promise<void> {\n  viewerCmp.value = null;\n  viewerLoadError.value = null;\n  const loader = VIEWER_MAP[extension];\n  if (!loader) return;\n  try {\n    const mod = (await loader()) as { default?: Component };\n    viewerCmp.value = mod.default ?? (mod as unknown as Component);\n  } catch (err) {\n    viewerLoadError.value = err instanceof Error ? err.message : 'viewer load failed';\n    if (extension === 'pdf') pdfFallbackToNative.value = true;\n  }\n}\n\nfunction onPdfFallback(): void {\n  pdfFallbackToNative.value = true;\n}\n\n/** Build the props bundle pushed into the active viewer component. */\nconst viewerProps = computed(() => {\n  const e = ext(props.file);\n  const base: Record<string, unknown> = {\n    url: src.value,\n    ext: e,\n    mime: props.file?.mime_type,\n    t,\n    authHeaders: props.authHeaders,\n    authCredentials: props.authCredentials,\n  };\n  if (props.file) {\n    base.filePath = stripAdapter(props.file.path);\n    // Archive viewer needs the adapter-qualified path because the\n    // /api/files/archive/list handler falls back to storages[0] when\n    // no adapter prefix is present — on multi-storage instances that\n    // 500s for every non-default storage (sample.zip on fm s3-test).\n    if (e === 'zip' || e === 'rar' || e === '7z' || e === 'tar' || e === 'gz' || e === 'tgz') {\n      base.filePath = props.file.path;\n      if (props.archiveListEndpoint) base.archiveListUrl = props.archiveListEndpoint;\n    }\n  }\n  if (e === 'drawio' || e === 'dio') {\n    base.drawioUrl = props.drawioUrl ?? undefined;\n    base.saveUrl = props.saveTextEndpoint ?? undefined;\n    base.readOnly = props.openMode === 'view';\n  }\n  if (e === 'pdf') {\n    base.pdfWorkerUrl = props.pdfWorkerUrl ?? undefined;\n    base.pdfSaveUrl = props.pdfSaveUrl ?? undefined;\n  }\n  return base;\n});\n\nfunction openInNewTab(): void {\n  buildAndOpenStandalone(props.openMode || 'edit');\n}\n\nfunction openEditInNewTab(): void {\n  buildAndOpenStandalone('edit');\n}\n\nfunction buildAndOpenStandalone(mode: 'view' | 'edit'): void {\n  if (!props.file) return;\n  const e = ext(props.file);\n  // Keep the adapter-qualified path intact so the editor route\n  // resolves the storage from the URL (stripping it falls back to\n  // storages[0] and 404s for any non-default adapter). Default base\n  // is the SFC's standalone /files/edit route; embedders override via\n  // viewerBaseUrl when they mount us elsewhere.\n  const base = props.viewerBaseUrl || '/files/edit';\n  const sep = base.includes('?') ? '&' : '?';\n  const url =\n    `${base}${sep}path=${encodeURIComponent(props.file.path)}` +\n    `&type=${encodeURIComponent(e)}` +\n    `&mode=${encodeURIComponent(mode)}`;\n  window.open(url, '_blank', 'noopener');\n}\n\n/**\n * Extensions that have a meaningful \"edit\" surface. Read-only kinds\n * (image/video/audio/3D/archive) don't surface an \"Edit\" button.\n */\nconst EDITABLE_EXTS = new Set([\n  // OnlyOffice — open the in-page office editor (or new tab) with\n  // edit permissions.\n  'docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt',\n  'odt', 'ods', 'odp', 'rtf',\n  // Drawio / mermaid round-trip via the new-tab route.\n  'drawio', 'dio', 'mmd', 'mermaid',\n  // Code / text / markdown — Monaco / split editor.\n  'md', 'markdown', 'txt', 'log',\n  'json', 'jsonc', 'yaml', 'yml', 'xml', 'svg', 'html', 'htm',\n  'js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx', 'vue', 'svelte',\n  'css', 'scss', 'sass', 'less',\n  'php', 'py', 'rb', 'go', 'rs', 'java', 'kt', 'swift',\n  'cpp', 'c', 'h', 'hpp', 'cs', 'dart',\n  'sh', 'bash', 'sql',\n  'toml', 'ini', 'conf', 'cfg', 'env',\n  'dockerfile', 'graphql', 'gql',\n]);\n\nconst canEditKind = computed<boolean>(() =>\n  !!props.file && EDITABLE_EXTS.has(ext(props.file)),\n);\n\n// Keep adapter prefix so backend resolves the right storage — stripping\n// it defaults to storages[0] and 404s on any non-default adapter.\nconst src = computed(() => (props.file ? props.previewUrl(props.file.path) : ''));\nconst download = computed(() => (props.file ? props.downloadUrl(props.file.path) : ''));\n\nfunction stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n/* === gorunum:v1-viewer — full-bleed overlay chrome ===\n *\n * The card modal (title bar + Download/Close footer) is gone; what replaces\n * it is one bar across the top, a chevron on each screen edge and a floating\n * zoom pill. `chromeless` is untouched: the standalone /files/edit route still\n * gets the bare viewer with no chrome at all, which is the whole point of that\n * flag — the browser tab is its container.\n */\n\n/** Chrome is drawn for the in-page overlay only. */\nconst showChrome = computed(() => !props.chromeless);\n\nconst viewerEl = ref<HTMLElement | null>(null);\n\nconst tileHtml = computed(() => (props.file ? fileIconTile(props.file) : ''));\nconst displayName = computed(() => (props.file ? nodeDisplayName(props.file) : ''));\n\n/** \"1 of 9\" — only when the host answered BOTH halves. */\nconst counterText = computed(() => {\n  const i = props.index;\n  const n = props.total;\n  if (!i || !n || n < 1 || i < 1) return '';\n  return t('viewer.counter', { i, n });\n});\n\n/** `246.3 KB • Sep 9, 2026 • 1 of 9`, with any unknown part left out\n *  rather than printed as a placeholder. */\nconst metaLine = computed(() => {\n  const f = props.file;\n  if (!f) return '';\n  const parts: string[] = [];\n  if (typeof f.size === 'number' && f.type === 'file') parts.push(formatSize(f.size));\n  const when = formatDate(f.last_modified);\n  if (when) parts.push(when);\n  if (counterText.value) parts.push(counterText.value);\n  return parts.join(' • ');\n});\n\n/** The chevrons appear only where prev/next actually goes somewhere. */\nconst canNav = computed(\n  () => showChrome.value && (props.navEnabled === true || (props.total ?? 0) > 1),\n);\n\n/** Starring is the real thing, not a second implementation: StarButton +\n *  lib/star.ts, the same pair the listing rows use. It needs the DB node id,\n *  which client-synthesized rows do not carry — no id, no button. */\nconst starNodeId = computed(() =>\n  typeof props.file?.id === 'number' ? (props.file.id as number) : null,\n);\n\n/**\n * Which kinds get the stage stretched instead of centred. Editors and\n * document surfaces want every pixel; a photo wants to sit in the middle\n * of the ground with room around it.\n */\nconst FILL_KINDS = new Set(['pdf', 'markdown', 'code', 'text', 'office', 'viewer']);\nconst stageModifier = computed(() =>\n  FILL_KINDS.has(kind.value) ? 'fe-preview--fill' : 'fe-preview--center',\n);\n\n/* --- Zoom (image only) ----------------------------------------------\n *\n * ⚠ The pill is hidden for pdf / office / drawio. Those three paint their\n * OWN zoom control inside their surface, and a second one wired to nothing\n * is a control that lies — worse than no control, because the user reads a\n * percentage that the thing on screen does not obey.\n */\nconst ZOOM_STEPS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4];\nconst zoom = ref(1);\nconst imgEl = ref<HTMLImageElement | null>(null);\n/** The width the image settles at when it is fit to the stage (zoom = 1).\n *  Everything else is a multiple of it, which is what makes \"100%\" mean\n *  \"the size you first saw\" rather than \"the pixel size of the file\". */\nconst fitWidth = ref(0);\n\nconst canZoom = computed(() => showChrome.value && kind.value === 'image');\n\nfunction measureFit(): void {\n  if (zoom.value !== 1 || !imgEl.value) return;\n  const w = imgEl.value.getBoundingClientRect().width;\n  if (w > 0) fitWidth.value = w;\n}\n\nconst imageStyle = computed(() => {\n  if (zoom.value === 1 || !fitWidth.value) return undefined;\n  return {\n    width: `${Math.round(fitWidth.value * zoom.value)}px`,\n    height: 'auto',\n    maxWidth: 'none',\n    maxHeight: 'none',\n  } as Record<string, string>;\n});\n\nfunction stepZoom(dir: 1 | -1): void {\n  const cur = zoom.value;\n  if (dir > 0) {\n    zoom.value = ZOOM_STEPS.find((s) => s > cur + 1e-6) ?? ZOOM_STEPS[ZOOM_STEPS.length - 1];\n  } else {\n    const lower = ZOOM_STEPS.filter((s) => s < cur - 1e-6);\n    zoom.value = lower.length ? lower[lower.length - 1] : ZOOM_STEPS[0];\n  }\n}\n\nfunction resetZoom(): void {\n  zoom.value = 1;\n  void nextTick(measureFit);\n}\n\nconst zoomLabel = computed(() => `${Math.round(zoom.value * 100)}%`);\nconst canZoomIn = computed(() => zoom.value < ZOOM_STEPS[ZOOM_STEPS.length - 1] - 1e-6);\nconst canZoomOut = computed(() => zoom.value > ZOOM_STEPS[0] + 1e-6);\n\n/* --- Fullscreen ------------------------------------------------------ */\nconst isFullscreen = ref(false);\n\nfunction onFullscreenChange(): void {\n  isFullscreen.value = !!document.fullscreenElement;\n}\n\nfunction toggleFullscreen(): void {\n  try {\n    if (document.fullscreenElement) {\n      void document.exitFullscreen?.();\n    } else {\n      void viewerEl.value?.requestFullscreen?.();\n    }\n  } catch {\n    /* a browser that refuses fullscreen just leaves the overlay as it is */\n  }\n}\n\n/**\n * The overlay has no backdrop ring to click — the card IS the viewport — so\n * the ground around the content takes that job. `.self` is what keeps it\n * honest: it only fires when the click landed on the ground itself, never on\n * an editor, an iframe or the image.\n */\nfunction onGroundClick(): void {\n  if (!showChrome.value) return;\n  emit('close');\n}\n\nconst loading = ref(false);\nconst fetchError = ref<string | null>(null);\nconst rawText = ref<string>('');\nconst MAX_TEXT_BYTES = 1_000_000;\nconst tooLarge = ref(false);\n\n// Markdown split-edit state — drives the side-by-side textarea+preview\n// layout inside the `kind === 'markdown'` template when openMode='edit'.\nconst mdDirty = ref(false);\nconst mdSaving = ref(false);\nlet mdReRenderTimer: ReturnType<typeof setTimeout> | undefined;\nlet mdAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nfunction onMdInput() {\n  mdDirty.value = true;\n  if (mdReRenderTimer) clearTimeout(mdReRenderTimer);\n  mdReRenderTimer = setTimeout(() => {\n    renderMarkdown(rawText.value);\n  }, 250);\n  // Autosave 1.5s after last keystroke — the manual Save button + Ctrl+S\n  // still work; saveMarkdown() guards against overlap.\n  if (mdAutosaveTimer) clearTimeout(mdAutosaveTimer);\n  mdAutosaveTimer = setTimeout(() => {\n    void saveMarkdown();\n  }, 1500);\n}\nasync function saveMarkdown() {\n  if (!props.saveTextEndpoint || !props.file || mdSaving.value) return;\n  mdSaving.value = true;\n  fetchError.value = null;\n  try {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(await (props.authHeaders ?? (() => ({})))()),\n    };\n    const res = await fetch(props.saveTextEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({ path: stripAdapter(props.file.path), content: rawText.value }),\n    });\n    if (!res.ok) {\n      throw new Error(`save failed: ${res.status} ${await res.text()}`);\n    }\n    mdDirty.value = false;\n  } catch (err) {\n    fetchError.value = err instanceof Error ? err.message : String(err);\n  } finally {\n    mdSaving.value = false;\n  }\n}\n\nasync function fetchText(url: string): Promise<void> {\n  loading.value = true;\n  fetchError.value = null;\n  rawText.value = '';\n  tooLarge.value = false;\n  try {\n    const headers: Record<string, string> = {};\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(url, {\n      credentials: props.authCredentials || 'same-origin',\n      headers,\n    });\n    if (!res.ok) {\n      throw new Error(`${res.status} ${res.statusText}`);\n    }\n    const len = Number(res.headers.get('content-length') || '0');\n    if (len > MAX_TEXT_BYTES) {\n      tooLarge.value = true;\n      return;\n    }\n    const text = await res.text();\n    if (text.length > MAX_TEXT_BYTES) {\n      tooLarge.value = true;\n      rawText.value = text.slice(0, MAX_TEXT_BYTES);\n    } else {\n      rawText.value = text;\n    }\n  } catch (err) {\n    fetchError.value = err instanceof Error ? err.message : String(err);\n  } finally {\n    loading.value = false;\n  }\n}\n\n// --- Markdown rendering (lazy markdown-it) ---\n//\n// Beyond the base markdown render we walk the resulting DOM for two\n// enrichments:\n//   - ```mermaid``` fences → swap the `<pre>` for a rendered SVG via\n//     the `mermaid` peer (when installed).\n//   - ```math``` / `$$ … $$` blocks → render with `katex` (peer).\n// Both enrichments degrade gracefully when the peer isn't available\n// (the original `<pre>` stays in place).\n\nconst markdownHtml = ref<string>('');\nconst markdownEl = ref<HTMLDivElement | null>(null);\n/**\n * The renderer could not be loaded at all.\n *\n * ⚠ Tracked separately from \"nothing to render\". In view mode a missing\n * renderer falls through to the raw source, which is honest; in the split\n * editor the preview pane simply stayed BLANK — a white half-window with no\n * explanation, measured in the desktop app on 2026-08-10.\n */\nconst markdownUnavailable = ref(false);\n\nasync function renderMarkdown(text: string): Promise<void> {\n  try {\n    const mod = (await import(/* @vite-ignore */ 'markdown-it').catch(() => null)) as any;\n    if (!mod) {\n      markdownHtml.value = '';\n      markdownUnavailable.value = true;\n      return;\n    }\n    markdownUnavailable.value = false;\n    const Md = (mod as { default: any }).default ?? (mod as any);\n    // html: true so inline HTML in README.md / docs renders (the\n    // GitHub / GitLab contract — operators expect `<img>`, tables,\n    // `<details>`, etc. to work). We sanitize the output below to\n    // strip scripts / event handlers before injecting via v-html.\n    const md = new Md({\n      html: true,\n      linkify: true,\n      breaks: true,\n      typographer: true,\n    });\n    const raw = md.render(text);\n    markdownHtml.value = sanitizeHtml(raw);\n    // Wait for Vue to flush the v-html into the DOM before walking it.\n    await new Promise<void>((r) => setTimeout(r, 0));\n    await enrichMarkdown();\n  } catch (err) {\n    markdownHtml.value = '';\n    fetchError.value = err instanceof Error ? err.message : String(err);\n  }\n}\n\n/**\n * Sanitize the markdown-it output before v-html injection.\n *\n * GitHub / GitLab let README authors embed inline HTML (img, table,\n * details, kbd …) so the viewer ships with `html: true`. This filter\n * strips the executable surface: `<script>`, `<iframe>`, `<object>`,\n * `<embed>`, any `on*` event-handler attribute, and `javascript:`\n * URLs. Conservative — README content with inline handlers is\n * exceptional and silent over-removal beats silent XSS.\n *\n * No external dep — keeping the package install-free is the trade\n * we want. Integrators who need a heavier sanitizer can run their\n * own DOMPurify pass on the rendered output before showing it.\n */\nfunction sanitizeHtml(html: string): string {\n  return html\n    .replace(/<\\s*script\\b[^<]*(?:(?!<\\s*\\/\\s*script\\s*>)<[^<]*)*<\\s*\\/\\s*script\\s*>/gi, '')\n    .replace(/<\\s*iframe\\b[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi, '')\n    .replace(/<\\s*object\\b[\\s\\S]*?<\\s*\\/\\s*object\\s*>/gi, '')\n    .replace(/<\\s*embed\\b[^>]*>/gi, '')\n    .replace(/\\son\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '')\n    .replace(/(href|src|action|formaction|xlink:href)\\s*=\\s*(?:\"\\s*javascript:[^\"]*\"|'\\s*javascript:[^']*')/gi, '$1=\"#\"');\n}\n\nasync function enrichMarkdown(): Promise<void> {\n  if (!markdownEl.value) return;\n  const root = markdownEl.value;\n  const blocks = Array.from(root.querySelectorAll('pre > code')) as HTMLElement[];\n  if (blocks.length === 0) return;\n\n  let mermaid: any = undefined;\n  let katex: any = undefined;\n\n  for (const block of blocks) {\n    const cls = block.className || '';\n    const isMermaid =\n      /\\blanguage-mermaid\\b/.test(cls) || /\\blanguage-mmd\\b/.test(cls);\n    const isMath =\n      /\\blanguage-math\\b/.test(cls) ||\n      /\\blanguage-latex\\b/.test(cls) ||\n      /\\blanguage-tex\\b/.test(cls);\n\n    if (isMermaid) {\n      if (mermaid === undefined) {\n        try {\n          const m = await import(/* @vite-ignore */ 'mermaid');\n          mermaid = m.default ?? m;\n          mermaid.initialize?.({\n            startOnLoad: false,\n            securityLevel: 'strict',\n          });\n        } catch {\n          mermaid = null;\n        }\n      }\n      if (!mermaid) continue;\n      try {\n        const id = `filex-md-mermaid-${Math.random().toString(36).slice(2)}`;\n        const { svg } = await mermaid.render(id, block.textContent || '');\n        const wrap = document.createElement('div');\n        wrap.className = 'fe-preview__md-mermaid';\n        wrap.innerHTML = svg;\n        block.parentElement?.replaceWith(wrap);\n      } catch {\n        /* leave fenced block */\n      }\n    } else if (isMath) {\n      if (katex === undefined) {\n        try {\n          const m = await import(/* @vite-ignore */ 'katex');\n          katex = m.default ?? m;\n        } catch {\n          katex = null;\n        }\n      }\n      if (!katex) continue;\n      try {\n        const html = katex.renderToString(block.textContent || '', {\n          displayMode: true,\n          throwOnError: false,\n        });\n        const wrap = document.createElement('div');\n        wrap.className = 'fe-preview__md-math';\n        wrap.innerHTML = html;\n        block.parentElement?.replaceWith(wrap);\n      } catch {\n        /* leave fenced block */\n      }\n    }\n  }\n}\n\n// --- Code highlight (highlight.js fallback) ---\n//\n// Used as the placeholder render until Monaco resolves, AND as the\n// permanent renderer when Monaco isn't installed at all (peer missing).\n\nconst codeHtml = ref<string>('');\n\nasync function highlightCode(text: string, language: string): Promise<void> {\n  try {\n    const mod = (await ensureHighlight()) as any;\n    if (!mod) {\n      codeHtml.value = '';\n      return;\n    }\n    const hljs = mod.default ?? mod;\n    if (hljs.getLanguage(language)) {\n      const result = hljs.highlight(text, { language, ignoreIllegals: true });\n      codeHtml.value = result.value;\n    } else {\n      const result = hljs.highlightAuto(text);\n      codeHtml.value = result.value;\n    }\n  } catch (err) {\n    codeHtml.value = '';\n    fetchError.value = err instanceof Error ? err.message : String(err);\n  }\n}\n\n// --- Monaco editor (lazy) ---\n//\n// We attempt to instantiate Monaco when the modal opens for a code/text\n// file. If the module isn't loaded yet, the highlight.js placeholder\n// renders first, and the editor mounts in-place once Monaco resolves.\n// Save endpoint required for editing — read-only Monaco still loads if\n// the user just wants the IDE-grade syntax/colour view.\n\nconst monacoEl = ref<HTMLDivElement | null>(null);\nlet monacoEditor: any = null;\nlet codeAutosaveTimer: ReturnType<typeof setTimeout> | undefined;\nconst monacoReady = ref(false);\n/** Monaco resolved to nothing — the peer is not in this build at all. */\nconst monacoUnavailable = ref(false);\nconst saving = ref(false);\nconst saveOk = ref(false);\nconst saveError = ref<string | null>(null);\n\nfunction disposeMonaco(): void {\n  if (monacoEditor) {\n    try {\n      monacoEditor.dispose();\n    } catch {\n      /* ignore */\n    }\n    monacoEditor = null;\n  }\n  monacoReady.value = false;\n  saveOk.value = false;\n  saveError.value = null;\n}\n\n/**\n * Map an extension to a Monaco language id. Anything not in the map\n * just becomes 'plaintext' — Monaco still gives line numbers + Ctrl+S.\n */\nfunction monacoLanguageFor(extension: string): string {\n  const map: Record<string, string> = {\n    js: 'javascript', mjs: 'javascript', cjs: 'javascript',\n    ts: 'typescript', tsx: 'typescript', jsx: 'javascript',\n    json: 'json', jsonc: 'json',\n    css: 'css', scss: 'scss', sass: 'scss', less: 'less',\n    html: 'html', htm: 'html', vue: 'html', svelte: 'html',\n    xml: 'xml', svg: 'xml',\n    md: 'markdown', markdown: 'markdown',\n    php: 'php', py: 'python',\n    yml: 'yaml', yaml: 'yaml',\n    go: 'go', rs: 'rust', sql: 'sql',\n    cpp: 'cpp', c: 'c', h: 'cpp', hpp: 'cpp',\n    sh: 'shell', bash: 'shell',\n    dockerfile: 'dockerfile',\n    toml: 'ini', ini: 'ini', conf: 'ini', cfg: 'ini',\n  };\n  return map[extension] ?? 'plaintext';\n}\n\nasync function tryMountMonaco(text: string, extension: string): Promise<boolean> {\n  const monaco = (await ensureMonaco()) as any;\n  // ⚠ \"Not installed\" is not \"still loading\". Monaco is an optional peer that\n  // most embeds do not ship, and the toolbar label was gated only on \"not ready\n  // yet\" — so a bundle without it showed \"Editor loading…\" forever, over a\n  // perfectly good read-only view. Measured in the desktop app once syntax\n  // highlighting started working and that label finally had something to sit on.\n  if (!monaco) monacoUnavailable.value = true;\n  if (!monaco || !monacoEl.value) return false;\n  try {\n    disposeMonaco();\n    const editable = !!props.saveTextEndpoint && props.openMode !== 'view';\n    // Honour the explicit theme prop when set; fall back to the OS\n    // preference otherwise. Without this the Monaco editor stays on\n    // vs-dark on OS-dark systems even when the host admin shell is\n    // light, producing a jarring light-card + dark-code combo inside\n    // the in-page preview modal.\n    const dark = props.theme === 'dark'\n      ? true\n      : props.theme === 'light'\n        ? false\n        : window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n    monacoEditor = monaco.editor.create(monacoEl.value, {\n      value: text,\n      language: monacoLanguageFor(extension),\n      readOnly: !editable,\n      theme: dark ? 'vs-dark' : 'vs',\n      automaticLayout: true,\n      minimap: { enabled: false },\n      fontSize: 13,\n    });\n    if (editable) {\n      monacoEditor.addCommand(\n        monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS,\n        () => void saveCode(),\n      );\n      // Autosave: 1.5s after the last keystroke we POST the buffer.\n      // Ctrl+S still works for the impatient — saveCode() guards against\n      // overlap, so a manual save during the debounce window just wins\n      // and the queued autosave becomes a no-op.\n      monacoEditor.onDidChangeModelContent(() => {\n        if (codeAutosaveTimer) clearTimeout(codeAutosaveTimer);\n        codeAutosaveTimer = setTimeout(() => {\n          void saveCode();\n        }, 1500);\n      });\n    }\n    monacoReady.value = true;\n    return true;\n  } catch (err) {\n    fetchError.value = `Monaco mount fail: ${(err as Error).message}`;\n    return false;\n  }\n}\n\nasync function saveCode(): Promise<void> {\n  if (!props.saveTextEndpoint || !props.file) return;\n  if (props.openMode === 'view') return;\n  if (saving.value) return;\n  saving.value = true;\n  saveOk.value = false;\n  saveError.value = null;\n  try {\n    const text = monacoEditor ? monacoEditor.getValue() : '';\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(props.saveTextEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({\n        path: stripAdapter(props.file.path),\n        content: text,\n      }),\n    });\n    if (!res.ok) {\n      const txt = await res.text().catch(() => '');\n      throw new Error(`${res.status} ${res.statusText}${txt ? ' — ' + txt.slice(0, 150) : ''}`);\n    }\n    saveOk.value = true;\n    setTimeout(() => {\n      saveOk.value = false;\n    }, 2500);\n  } catch (err) {\n    saveError.value = (err as Error).message;\n  } finally {\n    saving.value = false;\n  }\n}\n\n// --- Orchestration: fetch + render when modal opens ---\n\nasync function runOrchestration(open: boolean, url: string, k: string): Promise<void> {\n  rawText.value = '';\n  markdownHtml.value = '';\n  codeHtml.value = '';\n  fetchError.value = null;\n  officeError.value = null;\n  viewerCmp.value = null;\n  viewerLoadError.value = null;\n  pdfFallbackToNative.value = false;\n  /* gorunum:v1-viewer — a new file starts at 100%. Carrying 400% over from\n   * the previous photo means the next one opens mid-crop with no hint why. */\n  zoom.value = 1;\n  fitWidth.value = 0;\n  disposeOnlyOfficeEditor();\n  disposeMonaco();\n  if (!open || !url) return;\n  if (k === 'viewer') {\n    await loadViewerFor(ext(props.file));\n    return;\n  }\n  if (k === 'markdown' || k === 'code' || k === 'text') {\n    await fetchText(url);\n    if (tooLarge.value) return;\n    if (k === 'markdown') {\n      await renderMarkdown(rawText.value);\n      return;\n    }\n    // For code/text — try Monaco first when the cached module is\n    // already in memory. If not, render the highlight.js placeholder\n    // immediately, then attempt to upgrade to Monaco when the import\n    // settles.\n    const lang = CODE_LANGS[ext(props.file)] || '';\n    const monacoCached = getMonaco();\n    if (monacoCached) {\n      await new Promise<void>((r) => setTimeout(r, 0));\n      const ok = await tryMountMonaco(rawText.value, ext(props.file));\n      if (!ok) await highlightCode(rawText.value, lang);\n    } else {\n      // Render highlight.js immediately for read-only colour. Then\n      // kick off the Monaco load and swap it in once ready.\n      if (k === 'code') await highlightCode(rawText.value, lang);\n      ensureMonaco().then(async (m) => {\n        // ⚠ Record the \"never coming\" case here too. This branch returns early\n        // without ever reaching tryMountMonaco, so a build with no Monaco left\n        // the toolbar saying \"Editor loading…\" indefinitely.\n        if (!m) { monacoUnavailable.value = true; return; }\n        if (!props.open) return;\n        // Wait one tick so the placeholder DOM exists before swapping.\n        await new Promise<void>((r) => setTimeout(r, 0));\n        await tryMountMonaco(rawText.value, ext(props.file));\n      });\n    }\n  } else if (k === 'office') {\n    await new Promise<void>((r) => setTimeout(r, 0));\n    await mountOnlyOfficeEditor();\n  }\n}\n\nwatch(\n  () => [props.open, src.value, kind.value, props.openMode] as const,\n  ([open, url, k]) => {\n    void runOrchestration(open, url, k);\n  },\n);\n\n// Hand-fire on mount so the standalone Editor.vue route (which mounts\n// us with `open` already true) actually runs the orchestration. The\n// watcher itself is non-immediate because `immediate: true` would fire\n// before the rest of <script setup> finishes, hitting the TDZ on\n// `officeEditor`/Monaco state below. Doing this in onMounted+nextTick\n// guarantees every `let`/`function` in the file has been hoisted.\nonMounted(() => {\n  document.addEventListener('fullscreenchange', onFullscreenChange);\n  void nextTick(() => {\n    if (!props.open) return;\n    void runOrchestration(props.open, src.value, kind.value);\n  });\n});\n\nconst codeLanguage = computed(() => CODE_LANGS[ext(props.file)] || 'plaintext');\n\n// --- OnlyOffice DocEditor (real, JWT-signed) ---\n\nconst officeEl = ref<HTMLDivElement | null>(null);\nconst officeError = ref<string | null>(null);\nlet officeEditor: any = null;\n\nasync function mountOnlyOfficeEditor(): Promise<void> {\n  officeError.value = null;\n  if (!props.file || kind.value !== 'office') return;\n  if (!props.onlyOfficeConfigEndpoint) {\n    officeError.value = t('viewer.office_unconfigured');\n    return;\n  }\n  if (!officeEl.value) return;\n\n  try {\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n    if (props.authHeaders) Object.assign(headers, await props.authHeaders());\n    const res = await fetch(props.onlyOfficeConfigEndpoint, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({\n        // Send the FULL adapter-qualified path. The backend resolves\n        // `<adapter>://<rel>` against ListEnabledStorages; passing the\n        // bare relative path falls back to storages[0] which 404s for\n        // anything sitting on a non-primary storage (e.g. s3-test).\n        path: props.file.path,\n        mode: props.openMode || 'edit',\n      }),\n    });\n    if (!res.ok) {\n      throw new Error(`Config fetch ${res.status}: ${(await res.text()).slice(0, 200)}`);\n    }\n    const { config, documentServerUrl } = (await res.json()) as {\n      config: any;\n      documentServerUrl: string;\n    };\n\n    await loadOnlyOfficeScript(documentServerUrl);\n    disposeOnlyOfficeEditor();\n\n    const mountId = 'fe-onlyoffice-mount';\n    officeEl.value.id = mountId;\n\n    config.events = {\n      onError: (err: any) => {\n        officeError.value = formatOnlyOfficeError(err);\n      },\n    };\n\n    const W = window as any;\n    if (!W.DocsAPI || !W.DocsAPI.DocEditor) {\n      throw new Error('DocsAPI not available after script load');\n    }\n    officeEditor = new W.DocsAPI.DocEditor(mountId, config);\n  } catch (err) {\n    officeError.value = err instanceof Error ? err.message : String(err);\n  }\n}\n\nfunction disposeOnlyOfficeEditor(): void {\n  try {\n    officeEditor?.destroyEditor?.();\n  } catch {\n    /* ignore */\n  }\n  officeEditor = null;\n}\n\nonBeforeUnmount(() => {\n  document.removeEventListener('fullscreenchange', onFullscreenChange);\n  disposeOnlyOfficeEditor();\n  disposeMonaco();\n});\n\n/**\n * OnlyOffice fires onError with an event-like object:\n *   { type:'error', data:{ errorCode, errorDescription, ... } }\n * The legacy stringification produced \"[object Object]\" for objects\n * whose `data` was itself an object. Walk one level deeper so the\n * user sees the actual error description instead of a useless cast.\n */\nfunction formatOnlyOfficeError(err: unknown): string {\n  if (typeof err === 'string') return err;\n  const e = err as { data?: unknown; message?: unknown; errorDescription?: unknown };\n  if (e?.data && typeof e.data === 'object') {\n    const d = e.data as { errorDescription?: unknown; errorCode?: unknown; message?: unknown };\n    if (typeof d.errorDescription === 'string') return d.errorDescription;\n    if (typeof d.message === 'string') return d.message;\n    if (d.errorCode !== undefined) return `OnlyOffice error ${d.errorCode}`;\n  }\n  if (typeof e?.data === 'string') return e.data;\n  if (typeof e?.errorDescription === 'string') return e.errorDescription;\n  if (typeof e?.message === 'string') return e.message;\n  try {\n    return JSON.stringify(err);\n  } catch {\n    return 'OnlyOffice error';\n  }\n}\n\nconst ONLYOFFICE_SCRIPT_ID = 'fe-onlyoffice-api-js';\nfunction loadOnlyOfficeScript(base: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    if ((window as any).DocsAPI?.DocEditor) {\n      resolve();\n      return;\n    }\n    const existing = document.getElementById(ONLYOFFICE_SCRIPT_ID) as HTMLScriptElement | null;\n    if (existing) {\n      existing.addEventListener('load', () => resolve());\n      existing.addEventListener('error', () => reject(new Error('OnlyOffice api.js load failed')));\n      return;\n    }\n    const script = document.createElement('script');\n    script.id = ONLYOFFICE_SCRIPT_ID;\n    // Same URL the admin page's browser probe attempts, from the same\n    // helper — a probe that tested a different address than the editor loads\n    // would be the old lie wearing a new badge.\n    script.src = browserProbeURL('onlyoffice', base);\n    script.async = true;\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error('OnlyOffice api.js load failed'));\n    document.head.appendChild(script);\n  });\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    size=\"xl\"\n    :title=\"file?.basename || ''\"\n    :chromeless=\"chromeless\"\n    :fullbleed=\"!chromeless\"\n    :theme=\"theme\"\n    @close=\"emit('close')\"\n  >\n    <!-- === gorunum:v1-viewer ===\n         A full-bleed overlay, not a card: one bar across the top, a chevron on\n         each screen edge, a floating zoom pill at the bottom. `chromeless`\n         renders the viewer BARE (no bar, no chevrons, no pill) because the\n         standalone /files/edit route's container is the browser tab itself. -->\n    <div ref=\"viewerEl\" class=\"fe-viewer\" :class=\"{ 'fe-viewer--bare': chromeless }\">\n      <header v-if=\"showChrome && file\" class=\"fe-viewer__bar\">\n        <div class=\"fe-viewer__ident\">\n          <span class=\"fe-viewer__tile\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n          <span class=\"fe-viewer__idcol\">\n            <span class=\"fe-viewer__name\" :title=\"file.path\">{{ displayName }}</span>\n            <span v-if=\"metaLine\" class=\"fe-viewer__meta\">{{ metaLine }}</span>\n          </span>\n        </div>\n\n        <div class=\"fe-viewer__acts\">\n          <a\n            :href=\"download\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.download')\"\n            :aria-label=\"t('viewer.download')\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('download')\"></span></a>\n          <button\n            v-if=\"shareEnabled\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.share')\"\n            :aria-label=\"t('viewer.share')\"\n            @click=\"emit('share')\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span></button>\n          <!-- The listing's StarButton, not a copy of it: same component, same\n               lib/star.ts request, same optimistic rollback. -->\n          <StarButton\n            v-if=\"starNodeId !== null\"\n            class=\"fe-viewer__act fe-viewer__act--star\"\n            :starred=\"file.starred === true\"\n            :node-id=\"starNodeId\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            @change=\"(v: boolean) => emit('starred', v)\"\n          />\n          <button\n            v-if=\"openMode === 'view' && canEditKind && newTabEnabled !== false /* wiring:e2 */\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.edit')\"\n            :aria-label=\"t('viewer.edit')\"\n            @click=\"openEditInNewTab\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('rename')\"></span></button>\n          <button\n            v-if=\"newTabEnabled !== false /* wiring:e2 */\"\n            type=\"button\"\n            class=\"fe-viewer__act\"\n            :title=\"t('viewer.open_in_new_tab')\"\n            :aria-label=\"t('viewer.open_in_new_tab')\"\n            @click=\"openInNewTab\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('open-tab')\"></span></button>\n        </div>\n\n        <div class=\"fe-viewer__tail\">\n          <button\n            type=\"button\"\n            class=\"fe-viewer__act fe-viewer__close\"\n            :title=\"t('viewer.close')\"\n            :aria-label=\"t('viewer.close')\"\n            @click=\"emit('close')\"\n          ><span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span></button>\n        </div>\n      </header>\n\n      <div class=\"fe-viewer__stage\" @click.self=\"onGroundClick\">\n        <div v-if=\"file\" class=\"fe-preview\" :class=\"stageModifier\" @click.self=\"onGroundClick\">\n          <template v-if=\"kind === 'image'\">\n            <img\n              ref=\"imgEl\"\n              :src=\"src\"\n              :alt=\"file.basename\"\n              class=\"fe-preview__image\"\n              :style=\"imageStyle\"\n              @load=\"measureFit\"\n            />\n          </template>\n          <template v-else-if=\"kind === 'video'\">\n            <video :src=\"src\" controls preload=\"metadata\" class=\"fe-preview__video\" />\n          </template>\n          <template v-else-if=\"kind === 'audio'\">\n            <audio :src=\"src\" controls class=\"fe-preview__audio\" />\n          </template>\n          <template v-else-if=\"kind === 'pdf'\">\n            <object :data=\"src\" type=\"application/pdf\" class=\"fe-preview__iframe\">\n              <div class=\"fe-preview__fallback\">\n                <!-- ikon:emoji — the file's own tile, the one the row behind\n                     this overlay is wearing. -->\n                <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n                <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n                <p>{{ t('viewer.pdf_inline_failed') }}</p>\n                <a :href=\"download\" class=\"fe-btn fe-btn--primary\" target=\"_blank\" rel=\"noopener\">{{ t('viewer.open_in_new_tab') }}</a>\n              </div>\n            </object>\n          </template>\n\n          <template v-else-if=\"kind === 'markdown'\">\n            <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n            <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n              {{ t('viewer.too_large') }} <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n            </div>\n            <div\n              v-else-if=\"openMode === 'edit' && saveTextEndpoint\"\n              class=\"fe-preview__md-split\"\n            >\n              <div class=\"fe-preview__md-split-bar\">\n                <span class=\"fe-preview__md-split-label\">MARKDOWN</span>\n                <span v-if=\"fetchError\" class=\"fe-preview__md-split-error\">{{ fetchError }}</span>\n                <button\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--primary\"\n                  :disabled=\"!mdDirty || mdSaving\"\n                  @click=\"saveMarkdown\"\n                >\n                  {{ mdSaving ? t('viewer.saving') : (mdDirty ? t('viewer.save') : t('viewer.saved')) }}\n                </button>\n              </div>\n              <div class=\"fe-preview__md-split-body\">\n                <textarea\n                  class=\"fe-preview__md-split-input\"\n                  v-model=\"rawText\"\n                  @input=\"onMdInput\"\n                  @keydown.ctrl.s.prevent=\"saveMarkdown\"\n                  @keydown.meta.s.prevent=\"saveMarkdown\"\n                  spellcheck=\"false\"\n                  :placeholder=\"t('viewer.md_placeholder')\"\n                />\n                <div\n                  v-if=\"markdownUnavailable\"\n                  class=\"fe-preview__md-split-output fe-preview__md\"\n                >{{ t('viewer.peer_not_installed') }}</div>\n                <div\n                  v-else\n                  ref=\"markdownEl\"\n                  class=\"fe-preview__md-split-output fe-preview__md\"\n                  v-html=\"markdownHtml\"\n                ></div>\n              </div>\n            </div>\n            <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n              <p>{{ fetchError }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else-if=\"markdownHtml\" ref=\"markdownEl\" class=\"fe-preview__md\" v-html=\"markdownHtml\"></div>\n            <pre v-else class=\"fe-preview__pre\">{{ rawText }}</pre>\n          </template>\n\n          <template v-else-if=\"kind === 'viewer'\">\n            <div v-if=\"viewerLoadError && !pdfFallbackToNative\" class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span\n                class=\"fe-preview__fallback-icon fe-preview__fallback-icon--alert\"\n                aria-hidden=\"true\"\n                v-html=\"actionIconSvg('alert')\"\n              ></span>\n              <p>{{ viewerLoadError }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else-if=\"!viewerCmp\" class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n              <span\n                class=\"fe-preview__fallback-icon fe-preview__fallback-icon--spin\"\n                aria-hidden=\"true\"\n                v-html=\"actionIconSvg('progress')\"\n              ></span>\n              <p>{{ t('viewer.loading') }}</p>\n            </div>\n            <component\n              v-else\n              :is=\"viewerCmp\"\n              v-bind=\"viewerProps\"\n              class=\"fe-preview__viewer\"\n              @fallback=\"onPdfFallback\"\n            />\n          </template>\n\n          <template v-else-if=\"kind === 'code' || kind === 'text'\">\n            <div v-if=\"loading\" class=\"fe-preview__fallback\">{{ t('viewer.loading') }}</div>\n            <div v-else-if=\"tooLarge\" class=\"fe-preview__fallback\">\n              {{ t('viewer.too_large') }} <a :href=\"download\" class=\"fe-btn\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else-if=\"fetchError\" class=\"fe-preview__fallback\">\n              <p>{{ fetchError }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else class=\"fe-preview__code-wrap\">\n              <div class=\"fe-preview__code-toolbar\">\n                <!-- ⚠ lang=\"en\". This badge holds a highlight.js language ID\n                     (\"typescript\", \"ini\", \"nginx\") — a technical token, never\n                     translated prose — and the CSS uppercases it. CSS\n                     text-transform is LOCALE-AWARE: under the Turkish UI the\n                     document is lang=\"tr\", so \"typescript\" uppercased to\n                     \"TYPESCRİPT\" with a dotted İ (measured 2026-09-13). The\n                     sibling uppercase labels (.fe-sidenav__heading and friends)\n                     hold real Turkish words where \"ETİKETLER\" is exactly right,\n                     so the transform stays and only this one token opts out. -->\n                <span class=\"fe-preview__code-lang\" lang=\"en\">{{ codeLanguage }}</span>\n                <span v-if=\"!monacoReady && codeHtml\" class=\"fe-preview__code-status\">\n                  {{ saveTextEndpoint && !monacoUnavailable ? t('viewer.editor_loading') : t('viewer.read_only') }}\n                </span>\n                <span v-if=\"saveOk\" class=\"fe-preview__code-status fe-preview__code-status--ok\">\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('check')\"></span>\n                  {{ t('viewer.saved') }}\n                </span>\n                <span v-if=\"saveError\" class=\"fe-preview__code-status fe-preview__code-status--err\" :title=\"saveError\">\n                  <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/actionIcons -->\n                  <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  {{ t('viewer.save_error') }}\n                </span>\n                <span v-if=\"openMode === 'view'\" class=\"fe-preview__code-status\">{{ t('viewer.read_only') }}</span>\n                <button\n                  v-else-if=\"saveTextEndpoint && monacoReady\"\n                  type=\"button\"\n                  class=\"fe-btn fe-btn--primary\"\n                  :disabled=\"saving\"\n                  @click=\"saveCode\"\n                >{{ saving ? t('viewer.saving') : t('viewer.save') }}</button>\n              </div>\n              <!-- Monaco target — hidden until ready, then occupies the slot. -->\n              <div ref=\"monacoEl\" class=\"fe-preview__code-editor\" :class=\"{ 'is-hidden': !monacoReady }\" />\n              <!-- Highlight.js read-only fallback — visible until Monaco mounts. -->\n              <pre\n                v-if=\"!monacoReady && codeHtml\"\n                class=\"fe-preview__pre fe-preview__code hljs\"\n              ><code :class=\"`language-${codeLanguage}`\" v-html=\"codeHtml\"></code></pre>\n              <pre\n                v-else-if=\"!monacoReady && !codeHtml\"\n                class=\"fe-preview__pre\"\n                :data-lang=\"codeLanguage\"\n              >{{ rawText }}</pre>\n            </div>\n          </template>\n\n          <template v-else-if=\"kind === 'office'\">\n            <div v-if=\"officeError\" class=\"fe-preview__fallback\" data-testid=\"office-fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n              <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n              <p>{{ officeError }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n            <div v-else ref=\"officeEl\" class=\"fe-preview__office\" />\n          </template>\n\n          <template v-else>\n            <div class=\"fe-preview__fallback\">\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n              <span class=\"fe-preview__fallback-icon\" aria-hidden=\"true\" v-html=\"tileHtml\"></span>\n              <p>{{ t('viewer.no_preview') }}</p>\n              <a :href=\"download\" class=\"fe-btn fe-btn--primary\">{{ t('viewer.download') }}</a>\n            </div>\n          </template>\n        </div>\n      </div>\n\n      <button\n        v-if=\"canNav\"\n        type=\"button\"\n        class=\"fe-viewer__chev fe-viewer__chev--prev\"\n        :title=\"t('viewer.nav_prev')\"\n        :aria-label=\"t('viewer.nav_prev')\"\n        @click=\"emit('nav', -1)\"\n      >\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\"\n             stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n             aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 4.5L7.5 12 15 19.5\" /></svg>\n      </button>\n      <button\n        v-if=\"canNav\"\n        type=\"button\"\n        class=\"fe-viewer__chev fe-viewer__chev--next\"\n        :title=\"t('viewer.nav_next')\"\n        :aria-label=\"t('viewer.nav_next')\"\n        @click=\"emit('nav', 1)\"\n      >\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\"\n             stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n             aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 4.5L16.5 12 9 19.5\" /></svg>\n      </button>\n\n      <!-- Zoom pill. Shown for the image viewer only - pdf, office and drawio\n           paint their own zoom inside their surface, and a second percentage\n           that the content does not obey is a control that lies. -->\n      <div v-if=\"canZoom\" class=\"fe-viewer__zoom\">\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :disabled=\"!canZoomOut\"\n          :title=\"t('viewer.zoom_out')\"\n          :aria-label=\"t('viewer.zoom_out')\"\n          @click=\"stepZoom(-1)\"\n        >&#8722;</button>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-level\"\n          :title=\"t('viewer.zoom_reset')\"\n          :aria-label=\"t('viewer.zoom_reset')\"\n          @click=\"resetZoom\"\n        >{{ zoomLabel }}</button>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :disabled=\"!canZoomIn\"\n          :title=\"t('viewer.zoom_in')\"\n          :aria-label=\"t('viewer.zoom_in')\"\n          @click=\"stepZoom(1)\"\n        >+</button>\n        <span class=\"fe-viewer__zoom-sep\" aria-hidden=\"true\"></span>\n        <button\n          type=\"button\"\n          class=\"fe-viewer__zoom-btn\"\n          :title=\"isFullscreen ? t('viewer.exit_fullscreen') : t('viewer.fullscreen')\"\n          :aria-label=\"isFullscreen ? t('viewer.exit_fullscreen') : t('viewer.fullscreen')\"\n          @click=\"toggleFullscreen\"\n        >\n          <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\"\n               stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n               aria-hidden=\"true\" focusable=\"false\">\n            <template v-if=\"isFullscreen\">\n              <path d=\"M9.5 4.5v5h-5\" /><path d=\"M14.5 4.5v5h5\" />\n              <path d=\"M9.5 19.5v-5h-5\" /><path d=\"M14.5 19.5v-5h5\" />\n            </template>\n            <template v-else>\n              <path d=\"M4.5 9.5v-5h5\" /><path d=\"M19.5 9.5v-5h-5\" />\n              <path d=\"M4.5 14.5v5h5\" /><path d=\"M19.5 14.5v5h-5\" />\n            </template>\n          </svg>\n        </button>\n      </div>\n    </div>\n  </Modal>\n</template>\n\n<style>\n.fe-preview__code-editor.is-hidden {\n  display: none;\n}\n/* Wrapper for the dynamic viewers — they render their own toolbars\n * inside the wrapper, so we just give them the full pane height. */\n.fe-preview__viewer {\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  display: flex;\n  flex-direction: column;\n}\n.fe-preview .fe-preview__viewer {\n  align-self: stretch;\n}\n.fe-preview__md-mermaid {\n  display: flex;\n  justify-content: center;\n  margin: 16px 0;\n}\n.fe-preview__md-mermaid svg {\n  max-width: 100%;\n  height: auto;\n}\n.fe-preview__md-math {\n  margin: 16px 0;\n  text-align: center;\n  overflow-x: auto;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * QuickLook — wiring:c2 Space quick-look overlay.\n *\n * A thin behavioural wrapper over the existing PreviewModal (view\n * mode), so every viewer the modal knows (image/video/pdf/office/code/\n * 3D/archive/…) works in quick-look for free. What this layer adds:\n *\n *   - the quick-look key closes the peek again (Space by default — macOS\n *     Quick Look convention), and the open key promotes it into the full\n *     open flow (Enter by default, emit 'open-full'). Both come from the\n *     shortcut registry rather than from a comparison against the default\n *     key, so a remap reaches the overlay too\n *   - ← ↑ / → ↓ ask the host to move the selection; the host keeps the\n *     `file` prop in sync so the preview follows the selection. These are\n *     the peek's own arrows, not registry actions\n *   - a small floating hint bar naming those keys, read from the registry\n *\n * Keys are handled in window CAPTURE phase with stopPropagation so the\n * global shortcut registry never double-handles them; events that\n * originate in a form control inside a viewer (e.g. the CSV filter\n * input) are left alone. Esc is untouched — PreviewModal's own Modal\n * already closes on it.\n */\nimport { computed, onBeforeUnmount, watch } from 'vue';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { eventMatchesShortcut, shortcutHint } from '../composables/useKeyboardShortcuts';\nimport PreviewModal from '../modals/PreviewModal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  file: FileNode | null;\n  previewUrl: (path: string) => string;\n  downloadUrl: (path: string) => string;\n  onlyOfficeBase?: string | null;\n  onlyOfficeConfigEndpoint?: string | null;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  drawioUrl?: string | null;\n  pdfWorkerUrl?: string | null;\n  viewerBaseUrl?: string | null;\n  theme?: 'light' | 'dark' | 'auto';\n  /* === gorunum:v1-viewer — passed straight through to PreviewModal ===\n   * The peek knows nothing about the listing either; the host that answers\n   * `nav` is the one that can say \"1 of 9\". */\n  /** 1-based position of `file` in the host's file list. */\n  index?: number;\n  /** How many files that list holds. */\n  total?: number;\n  /** API origin for the star toggle. */\n  apiBase?: string;\n  /** Draw the share action (the host must listen to `@share`). */\n  shareEnabled?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  /** Arrow navigation: -1 = previous file, +1 = next file. Now raised by the\n   *  overlay's edge chevrons as well as by the arrow keys — ONE contract, two\n   *  triggers, because a second navigation path would drift from this one. */\n  (e: 'nav', delta: number): void;\n  /** Enter — close the peek and open the file for real. */\n  (e: 'open-full'): void;\n  /** The viewer's share action (only reachable when `shareEnabled`). */\n  (e: 'share'): void;\n  /** The viewer's star toggle succeeded. */\n  (e: 'starred', value: boolean): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction inFormControl(target: EventTarget | null): boolean {\n  const el = target as HTMLElement | null;\n  return !!(\n    el &&\n    (el.tagName === 'INPUT' ||\n      el.tagName === 'TEXTAREA' ||\n      el.tagName === 'SELECT' ||\n      el.isContentEditable)\n  );\n}\n\n/**\n * The peek's own arrows. These are NOT registry actions — they only\n * mean anything while the overlay is up — so they are declared once\n * here and the hint bar prints this same constant. Two copies of a key\n * name is how a legend starts lying about the key it names.\n */\nconst NAV_KEYS = ['↑', '↓'] as const;\n\nfunction onKeydown(e: KeyboardEvent) {\n  if (!props.open) return;\n  if (inFormControl(e.target)) return;\n\n  // ⚠ The registry first, and BEFORE the modifier bail-out: the user may\n  // have remapped quick-look onto a combo that carries Ctrl or Alt. The\n  // old version compared `e.key` to a hardcoded ' ' / 'Enter', so after a\n  // remap the peek opened on the new key and still closed on the old one\n  // — and the hint bar named the old one.\n  if (eventMatchesShortcut(e, 'quicklook')) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit('close');\n    return;\n  }\n  if (eventMatchesShortcut(e, 'open')) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit('open-full');\n    return;\n  }\n\n  if (e.ctrlKey || e.metaKey || e.altKey) return;\n  switch (e.key) {\n    case 'ArrowRight':\n    case 'ArrowDown':\n      e.preventDefault();\n      e.stopPropagation();\n      emit('nav', 1);\n      break;\n    case 'ArrowLeft':\n    case 'ArrowUp':\n      e.preventDefault();\n      e.stopPropagation();\n      emit('nav', -1);\n      break;\n  }\n}\n\n/**\n * The legend, read from the live registry. A segment whose action the\n * user has unbound disappears rather than printing an empty key cap.\n */\nconst hintSegments = computed(() => {\n  const segs: Array<{ id: string; keys: string[]; label: string }> = [];\n  const close = shortcutHint('quicklook');\n  if (close) segs.push({ id: 'quicklook', keys: [close], label: t('quicklook.hint_close') });\n  segs.push({ id: 'nav', keys: [...NAV_KEYS], label: t('quicklook.hint_nav') });\n  const open = shortcutHint('open');\n  if (open) segs.push({ id: 'open', keys: [open], label: t('quicklook.hint_open') });\n  return segs;\n});\n\nwatch(\n  () => props.open,\n  (open) => {\n    if (open) window.addEventListener('keydown', onKeydown, true);\n    else window.removeEventListener('keydown', onKeydown, true);\n  },\n  { immediate: true },\n);\n\nonBeforeUnmount(() => window.removeEventListener('keydown', onKeydown, true));\n</script>\n\n<template>\n  <PreviewModal\n    class=\"fe-quicklook\"\n    :open=\"open\"\n    :locale=\"locale\"\n    :file=\"file\"\n    :theme=\"theme\"\n    :preview-url=\"previewUrl\"\n    :download-url=\"downloadUrl\"\n    :only-office-base=\"onlyOfficeBase\"\n    :only-office-config-endpoint=\"onlyOfficeConfigEndpoint\"\n    open-mode=\"view\"\n    :auth-headers=\"authHeaders\"\n    :auth-credentials=\"authCredentials\"\n    :drawio-url=\"drawioUrl\"\n    :pdf-worker-url=\"pdfWorkerUrl\"\n    :viewer-base-url=\"viewerBaseUrl\"\n    :index=\"index\"\n    :total=\"total\"\n    :api-base=\"apiBase\"\n    :share-enabled=\"shareEnabled\"\n    :nav-enabled=\"true\"\n    @close=\"emit('close')\"\n    @nav=\"(d: number) => emit('nav', d)\"\n    @share=\"emit('share')\"\n    @starred=\"(v: boolean) => emit('starred', v)\"\n  />\n  <!--\n    Teleported under <body> for the same reason as ContextMenu and\n    OnboardingTour: the hint carries the `fe` root class (that is how it\n    reaches the `--fe-*` theme variables), so while it sits inside the\n    explorer tree ANY host rule that reaches `.fe` by descendant also\n    reaches the hint — and a host selector is always more specific than\n    our own single class. web/src/views/Explore.vue sizes the embedded\n    explorer with `.explore-host[data-v-…] .fe { height: 100% }`; that\n    stretched the hint pill to the full viewport height (issue #22).\n    Teleporting takes it out of every host container, so only the\n    package's own rules can reach it.\n  -->\n  <Teleport to=\"body\">\n    <transition name=\"fe-toast\">\n      <div\n        v-if=\"open\"\n        class=\"fe fe-ql-hint\"\n        :class=\"{\n          'fe--theme-light': theme === 'light',\n          'fe--theme-dark': theme === 'dark',\n        }\"\n        aria-hidden=\"true\"\n      >\n        <template v-for=\"(seg, i) in hintSegments\" :key=\"seg.id\">\n          <span v-if=\"i > 0\" class=\"fe-ql-hint__sep\">·</span>\n          <span class=\"fe-ql-hint__seg\">\n            <kbd v-for=\"k in seg.keys\" :key=\"k\" class=\"fe-kbd\">{{ k }}</kbd>\n            {{ seg.label }}\n          </span>\n        </template>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * OperationsCenter — the single visible surface for long-running work\n * (wiring:c3). Compact bottom-right badge (active count + aggregate\n * progress ring; hidden when idle) that expands into a panel: active\n * operations on top, session history below.\n *\n * Renders whatever the useOperations store aggregates — uploads, ops-queue\n * jobs, future convert/archive kinds — with one uniform row template.\n * Cancel / retry / dismiss route back through the store's action registry\n * to the owning publisher.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { Operation, OperationsStore } from '../composables/useOperations';\nimport { useLocale } from '../composables/useLocale';\n\nconst props = defineProps<{\n  center: OperationsStore;\n  locale: LocaleCode;\n  narrow?: boolean;\n}>();\n\nconst { t, formatSize } = useLocale(() => props.locale);\n\nconst open = ref(false);\nconst rootEl = ref<HTMLElement | null>(null);\n\nconst active = computed(() => props.center.active.value);\nconst history = computed(() => props.center.history.value);\nconst hasError = computed(() => props.center.hasError.value);\nconst overall = computed(() => props.center.overallPercent.value);\nconst runningCount = computed(() => props.center.runningCount.value);\n\n// Badge visible while anything is active; once the panel is open it stays\n// up (showing history) until the user closes it. Idle + closed → hidden.\nconst visible = computed(() => active.value.length > 0 || (open.value && history.value.length > 0));\n\nwatch(visible, (v) => {\n  if (!v) open.value = false;\n});\n\n// ---- progress ring ----\nconst RING_R = 8.5;\nconst RING_C = 2 * Math.PI * RING_R;\nconst ringOffset = computed(() => {\n  const p = overall.value;\n  if (p === null) return RING_C * 0.72; // spinner arc\n  return RING_C * (1 - Math.min(100, Math.max(0, p)) / 100);\n});\nconst ringSpin = computed(() => overall.value === null && runningCount.value > 0);\n\nconst pctText = computed(() => {\n  if (runningCount.value === 0 || overall.value === null) return '';\n  return t('opc.percent', { n: overall.value });\n});\n\nconst badgeAria = computed(() => t('opc.aria_badge', { n: active.value.length }));\n\n// ---- row helpers ----\nconst KIND_ICONS: Record<Operation['kind'], string> = {\n  upload: 'M12 16V5M7 9.5 12 5l5 4.5M5 19h14',\n  copy: 'M9 9h11v11H9zM5 15V4h11',\n  move: 'M4 12h13M12 6l6 6-6 6',\n  delete: 'M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13',\n  convert: 'M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5',\n  archive: 'M4 8V5h16v3zM5 8h14v12H5zM10 12h4',\n};\n\nfunction kindLabel(o: Operation): string {\n  return t(`opc.kind.${o.kind}`);\n}\n\nfunction rowTitle(o: Operation): string {\n  return o.name || kindLabel(o);\n}\n\nfunction statusText(o: Operation): string {\n  if (o.status === 'running') {\n    if (o.queued) return t('opc.queued');\n    if (o.totalBytes && o.totalBytes > 0) {\n      return `${formatSize(o.uploadedBytes ?? 0)} / ${formatSize(o.totalBytes)}`;\n    }\n    if (o.totalCount && o.totalCount > 0) {\n      return `${o.doneCount ?? 0}/${o.totalCount}`;\n    }\n    return t('opc.status.running');\n  }\n  if (o.status === 'done') return t('opc.status.done');\n  if (o.status === 'aborted') return t('opc.status.aborted');\n  return o.error || t('opc.status.error');\n}\n\nfunction chipText(o: Operation): string {\n  return t(`opc.status.${o.status === 'running' ? 'running' : o.status}`);\n}\n\n// ---- outside click + Escape ----\nfunction onDocPointerDown(ev: MouseEvent) {\n  if (!open.value) return;\n  const el = rootEl.value;\n  if (el && ev.target instanceof Node && !el.contains(ev.target)) open.value = false;\n}\nfunction onDocKeydown(ev: KeyboardEvent) {\n  if (open.value && ev.key === 'Escape') open.value = false;\n}\nonMounted(() => {\n  document.addEventListener('mousedown', onDocPointerDown);\n  document.addEventListener('keydown', onDocKeydown);\n});\nonBeforeUnmount(() => {\n  document.removeEventListener('mousedown', onDocPointerDown);\n  document.removeEventListener('keydown', onDocKeydown);\n});\n</script>\n\n<template>\n  <div\n    v-if=\"visible\"\n    ref=\"rootEl\"\n    class=\"fe-opc\"\n    :class=\"{ 'fe-opc--narrow': narrow, 'fe-opc--open': open }\"\n  >\n    <transition name=\"fe-opc-pop\">\n      <section v-if=\"open\" class=\"fe-opc__panel\" role=\"dialog\" :aria-label=\"t('opc.title')\">\n        <header class=\"fe-opc__head\">\n          <strong>{{ t('opc.title') }}</strong>\n          <button\n            type=\"button\"\n            class=\"fe-opc__x\"\n            :aria-label=\"t('opc.close')\"\n            @click=\"open = false\"\n          >×</button>\n        </header>\n        <div class=\"fe-opc__body\">\n          <div v-if=\"active.length > 0\" class=\"fe-opc__section\" aria-live=\"polite\">\n            <h3 class=\"fe-opc__section-title\">{{ t('opc.active') }}</h3>\n            <ul class=\"fe-opc__list\">\n              <li\n                v-for=\"o in active\"\n                :key=\"o.key\"\n                class=\"fe-opc__item\"\n                :class=\"`is-${o.status}`\"\n              >\n                <svg\n                  class=\"fe-opc__kicon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path :d=\"KIND_ICONS[o.kind]\" />\n                </svg>\n                <div class=\"fe-opc__mid\">\n                  <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n                  <div class=\"fe-opc__sub\">\n                    <span class=\"fe-opc__kind\">{{ kindLabel(o) }}</span>\n                    <span class=\"fe-opc__dot\" aria-hidden=\"true\">·</span>\n                    <span class=\"fe-opc__state\">{{ statusText(o) }}</span>\n                  </div>\n                  <div\n                    v-if=\"o.status === 'running' && o.percent !== null\"\n                    class=\"fe-opc__bar\"\n                    role=\"progressbar\"\n                    :aria-valuenow=\"o.percent\"\n                    aria-valuemin=\"0\"\n                    aria-valuemax=\"100\"\n                  >\n                    <div class=\"fe-opc__bar-fill\" :style=\"{ width: o.percent + '%' }\" />\n                  </div>\n                </div>\n                <span\n                  v-if=\"o.status === 'running' && o.percent === null && !o.queued\"\n                  class=\"fe-opc__spin\"\n                  aria-hidden=\"true\"\n                />\n                <div class=\"fe-opc__acts\">\n                  <button\n                    v-if=\"o.status === 'running' && o.cancellable\"\n                    type=\"button\"\n                    class=\"fe-opc__act\"\n                    @click=\"center.cancel(o.key)\"\n                  >{{ t('opc.cancel') }}</button>\n                  <button\n                    v-if=\"o.status === 'error' && o.retryable\"\n                    type=\"button\"\n                    class=\"fe-opc__act fe-opc__act--retry\"\n                    @click=\"center.retry(o.key)\"\n                  >{{ t('opc.retry') }}</button>\n                  <button\n                    v-if=\"o.status !== 'running'\"\n                    type=\"button\"\n                    class=\"fe-opc__x\"\n                    :aria-label=\"t('opc.dismiss')\"\n                    @click=\"center.dismiss(o.key)\"\n                  >×</button>\n                </div>\n              </li>\n            </ul>\n          </div>\n\n          <div v-if=\"history.length > 0\" class=\"fe-opc__section\">\n            <h3 class=\"fe-opc__section-title\">\n              {{ t('opc.history') }}\n              <button type=\"button\" class=\"fe-opc__act\" @click=\"center.clearHistory()\">\n                {{ t('opc.clear') }}\n              </button>\n            </h3>\n            <ul class=\"fe-opc__list fe-opc__list--history\">\n              <li\n                v-for=\"o in history\"\n                :key=\"'h-' + o.key\"\n                class=\"fe-opc__item fe-opc__item--history\"\n                :class=\"`is-${o.status}`\"\n              >\n                <svg\n                  class=\"fe-opc__kicon\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.8\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  aria-hidden=\"true\"\n                  focusable=\"false\"\n                >\n                  <path :d=\"KIND_ICONS[o.kind]\" />\n                </svg>\n                <div class=\"fe-opc__mid\">\n                  <div class=\"fe-opc__name\" :title=\"rowTitle(o)\">{{ rowTitle(o) }}</div>\n                  <div v-if=\"o.status === 'error' && o.error\" class=\"fe-opc__sub fe-opc__sub--err\">\n                    {{ o.error }}\n                  </div>\n                </div>\n                <span class=\"fe-opc__chip\" :class=\"`is-${o.status}`\">{{ chipText(o) }}</span>\n              </li>\n            </ul>\n          </div>\n\n          <p v-if=\"active.length === 0 && history.length === 0\" class=\"fe-opc__empty\">\n            {{ t('opc.empty') }}\n          </p>\n        </div>\n      </section>\n    </transition>\n\n    <button\n      type=\"button\"\n      class=\"fe-opc__badge\"\n      :class=\"{ 'is-error': hasError }\"\n      :aria-expanded=\"open\"\n      :aria-label=\"badgeAria\"\n      @click=\"open = !open\"\n    >\n      <svg\n        class=\"fe-opc__ring\"\n        :class=\"{ 'fe-opc__ring--spin': ringSpin }\"\n        viewBox=\"0 0 22 22\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle class=\"fe-opc__ring-track\" cx=\"11\" cy=\"11\" :r=\"RING_R\" fill=\"none\" stroke-width=\"2.5\" />\n        <circle\n          class=\"fe-opc__ring-fill\"\n          cx=\"11\"\n          cy=\"11\"\n          :r=\"RING_R\"\n          fill=\"none\"\n          stroke-width=\"2.5\"\n          stroke-linecap=\"round\"\n          :stroke-dasharray=\"RING_C\"\n          :stroke-dashoffset=\"ringOffset\"\n          transform=\"rotate(-90 11 11)\"\n        />\n      </svg>\n      <span class=\"fe-opc__count\">{{ active.length }}</span>\n      <span v-if=\"pctText\" class=\"fe-opc__pct\">{{ pctText }}</span>\n    </button>\n  </div>\n</template>\n","/**\n * useOperations — unified long-running-operation store (wiring:c3).\n *\n * One presentation-level aggregation point for everything that used to be\n * scattered across corner UIs:\n *   - uploads        (useUploadChunked jobs / legacy multipart rows)\n *   - ops-queue jobs (usePendingOps copy/move/delete worker ops)\n *   - future kinds   (convert / archive — same `sync()` contract, own group)\n *\n * The store does NOT talk to the network. Publishers (renderless\n * UploadProgress / PendingOpsTray adapters) reconcile their reactive source\n * lists into the store via `sync(group, items)`; OperationsCenter renders the\n * merged picture (badge + panel). Action callbacks (cancel/retry/dismiss)\n * are registered per row so the panel can route user intent back to the\n * owning surface without the store knowing any transport details.\n *\n * Lifecycle rules (per the Operations Center contract):\n *   - running rows live in `active`;\n *   - done/aborted rows linger in `active` for DONE_LINGER_MS (\"done\"\n *     flash) then move to `history` (session-only, capped);\n *   - error rows are STICKY: they stay in `active` until the user\n *     dismisses or retries them — even after the source list swept them\n *     (usePendingOps drops terminal ops after its RETAIN window).\n */\n\nimport { computed, getCurrentScope, onScopeDispose, ref } from 'vue';\n\nexport type OperationKind = 'upload' | 'copy' | 'move' | 'delete' | 'convert' | 'archive';\nexport type OperationStatus = 'running' | 'done' | 'error' | 'aborted';\n\n/** What a publisher hands to `sync()` for one row. */\nexport interface OperationInput {\n  /** Stable id within the group (upload uuid / ops row id). */\n  id: string | number;\n  kind: OperationKind;\n  /** Primary label — file name or target path. '' → renderer falls back to the kind verb. */\n  name: string;\n  /** 0..100, or null for indeterminate (renderer shows a spinner). */\n  percent: number | null;\n  status: OperationStatus;\n  error?: string | null;\n  /** Queue op accepted but not started yet (\"Queued\"). */\n  queued?: boolean;\n  /** Progress counters for queue ops (3/5 items). */\n  doneCount?: number;\n  totalCount?: number;\n  /** Byte progress for uploads. */\n  uploadedBytes?: number;\n  totalBytes?: number;\n  cancellable?: boolean;\n  retryable?: boolean;\n}\n\nexport interface OperationActions {\n  cancel?: () => void;\n  /** Clean the row out of the OWNING source list (called on retire/dismiss). */\n  dismiss?: () => void;\n  retry?: () => void;\n}\n\nexport interface Operation {\n  /** `${group}:${id}` — unique across publishers. */\n  key: string;\n  kind: OperationKind;\n  name: string;\n  percent: number | null;\n  status: OperationStatus;\n  error: string | null;\n  queued: boolean;\n  doneCount: number | null;\n  totalCount: number | null;\n  uploadedBytes: number | null;\n  totalBytes: number | null;\n  cancellable: boolean;\n  retryable: boolean;\n  startedAt: number;\n  settledAt: number | null;\n}\n\nconst DONE_LINGER_MS = 4000;\nconst HISTORY_CAP = 50;\n\nfunction toOperation(key: string, input: OperationInput, prev?: Operation): Operation {\n  const terminal = input.status !== 'running';\n  return {\n    key,\n    kind: input.kind,\n    name: input.name,\n    percent: input.percent,\n    status: input.status,\n    error: input.error ?? null,\n    queued: input.queued ?? false,\n    doneCount: input.doneCount ?? null,\n    totalCount: input.totalCount ?? null,\n    uploadedBytes: input.uploadedBytes ?? null,\n    totalBytes: input.totalBytes ?? null,\n    cancellable: input.cancellable ?? false,\n    retryable: input.retryable ?? false,\n    startedAt: prev?.startedAt ?? Date.now(),\n    settledAt: prev?.settledAt ?? (terminal ? Date.now() : null),\n  };\n}\n\nexport function useOperations() {\n  const active = ref<Operation[]>([]);\n  const history = ref<Operation[]>([]);\n\n  const actions = new Map<string, OperationActions>();\n  /** Keys already moved to history — sync must not resurrect them. */\n  const retired = new Set<string>();\n  const lingerTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n  function clearTimer(key: string) {\n    const tm = lingerTimers.get(key);\n    if (tm !== undefined) {\n      clearTimeout(tm);\n      lingerTimers.delete(key);\n    }\n  }\n\n  /** Move a row from active to the session history (newest first). */\n  function retire(key: string, opts: { toHistory?: boolean } = {}) {\n    clearTimer(key);\n    const idx = active.value.findIndex((o) => o.key === key);\n    if (idx === -1) return;\n    const [op] = active.value.splice(idx, 1);\n    active.value = [...active.value];\n    retired.add(key);\n    if (opts.toHistory !== false) {\n      history.value = [{ ...op, settledAt: op.settledAt ?? Date.now() }, ...history.value].slice(\n        0,\n        HISTORY_CAP,\n      );\n    }\n  }\n\n  function scheduleLinger(key: string) {\n    if (lingerTimers.has(key)) return;\n    lingerTimers.set(\n      key,\n      setTimeout(() => {\n        lingerTimers.delete(key);\n        // Retire + ask the owning source to drop its row so it doesn't\n        // resurrect on the next sync (uploads keep done rows forever).\n        const acts = actions.get(key);\n        retire(key);\n        acts?.dismiss?.();\n      }, DONE_LINGER_MS),\n    );\n  }\n\n  /**\n   * Full-list reconcile for one publisher group. Upserts every present row,\n   * removes vanished ones (sticky errors excepted), and manages the\n   * done-linger → history hand-off.\n   */\n  function sync(\n    group: string,\n    items: Array<{ input: OperationInput; actions?: OperationActions }>,\n  ): void {\n    const prefix = `${group}:`;\n    const present = new Set<string>();\n    let next = [...active.value];\n    let changed = false;\n\n    for (const item of items) {\n      const key = `${group}:${item.input.id}`;\n      present.add(key);\n      if (item.actions) actions.set(key, item.actions);\n      if (retired.has(key)) continue; // already history — don't resurrect\n      const idx = next.findIndex((o) => o.key === key);\n      const op = toOperation(key, item.input, idx === -1 ? undefined : next[idx]);\n      if (idx === -1) {\n        next = [op, ...next];\n        changed = true;\n      } else if (JSON.stringify(next[idx]) !== JSON.stringify(op)) {\n        next[idx] = op;\n        changed = true;\n      }\n      if (op.status === 'done' || op.status === 'aborted') scheduleLinger(key);\n    }\n\n    // Vanished from source: running → drop silently (superseded elsewhere),\n    // done/aborted → straight to history, error → sticky (keep visible).\n    for (const o of [...next]) {\n      if (!o.key.startsWith(prefix) || present.has(o.key)) continue;\n      if (o.status === 'error') continue;\n      clearTimer(o.key);\n      next = next.filter((x) => x.key !== o.key);\n      changed = true;\n      if (o.status !== 'running') {\n        retired.add(o.key);\n        history.value = [{ ...o, settledAt: o.settledAt ?? Date.now() }, ...history.value].slice(\n          0,\n          HISTORY_CAP,\n        );\n      }\n    }\n\n    // Bookkeeping: retired keys whose source rows are gone can be forgotten\n    // (their ids won't reappear — uuids / monotonic op ids).\n    for (const key of [...retired]) {\n      if (key.startsWith(prefix) && !present.has(key)) retired.delete(key);\n    }\n    for (const key of [...actions.keys()]) {\n      if (key.startsWith(prefix) && !present.has(key) && !active.value.some((o) => o.key === key)) {\n        // keep actions for rows still on screen (sticky errors)\n        if (!next.some((o) => o.key === key)) actions.delete(key);\n      }\n    }\n\n    if (changed) active.value = next;\n  }\n\n  function cancel(key: string) {\n    actions.get(key)?.cancel?.();\n  }\n\n  function retry(key: string) {\n    const acts = actions.get(key);\n    retire(key); // failed attempt goes to history; retry publishes a fresh row\n    acts?.dismiss?.();\n    acts?.retry?.();\n  }\n\n  function dismiss(key: string) {\n    const acts = actions.get(key);\n    retire(key);\n    acts?.dismiss?.();\n  }\n\n  function clearHistory() {\n    history.value = [];\n  }\n\n  const runningCount = computed(\n    () => active.value.filter((o) => o.status === 'running').length,\n  );\n  const errorCount = computed(() => active.value.filter((o) => o.status === 'error').length);\n  const hasError = computed(() => errorCount.value > 0);\n\n  /**\n   * Aggregate progress across determinate running rows (uploads weighted by\n   * bytes, queue ops by item counts). null → nothing determinate is running\n   * (badge ring spins instead of filling).\n   */\n  const overallPercent = computed<number | null>(() => {\n    const running = active.value.filter((o) => o.status === 'running');\n    let sum = 0;\n    let n = 0;\n    for (const o of running) {\n      let frac: number | null = null;\n      if (o.totalBytes && o.totalBytes > 0) {\n        frac = Math.min(1, (o.uploadedBytes ?? 0) / o.totalBytes);\n      } else if (o.totalCount && o.totalCount > 0) {\n        frac = Math.min(1, (o.doneCount ?? 0) / o.totalCount);\n      } else if (o.percent !== null) {\n        frac = Math.min(1, o.percent / 100);\n      }\n      if (frac !== null) {\n        sum += frac;\n        n += 1;\n      }\n    }\n    if (n === 0) return null;\n    return Math.round((sum / n) * 100);\n  });\n\n  if (getCurrentScope()) {\n    onScopeDispose(() => {\n      for (const tm of lingerTimers.values()) clearTimeout(tm);\n      lingerTimers.clear();\n    });\n  }\n\n  return {\n    active,\n    history,\n    runningCount,\n    errorCount,\n    hasError,\n    overallPercent,\n    sync,\n    cancel,\n    retry,\n    dismiss,\n    clearHistory,\n  };\n}\n\nexport type OperationsStore = ReturnType<typeof useOperations>;\n","<script setup lang=\"ts\">\n/**\n * OnboardingTour — wiring:c4 first-use coach-mark tour.\n *\n * A dependency-free spotlight walkthrough: each step targets a live DOM\n * element inside the explorer root (resolved lazily — steps whose target\n * is missing are skipped, so confined embeds with hidden surfaces never\n * show a dangling spotlight). Positioning is hand-rolled with\n * getBoundingClientRect + fixed overlay; the spotlight is a rounded\n * cutout drawn with a huge box-shadow.\n *\n * Teleported under <body> (same reason as ContextMenu: transformed embed\n * ancestors break position:fixed) and re-uses the `.fe-ctx-backdrop--theme-*`\n * classes so the CSS-variable theme cascade applies outside the `.fe` tree.\n *\n * Persistence (`filex.tourDone`) is the PARENT's job — the tour only\n * emits `close`; FileExplorer decides when it counts as done.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { shortcutHint } from '../composables/useKeyboardShortcuts';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** Explorer root — targets are resolved inside it only. */\n  root: HTMLElement | null;\n  theme?: ThemeMode;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* The tour teaches two keys by name, and both are remappable. Read them\n * from the registry so the sentence stays true for whoever is taking the\n * tour — a walkthrough that names the wrong key is worse than one that\n * names none. */\nconst hintCombos = computed(() => ({\n  palette: shortcutHint('palette'),\n  help: shortcutHint('help'),\n}));\n\n// ------------------------------------------------------------------\n// Step definitions. `target` returns the element to spotlight (null =\n// centered card, e.g. the closing shortcuts step).\n//\n// gorunum:v3-shell — every target below is a `data-testid` or a class the\n// shell owns, resolved from the live DOM. It used to find two of its\n// buttons by matching their localized `title` attribute, which quietly\n// stopped working the moment those verbs moved into a menu: `byTitle(r,\n// t('toolbar.upload'))` matched nothing at 1440px, so the upload step was\n// dropped from the walk and nobody could see that it had been. A step that\n// disappears is indistinguishable from a step that was never written.\n//\n// ⚠ Two steps point at a control the narrow shell draws DIFFERENTLY — the\n// panel (a column at 1440px, a closed drawer behind `toolbar-nav` at\n// 390px) and the create button (\"+ New\" and its menu, versus the upload\n// FAB). They say a different sentence there, and the sentence is chosen\n// from THE ELEMENT THAT ACTUALLY RESOLVED, never from a width: one branch,\n// no media query to keep in sync with the stylesheet.\n// ------------------------------------------------------------------\n\ninterface TourStep {\n  id: string;\n  titleKey: string;\n  /** A key, or a key chosen from whichever element resolved (see above). */\n  descKey: string | ((el: HTMLElement | null) => string);\n  target: (root: HTMLElement) => HTMLElement | null;\n}\n\nconst STEPS: TourStep[] = [\n  {\n    // The navigation panel: the standard views, then STORAGES, then\n    // CONNECTIONS. At 390px it is a drawer that starts closed, so there is\n    // nothing to spotlight and the button that opens it is the target.\n    id: 'nav',\n    titleKey: 'tour.step.nav.title',\n    descKey: (el) =>\n      el?.dataset.testid === 'sidenav' ? 'tour.step.nav.desc' : 'tour.step.nav.desc_closed',\n    target: (r) =>\n      r.querySelector<HTMLElement>('[data-testid=\"sidenav\"]') ||\n      r.querySelector<HTMLElement>('[data-testid=\"toolbar-nav\"]'),\n  },\n  {\n    // \"+ New\" — the menu that replaced the Upload / New folder pair. The\n    // narrow shell has no panel on screen and draws the upload FAB instead,\n    // which does ONE of the three things the menu offers, so it gets a\n    // sentence that promises only that one.\n    id: 'new',\n    titleKey: 'tour.step.new.title',\n    descKey: (el) =>\n      el?.dataset.testid === 'sidenav-new' ? 'tour.step.new.desc' : 'tour.step.new.desc_fab',\n    target: (r) =>\n      r.querySelector<HTMLElement>('[data-testid=\"sidenav-new\"]') ||\n      r.querySelector<HTMLElement>('.fe-fab'),\n  },\n  {\n    // ⚠ The FIELD, not `.fe-search__input`. The wide header's input carries\n    // both class names and the narrow one carries only `fe-drivesearch__input`\n    // — so the old selector resolved at 1440px and matched nothing at 390px,\n    // where the field is the widest thing on the row. The testid is on the\n    // wrapper in both layouts, and spotlighting the wrapper also takes in the\n    // advanced-search and palette buttons the copy now names.\n    id: 'search',\n    titleKey: 'tour.step.search.title',\n    descKey: 'tour.step.search.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"drive-search\"]'),\n  },\n  {\n    // The breadcrumb — this was the old first step's target while its title\n    // said \"Storages & folders\", which is the panel. Now it has its own step\n    // and its own title. Absent on Home, which has no address; the step drops\n    // itself there rather than pointing at the heading that takes its place.\n    id: 'crumb',\n    titleKey: 'tour.step.crumb.title',\n    descKey: 'tour.step.crumb.desc',\n    target: (r) => r.querySelector<HTMLElement>('.fe-breadcrumb'),\n  },\n  {\n    // The filter row. Unconditional in the shell now, but only drawn where\n    // there is a listing to filter — not at the multi-storage virtual root,\n    // which is where a first run usually starts, so this step is often the\n    // one that drops itself.\n    id: 'filters',\n    titleKey: 'tour.step.filters.title',\n    descKey: 'tour.step.filters.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"filterbar\"]'),\n  },\n  {\n    id: 'view',\n    titleKey: 'tour.step.view.title',\n    descKey: 'tour.step.view.desc',\n    // Still `.fe-toolbar__view`: ViewSwitcher kept its class when it moved\n    // from the header to the breadcrumb row.\n    target: (r) => r.querySelector<HTMLElement>('.fe-toolbar__view'),\n  },\n  {\n    // Sharing used to spotlight `.fe__body` — the whole listing, which is to\n    // say nothing in particular — while talking about a context menu. The\n    // details panel is where a share link is actually minted, so the step\n    // points at the control that opens it and names the context menu too.\n    id: 'details',\n    titleKey: 'tour.step.details.title',\n    descKey: 'tour.step.details.desc',\n    target: (r) => r.querySelector<HTMLElement>('[data-testid=\"subhead-inspector\"]'),\n  },\n  {\n    id: 'help',\n    titleKey: 'tour.step.help.title',\n    descKey: 'tour.step.help.desc',\n    target: () => null,\n  },\n];\n\n// Steps re-resolved on every open so surfaces that appeared/disappeared\n// since mount (narrow-mode collapse, RBAC hiding upload…) are honored.\nconst activeSteps = ref<TourStep[]>([]);\nconst stepIdx = ref(0);\n\nconst step = computed<TourStep | null>(() => activeSteps.value[stepIdx.value] ?? null);\nconst total = computed(() => activeSteps.value.length);\n\nfunction resolveSteps() {\n  const r = props.root;\n  activeSteps.value = STEPS.filter((s) => {\n    if (s.id === 'help') return true; // centered card — no DOM dependency\n    if (!r) return false;\n    const el = s.target(r);\n    // Element must exist AND be laid out (visible) — a display:none\n    // toolbar section in narrow mode yields a 0×0 rect.\n    if (!el) return false;\n    const rect = el.getBoundingClientRect();\n    return rect.width > 0 && rect.height > 0;\n  });\n}\n\n// ------------------------------------------------------------------\n// Spotlight + card geometry\n// ------------------------------------------------------------------\n\ninterface Rect {\n  top: number;\n  left: number;\n  width: number;\n  height: number;\n}\nconst spot = ref<Rect | null>(null);\nconst cardStyle = ref<Record<string, string>>({});\nconst cardEl = ref<HTMLElement | null>(null);\n/**\n * The element the CURRENT step resolved to, kept so a step whose control\n * differs by width can pick its sentence from what is really there.\n *\n * Written at the top of `place()`, which runs before the card re-renders\n * (the `stepIdx` watcher flushes 'pre') and again on every resize — so the\n * copy follows the spotlight instead of lagging a step behind it. Assigning\n * the same element twice is not a change, so a scroll storm costs nothing.\n */\nconst targetEl = ref<HTMLElement | null>(null);\n\n/** The step's sentence, with the shortcut names filled in. */\nconst stepDesc = computed(() => {\n  const s = step.value;\n  if (!s) return '';\n  const key = typeof s.descKey === 'function' ? s.descKey(targetEl.value) : s.descKey;\n  return t(key, hintCombos.value);\n});\n\nconst PAD = 6; // spotlight breathing room around the target\nconst GAP = 12; // gap between spotlight and the card\n\nasync function place() {\n  const s = step.value;\n  const r = props.root;\n  if (!s) return;\n  const el = r ? s.target(r) : null;\n  targetEl.value = el;\n  if (!el) {\n    spot.value = null; // centered card\n    cardStyle.value = {};\n    return;\n  }\n  const rect = el.getBoundingClientRect();\n  if (rect.width <= 0 && rect.height <= 0) {\n    spot.value = null;\n    cardStyle.value = {};\n    return;\n  }\n  spot.value = {\n    top: rect.top - PAD,\n    left: rect.left - PAD,\n    width: rect.width + PAD * 2,\n    height: rect.height + PAD * 2,\n  };\n  // Card: below the spotlight, then above, then beside it.\n  //\n  // gorunum:v3-shell — the SIDE branches are why this is four cases and not\n  // two. The navigation panel is a full-height column, so neither \"below\" nor\n  // \"above\" fits and the old code clamped the card to the top of the viewport\n  // — which put it flat on top of the panel, hiding the very rows (\"Home, My\n  // files, Shared with me…\") the step was reading out. A coach mark that\n  // covers its own subject is worse than no coach mark: it looks like the\n  // product drew a dialog in the wrong place.\n  await nextTick();\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  const cw = Math.min(340, vw - 24);\n  const ch = cardEl.value?.offsetHeight ?? 160;\n  const sTop = rect.top - PAD;\n  const sBottom = rect.bottom + PAD;\n  const sLeft = rect.left - PAD;\n  const sRight = rect.right + PAD;\n  // Centred on the target along the other axis, then clamped into view.\n  const clampX = (x: number) => Math.min(Math.max(12, x), Math.max(12, vw - cw - 12));\n  const clampY = (y: number) => Math.min(Math.max(12, y), Math.max(12, vh - ch - 12));\n  const midX = clampX(rect.left + rect.width / 2 - cw / 2);\n  const midY = clampY(rect.top + rect.height / 2 - ch / 2);\n\n  let top: number;\n  let left: number;\n  if (sBottom + GAP + ch <= vh - 12) {\n    top = sBottom + GAP;\n    left = midX;\n  } else if (sTop - GAP - ch >= 12) {\n    top = sTop - GAP - ch;\n    left = midX;\n  } else if (sRight + GAP + cw <= vw - 12) {\n    left = sRight + GAP;\n    top = midY;\n  } else if (sLeft - GAP - cw >= 12) {\n    left = sLeft - GAP - cw;\n    top = midY;\n  } else {\n    // Nothing fits — a target that fills the viewport. Clamp, and accept the\n    // overlap rather than drawing the card off screen.\n    top = clampY(sBottom + GAP);\n    left = midX;\n  }\n  cardStyle.value = {\n    top: `${Math.round(top)}px`,\n    left: `${Math.round(left)}px`,\n    width: `${cw}px`,\n  };\n}\n\nlet placeRaf = 0;\n/**\n * Re-place after a resize or a scroll — but on the NEXT frame, never inline.\n *\n * ⚠ The explorer decides it is narrow from a ResizeObserver on its own root\n * (FileExplorer.vue, `isNarrow`), and ResizeObserver callbacks run AFTER the\n * frame's rAF callbacks — so neither this `window` listener nor a single rAF\n * has seen the new layout yet. Measured: shrinking 1440 → 390 with the tour\n * open left the spotlight on the navigation panel (the element was still in\n * the DOM when this handler asked for it) both inline and after one frame;\n * only a SECOND resize moved it onto the top bar's button. Two frames plus a\n * tick puts this after the observer has fired and Vue has patched, so the\n * first resize gets the right answer — and the step's sentence, which is\n * chosen from that same element, changes with it.\n */\nfunction onViewportChange() {\n  if (!props.open) return;\n  if (placeRaf) cancelAnimationFrame(placeRaf);\n  placeRaf = requestAnimationFrame(() => {\n    placeRaf = requestAnimationFrame(() => {\n      placeRaf = 0;\n      void nextTick().then(place);\n    });\n  });\n}\n\n// ------------------------------------------------------------------\n// Flow\n// ------------------------------------------------------------------\n\nfunction next() {\n  if (stepIdx.value >= total.value - 1) {\n    emit('close');\n    return;\n  }\n  stepIdx.value += 1;\n}\n\nfunction back() {\n  if (stepIdx.value > 0) stepIdx.value -= 1;\n}\n\nfunction skip() {\n  emit('close');\n}\n\nfunction onKey(e: KeyboardEvent) {\n  if (!props.open) return;\n  if (e.key === 'Escape') {\n    e.stopPropagation();\n    skip();\n  } else if (e.key === 'ArrowRight' || e.key === 'Enter') {\n    e.preventDefault();\n    next();\n  } else if (e.key === 'ArrowLeft') {\n    e.preventDefault();\n    back();\n  }\n}\n\nwatch(\n  () => props.open,\n  async (v) => {\n    if (v) {\n      stepIdx.value = 0;\n      resolveSteps();\n      await nextTick();\n      await place();\n      cardEl.value?.focus();\n    }\n  },\n);\n\nwatch(stepIdx, async () => {\n  await place();\n  cardEl.value?.focus();\n});\n\nonMounted(() => {\n  window.addEventListener('resize', onViewportChange);\n  window.addEventListener('scroll', onViewportChange, true);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener('resize', onViewportChange);\n  window.removeEventListener('scroll', onViewportChange, true);\n  if (placeRaf) cancelAnimationFrame(placeRaf);\n});\n\n// Theme cascade outside `.fe` — same pattern as ContextMenu.\nconst prefersDark = ref(false);\nlet mq: MediaQueryList | undefined;\nfunction syncPrefersDark(e?: MediaQueryListEvent | MediaQueryList) {\n  prefersDark.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof window === 'undefined') return;\n  mq = window.matchMedia('(prefers-color-scheme: dark)');\n  syncPrefersDark(mq);\n  mq.addEventListener?.('change', syncPrefersDark);\n});\nonBeforeUnmount(() => {\n  mq?.removeEventListener?.('change', syncPrefersDark);\n});\nconst themeClass = computed(() => `fe-ctx-backdrop--theme-${props.theme || 'auto'}`);\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <transition name=\"fe-tour\">\n      <div\n        v-if=\"open && step\"\n        class=\"fe-tour\"\n        :class=\"themeClass\"\n        :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-label=\"t('tour.aria')\"\n        @keydown=\"onKey\"\n      >\n        <!-- Spotlight: rounded cutout via huge box-shadow. Centered steps\n             (no target) use a full-dim overlay instead. -->\n        <div\n          v-if=\"spot\"\n          class=\"fe-tour__spot\"\n          :style=\"{\n            top: spot.top + 'px',\n            left: spot.left + 'px',\n            width: spot.width + 'px',\n            height: spot.height + 'px',\n          }\"\n          aria-hidden=\"true\"\n        />\n        <div v-else class=\"fe-tour__dim\" aria-hidden=\"true\" />\n\n        <div\n          ref=\"cardEl\"\n          class=\"fe-tour__card\"\n          :class=\"{ 'fe-tour__card--center': !spot }\"\n          :style=\"spot ? cardStyle : {}\"\n          tabindex=\"-1\"\n        >\n          <p class=\"fe-tour__progress\" aria-hidden=\"true\">\n            {{ t('tour.progress', { n: stepIdx + 1, m: total }) }}\n          </p>\n          <h3 class=\"fe-tour__title\">{{ t(step.titleKey) }}</h3>\n          <p class=\"fe-tour__desc\">{{ stepDesc }}</p>\n          <div class=\"fe-tour__dots\" aria-hidden=\"true\">\n            <span\n              v-for=\"(s, i) in activeSteps\"\n              :key=\"s.id\"\n              class=\"fe-tour__dot\"\n              :class=\"{ 'is-active': i === stepIdx }\"\n            />\n          </div>\n          <div class=\"fe-tour__actions\">\n            <button type=\"button\" class=\"fe-btn fe-tour__skip\" @click=\"skip\">\n              {{ t('tour.skip') }}\n            </button>\n            <span class=\"fe-tour__actions-spacer\" />\n            <button\n              v-if=\"stepIdx > 0\"\n              type=\"button\"\n              class=\"fe-btn\"\n              @click=\"back\"\n            >\n              {{ t('tour.back') }}\n            </button>\n            <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"next\">\n              {{ stepIdx >= total - 1 ? t('tour.done') : t('tour.next') }}\n            </button>\n          </div>\n        </div>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * TabBar — wiring:d1 the tab strip.\n *\n * Thin strip that sits ABOVE the toolbar. The host renders it only when\n * 2+ tabs exist (embed pixel-parity: a single tab shows nothing at all).\n * Purely presentational: every mutation is an emit; useTabs owns state.\n *\n * Interactions:\n *   click tab      → select\n *   ×/middle-click → close\n *   +              → new tab (clone of the current location)\n *   drag           → reorder (HTML5 DnD; live-swap while dragging)\n *   ⫿ (split)      → toggle the active tab's secondary pane\n *\n * UNSCOPED styles (`fe-tabs*` in base.css) — the webcomponent build\n * cannot carry scoped data-v hashes (v0.5.0 discovery).\n */\nimport { ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\n\nexport interface TabItem {\n  id: string;\n  label: string;\n  /** true → the tab carries a split pane (small accent dot). */\n  split: boolean;\n}\n\nconst props = defineProps<{\n  tabs: TabItem[];\n  activeId: string;\n  locale: LocaleCode;\n  /** false → the split toggle is hidden (narrow embeds). */\n  splitEnabled?: boolean;\n  /** true → the split toggle renders pressed (active tab has a pane). */\n  splitActive?: boolean;\n  /**\n   * gorunum:v5-panerow — the details (inspector) toggle lives in this row too.\n   *\n   * ⚠ Opt-in, and absent means NOT DRAWN rather than \"closed\": until the host\n   * moves its own copy out of the breadcrumb row there would otherwise be two\n   * of the same button on screen, which is the duplicate this wave removes.\n   */\n  inspectorEnabled?: boolean;\n  /** true → the details toggle renders pressed (the panel is open). */\n  inspectorOpen?: boolean;\n  /**\n   * gorunum:v5-panerow — hide the tabs themselves (and \"+\"), keeping the row.\n   *\n   * ⚠ True is not \"no tabs exist\", it is \"this deployment does not offer\n   * them\": the `simple` profile drops tabs deliberately (#14 named them as\n   * power-user chrome) but still needs this row, because the details toggle\n   * lives in it. Without the flag the row could only be all-or-nothing, and\n   * the ⓘ would have to keep a second home in the breadcrumb row for that one\n   * profile — a control with two homes is how the two drift.\n   *\n   * ⚠⚠ Phrased as HIDE, not SHOW, and that is not taste. A prop declared\n   * `showTabs?: boolean` compiles to a runtime Boolean prop, and Vue casts an\n   * ABSENT Boolean prop to `false` — not to `undefined`. So `showTabs !== false`\n   * read false for every host that passed nothing, and the strip rendered with\n   * no tabs and no \"+\" at all. Measured in a real browser: `.fe-tabs__tab`\n   * count went from 1 to 0 the moment the prop was added, in both themes at\n   * both widths. Negative default = safe default.\n   */\n  hideTabs?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'select', id: string): void;\n  (e: 'close', id: string): void;\n  (e: 'new'): void;\n  (e: 'reorder', from: number, to: number): void;\n  (e: 'toggle-split'): void;\n  (e: 'toggle-inspector'): void /* gorunum:v5-panerow */;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n// ---- drag-sort (HTML5 DnD, live swap) ------------------------------\nconst dragIndex = ref<number | null>(null);\nconst overIndex = ref<number | null>(null);\n\nfunction onDragStart(i: number, ev: DragEvent) {\n  dragIndex.value = i;\n  if (ev.dataTransfer) {\n    ev.dataTransfer.effectAllowed = 'move';\n    // Firefox requires SOME payload for a drag to start. Deliberately not\n    // the internal file-DnD MIME, so the explorer's drop surfaces ignore it.\n    ev.dataTransfer.setData('text/plain', props.tabs[i]?.id ?? '');\n  }\n}\n\nfunction onDragOver(i: number, ev: DragEvent) {\n  if (dragIndex.value === null) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  overIndex.value = i;\n}\n\nfunction onDragLeave(i: number) {\n  if (overIndex.value === i) overIndex.value = null;\n}\n\nfunction onDrop(i: number, ev: DragEvent) {\n  if (dragIndex.value === null) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (dragIndex.value !== i) emit('reorder', dragIndex.value, i);\n  dragIndex.value = null;\n  overIndex.value = null;\n}\n\nfunction onDragEnd() {\n  dragIndex.value = null;\n  overIndex.value = null;\n}\n\n// Middle-click closes a tab (browser convention). The mousedown guard\n// cancels Chromium's autoscroll on the scrollable strip — without it the\n// auxclick event is never generated.\nfunction onTabMiddleDown(ev: MouseEvent) {\n  if (ev.button === 1) ev.preventDefault();\n}\nfunction onAux(id: string, ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  // ⚠ The same guard the × has. `useTabs.closeTab()` refuses the last tab, so\n  // middle-clicking it was already a no-op; leaving it live while the × is\n  // hidden would be two doors to one verb disagreeing about whether it exists.\n  if (props.tabs.length <= 1) return;\n  emit('close', id);\n}\n</script>\n\n<template>\n  <div class=\"fe-tabs\" role=\"tablist\" :aria-label=\"t('tabs.strip')\">\n    <div v-if=\"!hideTabs\" class=\"fe-tabs__scroll\">\n      <div\n        v-for=\"(tab, i) in tabs\"\n        :key=\"tab.id\"\n        class=\"fe-tabs__tab\"\n        :class=\"{\n          'is-active': tab.id === activeId,\n          'is-dragover': overIndex === i && dragIndex !== null && dragIndex !== i,\n        }\"\n        role=\"tab\"\n        :aria-selected=\"tab.id === activeId ? 'true' : 'false'\"\n        tabindex=\"0\"\n        draggable=\"true\"\n        :title=\"tab.label\"\n        @click=\"emit('select', tab.id)\"\n        @keydown.enter.prevent=\"emit('select', tab.id)\"\n        @mousedown=\"onTabMiddleDown($event)\"\n        @auxclick=\"onAux(tab.id, $event)\"\n        @dragstart=\"onDragStart(i, $event)\"\n        @dragover=\"onDragOver(i, $event)\"\n        @dragleave=\"onDragLeave(i)\"\n        @drop=\"onDrop(i, $event)\"\n        @dragend=\"onDragEnd\"\n      >\n        <span v-if=\"tab.split\" class=\"fe-tabs__splitdot\" aria-hidden=\"true\"></span>\n        <span class=\"fe-tabs__label\">{{ tab.label }}</span>\n        <!-- ⚠ Not drawn when this is the only tab. Owner's decision,\n             2026-09-13, verbatim: *\"tek kalan tab'de x gözükmemeli, onu da\n             kaldırırsın.\"* It is not a style choice — `useTabs.closeTab()`\n             opens with `if (tabs.length <= 1) return null`, so at one tab the\n             × has always been a control that cannot do anything. Drawing it\n             was inviting a dead click. -->\n        <button\n          v-if=\"tabs.length > 1\"\n          type=\"button\"\n          class=\"fe-tabs__close\"\n          :aria-label=\"t('tabs.close')\"\n          :title=\"t('tabs.close')\"\n          @click.stop=\"emit('close', tab.id)\"\n        >×</button>\n      </div>\n    </div>\n    <!-- ⚠ OUTSIDE the scrolling area. Inside it, \"new tab\" scrolled away with\n         the tabs it creates: past a dozen tabs the + was off the right edge and\n         the only way back to it was scrolling a strip most people do not know\n         scrolls. Pinned here it is always where it was. -->\n    <button\n      v-if=\"!hideTabs\"\n      type=\"button\"\n      class=\"fe-tabs__new\"\n      :aria-label=\"t('tabs.new')\"\n      :title=\"t('tabs.new')\"\n      @click=\"emit('new')\"\n    >+</button>\n    <!-- gorunum:v5-panerow — back in THIS row, where it was.\n         ⚠ It spent one round teleported up into the breadcrumb row beside the\n         details toggle. The reasoning was sound (that row is always drawn,\n         this strip is `v-if`'d) and it was approved, but the owner looked at\n         the result and rejected it: *\"kanka split pane ve info butonunu alt\n         kısımda bırak\"*. He decides. The reachability problem the teleport was\n         solving is real and is answered properly in the handover diff instead:\n         this row becomes the WINDOW's row — tabs, +, split and the details\n         toggle — and is drawn whenever any of the four has something to do,\n         rather than only when a second tab exists. -->\n    <button\n      v-if=\"splitEnabled !== false\"\n      type=\"button\"\n      class=\"fe-tabs__split\"\n      :class=\"{ 'is-active': splitActive }\"\n      :aria-label=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n      :title=\"splitActive ? t('tabs.split_off') : t('tabs.split')\"\n      :aria-pressed=\"splitActive ? 'true' : 'false'\"\n      data-testid=\"tabs-split\"\n      @click=\"emit('toggle-split')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.8\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n        <path d=\"M12 4v16\" />\n      </svg>\n    </button>\n\n    <!-- gorunum:v5-panerow — the details toggle's home in this row.\n         ⚠ Rendered ONLY when the host passes `inspectorEnabled`, which nothing\n         does yet: until the FileExplorer diff in the handover is applied, the\n         ⓘ is still drawn in the breadcrumb row and this must stay silent, or\n         there would be two of it. When the diff lands, `infoPanelToggle` is\n         passed here and the subhead's copy is deleted in the same change. -->\n    <button\n      v-if=\"inspectorEnabled\"\n      type=\"button\"\n      class=\"fe-tabs__inspector\"\n      :class=\"{ 'is-active': inspectorOpen }\"\n      :aria-pressed=\"inspectorOpen ? 'true' : 'false'\"\n      :title=\"t('toolbar.inspector')\"\n      :aria-label=\"t('toolbar.inspector')\"\n      data-testid=\"tabs-inspector\"\n      @click=\"emit('toggle-inspector')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.8\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"12\" cy=\"12\" r=\"9\" />\n        <path d=\"M12 11v5\" />\n        <circle cx=\"12\" cy=\"7.6\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n      </svg>\n    </button>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breadcrumb — adapter-aware path crumbs.\n *\n * Dirname arrives as `<adapter>://<rel>` (e.g. `s3-test://aa/bb`). The\n * first crumb is ALWAYS the storage root — its label is the adapter\n * name itself (`s3-test`) and clicking it lands you at `<adapter>://`,\n * NOT at the first sub-folder you happened to be inside. The remaining\n * crumbs walk down the path one segment at a time.\n *\n * Examples:\n *   `s3-test://`           → [s3-test]\n *   `s3-test://aa`         → [s3-test] › [aa]\n *   `s3-test://aa/bb`      → [s3-test] › [aa] › [bb]\n *\n * `rootLabel` overrides the adapter name when the embedder wants a\n * branded label ('Files', 'My Drive', etc). Defaults to the adapter.\n *\n * The ✏ button swaps the crumbs for a free-form input; Enter\n * navigates, Escape cancels.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport { virtualSegmentLabel } from '../lib/listing';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\n\nconst props = defineProps<{\n  dirname: string;\n  adapter: string;\n  rootLabel: string;\n  locale: LocaleCode;\n  /**\n   * Multi-storage mode — when true the breadcrumb prepends a global\n   * \"/\" crumb so the user can pop all the way back to the storage\n   * picker. Storage name then occupies crumb #1 instead of #0.\n   */\n  multiStorageRoot?: boolean;\n  /**\n   * Root confinement (qualified `<adapter>://<rel>`). When set the breadcrumb\n   * treats this folder as `/`: crumbs above it are hidden, the root crumb is\n   * the confined folder's own name, and the ✏ path editor shows/accepts paths\n   * relative to it (`/`, `/sub`). Pairs with FileExplorer's rootPath clamp.\n   */\n  rootPath?: string;\n  /**\n   * gorunum:v2-topbar — what is INSIDE the folder the last crumb names, for\n   * the chevron the reference shell puts there (\"Subfolders\"). Supplied by\n   * the parent, because the listing it comes from is the parent's: a second\n   * fetch from here would be a second answer to \"what is in this folder\".\n   *\n   * ⚠ The affordance is drawn whenever the array is PRESENT, empty or not —\n   * a control that appears and disappears as you walk the tree is a control\n   * nobody learns. An empty folder says so in the menu instead.\n   */\n  subfolders?: { label: string; adapterPath: string }[];\n}>();\n\n// Confined root parsed into its adapter-relative form (\"projeler/acme\") and\n// the trailing folder name used as the \"/\" crumb label.\nconst confinedRel = computed(() => {\n  if (!props.rootPath) return '';\n  const r = props.rootPath;\n  const i = r.indexOf('://');\n  return (i >= 0 ? r.slice(i + 3) : r).replace(/^\\/+|\\/+$/g, '');\n});\nconst floorLabel = computed(() => {\n  const rel = confinedRel.value;\n  if (!rel) return props.rootLabel || props.adapter;\n  const parts = rel.split('/');\n  return parts[parts.length - 1] || (props.rootLabel || props.adapter);\n});\n\nconst { t } = useLocale(() => props.locale);\n\n\nconst emit = defineEmits<{\n  (e: 'navigate', adapterPath: string): void;\n  (e: 'copy-path', adapterPath: string): void;\n  (e: 'crumb-context', payload: { x: number; y: number; adapterPath: string; label: string }): void;\n  (e: 'crumb-drop', adapterPath: string, ev: DragEvent): void;\n}>();\n\ninterface Crumb {\n  label: string;\n  adapterPath: string;\n}\n\nconst crumbs = computed<Crumb[]>(() => {\n  /* ⚠ Empty adapter → EMPTY prefix, not a bare `://`. A virtual view\n     (`.starred`, `.tag~invoices`) belongs to no storage, so the pane hands us\n     the sentinel with no adapter at all; gluing `://` onto it would make every\n     crumb's `adapterPath` read `://.starred`, which navigates nowhere — the\n     view's own address is the bare sentinel. */\n  const adapterPrefix = props.adapter ? `${props.adapter}://` : '';\n  const raw = adapterPrefix && props.dirname.startsWith(adapterPrefix)\n    ? props.dirname.slice(adapterPrefix.length)\n    : props.dirname;\n  const parts = raw.split('/').filter(Boolean);\n\n  const out: Crumb[] = [];\n\n  // Confined: the root folder is the top crumb (its own name), and only the\n  // path BELOW it is walked — segments above the confinement are never shown.\n  if (props.rootPath) {\n    const floor = confinedRel.value;\n    const cur = raw.replace(/^\\/+|\\/+$/g, '');\n    const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n      ? cur.slice(floor.length).replace(/^\\/+/, '')\n      : '';\n    out.push({ label: floorLabel.value, adapterPath: props.rootPath });\n    let acc = floor;\n    for (const part of below.split('/').filter(Boolean)) {\n      acc = acc ? `${acc}/${part}` : part;\n      /* ⚠ THE SAME resolver the unconfined branch below uses. This line used to\n         carry a private `part === '.trash' ? t('node.trash') : part` — a second\n         copy of the sentinel mapping that knew about exactly one sentinel, so a\n         confined embed printed `.starred`, `.shared`, `.recent` and\n         `.tag~invoices` raw while the panel three inches away named them\n         properly. One resolver, and a sentinel added to `lib/listing` reaches\n         both branches on the day it lands. */\n      out.push({ label: virtualSegmentLabel(part, t) || part, adapterPath: `${adapterPrefix}${acc}` });\n    }\n    return out;\n  }\n\n  if (props.multiStorageRoot) {\n    // Global \"/\" crumb — clicking it pops back to the storage picker\n    // (FileExplorer treats the empty string as the virtual root).\n    out.push({ label: '/', adapterPath: '' });\n    if (props.adapter) {\n      // Storage segment — wire form `<adapter>://` lands at storage\n      // root regardless of where we are now.\n      out.push({ label: props.rootLabel || props.adapter, adapterPath: adapterPrefix });\n    }\n  } else if (props.adapter || props.rootLabel) {\n    // Single-storage mode: the storage name IS the root, no \"/\"\n    // above it.\n    // ⚠ …and with NEITHER a storage nor a branded label there is nothing to\n    // name: that is a virtual view in a single-storage explorer, where the\n    // crumb would otherwise be an empty, clickable box in front of \"Starred\".\n    out.push({\n      label: props.rootLabel || props.adapter,\n      adapterPath: adapterPrefix,\n    });\n  }\n\n  let acc = '';\n  for (const part of parts) {\n    acc = acc ? `${acc}/${part}` : part;\n    // gezinti:g1 — the sentinel segments the virtual views park in `dirname`\n    // (`.trash` predates them). Without a mapping the crumb reads \".starred\",\n    // which is a filename the user never typed and cannot navigate to.\n    // etiket:t1 — via the shared resolver, which also knows the tag view's\n    // `.tag~<name>` segment; the raw map only covers the fixed-label views.\n    const label = virtualSegmentLabel(part, t) || part;\n    out.push({ label, adapterPath: `${adapterPrefix}${acc}` });\n  }\n  return out;\n});\n\n// ------------------------------------------------------------------\n// Overflow collapse (cila:c / I5) — when the trail grows past the\n// threshold, show `root › … › parent › current`; the middle crumbs move\n// into a dropdown. Visible crumbs keep their full click/drag-drop/context\n// behavior; dropdown entries only navigate.\n// ------------------------------------------------------------------\n/* gorunum:v2-topbar — the home crumb.\n *\n * ⚠ It REPLACES the root crumb, it is not added beside it. In multi-storage\n * mode `crumbs[0]` is a bare \"/\" whose only job is \"back to the storage\n * list\" — exactly what a house glyph says, and better than a slash nobody\n * reads as a button. Drawing both would be two controls for one destination,\n * which is the duplicate this pass exists to remove.\n * ⚠ Only that \"/\" crumb is swallowed. A single-storage explorer's first crumb\n * is the storage's NAME and a confined one's is the folder's — information a\n * tooltip on a house cannot carry, so those keep their text. */\nconst homeCrumb = computed<Crumb | null>(() => {\n  const first = crumbs.value[0];\n  if (!first) return null;\n  return props.multiStorageRoot && first.adapterPath === '' ? first : null;\n});\n/** The crumbs drawn as text — everything the home button did not swallow. */\nconst trail = computed<Crumb[]>(() =>\n  homeCrumb.value ? crumbs.value.slice(1) : crumbs.value,\n);\n/** True while the home button is the current folder (nothing below it). */\nconst homeIsCurrent = computed(() => !!homeCrumb.value && trail.value.length === 0);\n\nconst OVERFLOW_THRESHOLD = 4;\nconst collapsed = computed(() => trail.value.length > OVERFLOW_THRESHOLD);\nconst leadCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(0, 1) : trail.value,\n);\nconst middleCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(1, -2) : [],\n);\nconst tailCrumbs = computed<Crumb[]>(() =>\n  collapsed.value ? trail.value.slice(-2) : [],\n);\n\nconst overflowOpen = ref(false);\nconst moreWrapEl = ref<HTMLElement | null>(null);\n/* gorunum:v2-topbar — the \"Subfolders\" chevron's own menu. Separate state\n   from the overflow \"…\", because the two open different lists (crumbs ABOVE\n   this folder vs folders INSIDE it) and only ever one at a time. */\nconst subOpen = ref(false);\nconst subWrapEl = ref<HTMLElement | null>(null);\n\nconst anyMenuOpen = computed(() => overflowOpen.value || subOpen.value);\n\nfunction closeMenus() {\n  overflowOpen.value = false;\n  subOpen.value = false;\n}\n\nfunction onOverflowPick(crumb: Crumb) {\n  closeMenus();\n  emit('navigate', crumb.adapterPath);\n}\n\nfunction toggleSub() {\n  overflowOpen.value = false;\n  subOpen.value = !subOpen.value;\n}\n\nfunction onDocClick(e: MouseEvent) {\n  const t = e.target;\n  if (!(t instanceof Node)) {\n    closeMenus();\n    return;\n  }\n  if (moreWrapEl.value?.contains(t) || subWrapEl.value?.contains(t)) return;\n  closeMenus();\n}\n\nfunction onDocKeydown(e: KeyboardEvent) {\n  if (e.key === 'Escape') {\n    e.stopPropagation();\n    closeMenus();\n  }\n}\n\nwatch(anyMenuOpen, (v) => {\n  if (v) {\n    document.addEventListener('click', onDocClick, true);\n    document.addEventListener('keydown', onDocKeydown, true);\n  } else {\n    document.removeEventListener('click', onDocClick, true);\n    document.removeEventListener('keydown', onDocKeydown, true);\n  }\n});\n// Navigation rebuilds the trail — a stale open menu would list crumbs of\n// the previous folder (and subfolders of the one we just left).\nwatch(crumbs, closeMenus);\nonBeforeUnmount(() => {\n  document.removeEventListener('click', onDocClick, true);\n  document.removeEventListener('keydown', onDocKeydown, true);\n});\n\nfunction onClick(crumb: Crumb) {\n  emit('navigate', crumb.adapterPath);\n}\n\n/* The home button's three handlers, null-guarded here rather than in the\n * template: `v-if=\"homeCrumb\"` does not narrow the ref inside an event\n * binding, and a `!` in markup is an assertion no reader can check. */\nfunction onHomeClick() {\n  if (homeCrumb.value) onClick(homeCrumb.value);\n}\nfunction onHomeContext(ev: MouseEvent) {\n  if (homeCrumb.value) onContext(ev, homeCrumb.value);\n}\nfunction onHomeDrop(ev: DragEvent) {\n  if (homeCrumb.value) onCrumbDrop(ev, homeCrumb.value);\n}\n\nfunction onContext(ev: MouseEvent, crumb: Crumb) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('crumb-context', {\n    x: ev.clientX,\n    y: ev.clientY,\n    adapterPath: crumb.adapterPath,\n    label: crumb.label,\n  });\n}\n\nfunction onCrumbDragOver(ev: DragEvent) {\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n}\n\nfunction onCrumbDrop(ev: DragEvent, crumb: Crumb) {\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('crumb-drop', crumb.adapterPath, ev);\n}\n\nconst editing = ref(false);\nconst pathDraft = ref('');\nconst pathInput = ref<HTMLInputElement | null>(null);\n\nfunction startEdit() {\n  const adapterPrefix = `${props.adapter}://`;\n  const rel = props.dirname.startsWith(adapterPrefix)\n    ? props.dirname.slice(adapterPrefix.length)\n    : props.dirname;\n  // Confined: edit relative to the root folder — `/` is the root, `/sub` below.\n  if (props.rootPath) {\n    const floor = confinedRel.value;\n    const cur = rel.replace(/^\\/+|\\/+$/g, '');\n    const below = floor && (cur === floor || cur.startsWith(floor + '/'))\n      ? cur.slice(floor.length).replace(/^\\/+/, '')\n      : '';\n    pathDraft.value = below ? `/${below}` : '/';\n    editing.value = true;\n    void nextTick(() => {\n      pathInput.value?.focus();\n      pathInput.value?.select();\n    });\n    return;\n  }\n  // Multi-storage: show `/<storage>/<rel>` so the user can edit the\n  // whole tree (`/main/foo`, `/s3-test/example`, just `/` for root).\n  if (props.multiStorageRoot) {\n    if (!props.adapter) {\n      pathDraft.value = '/';\n    } else {\n      const trimmed = rel.replace(/^\\/+|\\/+$/g, '');\n      pathDraft.value = trimmed\n        ? `/${props.adapter}/${trimmed}`\n        : `/${props.adapter}`;\n    }\n  } else {\n    pathDraft.value = rel;\n  }\n  editing.value = true;\n  void nextTick(() => {\n    pathInput.value?.focus();\n    pathInput.value?.select();\n  });\n}\n\nfunction submitPath() {\n  const raw = pathDraft.value.trim();\n  editing.value = false;\n\n  // Confined: the typed path is relative to the root folder; prepend the floor.\n  if (props.rootPath) {\n    const sub = raw.replace(/^\\/+|\\/+$/g, '');\n    const floor = confinedRel.value;\n    const rel = sub ? (floor ? `${floor}/${sub}` : sub) : floor;\n    emit('navigate', rel ? `${props.adapter}://${rel}` : `${props.adapter}://`);\n    return;\n  }\n\n  if (props.multiStorageRoot) {\n    // Strip leading/trailing slashes. First segment = storage.\n    const clean = raw.replace(/^\\/+|\\/+$/g, '');\n    if (!clean) {\n      // navigate to global root by emitting empty wire path; the\n      // FileExplorer treats it as virtual storage list.\n      emit('navigate', '');\n      return;\n    }\n    const slash = clean.indexOf('/');\n    const adapter = slash === -1 ? clean : clean.slice(0, slash);\n    const rel = slash === -1 ? '' : clean.slice(slash + 1);\n    emit('navigate', rel ? `${adapter}://${rel}` : `${adapter}://`);\n    return;\n  }\n\n  const v = raw.replace(/^\\/+|\\/+$/g, '');\n  if (!v) return;\n  emit('navigate', `${props.adapter}://${v}`);\n}\n\nfunction cancelEdit() {\n  editing.value = false;\n}\n</script>\n\n<template>\n  <nav class=\"fe-breadcrumb\" aria-label=\"Breadcrumb\">\n    <template v-if=\"!editing\">\n      <!-- gorunum:v2-topbar — the root crumb. It IS `crumbs[0]` (see the\n           script), drawn as a house instead of a \"/\" nobody reads as a\n           button; it is never an extra control beside the root.\n\n           ⚠⚠ It is named `breadcrumb.root`, NOT `breadcrumb.home`, and that\n           was a real collision rather than a synonym. This button goes to\n           `adapterPath: ''` — the top of the tree: the DRIVES listing where\n           several storages are visible, the storage root where one is. The\n           panel's own \"Home\" row goes somewhere else entirely (the overview\n           with Storages · Recent · Starred). Two controls, one word, two\n           destinations — and the word belonged to the other one. It mattered\n           more from 2026-09-13, when \"My files\" stopped being drawn for a\n           multi-storage deployment: this button became the only door to that\n           listing, so the one thing it must not do is point at a different\n           row in the panel.\n\n           `breadcrumb.root` rather than a new string because the product\n           ALREADY names this destination: FileExplorer labels the tab you\n           land on with exactly this key (\"Root\" / \"Kök\"). Hovering the house\n           and reading the tab now say the same word instead of two.\n\n           ⚠ Relabelled, NOT repointed. Sending it to the Home overview would\n           break two things that are measured: `crumbs[0]` is this crumb, and\n           `trail` is `crumbs.slice(1)`, so the root would lose its only crumb\n           and (post-\"My files\") its last door; and `goUp()`/Alt+↑ from a\n           storage root loads `''`, so Up and the crumb would then disagree\n           about what sits above a storage.\n           ⚠ `data-testid` stays `breadcrumb-home`: it is a selector other\n           surfaces already use, and renaming it buys nothing. -->\n      <button\n        v-if=\"homeCrumb\"\n        type=\"button\"\n        class=\"fe-breadcrumb__crumb fe-breadcrumb__home\"\n        :class=\"{ 'is-last': homeIsCurrent }\"\n        :aria-current=\"homeIsCurrent ? 'page' : undefined\"\n        :title=\"t('breadcrumb.root')\"\n        :aria-label=\"t('breadcrumb.root')\"\n        data-testid=\"breadcrumb-home\"\n        @click=\"onHomeClick\"\n        @contextmenu=\"onHomeContext\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onHomeDrop\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('home')\"></span>\n        <span v-if=\"!homeIsCurrent\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <button\n        v-for=\"(c, i) in leadCrumbs\"\n        :key=\"c.adapterPath\"\n        class=\"fe-breadcrumb__crumb\"\n        :class=\"{ 'is-last': !collapsed && i === leadCrumbs.length - 1 }\"\n        type=\"button\"\n        :aria-current=\"!collapsed && i === leadCrumbs.length - 1 ? 'page' : undefined\"\n        @click=\"onClick(c)\"\n        @contextmenu=\"onContext($event, c)\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onCrumbDrop($event, c)\"\n      >\n        <span>{{ c.label }}</span>\n        <span v-if=\"collapsed || i < leadCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <span v-if=\"middleCrumbs.length\" ref=\"moreWrapEl\" class=\"fe-breadcrumb__more-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-breadcrumb__more\"\n          aria-haspopup=\"menu\"\n          :aria-expanded=\"overflowOpen\"\n          :aria-label=\"t('breadcrumb.more')\"\n          :title=\"t('breadcrumb.more')\"\n          @click=\"overflowOpen = !overflowOpen\"\n        >…</button>\n        <span class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n        <div v-if=\"overflowOpen\" class=\"fe-breadcrumb__menu\" role=\"menu\">\n          <button\n            v-for=\"c in middleCrumbs\"\n            :key=\"c.adapterPath\"\n            type=\"button\"\n            class=\"fe-breadcrumb__menu-item\"\n            role=\"menuitem\"\n            @click=\"onOverflowPick(c)\"\n          >{{ c.label }}</button>\n        </div>\n      </span>\n      <button\n        v-for=\"(c, i) in tailCrumbs\"\n        :key=\"c.adapterPath\"\n        class=\"fe-breadcrumb__crumb\"\n        :class=\"{ 'is-last': i === tailCrumbs.length - 1 }\"\n        type=\"button\"\n        :aria-current=\"i === tailCrumbs.length - 1 ? 'page' : undefined\"\n        @click=\"onClick(c)\"\n        @contextmenu=\"onContext($event, c)\"\n        @dragover=\"onCrumbDragOver\"\n        @drop=\"onCrumbDrop($event, c)\"\n      >\n        <span>{{ c.label }}</span>\n        <span v-if=\"i < tailCrumbs.length - 1\" class=\"fe-breadcrumb__sep\" aria-hidden=\"true\">›</span>\n      </button>\n      <!-- gorunum:v2-topbar — \"Subfolders\": the chevron the reference shell\n           hangs on the LAST crumb, opening what is inside the folder you are\n           standing in. Drawn whenever the parent supplies the list, empty or\n           not (see the prop's note). -->\n      <span v-if=\"subfolders\" ref=\"subWrapEl\" class=\"fe-breadcrumb__sub-wrap\">\n        <button\n          type=\"button\"\n          class=\"fe-breadcrumb__sub\"\n          aria-haspopup=\"menu\"\n          :aria-expanded=\"subOpen\"\n          :title=\"t('breadcrumb.subfolders')\"\n          :aria-label=\"t('breadcrumb.subfolders')\"\n          data-testid=\"breadcrumb-subfolders\"\n          @click=\"toggleSub\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('subfolders')\"></span>\n        </button>\n        <div v-if=\"subOpen\" class=\"fe-breadcrumb__menu\" role=\"menu\">\n          <button\n            v-for=\"c in subfolders\"\n            :key=\"c.adapterPath\"\n            type=\"button\"\n            class=\"fe-breadcrumb__menu-item\"\n            role=\"menuitem\"\n            @click=\"onOverflowPick(c)\"\n          >{{ c.label }}</button>\n          <p v-if=\"!subfolders.length\" class=\"fe-breadcrumb__menu-empty\">\n            {{ t('breadcrumb.subfolders.empty') }}\n          </p>\n        </div>\n      </span>\n      <!-- gorunum:v1 — \"type a path and go\". The glyph was the ✏ emoji, which\n           this row draws from whichever emoji font the machine has: on a\n           headless Chromium and on a Linux box without one it comes out as a\n           stray dash beside the crumbs. An inline SVG is the same mark\n           everywhere and inherits the row's colour.\n           gorunum:v2-topbar — the mark now comes from lib/actionIcons with\n           every other glyph in the row; the reference shell has no path\n           editor at all, so this is ours and it stays. -->\n      <button\n        type=\"button\"\n        class=\"fe-breadcrumb__edit\"\n        :title=\"t('breadcrumb.go_to_path')\"\n        :aria-label=\"t('breadcrumb.go_to_path')\"\n        data-testid=\"breadcrumb-edit-path\"\n        @click=\"startEdit\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('edit-path')\"></span>\n      </button>\n    </template>\n    <template v-else>\n      <input\n        ref=\"pathInput\"\n        v-model=\"pathDraft\"\n        type=\"text\"\n        class=\"fe-breadcrumb__input\"\n        :placeholder=\"t('breadcrumb.path_placeholder')\"\n        spellcheck=\"false\"\n        autocomplete=\"off\"\n        @keydown.enter.prevent=\"submitPath\"\n        @keydown.escape.prevent=\"cancelEdit\"\n        @blur=\"cancelEdit\"\n      />\n    </template>\n  </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FilterBar — surucu:d1, the chip row under the breadcrumb in the `drive`\n * profile.\n *\n * Four chips: Type · People · Modified · Size. Each opens a small single-choice\n * popover; a chip with a choice made carries that choice as its label, so the\n * row says what is being filtered without opening anything.\n *\n * ⚠ Type comes FIRST. The row used to open with People, which put the one\n * chip that is empty in a single-account install in front of the one every\n * listing has an answer for.\n *\n * ⚠ It was THREE for a long time, and the reason was written here: there was\n * nothing behind a People chip, because a listing row carried no owner and\n * `nodes.owner_id` was quota bookkeeping nobody serialized. That is no longer\n * true — migration 00038 made ownership a fact on the row and the listing\n * projection carries it — so the chip now filters on data the row already has,\n * like the other three. If ownership is ever taken back off the wire, this chip\n * has to go with it: a control that opens, offers names and changes nothing is\n * worse than an absent one.\n *\n * ⚠ The People options are NOT a directory listing. `Anyone`, `You` and\n * `System` are always offered; the named accounts are only the ones that\n * actually own something in the rows on screen (`peopleOptions`). Offering\n * every account on the install would put inert names in the menu and leak the\n * user list into a folder view.\n *\n * === surucu:d1-sort — the trailing edge ===============================\n * Two controls at the right of the same row: a button that NAMES the active\n * sort and flips its direction, and a chevron whose menu picks the key.\n *\n * ⚠⚠ They do not own a sort. Both reach for `lib/sortOrder`'s store for the\n * PANE they are inside, the same one the list view's own column headers reach\n * for, so the chip row and the headers are two handles on ONE piece of state\n * — sort by Size here and\n * the Size column's arrow moves, click the Name header and this button says\n * Name. A control with its own private copy of the answer is filex lesson #67\n * one level up, and it is what this row was one commit away from becoming.\n *\n * ⚠⚠ …and while a SEARCH RESULT is on screen there is no key to name. The\n * rows were ranked by the server (`order === 'relevance'`, see\n * `lib/sortOrder`), so this button prints \"Relevance\" instead of the key,\n * drops its direction arrow, and closes — with the reason in its own tooltip\n * and accessible name. A button reading \"Name ↑\" over a list that is not in\n * name order is the failure this whole row is otherwise built to avoid, and a\n * control that simply went inert would be the same lie without the wording.\n * The key itself is untouched: it is still there the moment the search is\n * left.\n *\n * ⚠ Deliberately NOT here: the reference build's \"Listing actions\" ⋮ that sits\n * beside these two. Its menu is New folder / New file / Upload files / Paste /\n * Select all / Deselect all — six commands this component cannot perform and\n * has no handle on. Drawing the menu here would mean six items that open,\n * offer a word and do nothing, which is the failure the People note above is\n * about. It needs events from the explorer; see the report.\n *\n * ⚠ Popovers are TELEPORTED to <body>, like ContextMenu, and positioned\n * `fixed`. An absolutely-positioned panel inside the explorer is clipped by\n * `.fe__body`'s own scroll container, which is how a menu ends up half visible\n * with its own scrollbar. ONE popover machine serves the chips and the sort\n * menu — same positioning, same outside-click, same Escape — because two of\n * them is two chances for a panel to be left open behind the other.\n *\n * ⚠ No `<style>` block. Package CSS lives in `styles/base.css` — a scoped block\n * compiles to `.cls[data-v-HASH]` and the hash does not match in the\n * web-component build, so the rules silently stop applying in every embed.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { FileNode } from '../types/FileNode';\nimport type { DriveFilters, ModifiedFilter, SizeFilter, TypeFilter } from '../lib/fileFilters';\nimport { activeFilterCount, peopleOptions } from '../lib/fileFilters';\nimport {\n  SORT_KEYS,\n  setSortLocale,\n  useSortStore,\n  type ListingOrder,\n  type SortKey,\n} from '../lib/sortOrder';\n\nconst props = defineProps<{\n  value: DriveFilters;\n  locale: LocaleCode;\n  /** Resolved theme — the teleported popover leaves the `.fe` variable scope. */\n  theme?: ThemeMode;\n  /** Rows currently shown / rows the folder holds, for the count chip. */\n  shown?: number;\n  total?: number;\n  /**\n   * The rows the People chip derives its named accounts from — the listing\n   * BEFORE filtering, so choosing a person does not empty the menu that\n   * offered them.\n   *\n   * ⚠ Optional. Without it the chip still offers Anyone / You / System, which\n   * are the three that never depend on data; an embedder who passes nothing\n   * gets a working control rather than a broken one.\n   */\n  files?: FileNode[];\n  /* === surucu:d1-actions — the \"⋮\" listing menu ======================\n   * ⚠ Every row in it is a command this component cannot run: the clipboard,\n   * the selection and the write permissions all live in the explorer. So the\n   * menu takes its two ENABLED states as props and emits the verbs, and the\n   * host decides whether a row is reachable. A menu that draws \"Paste\" alive\n   * over an empty clipboard is a menu that lies once per folder. */\n  /** There is something on the clipboard to paste here. */\n  canPaste?: boolean;\n  /** This folder can be written to (false at a read-only root, in the trash). */\n  canWrite?: boolean;\n  /**\n   * Where the listing behind this row got its order — see `lib/sortOrder`.\n   * `relevance` (a search result) closes the sort control and makes it name\n   * the order it is actually in. Omitted = an ordinary folder listing, which\n   * is what every embedder that never searches has.\n   */\n  order?: ListingOrder;\n  /* === surucu:d1-scope — the row where there is nothing to chip ==========\n   *\n   * ⚠⚠ `find` is not \"a smaller filter bar\". It is this row over a listing\n   * whose rows are not files: the multi-storage ROOT (every row is a drive)\n   * and HOME (three blocks of cards). Type / People / Modified / Size all\n   * answer from `extension`, `mime_type`, `owner_id`, `size` and\n   * `last_modified`, and a drive has none of the five — the chips would open,\n   * offer ten words and narrow nothing, which is the exact failure the People\n   * note above is about. The name box is the one dimension those rows DO\n   * have, so it is the one that stays.\n   *\n   * ⚠ And it stays REACHABLE, rather than the row being dropped: \"root\n   * folder'da filtre barı kalsın, en kötü o bardan search kalacak — orada adam\n   * isterse storage ismi aratabilir\" (owner, 2026-09-13). A box that filters\n   * nothing would be worse than no box; this one filters the rows in hand\n   * through the same `DriveFilters.name` predicate every other listing uses.\n   */\n  mode?: 'full' | 'find';\n  /**\n   * What the name box says it narrows. The default names a FOLDER, which is\n   * wrong in both `find` places — neither the drive list nor Home is one.\n   * Passed already translated: the pane knows which of the two it is, the\n   * catalogue lookup belongs with the caller that knows.\n   */\n  findLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'update:value', v: DriveFilters): void;\n  /* surucu:d1-actions — the listing's own verbs. Names match the events the\n     navigation panel already emits for the same two commands, so the host\n     wires one handler for each rather than one per menu. */\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'paste'): void;\n  (e: 'select-all'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/** surucu:d1-scope — everything except the name box is drawn only in `full`. */\nconst full = computed(() => (props.mode ?? 'full') === 'full');\n/** The name box's placeholder AND its accessible name — one value, read twice,\n *  so the two cannot describe different things. */\nconst findLabel = computed(() => props.findLabel || t('filter.find'));\n\ntype Group = 'people' | 'type' | 'modified' | 'size';\n/** Everything this row can open. `sort` is not a filter group — it shares the\n *  popover machine, not the filter model. */\ntype PopId = Group | 'sort' | 'actions';\n\n/** The chips, in the order they are drawn. One array, so the template loop and\n *  `optionsFor` cannot disagree about how many there are. */\nconst GROUPS: Group[] = ['type', 'people', 'modified', 'size'];\n\nconst TYPE_OPTIONS: TypeFilter[] = [\n  'any', 'folder', 'document', 'spreadsheet', 'presentation', 'pdf',\n  'image', 'video', 'audio', 'archive', 'code',\n];\nconst MODIFIED_OPTIONS: ModifiedFilter[] = ['any', 'today', '7d', '30d', 'year'];\nconst SIZE_OPTIONS: SizeFilter[] = ['any', 'lt1', '1to10', '10to100', 'gt100'];\n\n/** Anyone / You / System, plus every other account owning a row on screen. */\nconst peopleChoices = computed(() => peopleOptions(props.files ?? []));\n\nfunction optionsFor(g: Group): string[] {\n  if (g === 'people') return peopleChoices.value.map((o) => o.value);\n  if (g === 'type') return TYPE_OPTIONS;\n  if (g === 'modified') return MODIFIED_OPTIONS;\n  return SIZE_OPTIONS;\n}\n\nfunction optionLabel(g: Group, v: string): string {\n  // A named account is labelled by its NAME, which no locale file can know.\n  // The three fixed members are ordinary keys like every other group's.\n  if (g === 'people' && v.startsWith('u:')) {\n    return peopleChoices.value.find((o) => o.value === v)?.name || v.slice(2);\n  }\n  return t(`filter.${g}.${v}`);\n}\n\n/** The chip's own label: the group name until a choice is made, then the\n *  choice — a row of three identical words tells the reader nothing. */\nfunction chipLabel(g: Group): string {\n  const v = g === 'people' ? (props.value.people ?? 'any') : props.value[g];\n  return v === 'any' ? t(`filter.${g}`) : optionLabel(g, v);\n}\n\n/** `value[g]` for a group whose field is optional. */\nfunction chosen(g: Group): string {\n  return g === 'people' ? (props.value.people ?? 'any') : props.value[g];\n}\n\nconst activeCount = computed(() => activeFilterCount(props.value));\n\n// ── surucu:d1-sort — the sort control ─────────────────────────────────\n// Reading through the STORE OF THE PANE this row is inside, so the call\n// subscribes this render to that pane's state and there is no second place\n// holding a copy that could go stale.\n//\n// ⚠⚠ Per pane, not per bundle. The split view draws this row in both halves;\n// while the key lived in a module-level singleton, choosing \"Size ↓\" on the\n// right re-ordered the listing on the left (measured 2026-09-13). With no\n// provider — one listing, a bare <FilterBar> in a test — this is the default\n// store and nothing changes.\nconst sort = useSortStore();\nconst sortKey = computed<SortKey>(() => sort.key.value);\nconst sortAscending = computed(() => sort.dir.value === 'asc');\n\n/** The rows behind this row are the server's ranked answer, so the key below\n *  is not what is on screen. One boolean, read by everything in the control. */\nconst ranked = computed(() => props.order === 'relevance');\n\n/** \"Modified\", \"Size\" … — the SAME words the list view's column headers use\n *  (`col.*`), because they name the same sort. Over a ranked listing it is\n *  \"Relevance\" instead: the button must name the order it is IN. */\nconst sortKeyLabel = computed(() => (ranked.value ? t('sort.relevance') : t(`col.${sortKey.value}`)));\n/** Read only by a screen reader, exactly as in the reference build: the arrow\n *  says the direction to everyone who can see it. Over a ranked listing the\n *  arrow is gone and this carries the REASON instead — the same sentence the\n *  tooltip shows, because \"disabled\" with no explanation is the state the\n *  owner specifically did not want. */\nconst sortDirLabel = computed(() =>\n  ranked.value ? t('sort.relevance_why') : t(sortAscending.value ? 'sort.asc' : 'sort.desc'),\n);\n\n/** The sort's own `type` order is by the word the Type column prints, so the\n *  comparator has to know which catalogue that word comes from. */\nwatch(() => props.locale, (l) => setSortLocale(l), { immediate: true });\n\n/**\n * ⚠ `setSort`, not `chooseSortKey`: a menu item NAMES a destination, so\n * picking the key that is already active must leave it where it is rather\n * than quietly reverse it. The button beside this menu is the toggle, and a\n * column header — where clicking the active one again is what everybody\n * expects — uses the other one.\n */\nfunction pickSortKey(k: SortKey): void {\n  sort.setSort(k);\n  close(true);\n}\n\n/**\n * ⚠⚠ The two sort handles refuse to act over a RANKED listing, in the handler\n * and not only through the `disabled` attribute on the button.\n *\n * `disabled` suppresses the browser's own activation, but a click dispatched\n * in script still reaches this listener, and the damage is silent: nothing on\n * screen moves (the rows are the server's), the shared key is written to\n * `filex.list-sort`, and the FOLDER the person goes back to is re-ordered\n * behind their back. Measured 2026-09-13 on the list view's twin control — a\n * scripted click on the closed Size header left the rows untouched and still\n * turned the stored sort from Name ↑ into Size ↑.\n */\nfunction flipSortDir(): void {\n  if (ranked.value) return;\n  sort.toggleSortDir();\n}\nfunction openSortMenu(): void {\n  if (ranked.value) return;\n  void toggle('sort');\n}\n\n/* === surucu:d1-actions — what the \"⋮\" offers ==========================\n * The reference build's listing menu, minus one row: it also carries \"File\",\n * and this explorer has no create-empty-file command anywhere — not in the\n * \"+ New\" menu, not in the right-click menu, not as a shortcut. Shipping the\n * word with nothing behind it is the one thing this menu was held back for.\n *\n * ⚠ Disabled rather than hidden, all of them. A menu whose height changes\n * between folders is a menu people misclick, and \"Paste\" greyed out says the\n * clipboard is empty — \"Paste\" absent says the feature does not exist.\n *\n * ⚠⚠ And there is no \"Deselect all\", which the reference build does carry.\n * MEASURED, not assumed: the instant anything is selected this whole row is\n * replaced by the selection bar (`.fe-selbar-slot.is-active`) — filter row\n * hidden, this button hidden — and that bar draws its own \"Clear selection\"\n * button. So a Deselect row here could never be reached (having a selection is\n * exactly the state that hides the menu) and would duplicate a control that IS\n * on screen at that moment. \"Select all\" is the opposite case and stays: it is\n * reachable precisely when it is useful, and it exists nowhere else but a\n * keystroke.\n */\nconst actionRows = computed(() => [\n  { key: 'new-folder', label: t('toolbar.new_folder'), disabled: props.canWrite === false },\n  { key: 'upload', label: t('toolbar.upload'), disabled: props.canWrite === false },\n  { key: 'paste', label: t('ctx.paste'), disabled: !props.canPaste || props.canWrite === false },\n  { key: 'sep', label: '', divider: true, disabled: true },\n  { key: 'select-all', label: t('shortcuts.select_all'), disabled: false },\n]);\n\nfunction runAction(key: string): void {\n  close(true);\n  if (key === 'new-folder') emit('new-folder');\n  else if (key === 'upload') emit('upload');\n  else if (key === 'paste') emit('paste');\n  else if (key === 'select-all') emit('select-all');\n}\n\n// ── the popover ──────────────────────────────────────────────────────\nconst openPop = ref<PopId | null>(null);\nconst pos = ref({ x: 0, y: 0 });\nconst panelEl = ref<HTMLElement | null>(null);\nconst anchorEls = ref<Record<string, HTMLElement | null>>({});\n\nfunction setAnchorEl(id: PopId, el: unknown) {\n  anchorEls.value[id] = (el as HTMLElement | null) ?? null;\n}\n\n// The open popover's data, precomputed. Reading `value[openPop]` straight\n// from the template would lean on template narrowing across a Teleport, and\n// `vue-tsc --noEmit` is part of this package's build.\nconst openGroup = computed<Group | null>(() =>\n  openPop.value && openPop.value !== 'sort' && openPop.value !== 'actions'\n    ? openPop.value\n    : null,\n);\nconst popOptions = computed<string[]>(() => (openGroup.value ? optionsFor(openGroup.value) : []));\nconst popTitle = computed(() =>\n  openGroup.value\n    ? t(`filter.${openGroup.value}`)\n    : openPop.value === 'actions'\n      ? t('filter.actions')\n      : t('sort.by'),\n);\nfunction popChecked(opt: string): boolean {\n  return !!openGroup.value && chosen(openGroup.value) === opt;\n}\nfunction popLabel(opt: string): string {\n  return openGroup.value ? optionLabel(openGroup.value, opt) : opt;\n}\nfunction popPick(opt: string): void {\n  if (openGroup.value) pick(openGroup.value, opt);\n}\n\nasync function toggle(id: PopId) {\n  if (openPop.value === id) {\n    close();\n    return;\n  }\n  const r = anchorEls.value[id]?.getBoundingClientRect();\n  pos.value = { x: r ? r.left : 8, y: r ? r.bottom + 6 : 8 };\n  openPop.value = id;\n  await nextTick();\n  // Keep it on screen: a chip near the right edge would otherwise open a panel\n  // that runs off it, and the row is right beside the info panel.\n  const panel = panelEl.value;\n  if (panel) {\n    const box = panel.getBoundingClientRect();\n    if (box.right > window.innerWidth - 8) {\n      pos.value = { ...pos.value, x: Math.max(8, window.innerWidth - 8 - box.width) };\n    }\n    if (box.bottom > window.innerHeight - 8) {\n      const r2 = anchorEls.value[id]?.getBoundingClientRect();\n      pos.value = { ...pos.value, y: Math.max(8, (r2 ? r2.top : 0) - box.height - 6) };\n    }\n    // `data-active` rather than a tick: the sort menu draws no check mark (the\n    // button beside it already names the active key), but the keyboard still\n    // has to land on it.\n    panel.querySelector<HTMLElement>('[data-active=\"true\"]')?.focus();\n  }\n}\n\nfunction close(restoreFocus = false) {\n  const id = openPop.value;\n  openPop.value = null;\n  if (restoreFocus && id) anchorEls.value[id]?.focus();\n}\n\n/* surucu:d1-sort — ⚠ a listing can BECOME ranked while the Sort-by menu is\n * open: the header field searches on a debounce, so the rows change under a\n * popover that is already up. Leaving it there would offer four keys the\n * listing no longer obeys, and the anchor it is positioned against has just\n * gone disabled — so it would also be unreachable by keyboard. */\nwatch(\n  () => props.order,\n  (o) => {\n    if (o === 'relevance' && openPop.value === 'sort') close();\n  },\n);\n\nfunction pick(g: Group, v: string) {\n  emit('update:value', { ...props.value, [g]: v } as DriveFilters);\n  close(true);\n}\n\nfunction clearAll() {\n  localName.value = '';\n  // ⚠ Every dimension, named. This literal is hand-written rather than\n  // EMPTY_FILTERS because it must NOT reset the advanced-search fields the\n  // dialog owns — but a dimension left out here is a chip \"Clear\" cannot\n  // clear, which is how `people` would have stayed set forever.\n  //\n  // ⚠ The sort is NOT one of them. \"Clear filters\" un-hides rows; it does not\n  // re-order the ones that were never hidden, and a button that silently threw\n  // away the order you chose would be a second, invisible job.\n  emit('update:value', {\n    ...props.value,\n    type: 'any',\n    modified: 'any',\n    size: 'any',\n    name: '',\n    people: 'any',\n  });\n}\n\n/* === gorunum:v1 — \"Filter in this folder…\" ============================\n * The chips narrow the rows in hand by type/date/size; this narrows the same\n * rows by name, and it is part of the SAME model (`DriveFilters.name`) rather\n * than a second channel — one predicate, one \"Clear\", one empty state.\n *\n * ⚠ Not the header field. That one runs a server search and replaces the\n * listing with hits from below this folder; this one never leaves the folder\n * and never issues a request.\n *\n * Debounced, because every emit clears the selection in the parent (a row the\n * filter just hid would still be what Delete acts on) — doing that on each\n * keystroke would be a selection that dies while you type. */\nconst localName = ref(props.value.name ?? '');\nwatch(\n  () => props.value.name ?? '',\n  (v) => {\n    // The parent resets the filters on navigation; the box has to follow, or\n    // it keeps printing a word that no longer filters anything.\n    if (v !== localName.value.trim()) localName.value = v;\n  },\n);\nlet nameTimer: ReturnType<typeof setTimeout> | undefined;\nfunction onNameInput(ev: Event) {\n  localName.value = (ev.target as HTMLInputElement).value;\n  if (nameTimer) clearTimeout(nameTimer);\n  nameTimer = setTimeout(() => {\n    emit('update:value', { ...props.value, name: localName.value.trim() });\n  }, 140);\n}\nfunction clearName() {\n  if (nameTimer) clearTimeout(nameTimer);\n  localName.value = '';\n  emit('update:value', { ...props.value, name: '' });\n}\nonBeforeUnmount(() => {\n  if (nameTimer) clearTimeout(nameTimer);\n});\n\nfunction onDocPointer(ev: PointerEvent) {\n  if (!openPop.value) return;\n  const el = ev.target as Node;\n  if (panelEl.value?.contains(el)) return;\n  if (Object.values(anchorEls.value).some((c) => c?.contains(el))) return;\n  close();\n}\n\nfunction onKey(ev: KeyboardEvent) {\n  if (ev.key === 'Escape' && openPop.value) {\n    ev.stopPropagation();\n    close(true);\n  }\n}\n\nonMounted(() => {\n  document.addEventListener('pointerdown', onDocPointer, true);\n  document.addEventListener('keydown', onKey, true);\n});\nonBeforeUnmount(() => {\n  document.removeEventListener('pointerdown', onDocPointer, true);\n  document.removeEventListener('keydown', onKey, true);\n});\n</script>\n\n<template>\n  <div class=\"fe-filterbar\" :data-mode=\"full ? 'full' : 'find'\" data-testid=\"filterbar\">\n    <!-- `display: contents` — the chips stay flex items of the row while the\n         group role covers exactly the four that ARE filters. The sort control\n         at the far end is not one of them and must not be announced as one. -->\n    <div v-if=\"full\" class=\"fe-filterbar__chips\" role=\"group\" :aria-label=\"t('filter.aria')\">\n      <button\n        v-for=\"g in GROUPS\"\n        :key=\"g\"\n        :ref=\"(el) => setAnchorEl(g, el)\"\n        type=\"button\"\n        class=\"fe-filterbar__chip\"\n        :class=\"{ 'is-set': chosen(g) !== 'any', 'is-open': openPop === g }\"\n        :aria-expanded=\"openPop === g\"\n        aria-haspopup=\"listbox\"\n        :data-testid=\"`filter-${g}`\"\n        @click=\"toggle(g)\"\n      >\n        <span class=\"fe-filterbar__label\">{{ chipLabel(g) }}</span>\n        <svg\n          class=\"fe-ficon fe-filterbar__caret\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M7 10l5 5 5-5\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- gorunum:v1 — the name box. Same height as the chips beside it; it is\n         one more way to narrow THIS folder, not a second search. -->\n    <div class=\"fe-filterbar__find\">\n      <svg\n        class=\"fe-ficon fe-filterbar__find-glass\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"1.9\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"11\" cy=\"11\" r=\"6.5\" />\n        <path d=\"M16 16l4.5 4.5\" />\n      </svg>\n      <input\n        type=\"search\"\n        class=\"fe-filterbar__find-input\"\n        :placeholder=\"findLabel\"\n        :aria-label=\"findLabel\"\n        :value=\"localName\"\n        data-testid=\"filter-find\"\n        @input=\"onNameInput\"\n        @keydown.esc.stop.prevent=\"clearName\"\n      />\n    </div>\n\n    <button\n      v-if=\"full && activeCount > 0\"\n      type=\"button\"\n      class=\"fe-filterbar__clear\"\n      data-testid=\"filter-clear\"\n      @click=\"clearAll\"\n    >\n      {{ t('filter.clear') }}\n    </button>\n\n    <span\n      v-if=\"full && activeCount > 0 && typeof shown === 'number' && typeof total === 'number'\"\n      class=\"fe-filterbar__count\"\n      role=\"status\"\n      data-testid=\"filter-count\"\n      >{{ t('filter.count', { shown: String(shown), total: String(total) }) }}</span\n    >\n\n    <!-- surucu:d1-sort — pushed to the trailing edge of the row.\n         ⚠ `full` only: a drive list and Home's three card blocks are not a\n         sorted listing this row owns, so a button naming a sort key would be\n         naming one nothing on screen obeys — the same lie the ranked-search\n         case above is built to avoid. -->\n    <div v-if=\"full\" class=\"fe-filterbar__sort\">\n      <button\n        :ref=\"(el) => setAnchorEl('sort', el)\"\n        type=\"button\"\n        class=\"fe-filterbar__sortdir\"\n        :class=\"{ 'is-ranked': ranked }\"\n        :disabled=\"ranked\"\n        :title=\"ranked ? sortDirLabel : undefined\"\n        data-testid=\"sort-dir\"\n        @click=\"flipSortDir()\"\n      >\n        <span>{{ sortKeyLabel }}</span>\n        <!-- The accessible name becomes \"Modified, Descending\". The arrow\n             carries the same fact for everyone who can see it, so it is not\n             repeated as a title. Ranked: \"Relevance, <why it is closed>\" —\n             the reason reaches a screen reader through the same channel it\n             reaches a mouse, rather than living only in a tooltip. -->\n        <span class=\"fe-sr-only\">, {{ sortDirLabel }}</span>\n        <svg\n          v-if=\"!ranked\"\n          class=\"fe-ficon fe-filterbar__sortarrow\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <template v-if=\"sortAscending\">\n            <path d=\"M12 19V5\" />\n            <path d=\"M5 12l7-7 7 7\" />\n          </template>\n          <template v-else>\n            <path d=\"M12 5v14\" />\n            <path d=\"M19 12l-7 7-7-7\" />\n          </template>\n        </svg>\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-filterbar__sortpick\"\n        :aria-label=\"ranked ? sortDirLabel : t('sort.by')\"\n        :title=\"ranked ? sortDirLabel : t('sort.by')\"\n        :disabled=\"ranked\"\n        aria-haspopup=\"menu\"\n        :aria-expanded=\"openPop === 'sort'\"\n        data-testid=\"sort-menu\"\n        @click=\"openSortMenu()\"\n      >\n        <svg\n          class=\"fe-ficon fe-filterbar__caret\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n          focusable=\"false\"\n        >\n          <path d=\"M7 10l5 5 5-5\" />\n        </svg>\n      </button>\n    </div>\n\n    <!-- surucu:d1-actions — the listing's own menu, at the very end of the row.\n         ⚠ VERTICAL dots, and the header's overflow is HORIZONTAL dots, which is\n         the whole distinction: in this product ⋮ means \"act on this thing\" (it\n         is the glyph on every file row) and ⋯ means \"settings for the app\". Two\n         menus one row apart would otherwise read as two doors to one place. -->\n    <button\n      v-if=\"full\"\n      :ref=\"(el) => setAnchorEl('actions', el)\"\n      type=\"button\"\n      class=\"fe-filterbar__actions\"\n      :aria-label=\"t('filter.actions')\"\n      :title=\"t('filter.actions')\"\n      aria-haspopup=\"menu\"\n      :aria-expanded=\"openPop === 'actions'\"\n      data-testid=\"listing-actions\"\n      @click=\"toggle('actions')\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <circle cx=\"12\" cy=\"5.5\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n        <circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n        <circle cx=\"12\" cy=\"18.5\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" />\n      </svg>\n    </button>\n\n    <Teleport to=\"body\">\n      <div\n        v-if=\"openPop\"\n        ref=\"panelEl\"\n        class=\"fe-filterpop\"\n        :class=\"{\n          'fe--theme-light': theme === 'light',\n          'fe--theme-dark': theme === 'dark',\n          'fe-filterpop--sort': openPop === 'sort',\n          'fe-filterpop--actions': openPop === 'actions',\n        }\"\n        :role=\"openPop === 'sort' || openPop === 'actions' ? 'menu' : 'listbox'\"\n        :aria-label=\"popTitle\"\n        :style=\"{ left: pos.x + 'px', top: pos.y + 'px' }\"\n      >\n        <template v-if=\"openPop === 'actions'\">\n          <template v-for=\"a in actionRows\" :key=\"a.key\">\n            <hr v-if=\"a.divider\" class=\"fe-filterpop__rule\" aria-hidden=\"true\" />\n            <button\n              v-else\n              type=\"button\"\n              class=\"fe-filterpop__item\"\n              role=\"menuitem\"\n              :disabled=\"a.disabled\"\n              :aria-disabled=\"a.disabled\"\n              :data-active=\"'false'\"\n              :data-testid=\"`listing-action-${a.key}`\"\n              @click=\"runAction(a.key)\"\n            >\n              <span>{{ a.label }}</span>\n            </button>\n          </template>\n        </template>\n        <template v-else-if=\"openPop === 'sort'\">\n          <button\n            v-for=\"k in SORT_KEYS\"\n            :key=\"k\"\n            type=\"button\"\n            class=\"fe-filterpop__item\"\n            role=\"menuitem\"\n            :data-active=\"sortKey === k ? 'true' : 'false'\"\n            :data-testid=\"`sort-opt-${k}`\"\n            @click=\"pickSortKey(k)\"\n          >\n            <span>{{ t(`col.${k}`) }}</span>\n          </button>\n        </template>\n        <template v-else>\n          <button\n            v-for=\"opt in popOptions\"\n            :key=\"opt\"\n            type=\"button\"\n            class=\"fe-filterpop__item\"\n            role=\"option\"\n            :aria-selected=\"popChecked(opt)\"\n            :data-checked=\"popChecked(opt) ? 'true' : 'false'\"\n            :data-active=\"popChecked(opt) ? 'true' : 'false'\"\n            :data-testid=\"`filter-opt-${opt}`\"\n            @click=\"popPick(opt)\"\n          >\n            <span class=\"fe-filterpop__tick\" aria-hidden=\"true\">{{ popChecked(opt) ? '✓' : '' }}</span>\n            <span>{{ popLabel(opt) }}</span>\n          </button>\n        </template>\n      </div>\n    </Teleport>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ViewSwitcher — the list / grid / gallery toggle.\n *\n * Lifted out of Toolbar.vue unchanged (same classes, same glyphs, same\n * `role=\"tablist\"` semantics — the glyphs moved to lib/actionIcons with the\n * rest of the emoji, see `gorunum:v1-icons`) because the `drive` profile puts it on the\n * breadcrumb row instead of in the header, and two copies of a switcher is\n * how the two rows end up offering different modes. One component, mounted\n * in whichever row the profile asks for.\n *\n * `modes` absent = all three, so every embedder that predates `uiProfile`\n * keeps the switcher it had.\n *\n * ⚠ No `<style>` block — package CSS lives in `styles/base.css` (a scoped\n * block's `data-v` hash does not match in the web-component build).\n */\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport type { ViewMode } from '../types/FileNode';\n\nconst props = defineProps<{\n  viewMode: ViewMode;\n  locale: LocaleCode;\n  modes?: ViewMode[];\n}>();\n\nconst emit = defineEmits<{ (e: 'update:viewMode', v: ViewMode): void }>();\n\nconst { t } = useLocale(() => props.locale);\n\nfunction offers(v: ViewMode): boolean {\n  return !props.modes || props.modes.includes(v);\n}\n</script>\n\n<template>\n  <div class=\"fe-toolbar__view\" role=\"tablist\" :aria-label=\"t('toolbar.view_label')\">\n    <button\n      v-if=\"offers('list')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'list' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'list'\"\n      :title=\"t('toolbar.view.list')\"\n      :aria-label=\"t('toolbar.view.list')\"\n      data-testid=\"view-list\"\n      @click=\"emit('update:viewMode', 'list')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-list')\"></span>\n    </button>\n    <button\n      v-if=\"offers('grid')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'grid' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'grid'\"\n      :title=\"t('toolbar.view.grid')\"\n      :aria-label=\"t('toolbar.view.grid')\"\n      data-testid=\"view-grid\"\n      @click=\"emit('update:viewMode', 'grid')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-grid')\"></span>\n    </button>\n    <button\n      v-if=\"offers('gallery')\"\n      type=\"button\"\n      class=\"fe-btn fe-btn--icon-only\"\n      :class=\"{ 'is-active': viewMode === 'gallery' }\"\n      role=\"tab\"\n      :aria-selected=\"viewMode === 'gallery'\"\n      :title=\"t('toolbar.view.gallery')\"\n      :aria-label=\"t('toolbar.view.gallery')\"\n      data-testid=\"view-gallery\"\n      @click=\"emit('update:viewMode', 'gallery')\"\n    >\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('view-gallery')\"></span>\n    </button>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ListView — tabular layout (name / size / modified).\n *\n * Selection + context menu + double-click open are caller-owned — we\n * just emit the events and let FileExplorer.vue handle them uniformly\n * across List and Grid.\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport ItemCheck from './ItemCheck.vue';\nimport {\n  arrivedFromOutside,\n  ownedByViewer,\n  ownerIdOf,\n  ownerNameOf,\n} from '../lib/fileFilters';\nimport {\n  encryptedFolderTile,\n  fileIconTile,\n  isEncryptedFolder,\n  isStorageRow,\n  typeLabelFor,\n} from '../lib/fileIcons'; /* gorunum:v1-preview · ikon:emoji */\nimport {\n  setSortLocale,\n  useSortStore,\n  type ListingOrder,\n  type SortKey,\n} from '../lib/sortOrder'; /* surucu:d1-sort */\nimport { matchedInContent, snippetSegments } from '../lib/snippet'; /* bul:s3 */\nimport { drawsAsPage, previewKindFor } from '../lib/filePreview'; /* tablo:t1 */\nimport { applyDragGhost } from '../lib/dragGhost'; /* wiring:c4 */\nimport { parentDirOf } from '../lib/listing'; /* Location column — one split rule for every view */\nimport {\n  groupByDate,\n  groupingActive,\n  type DateRun,\n} from '../lib/dateGroups'; /* zaman:z1 · gruplama */\nimport {\n  COLUMNS,\n  columnHidden,\n  columnWidth,\n  columnsCustomised,\n  canMoveColumn,\n  columnOrder,\n  folderIsRemembered,\n  freezeWidths,\n  moveColumn,\n  moveColumnBy,\n  forgetAllFolders,\n  forgetFolder,\n  rememberedCount,\n  resetColumns,\n  setColumnHidden,\n  setColumnWidth,\n  tableLayout,\n  widthsAreAuto,\n  type ColumnId,\n} from '../lib/viewPrefs'; /* tablo:t1 */\nimport StarButton from './StarButton.vue';\n\nconst props = defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  /** Paths that were cut → dim them so the user sees the pending move. */\n  clipped?: Set<string>;\n  /**\n   * Show each row's parent directory under the basename. Caller flips\n   * this on while a search filter is active so the user can tell\n   * `invoice.pdf` (in 2024/) apart from `invoice.pdf` (in 2025/) when\n   * both match the same query.\n   */\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Set of node IDs flagged starred by the user — render an inline\n   *  filled star indicator and let the user toggle it from the row. */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  /** Backend base URL + auth header builder forwarded to StarButton\n   *  so it can POST /api/files/manager/star on click. Optional —\n   *  embedders without auth wire-up pass nothing and the star column\n   *  hides itself. */\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** Desktop selective sync: availability badge per row (kept on this\n   *  computer / syncing right now / online only). Absent on the web —\n   *  no badge renders at all. */\n  keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n  /**\n   * surucu:d1-sort — where these rows got their order (`lib/sortOrder`).\n   *\n   * `relevance` means the server ranked them: this view then draws them in\n   * the order they arrived, groups nothing by date and closes its column\n   * sorts. Omitted = an ordinary folder listing, sorted by the active key —\n   * which is what every caller that does not search passes, including the\n   * split view's secondary pane.\n   */\n  order?: ListingOrder;\n  /**\n   * tablo:t1 — the key the folder on screen is remembered under\n   * (`lib/viewPrefs.folderKey`), or '' when this listing has no folder behind\n   * it or the host turned the memory off. The column menu reads it for its\n   * two per-folder rows and nothing else does; the memory itself is written by\n   * the caller, which is the only thing that knows when a navigation ended.\n   */\n  folderKey?: string;\n  /**\n   * tablo:t1 — the resolved theme, forwarded to the column menu.\n   *\n   * ⚠ Needed because that menu is teleported to <body>, where the `.fe`\n   * ancestor that scopes the design tokens is gone — the same reason\n   * `ContextMenu` takes one, and the class it tags itself with is the same one\n   * `variables.css` already re-applies dark values under.\n   */\n  theme?: ThemeMode;\n  /**\n   * tablo:t1 — the authenticated thumbnail resolver, the same one the grid and\n   * the gallery are handed (`useThumbs.src`).\n   *\n   * ⚠ Optional, and the list draws its type tile when it is absent: an embed\n   * with no auth wire-up cannot fetch a thumb at all, and a broken <img> in\n   * every row would be worse than the glyph it replaced.\n   */\n  thumbSrc?: (n: FileNode) => string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'click-row', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-row', node: FileNode): void;\n  (e: 'context-row', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /**\n   * gorunum:v1 — the order this view actually renders.\n   *\n   * A shift-range is arithmetic over a list, and until now the parent did that\n   * arithmetic over the BACKEND's order while the user was looking at a sorted\n   * one. Sorting by size and shift-clicking two adjacent rows selected\n   * whatever happened to lie between them in the server's answer. Hoisting\n   * folders made it reachable without sorting anything, which is how it was\n   * found. The view knows what it drew; it says so.\n   */\n  (e: 'display-order', nodes: FileNode[]): void;\n}>();\n\nconst {\n  t,\n  formatSize,\n  formatDate,\n  formatDateFull,\n  formatMonthYear,\n  zonedYearMonth,\n  toDate,\n  nodeDisplayName,\n} = useLocale(() => props.locale);\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\nfunction onRowClick(n: FileNode, ev: MouseEvent) {\n  emit('click-row', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onRowDbl(n: FileNode) {\n  emit('dbl-row', n);\n}\n\nfunction onRowCtx(n: FileNode, ev: MouseEvent) {\n  // Stop bubbling so the root `@contextmenu` handler doesn't fire and\n  // clear the selection we just set.\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-row', n, ev);\n}\n\n/**\n * gorunum:v1 — the row's ⋮ button opens THE SAME menu the right-click opens.\n *\n * It emits `context-row` with the same node, i.e. it walks the caller's\n * existing context-menu path (`onContextTarget` → `selectionActionList`) with\n * a synthetic event carrying the button's own corner as the anchor. There is\n * deliberately no second action list here: a menu assembled beside the real\n * one drifts from it the first time an action is added, and the row's \"⋮\" and\n * its right-click would then offer different things on the same file\n * (filex lesson #67).\n */\nfunction onRowMenu(n: FileNode, ev: MouseEvent) {\n  const el = ev.currentTarget as HTMLElement | null;\n  const box = el?.getBoundingClientRect();\n  emit('context-row', n, {\n    clientX: box ? box.left : ev.clientX,\n    clientY: box ? box.bottom : ev.clientY,\n    preventDefault: () => {},\n    stopPropagation: () => {},\n  } as unknown as MouseEvent);\n}\n\n/**\n * issue #26 — the checkbox is the one click that selects (a click anywhere\n * else on the row opens it). It goes out as the same `click-row` emit every\n * other gesture uses, marked `check`, so FilePane routes it to the one\n * `useSelection.click` — one anchor, one set, the one the context menu acts\n * on. See composables/useRowTouch `checkMod`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-row', n, checkMod(ev));\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  /* wiring:c4 — custom ghost (name + multi-select count badge). Visual\n   * only; the payload/selection logic stays in FileExplorer. */\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n/* wiring:c4 — droptarget highlight: the folder row currently hovered by an\n * internal drag gets `.is-droptarget`. Purely visual — the accept/deny\n * decision below is untouched (files never preventDefault, so the browser\n * shows the native no-drop cursor on invalid targets). */\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path; /* wiring:c4 */\n}\n\n/* wiring:c4 */\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null; /* wiring:c4 */\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the row's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-row', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-row', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\nfunction keepGlyph(b: 'kept' | 'syncing' | 'cloud' | 'partial'): string {\n  if (b === 'kept') return '\\u2713';\n  if (b === 'syncing') return '\\u27f3';\n  if (b === 'partial') return '\\u25d0';\n  return '\\u2601';\n}\n\nfunction isPinnedSpecial(n: FileNode): boolean {\n  return n.basename === '.trash' || isStorageRow(n);\n}\n\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms, { time: true }) || '—';\n}\n\n/**\n * zaman:z1 — the hover text behind the date cell: the whole instant, named\n * with the zone it is being read in. The cell itself has room for\n * \"Sep 12, 2026, 3:14 AM\" and no room to say whose 3:14 that is.\n */\nfunction fullDate(ms: number | undefined): string {\n  return formatDateFull(ms);\n}\n\n/**\n * gorunum:v1-preview — the Type column names the KIND: `TypeScript`,\n * `Spreadsheet`, `PDF document`, `Folder`.\n *\n * ⚠ This reverses the note that stood here, which argued the raw extension in\n * caps was \"the only kind fact a listing actually carries\" and that a name\n * table would only repeat what the coloured tile says. Both halves were wrong.\n * `TS` is not a fact about the kind, it is the suffix someone typed; and the\n * tile says *family* (one glyph covers .ts, .go, .css and .sql), which is\n * exactly the distinction a column headed \"Type\" is there to make. The owner\n * asked for the words, and the words are strictly more informative.\n *\n * The table itself is in `lib/fileIcons` beside the extension → family map it\n * is built on, so this column, the info panel and anything else that names a\n * kind read one answer (filex lesson #67). Everything unmapped still falls\n * back to the uppercased extension — no empty cells.\n *\n * The pinned virtual rows (Trash, a storage drive) keep their em dash: Trash\n * is a `type: 'dir'` sentinel, and calling it a folder in this column is the\n * sort of small lie that sends someone looking for it on disk.\n */\nfunction typeLabel(n: FileNode): string {\n  if (isPinnedSpecial(n)) return '—';\n  return typeLabelFor(n, t);\n}\n\n/**\n * tablo:t1 — THE ROW'S PICTURE, where there is a real one to show.\n *\n * The grid and the gallery have drawn true thumbnails for a while; the list\n * drew a type glyph for every row, including a 38 KB photograph. The data was\n * always there and the endpoint always worked — the list simply never asked.\n *\n * ⚠⚠ It asks under exactly the grid's condition, not a second one of its own.\n * `previewKindFor` is non-null for anything we can read as text, and for those\n * the backend's \"thumbnail\" is a generated rectangle with the extension\n * stencilled on it — the same three letters the Type column prints in words\n * two inches to the right. Skipping the call for them is what keeps this\n * costing zero extra requests rather than one per row; copying the rule rather\n * than restating it is what stops the list and the grid disagreeing about\n * which files have pictures (filex lesson #67).\n */\nfunction thumbOf(n: FileNode): string | null {\n  if (n.type === 'dir') return null;\n  if (previewKindFor(n)) return null;\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/** Whether the Type column is on screen. While it is, it already says \"Folder\"\n *  in its own cell, and the word beside the name printed it twice per row. */\nconst typeColumnShown = computed(() => visibleCols.value.includes('type'));\n\n/** The muted \"Folder\" said beside a directory's name — not on the sentinels,\n *  and only while no Type column says it (see typeColumnShown). */\nfunction isPlainDir(n: FileNode): boolean {\n  return n.type === 'dir' && !isPinnedSpecial(n);\n}\n\n/**\n * tablo:t1 — WHERE THE ROW LIVES, for the Location column.\n *\n * ⚠⚠ This used to be a second line printed UNDER the file's name, and that is\n * the defect the owner reported, verbatim: \"name yazılarının altında uzun tire\n * görüyorum aynı modified'da olduğu gibi… her değer kendi sütununda gözükmesi\n * gerekmekte\" — a long dash under the name text, and every value belongs in\n * its own column. Measured on Recent, where every row sits at its storage's\n * root: the parent folder was '' for all of them, the template printed the\n * `|| '—'` fallback, and eleven em dashes hung under eleven filenames. A value\n * with no column of its own has nowhere to be absent from, so it had to invent\n * a placeholder; give it a column and \"no sub-folder\" is simply an empty cell.\n *\n * The storage leads, so this reads the way the reference build's own Location\n * column does (`demo`, `demo/Design`) and a row at the root of a drive still\n * says which drive.\n *\n * ⚠ The folder comes from `parentDirOf` (lib/listing), which splits on the\n * first `://`. This file had its own copy that stripped a URL-scheme pattern\n * instead, and a storage NAME is not a scheme: for `My files` nothing was\n * stripped and this printed `My files/My files://Photos` (2026-09-14).\n */\nfunction locationLabel(n: FileNode): string {\n  const dir = parentDirOf(n.path);\n  const store = String((n as Record<string, unknown>).storage ?? '').trim();\n  return [store, dir].filter(Boolean).join('/');\n}\n\n/* bul:s3 — search-result enrichment. The v0.2 backend inlines `snippet`\n * (plain text, «» highlights) + `matched` on search hits; regular listings\n * never carry them, so presence-gating keeps normal rows untouched and an\n * older backend simply renders nothing extra. */\nfunction rowSnippet(n: FileNode): string {\n  const s = (n as Record<string, unknown>).snippet;\n  return typeof s === 'string' ? s : '';\n}\n\nfunction rowInContent(n: FileNode): boolean {\n  return matchedInContent((n as Record<string, unknown>).matched);\n}\n\n// ------------------------------------------------------------------\n// Column sorting.\n//\n// ⚠⚠ NOT local to the list view any more. The key, the direction, the click\n// cycle and the comparator all live in `lib/sortOrder`, the module-level\n// singleton the filter row's sort control also drives — so these headers and\n// that control are two handles on ONE piece of state rather than two sorts\n// racing to re-order the same rows (filex lesson #67, one level up from the\n// \"folders first\" copy it is about). The headers kept their behaviour: click\n// a column to sort by it, click it again to reverse.\n//\n// ⚠⚠ The old third click — \"back to the backend's order\" — is back, but as a\n// property of the ROWS rather than of the click: `order === 'relevance'` says\n// the server ranked this listing, and then no key is applied, no column\n// claims to be sorting, and these headers close. The filter row's button says\n// \"Relevance\" and why, so the state the list is in is one the control can\n// describe — which is the thing that made `key: null` unworkable as a key.\n//\n// ⚠ Closing the headers is not politeness. A header click while a ranked\n// listing is on screen would set the shared key, move nothing at all, and\n// then re-order the FOLDER the person returns to — a control whose only\n// effect is somewhere the user is not looking.\n// ------------------------------------------------------------------\n\n/** The Type column sorts too now, so every key the filter row's Sort-by menu\n *  offers is reachable from a header as well. */\n/* ⚠⚠ The store of the PANE this list is inside, not a module-level singleton.\n * Two panes of a split each draw a listing and each carry a sort control; one\n * shared answer means the control in the right pane re-orders the left one.\n * With no provider (a bare <ListView>, a host with one listing) this is the\n * default store, i.e. exactly the old behaviour. */\nconst sort = useSortStore();\nconst sortKey = computed<SortKey>(() => sort.key.value);\nconst sortDir = computed(() => sort.dir.value);\n/** These rows are the server's ranked answer — see the `order` prop. */\nconst ranked = computed(() => props.order === 'relevance');\n\n/* `type` sorts by the word this very column prints, so the comparator needs\n * the catalogue that word comes from. */\nwatch(() => props.locale, (l) => setSortLocale(l), { immediate: true });\n\nfunction toggleSort(key: SortKey) {\n  /* ⚠⚠ The `disabled` attribute on the header is the AFFORDANCE, not the\n   * rule. A disabled button suppresses the browser's own activation, but any\n   * click dispatched in script still runs this listener — and an embedder is\n   * free to restyle or re-render these headers. The consequence of letting one\n   * through is invisible and delayed: nothing moves on screen (the listing is\n   * ranked), the shared key is written to `filex.list-sort`, and the FOLDER\n   * the person returns to comes back in an order they never asked for.\n   * Measured 2026-09-13: a scripted click on the closed Size header left the\n   * rows untouched and still turned the stored sort from Name ↑ into Size ↑. */\n  if (ranked.value) return;\n  sort.chooseSortKey(key);\n}\n\n/** What a column header promises. Over a ranked listing the headers are\n *  closed, so they say WHY rather than going quietly grey — the same sentence\n *  the filter row's sort button carries, because it is the same fact. */\nconst sortTitle = computed(() => t(ranked.value ? 'sort.relevance_why' : 'col.sort'));\n\nfunction ariaSort(key: SortKey): 'ascending' | 'descending' | 'none' {\n  // ⚠ 'none' for every column over a ranked listing: `aria-sort` is a claim\n  // about the rows below, and the rows below are in the server's order.\n  if (ranked.value || sortKey.value !== key) return 'none';\n  return sortDir.value === 'asc' ? 'ascending' : 'descending';\n}\n\n// ------------------------------------------------------------------\n// tablo:t2 — the columns: how wide, and who decides.\n//\n// ⚠⚠ THE LAYOUT IS COMPUTED HERE, IN JAVASCRIPT, and applied as inline widths\n// — it is not a stylesheet rule. It used to be three places at once (a base\n// template in `base.css`, a `.fe--narrow` override restating it and a\n// `@media (max-width: 640px)` rule restating it again, each with its own list\n// of cells to `display: none`), and they disagreed: the media query answers\n// the VIEWPORT while `.fe--narrow` answers the CONTAINER, so an embed 500px\n// wide on a 1400px screen got one rule's hiding and the other rule's tracks.\n//\n// ⚠⚠ IT IS A REAL TABLE NOW, not a fit-to-container layout. The previous\n// arrangement sized the columns to the pane and, when they stopped fitting,\n// SHED the least informative one and told the person \"no room\" in the header\n// menu. The owner rejected the model, verbatim: \"büyütme küçültme düzgün\n// çalışmıyor, tablo gibi durmuyor orası. Çok büyütünce yok oluyor, 'no room'\n// diyor — no room demesin, kenara devam eden bir scroll getirsin.\" So the\n// table's width is the sum of its columns, the pane scrolls sideways when that\n// is more than it has, the ⋮ stays pinned to the right edge, and a table\n// narrower than its pane sits at the LEFT with the slack after it.\n// ------------------------------------------------------------------\n\n/** Which optional columns this listing is willing to draw at all, before any\n *  question of width or of the person's own choices. */\nconst candidateCols = computed<ColumnId[]>(() => {\n  const out: ColumnId[] = ['type'];\n  /* Location only where the rows come from more than one folder — the same\n     condition that used to draw the parent path under the name. In an ordinary\n     folder every row shares one location and the column would be a wall of the\n     same string. */\n  if (props.showParentPath) out.push('location');\n  out.push('owner', 'modified', 'size');\n  if (props.starEnabled !== false && (!!props.apiBase || props.apiBase === '')) out.push('star');\n  return out;\n});\n\n/**\n * The width the list actually has.\n *\n * ⚠ Its OWN width, watched with a ResizeObserver, not the window's. An\n * explorer embedded in a side panel is narrow on a wide screen, and that is\n * the case the old media query could not see. It is also the SCROLLPORT's\n * width — `.fe-list` is the scrolling box now, so `contentRect` already has\n * the vertical scrollbar taken out of it and the auto widths are computed\n * against the room a row really has. 0 until the first observation, which\n * `tableLayout` reads as \"keep the shipped widths\" so the first paint is not a\n * guess that then jumps.\n */\nconst listEl = ref<HTMLElement | null>(null);\nconst listWidth = ref(0);\nlet ro: ResizeObserver | null = null;\n\n/**\n * Is the table scrolled off its left edge?\n *\n * Only used to draw the pinned ⋮ column's edge. A permanent divider there\n * would claim the column is floating when it is simply the last cell of a\n * table that fits.\n */\nconst scrolledX = ref(false);\n\nfunction onListScroll(ev: Event) {\n  const el = ev.currentTarget as HTMLElement | null;\n  const on = (el?.scrollLeft ?? 0) > 0;\n  if (on !== scrolledX.value) scrolledX.value = on;\n}\n\nonMounted(() => {\n  if (!listEl.value || typeof ResizeObserver === 'undefined') return;\n  ro = new ResizeObserver((entries) => {\n    const w = entries[0]?.contentRect?.width ?? 0;\n    if (Math.abs(w - listWidth.value) >= 1) listWidth.value = w;\n  });\n  ro.observe(listEl.value);\n});\nonBeforeUnmount(() => {\n  ro?.disconnect();\n  ro = null;\n  window.removeEventListener('pointermove', onResizeMove);\n  window.removeEventListener('pointerup', onResizeEnd);\n});\n\nconst layout = computed(() => tableLayout(listWidth.value, candidateCols.value));\nconst visibleCols = computed<ColumnId[]>(() => layout.value.visible);\n\n/**\n * ONE object, bound to the header and to every row.\n *\n * ⚠⚠ The header has to be exactly as wide as the rows or it drifts out of line\n * with its own columns the moment the table is scrolled sideways — which is\n * worse than having no header at all, because it labels the wrong values.\n * `min-width: 100%` in the stylesheet is what keeps a NARROW table's rows\n * spanning the pane (so hover and selection do not stop halfway across) while\n * the cells inside them still pack left.\n */\nconst tableStyle = computed(() => ({ width: `${layout.value.total}px` }));\n\n/** A drawn track's width, as the inline style the cell carries. `flex-basis`\n *  rather than a grid track, because the pinned ⋮ has to be able to move\n *  within the row — a sticky GRID item is confined to its own grid area and\n *  therefore cannot move at all. */\nfunction colStyle(id: ColumnId) {\n  return { flex: `0 0 ${layout.value.widths[id] ?? columnWidth(id)}px` };\n}\n\n/** A column's cell class — the existing `fe-list__col--*` names, so every\n *  style already written against them keeps applying. */\nfunction colClass(id: ColumnId): string {\n  return `fe-list__col fe-list__col--${id === 'modified' ? 'mod' : id}`;\n}\n\n/** The four keys a header can sort by, keyed by column. Location and the star\n *  are not sorts: there is no `SortKey` for either, and inventing one would put\n *  a word in the Sort-by menu that means nothing in nine listings out of ten. */\nconst SORT_OF: Partial<Record<ColumnId, SortKey>> = {\n  type: 'type',\n  modified: 'modified',\n  size: 'size',\n};\n\nconst COL_LABEL: Record<ColumnId, string> = {\n  name: 'col.name',\n  type: 'col.type',\n  location: 'col.location',\n  owner: 'col.owner',\n  modified: 'col.modified',\n  size: 'col.size',\n  star: 'col.star',\n};\n\nfunction colLabel(id: ColumnId): string {\n  return t(COL_LABEL[id]);\n}\n\n/** What the cell prints for this row. One switch, so the head's order and the\n *  body's values are driven by the same list. */\nfunction cellText(id: ColumnId, n: FileNode): string {\n  switch (id) {\n    case 'type':\n      return typeLabel(n);\n    case 'location':\n      return locationLabel(n);\n    case 'owner':\n      return ownerLabel(n);\n    case 'modified':\n      return displayDate(n.last_modified);\n    case 'size':\n      return formatSize(n.size);\n    default:\n      return '';\n  }\n}\n\nfunction cellTitle(id: ColumnId, n: FileNode): string | undefined {\n  if (id === 'owner') return ownerTitle(n);\n  if (id === 'modified') return fullDate(n.last_modified);\n  if (id === 'location') return locationLabel(n) || undefined;\n  return undefined;\n}\n\n/**\n * The name cell's hover text.\n *\n * ⚠ Carries the location too when the Location column is not drawn — which\n * now only happens when the person has turned it off, since width sheds\n * nothing. The point of moving the parent path into a column was that every\n * value gets a column; the point of this line is that a column somebody hid\n * must not silently destroy the only copy of a fact, or `report.pdf` in two\n * folders is two identical rows.\n */\nfunction nameTitle(n: FileNode): string {\n  if (!props.showParentPath || visibleCols.value.includes('location')) return n.basename;\n  const loc = locationLabel(n);\n  return loc ? `${n.basename} · ${loc}` : n.basename;\n}\n\n// ── resizing ──────────────────────────────────────────────────────────\n\nfunction isResizable(id: ColumnId): boolean {\n  return COLUMNS.find((c) => c.id === id)?.resizable === true;\n}\n\n/**\n * ⚠⚠ NAME HAS A HANDLE NOW, and the note that stood here said the opposite:\n * \"there is deliberately NO handle on Name… it is whatever the fixed columns\n * leave, so dragging Name can only mean dragging everything else.\" That was\n * true of the flexible `minmax(220px, 1fr)` track, and the track is what the\n * owner rejected: \"küçültme yapınca name kısmı büyüyormuş gibi davranıyor — bu\n * davranış yanlış, istersem name'i de kısabilir olmalıyım.\" Name is an\n * ordinary column with a width of its own, so its handle resizes the column it\n * sits on, like every other.\n */\nlet resizing: { id: ColumnId; startX: number; startW: number } | null = null;\n\n/**\n * THE FIRST DRAG FREEZES THE WHOLE ROW.\n *\n * ⚠⚠ Not just the column under the pointer. Until somebody sizes a column the\n * widths are derived from the pane (`tableLayout`, auto), and auto Name takes\n * whatever slack is going — so narrowing Size while Name is still auto would\n * widen Name, which is precisely the behaviour being fixed. Committing every\n * drawn width the instant a gesture starts turns the drag into what it looks\n * like, and is also what makes \"I have never touched this\" distinguishable\n * from \"I deliberately made Name narrow\" forever after (`widthsAreAuto`).\n */\nfunction freezeBeforeEdit() {\n  if (!widthsAreAuto()) return;\n  freezeWidths(layout.value.widths);\n}\n\nfunction onResizeStart(id: ColumnId, ev: PointerEvent) {\n  if (!isResizable(id)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  freezeBeforeEdit();\n  resizing = { id, startX: ev.clientX, startW: columnWidth(id) };\n  /* ⚠ On the WINDOW, not on the handle with setPointerCapture: the pointer\n   * leaves the 9px handle within the first few pixels of any real drag, and a\n   * capture on an element Vue may re-render mid-drag (the template width is\n   * reactive and changes on every move) is released the moment that element is\n   * patched — the column would stop following the cursor halfway. */\n  window.addEventListener('pointermove', onResizeMove);\n  window.addEventListener('pointerup', onResizeEnd);\n}\n\nfunction onResizeMove(ev: PointerEvent) {\n  if (!resizing) return;\n  setColumnWidth(resizing.id, resizing.startW + (ev.clientX - resizing.startX));\n}\n\nfunction onResizeEnd() {\n  resizing = null;\n  window.removeEventListener('pointermove', onResizeMove);\n  window.removeEventListener('pointerup', onResizeEnd);\n}\n\n/** Keyboard resizing — the handle is focusable, so it has to do something.\n *  16px a step, which is about one character of the 13px body text. */\nfunction onResizeKey(id: ColumnId, ev: KeyboardEvent) {\n  const step = ev.key === 'ArrowLeft' ? -16 : ev.key === 'ArrowRight' ? 16 : 0;\n  if (!step) return;\n  ev.preventDefault();\n  freezeBeforeEdit();\n  setColumnWidth(id, columnWidth(id) + step);\n}\n\n/** Double-click a handle: back to this column's shipped width. \"Size to fit\"\n *  would mean measuring every cell in a listing that may be thousands of rows\n *  long, and the honest cheap answer is the default. */\nfunction onResizeReset(id: ColumnId) {\n  const spec = COLUMNS.find((c) => c.id === id);\n  if (!spec) return;\n  freezeBeforeEdit();\n  setColumnWidth(id, spec.width);\n}\n\n// ── reordering ────────────────────────────────────────────\n\n/**\n * DRAG A HEADER TO MOVE ITS COLUMN — the owner's third ask for this table:\n * \"ayrıca yerlerini falan değiştirebilir olayım ya o sütunların.\"\n *\n * ⚠⚠ The threshold is the whole difficulty. Clicking a header sorts and\n * dragging it moves, and both start with the same pointerdown — so a reorder\n * that begins on the first pixel of movement turns every sort click into an\n * accidental two-pixel drag. Nothing happens here until the pointer has\n * travelled `DRAG_SLOP`; below that the gesture stays a click and the sort\n * button gets it, untouched. Above it, the click the browser fires on\n * pointerup is swallowed on its way past (`onHeadClickCapture`), or every\n * completed drag would also re-sort the column it had just moved.\n *\n * ⚠ Name is not in this: it is pinned first and nothing may be dropped before\n * it. It carries the tick, the icon and the row's click target, which is why\n * every file manager pins it — and `columnOrder` enforces it, so a document\n * that claims otherwise cannot put a column ahead of the one the row is read\n * by. Its WIDTH is the person's, though; only its place is fixed.\n */\nconst DRAG_SLOP = 5;\nlet dragState: { id: ColumnId; startX: number; armed: boolean } | null = null;\n/** The column being dragged, once the slop is cleared. */\nconst dragCol = ref<ColumnId | null>(null);\n/** Where it would land: an index into the drawn columns. */\nconst dropAt = ref<number | null>(null);\n/**\n * When a real drag last ended — the one thing standing between \"I moved a\n * column\" and \"I moved a column and also re-sorted it\".\n *\n * ⚠⚠ A TIMESTAMP and not a boolean. A flag is armed on pointerup and\n * disarmed by the click that follows — except when no click follows, which\n * happens whenever the pointer went down on one header and up on another and\n * the browser found no common ancestor to fire on. The flag then sits armed\n * and eats the NEXT header click the person makes, which is a sort that\n * silently does nothing minutes later. A window bounds the damage to the\n * gesture it belongs to. Measured 2026-09-13: a sort click after a reorder\n * drag did nothing at all.\n */\nlet dragEndedAt = 0;\nconst CLICK_SWALLOW_MS = 300;\n/** Set by Escape, cleared by the pointerup it pre-empts. */\nlet cancelled = false;\n\nfunction isMovable(id: ColumnId): boolean {\n  return COLUMNS.find((c) => c.id === id)?.hideable === true;\n}\n\nfunction onHeadPointerDown(id: ColumnId, ev: PointerEvent) {\n  if (ev.button !== 0 || !isMovable(id)) return;\n  dragState = { id, startX: ev.clientX, armed: false };\n  window.addEventListener('pointermove', onHeadPointerMove);\n  window.addEventListener('pointerup', onHeadPointerUp);\n  window.addEventListener('keydown', onDragKey, true);\n}\n\nfunction onHeadPointerMove(ev: PointerEvent) {\n  if (!dragState) return;\n  if (!dragState.armed) {\n    if (Math.abs(ev.clientX - dragState.startX) < DRAG_SLOP) return;\n    dragState.armed = true;\n    dragCol.value = dragState.id;\n  }\n  /* Where the pointer is, in terms of the drawn header cells. The insertion\n   * point is the gap nearest the cursor, and it is ONE number — the marker\n   * draws it and the drop applies it, so the picture cannot promise a landing\n   * the drop does not honour. */\n  const head = listEl.value?.querySelector('.fe-list__head');\n  if (!head) return;\n  const cells = [...head.querySelectorAll('.fe-list__col')] as HTMLElement[];\n  /* The first two cells are the tick and Name, the last is the row menu; only\n     the ones between are positions a column can take. */\n  const movable = cells.slice(2, 2 + visibleCols.value.length);\n  let idx = movable.length;\n  for (let i = 0; i < movable.length; i++) {\n    const box = movable[i].getBoundingClientRect();\n    if (ev.clientX < box.left + box.width / 2) {\n      idx = i;\n      break;\n    }\n  }\n  dropAt.value = idx;\n}\n\nfunction onHeadPointerUp() {\n  const st = dragState;\n  const target = dropAt.value;\n  endDrag();\n  /* ⚠ `cancelled` is checked as well as `armed`: Escape clears `dragState`,\n   * but a pointerup already queued behind it must not be able to complete the\n   * drop the person just abandoned. */\n  if (!st?.armed || cancelled) {\n    cancelled = false;\n    return;\n  }\n  dragEndedAt = Date.now();\n  if (target == null) return;\n  /* Translate a position among the DRAWN columns into a position in the full\n   * stored order: a column shed for want of room still has a place in the\n   * sequence, and dropping between two visible columns must not silently\n   * reshuffle the one hiding between them. */\n  const drawn = visibleCols.value.filter((id) => id !== st.id);\n  const before = drawn[Math.min(target, drawn.length)];\n  const full = columnOrder();\n  moveColumn(st.id, before ? full.indexOf(before) : full.length);\n}\n\nfunction onDragKey(ev: KeyboardEvent) {\n  if (ev.key !== 'Escape') return;\n  /* Cancel: the drop is abandoned and nothing is written. The click is still\n   * swallowed, because the pointer is mid-gesture and releasing it over a\n   * header would otherwise sort the very column the person was rescuing. */\n  ev.stopPropagation();\n  const armed = dragState?.armed === true;\n  endDrag();\n  if (armed) {\n    cancelled = true;\n    dragEndedAt = Date.now();\n  }\n}\n\nfunction endDrag() {\n  dragState = null;\n  dragCol.value = null;\n  dropAt.value = null;\n  window.removeEventListener('pointermove', onHeadPointerMove);\n  window.removeEventListener('pointerup', onHeadPointerUp);\n  window.removeEventListener('keydown', onDragKey, true);\n}\n\n/** Capture phase, on the header row: a click that ended a drag never reaches\n *  the sort button underneath it. */\nfunction onHeadClickCapture(ev: MouseEvent) {\n  if (Date.now() - dragEndedAt > CLICK_SWALLOW_MS) return;\n  dragEndedAt = 0;\n  ev.preventDefault();\n  ev.stopPropagation();\n}\n\n// ── the column menu ───────────────────────────────────────────────────\n\n/**\n * A small settings popover, opened by the header's own ⋮ or by right-clicking\n * the header — the two gestures the owner named.\n *\n * ⚠ Not `ContextMenu`, and that is not a second menu in the sense filex lesson\n * #67 warns about: nothing here is an action on a file, so there is no action\n * list to drift out of step with the row menu's. It is a panel of checkboxes,\n * which a menu cannot be — a menu closes on every pick, so turning four\n * columns off would be four separate right-clicks.\n */\nconst colMenuOpen = ref(false);\nconst colMenuX = ref(0);\nconst colMenuY = ref(0);\nconst colMenuEl = ref<HTMLElement | null>(null);\n\nconst prefersDark = ref(false);\nonMounted(() => {\n  try {\n    prefersDark.value = window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n  } catch {\n    /* jsdom / no matchMedia */\n  }\n});\nconst colMenuThemeClass = computed(\n  () => `fe-ctx-backdrop--theme-${props.theme || 'auto'}`,\n);\n\n/** Everything the person may toggle here: the candidates, minus the ones that\n *  are not theirs to hide (the star follows the Starred view's own rule). */\nconst menuCols = computed(() =>\n  /* In the person's OWN order, so this list reads as the list on screen — a\n     settings panel that disagrees with the thing it configures is how someone\n     ends up nudging the wrong column left. */\n  columnOrder()\n    .filter((id) => COLUMNS.find((c) => c.id === id)?.hideable && candidateCols.value.includes(id))\n    /* ⚠ No `squeezed` flag any more, and no \"no room\" note beside a ticked\n       row. It existed because a column could be ON and still not drawn, for\n       want of width; nothing is dropped for width now, so a ticked column is\n       on screen — possibly past the right edge, where the table scrolls to\n       reach it. A note that can no longer be true is worse than no note. */\n    .map((id) => ({\n      id,\n      label: colLabel(id),\n      on: !columnHidden(id),\n      canLeft: canMoveColumn(id, -1),\n      canRight: canMoveColumn(id, 1),\n    })),\n);\n\n/** The same move the drag performs, reachable from the keyboard. A reorder\n *  only a mouse can do is a reorder half the people using this cannot do. */\nfunction nudgeCol(id: ColumnId, delta: -1 | 1) {\n  moveColumnBy(id, delta);\n}\n\nconst canResetCols = computed(() => columnsCustomised());\nconst rememberedFolders = computed(() => rememberedCount());\nconst thisFolderRemembered = computed(() => !!props.folderKey && folderIsRemembered(props.folderKey));\n\nasync function openColMenu(ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  const el = ev.currentTarget as HTMLElement | null;\n  const box = el?.getBoundingClientRect();\n  /* Anchored to the BUTTON's corner when it came from the ⋮, to the pointer\n   * when it came from a right-click — the two gestures mean different things\n   * about where the person is looking. */\n  colMenuX.value = ev.clientX || (box ? box.left : 0);\n  colMenuY.value = ev.clientY || (box ? box.bottom : 0);\n  colMenuOpen.value = true;\n  await nextTick();\n  clampColMenu();\n  colMenuEl.value?.focus();\n}\n\n/** Keep it on screen. Opened from a header at the right edge it would\n *  otherwise hang off the window with no way to reach the last row. */\nfunction clampColMenu() {\n  const el = colMenuEl.value;\n  if (!el) return;\n  const box = el.getBoundingClientRect();\n  const pad = 8;\n  if (box.right > window.innerWidth - pad) {\n    colMenuX.value = Math.max(pad, window.innerWidth - pad - box.width);\n  }\n  if (box.bottom > window.innerHeight - pad) {\n    colMenuY.value = Math.max(pad, window.innerHeight - pad - box.height);\n  }\n}\n\nfunction closeColMenu() {\n  colMenuOpen.value = false;\n}\n\nfunction toggleCol(id: ColumnId) {\n  setColumnHidden(id, !columnHidden(id));\n}\n\nfunction onResetColumns() {\n  resetColumns();\n}\n\n/**\n * \"Apply to all folders\" — the escape hatch.\n *\n * ⚠ It only FORGETS. It does not need to write anything, because the global\n * default is already this folder's setup: every deliberate change writes both\n * the folder's memory and the global preference (`filex.view-mode`,\n * `filex.list-sort`), so throwing the per-folder map away leaves exactly one\n * answer standing — the one on screen. That property is the reason the rule\n * fits in a sentence.\n */\nfunction onApplyToAll() {\n  forgetAllFolders();\n  closeColMenu();\n}\n\nfunction onForgetFolder() {\n  if (props.folderKey) forgetFolder(props.folderKey);\n  closeColMenu();\n}\n\nconst rows = computed(() => {\n  // Virtual rows (.trash / storage drives) stay pinned on top in their\n  // original order; only real entries take part in the sort.\n  const pinned: FileNode[] = [];\n  const rest: FileNode[] = [];\n  for (const n of props.files) (isPinnedSpecial(n) ? pinned : rest).push(n);\n\n  /* The listing's order, from the one place that owns the rule\n   * (`lib/sortOrder.compareInOrder`). An ordinary folder: folders first, then\n   * the active key. A ranked answer: folders first and NOTHING else, which is\n   * byte-for-byte the pass GridView already makes — so the two views cannot\n   * disagree in either mode. Array#sort is stable, so ties keep the order the\n   * backend answered in, and in `relevance` every pair of same-kind rows is a\n   * tie: that stability IS how the server's ranking survives this line. */\n  return [...pinned, ...rest.sort(sort.compareInOrder(props.order ?? 'sort'))];\n});\n\n// ------------------------------------------------------------------\n// Date grouping — only while sorted by modified date. Rows are split\n// into contiguous segments so the row markup below stays untouched.\n//\n// ⚠⚠ The LADDER and the \"is a heading honest here\" rule both moved to\n// `lib/dateGroups`, because the grid and the gallery draw the same headings\n// now and a second copy of either would drift the first time a rung changed.\n// This file keeps only what is its own: which rows are aside from the dates.\n// ------------------------------------------------------------------\n\n/* zaman:z1 — the headings answer \"what day is this row from\", so they read the\n * same clock the cell beside them prints (composables/useLocale → lib/timezone\n * → lib/dateGroups). They used to ask the DEVICE, so for a viewer set to UTC a\n * file touched at 01:00 Istanbul sat under \"Today\" in the group header and\n * printed yesterday's date in its own cell, one line apart. */\nconst groupLabels = computed(() => ({ t, formatMonthYear, zonedYearMonth }));\n\nwatch(\n  rows,\n  (list) => emit('display-order', list),\n  { immediate: true },\n);\n\n/* ── Owner ────────────────────────────────────────────────────────────────\n *\n * Three answers, and only three: your own name is \"You\", a row nobody put here\n * through filex is \"System\", and anything else is the account's display name.\n *\n * ⚠ \"System\" is not a placeholder for missing data — it is the true answer for\n * a file the scanner found in the bucket, and most rows on a mounted storage\n * are exactly that. Leaving the cell blank there would read as \"we failed to\n * look it up\", which is a different and false statement. */\nfunction ownerLabel(n: FileNode): string {\n  if (ownedByViewer(n)) return t('owner.you');\n  if (ownerIdOf(n) === null) return t('owner.system');\n  return ownerNameOf(n) || t('owner.unknown');\n}\n\n/** The hover text. It carries the two facts the column has no room for: that\n *  the bytes were handed in by an anonymous visitor through a drop link, and\n *  who touched the thing last when that is not the owner. */\nfunction ownerTitle(n: FileNode): string {\n  const parts = [ownerLabel(n)];\n  if (arrivedFromOutside(n)) parts.push(t('owner.external'));\n  const actor = (n as Record<string, unknown>).last_actor_name;\n  const actorSelf = (n as Record<string, unknown>).last_actor_self === true;\n  const actorId = (n as Record<string, unknown>).last_actor_id;\n  if (actorSelf || (typeof actor === 'string' && actor)) {\n    const who = actorSelf ? t('owner.you') : String(actor);\n    if (who !== parts[0]) parts.push(t('owner.last_actor', { who }));\n  } else if (actorId === undefined && ownerIdOf(n) !== null) {\n    // An owned row whose last change came from outside filex.\n    parts.push(t('owner.last_actor', { who: t('owner.system') }));\n  }\n  return parts.join(' · ');\n}\n\nconst segments = computed<DateRun<FileNode>[]>(() =>\n  groupByDate(rows.value, {\n    /* ⚠ `ranked` is half of this and not a detail: over a search's ranked\n     * answer the key is still `modified` (nothing cleared it), the listing\n     * just is not obeying it — see `lib/dateGroups.groupingActive`. */\n    active: groupingActive(sortKey.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    /* ⚠ Folders are their OWN run, above the first date heading, and that is\n     * what lets \"folders before files\" hold while sorted by date. The rule\n     * used to be softened instead — rows sorted by date, folders floating to\n     * the top of each bucket — because hoisting them all would have split a\n     * bucket in two and drawn \"Today\" twice, once over the folders and once\n     * over the files. A run of their own removes that reason, and a folder has\n     * no meaningful modification date to file under anyway. */\n    aside: (n) =>\n      isPinnedSpecial(n) ? { id: 'pinned' } : n.type === 'dir' ? { id: 'dirs' } : null,\n    labels: groupLabels.value,\n  }).runs,\n);\n</script>\n\n<template>\n  <!-- wiring:c4 — grid semantics: container role + localized labels; rows\n       carry aria-selected below. Structure/layout untouched. -->\n  <div\n    ref=\"listEl\"\n    class=\"fe-list\"\n    :class=\"{\n      'is-loading': loading,\n      'has-star-col': !!apiBase || apiBase === '',\n      'is-scrolled-x': scrolledX,\n    }\"\n    role=\"grid\"\n    :aria-label=\"t('list.aria')\"\n    :aria-busy=\"loading ? 'true' : undefined\"\n    @scroll.passive=\"onListScroll\"\n  >\n    <!-- tablo:t2 — every width is INLINE, computed from the person's own\n         columns and, until they touch one, from the pane (lib/viewPrefs\n         .tableLayout). The head and the rows carry the SAME width object, so a\n         table scrolled sideways cannot drift out of line with its header. -->\n    <div\n      class=\"fe-list__head\"\n      role=\"row\"\n      :class=\"{ 'is-dragging-col': !!dragCol }\"\n      :style=\"tableStyle\"\n      @contextmenu=\"openColMenu\"\n      @click.capture=\"onHeadClickCapture\"\n    >\n      <!-- gorunum:v1 — the checkbox column's header stays empty on purpose: a\n           select-all tick here is a real affordance with real consequences\n           (Delete acts on the selection) and the spec does not call for one. -->\n      <div class=\"fe-list__col fe-list__col--check\" role=\"columnheader\"></div>\n      <div\n        class=\"fe-list__col fe-list__col--name\"\n        role=\"columnheader\"\n        :style=\"colStyle('name')\"\n        :aria-sort=\"ariaSort('name')\"\n      >\n        <button type=\"button\" class=\"fe-list__sort\" :disabled=\"ranked\" :title=\"sortTitle\" @click=\"toggleSort('name')\">\n          {{ t('col.name') }}\n          <span v-if=\"!ranked && sortKey ==='name'\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortDir === 'asc' ? '↑' : '↓' }}</span>\n        </button>\n        <!-- Name's own handle. It used to have none, because Name was the\n             flexible track and \"dragging Name\" could only mean dragging\n             everything else; it has a width of its own now, so it drags like\n             any other column — in both directions. -->\n        <span\n          class=\"fe-list__resize\"\n          role=\"separator\"\n          aria-orientation=\"vertical\"\n          tabindex=\"0\"\n          :aria-label=\"t('cols.resize', { col: t('col.name') })\"\n          :title=\"t('cols.resize', { col: t('col.name') })\"\n          @pointerdown=\"onResizeStart('name', $event)\"\n          @dblclick.stop=\"onResizeReset('name')\"\n          @keydown=\"onResizeKey('name', $event)\"\n        ></span>\n      </div>\n      <!-- surucu:d1-sort — Type / Modified / Size sort; Location and the star\n           do not, because there is no SortKey for either and inventing one\n           would put a word in the Sort-by menu that means nothing in nine\n           listings out of ten. Owner is the same case: the People chip is how\n           you narrow by person. -->\n      <div\n        v-for=\"(id, ci) in visibleCols\"\n        :key=\"id\"\n        :class=\"[\n          colClass(id),\n          {\n            'is-col-dragging': dragCol === id,\n            'is-drop-before': dropAt === ci && !!dragCol && dragCol !== id,\n            'is-drop-after': dropAt === visibleCols.length && ci === visibleCols.length - 1 && !!dragCol,\n            'is-movable': isMovable(id),\n          },\n        ]\"\n        role=\"columnheader\"\n        :style=\"colStyle(id)\"\n        :aria-sort=\"SORT_OF[id] ? ariaSort(SORT_OF[id]!) : undefined\"\n        :aria-label=\"id === 'star' ? t('col.star') : undefined\"\n        @pointerdown=\"onHeadPointerDown(id, $event)\"\n      >\n        <button\n          v-if=\"SORT_OF[id]\"\n          type=\"button\"\n          class=\"fe-list__sort\"\n          :disabled=\"ranked\"\n          :title=\"sortTitle\"\n          @click=\"toggleSort(SORT_OF[id]!)\"\n        >\n          {{ colLabel(id) }}\n          <span v-if=\"!ranked && sortKey === SORT_OF[id]\" class=\"fe-list__sort-arrow\" aria-hidden=\"true\">{{ sortDir === 'asc' ? '↑' : '↓' }}</span>\n        </button>\n        <span v-else-if=\"id !== 'star'\" class=\"fe-list__head-label\">{{ colLabel(id) }}</span>\n        <!-- The drag handle straddles the divider on this column's trailing\n             edge. `role=\"separator\"` and focusable, so the arrow keys move it\n             too — a handle you can only reach with a mouse is a handle half\n             the people using this cannot reach at all. -->\n        <span\n          v-if=\"isResizable(id)\"\n          class=\"fe-list__resize\"\n          role=\"separator\"\n          aria-orientation=\"vertical\"\n          tabindex=\"0\"\n          :aria-label=\"t('cols.resize', { col: colLabel(id) })\"\n          :title=\"t('cols.resize', { col: colLabel(id) })\"\n          @pointerdown=\"onResizeStart(id, $event)\"\n          @dblclick.stop=\"onResizeReset(id)\"\n          @keydown=\"onResizeKey(id, $event)\"\n        ></span>\n      </div>\n      <div class=\"fe-list__col fe-list__col--menu\" role=\"columnheader\">\n        <button\n          type=\"button\"\n          class=\"fe-list__menu fe-list__colmenu-btn\"\n          :title=\"t('cols.menu')\"\n          :aria-label=\"t('cols.menu')\"\n          aria-haspopup=\"dialog\"\n          :aria-expanded=\"colMenuOpen ? 'true' : 'false'\"\n          @click=\"openColMenu\"\n        ><span aria-hidden=\"true\">&#8942;</span></button>\n      </div>\n    </div>\n    <div class=\"fe-list__body\" role=\"rowgroup\">\n      <template v-for=\"seg in segments\" :key=\"seg.id\">\n      <div v-if=\"seg.label\" class=\"fe-list__group\" role=\"presentation\">{{ seg.label }}</div>\n      <div\n        v-for=\"n in seg.items\"\n        :key=\"n.path\"\n        class=\"fe-list__row\"\n        :class=\"{\n          'is-selected': isSelected(n),\n          'is-dir': n.type === 'dir',\n          'is-trash': n.trashed,\n          'is-clipped': clipped?.has(n.path),\n          'is-droptarget': dropTargetPath === n.path /* wiring:c4 */,\n        }\"\n        role=\"row\"\n        tabindex=\"0\"\n        :style=\"tableStyle /* tablo:t2 — the head's own width, so the two cannot drift */\"\n        :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n        :aria-label=\"nodeDisplayName(n) /* wiring:c4 */\"\n        :data-fe-path=\"n.path /* wiring:d1 — middle-click open-in-new-tab delegation */\"\n        draggable=\"true\"\n        @click=\"onRowClick(n, $event)\"\n        @dblclick=\"onRowDbl(n)\"\n        @contextmenu=\"onRowCtx(n, $event)\"\n        @dragstart=\"onItemDragStart(n, $event)\"\n        @dragover=\"onItemDragOver(n, $event)\"\n        @dragleave=\"onItemDragLeave(n) /* wiring:c4 */\"\n        @drop=\"onItemDrop(n, $event)\"\n        @touchstart.passive=\"touch.onTouchStart(n, $event)\"\n        @touchend=\"touch.onTouchEnd\"\n        @touchmove.passive=\"touch.onTouchMove\"\n      >\n        <!-- issue #26 — the tick is the one click that selects; the whole\n             cell is its target, so a click that just misses the box does not\n             open the row instead. `data-fe-control` keeps a finger on the\n             cell from counting as a tap on the row (useRowTouch). -->\n        <div\n          class=\"fe-list__col fe-list__col--check\"\n          role=\"gridcell\"\n          data-fe-control\n          @click.stop=\"onCheckClick(n, $event)\"\n          @dblclick.stop\n        >\n          <ItemCheck :on=\"isSelected(n)\" :label=\"nodeDisplayName(n)\" />\n        </div>\n        <div class=\"fe-list__col fe-list__col--name\" role=\"gridcell\" :style=\"colStyle('name')\">\n          <!-- ikon:emoji — an encrypted folder is still a FOLDER: it keeps the\n               folder's shape and colour with the padlock cut out of it, and the\n               span carries the name the bare lock emoji never had. One definition\n               for all three views, in lib/fileIcons. -->\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"isEncryptedFolder(n)\"\n            class=\"fe-list__icon fe-list__icon--svg\"\n            role=\"img\"\n            :aria-label=\"t('e2e.badge')\"\n            v-html=\"encryptedFolderTile()\"\n          ></span>\n          <!-- tablo:t1 — the real thumbnail, at the tile's own size so the row\n               height does not move. `draggable=\"false\"` for the reason the\n               grid gives: dragging an <img> puts a 'Files' MIME on the\n               dataTransfer and the parent's upload handler re-uploads the\n               thing you were only moving. -->\n          <img\n            v-else-if=\"thumbOf(n)\"\n            class=\"fe-list__icon fe-list__icon--img\"\n            :class=\"{ 'fe-thumb--page': drawsAsPage(n) }\"\n            :src=\"thumbOf(n)!\"\n            alt=\"\"\n            aria-hidden=\"true\"\n            loading=\"lazy\"\n            draggable=\"false\"\n          />\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span v-else class=\"fe-list__icon fe-list__icon--svg\" aria-hidden=\"true\" v-html=\"fileIconTile(n)\"></span>\n          <div class=\"fe-list__name-wrap\">\n            <span class=\"fe-list__name\" :title=\"nameTitle(n)\">\n              {{ nodeDisplayName(n) }}\n              <!-- bul:s3 — content-match badge -->\n              <span v-if=\"rowInContent(n)\" class=\"fe-list__badge\">{{ t('search.in_content') }}</span>\n              <span\n                v-if=\"keepBadgeFor && keepBadgeFor(n)\"\n                :class=\"['fe-keepbadge', 'fe-keepbadge--' + keepBadgeFor(n)]\"\n                :title=\"t('keep.badge_' + keepBadgeFor(n))\"\n                role=\"img\"\n                :aria-label=\"t('keep.badge_' + keepBadgeFor(n))\"\n              >{{ keepGlyph(keepBadgeFor(n)!) }}</span>\n            </span>\n            <!-- tablo:t1 — the parent path used to be a second line HERE, and\n                 printed an em dash when a row had no sub-folder. That is the\n                 dash the owner reported under the filenames; it is a Location\n                 COLUMN now (\"her değer kendi sütununda gözükmesi gerekmekte\"),\n                 and a row at a storage's root simply has an empty cell. -->\n            <!-- bul:s3 — content snippet («» → <mark> via TEXT segments, no innerHTML) -->\n            <span v-if=\"rowSnippet(n)\" class=\"fe-list__snippet\">\n              <template v-for=\"(seg, si) in snippetSegments(rowSnippet(n))\" :key=\"si\">\n                <mark v-if=\"seg.match\" class=\"fe-list__mark\">{{ seg.text }}</mark>\n                <template v-else>{{ seg.text }}</template>\n              </template>\n            </span>\n          </div>\n          <!-- gorunum:v1 — the kind, said in words beside the name. OUTSIDE\n               `.fe-list__name`: the shot scripts read that element's\n               textContent as the filename (e2e/shots/starstags.mjs), and a\n               row whose name reads \"Reports Folder\" breaks them silently. -->\n          <span v-if=\"isPlainDir(n) && !typeColumnShown\" class=\"fe-list__kind\">{{ t('node.folder') }}</span>\n        </div>\n        <!-- tablo:t1 — one loop over the SAME list the header draws, so a\n             column cannot exist in one and not the other, and the values land\n             in the tracks the inline template allocated. -->\n        <template v-for=\"id in visibleCols\" :key=\"id\">\n          <div\n            v-if=\"id === 'star'\"\n            class=\"fe-list__col fe-list__col--star\"\n            role=\"gridcell\"\n            :style=\"colStyle(id)\"\n          >\n            <!-- issue #26 — only the star itself is a control; the rest of the\n                 cell (all of it on a folder, which has no star) opens the row\n                 like any other empty space on it. `display: contents`, so the\n                 wrapper stops the click without moving the star. -->\n            <span\n              v-if=\"starEnabled !== false && typeof n.id === 'number' && n.type === 'file'\"\n              class=\"fe-list__star-hit\"\n              data-fe-control\n              @click.stop\n              @dblclick.stop\n            >\n              <StarButton\n                :starred=\"!!starredIds?.has(n.id)\"\n                :node-id=\"n.id\"\n                :api-base=\"apiBase\"\n                :auth-headers=\"authHeaders\"\n                :auth-credentials=\"authCredentials\"\n                :locale=\"locale\"\n                compact\n                @change=\"(val: boolean) => emit('star-change', n, val)\"\n              />\n            </span>\n          </div>\n          <div v-else :class=\"colClass(id)\" role=\"gridcell\" :style=\"colStyle(id)\" :title=\"cellTitle(id, n)\">\n            {{ cellText(id, n) }}\n          </div>\n        </template>\n        <div class=\"fe-list__col fe-list__col--menu\" role=\"gridcell\" data-fe-control @click.stop @dblclick.stop>\n          <button\n            type=\"button\"\n            class=\"fe-list__menu\"\n            :title=\"t('toolbar.more')\"\n            :aria-label=\"t('toolbar.more')\"\n            @click=\"onRowMenu(n, $event)\"\n          ><span aria-hidden=\"true\">&#8942;</span></button>\n        </div>\n      </div>\n      </template>\n      <div v-if=\"!loading && rows.length === 0\" class=\"fe-list__empty\">\n        {{ t('empty.folder') }}\n      </div>\n    </div>\n  </div>\n  <!-- tablo:t1 — the column menu. Teleported to <body> for the reason\n       ContextMenu gives: inside the tree, an ancestor with `overflow: hidden`\n       or its own transform clips or displaces it, and the header sits inside a\n       scrolling region. It therefore carries the theme class `variables.css`\n       re-applies dark values under, because the `.fe` ancestor that normally\n       scopes the tokens is not above it any more. -->\n  <Teleport to=\"body\">\n    <div\n      v-if=\"colMenuOpen\"\n      class=\"fe-colmenu__backdrop\"\n      :class=\"colMenuThemeClass\"\n      :data-prefers-dark=\"prefersDark ? '1' : '0'\"\n      @click=\"closeColMenu\"\n      @contextmenu.prevent=\"closeColMenu\"\n    >\n      <div\n        ref=\"colMenuEl\"\n        class=\"fe-colmenu\"\n        role=\"dialog\"\n        tabindex=\"-1\"\n        :aria-label=\"t('cols.menu')\"\n        :style=\"{ top: colMenuY + 'px', left: colMenuX + 'px' }\"\n        @click.stop\n        @keydown.esc.stop=\"closeColMenu\"\n      >\n        <p class=\"fe-colmenu__title\">{{ t('cols.title') }}</p>\n        <div v-for=\"c in menuCols\" :key=\"c.id\" class=\"fe-colmenu__line\">\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__row\"\n            role=\"checkbox\"\n            :aria-checked=\"c.on ? 'true' : 'false'\"\n            @click=\"toggleCol(c.id)\"\n          >\n            <span class=\"fe-list__check fe-colmenu__tick\" :class=\"{ 'is-on': c.on }\" aria-hidden=\"true\"></span>\n            <span class=\"fe-colmenu__label\">{{ c.label }}</span>\n          </button>\n          <!-- The drag, reachable from a keyboard. Same move, same model — a\n               reorder only a mouse can perform is one half the people using\n               this cannot perform at all. -->\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__nudge\"\n            :disabled=\"!c.canLeft\"\n            :title=\"t('cols.move_left', { col: c.label })\"\n            :aria-label=\"t('cols.move_left', { col: c.label })\"\n            @click=\"nudgeCol(c.id, -1)\"\n          ><span aria-hidden=\"true\">&#8592;</span></button>\n          <button\n            type=\"button\"\n            class=\"fe-colmenu__nudge\"\n            :disabled=\"!c.canRight\"\n            :title=\"t('cols.move_right', { col: c.label })\"\n            :aria-label=\"t('cols.move_right', { col: c.label })\"\n            @click=\"nudgeCol(c.id, 1)\"\n          ><span aria-hidden=\"true\">&#8594;</span></button>\n        </div>\n        <div v-if=\"canResetCols\" class=\"fe-colmenu__sep\" role=\"separator\"></div>\n        <button v-if=\"canResetCols\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onResetColumns\">\n          <span class=\"fe-colmenu__label\">{{ t('cols.reset') }}</span>\n        </button>\n        <div v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__sep\" role=\"separator\"></div>\n        <p v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__title\">{{ t('cols.folder_title') }}</p>\n        <!-- The rule, in one sentence, next to the two buttons that act on it.\n             A per-folder memory nobody can explain is the difference between a\n             feature and a haunting. -->\n        <p v-if=\"thisFolderRemembered || rememberedFolders > 0\" class=\"fe-colmenu__hint\">{{ t('cols.folder_hint') }}</p>\n        <button v-if=\"thisFolderRemembered\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onForgetFolder\">\n          <span class=\"fe-colmenu__label\">{{ t('cols.forget_folder') }}</span>\n        </button>\n        <button v-if=\"rememberedFolders > 0\" type=\"button\" class=\"fe-colmenu__row\" @click=\"onApplyToAll\">\n          <span class=\"fe-colmenu__label\">{{ t('cols.apply_all', { count: rememberedFolders }) }}</span>\n        </button>\n      </div>\n    </div>\n  </Teleport>\n</template>\n","<script setup lang=\"ts\">\n// (unscoped styles by design — see base.css wiring:d2 block; SFC scoped\n// styles are banned for webcomponent data-v hash mismatch reasons.)\n/**\n * GalleryView — wiring:d2. Third view mode: large-thumbnail gallery for\n * visual browsing (photos/videos). Derived from GridView (same props/emits,\n * same listbox a11y, same selection/drag/touch contract) but renders big\n * square tiles: thumbnail (or SVG file-type icon fallback) with the name\n * below and size+date revealed on hover/focus. GridView itself is untouched.\n */\nimport { computed, onBeforeUnmount, ref } from 'vue';\nimport { hasInternalDrag } from '../lib/dragOut';\nimport type { FileNode } from '../types/FileNode';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { checkMod, clickMod, useRowTouch, type ClickMod } from '../composables/useRowTouch';\nimport ItemCheck from './ItemCheck.vue';\nimport { encryptedFolderTile, fileIconTile, isEncryptedFolder } from '../lib/fileIcons';\nimport {\n  createFilePreviews,\n  drawsAsPage,\n  drawsAsVideo,\n  type FilePreview,\n} from '../lib/filePreview'; /* gorunum:v1-preview */\nimport StarButton from './StarButton.vue';\nimport { applyDragGhost } from '../lib/dragGhost';\nimport { parentDirOf } from '../lib/listing'; /* the folder a row sits in — one split rule for every view */\nimport {\n  groupByDate,\n  groupingActive,\n} from '../lib/dateGroups'; /* gruplama */\nimport { useSortStore, type ListingOrder } from '../lib/sortOrder'; /* gruplama */\n\nconst props = withDefaults(defineProps<{\n  files: FileNode[];\n  selected: Set<string>;\n  clipped?: Set<string>;\n  showParentPath?: boolean;\n  locale: LocaleCode;\n  loading?: boolean;\n  /** Authenticated thumb resolver (useThumbs.src) — same contract as\n   *  GridView: raw `thumb_url` is root-relative and unauthenticated, so\n   *  embedded hosts NEED this. null = icon fallback. */\n  thumbSrc?: (n: FileNode) => string | null;\n  /**\n   * Starring on a card. Same contract as ListView: the id set the explorer\n   * keeps, plus the API wiring StarButton needs. Absent apiBase → no star is\n   * rendered at all, exactly as in the list.\n   *\n   * ⚠ Not list-only. The Starred VIEW shipped before starring was reachable\n   * from anywhere but the list, so a user in grid view — the mode the panel's\n   * own screenshots show — had a view they could not fill.\n   */\n  starredIds?: Set<number>;\n  /**\n   * Offer the star affordance at all. Follows the Starred view: when the panel\n   * leaves that view out — a shared app token has no single person behind it,\n   * so \"your starred files\" is one list shown to strangers — offering to star\n   * something is offering to write into that same shared list. Owner's call,\n   * 2026-09-05, verbatim (translated from Turkish): \"if the starred place is\n   * not visible, then star/unstar should not be visible either\".\n   */\n  starEnabled?: boolean;\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** gorunum:v1-preview — inside an E2E-encrypted folder every body is\n   *  ciphertext, so the text preview stays off. Same prop, same meaning and\n   *  same default as GridView's. */\n  e2eActive?: boolean;\n  /**\n   * gruplama — where these rows got their order, the same prop the list and\n   * the grid take (`lib/sortOrder.ListingOrder`). Read for one thing only: a\n   * date heading over the server's RANKED answer would be a claim about an\n   * order the tiles are not in. Omitted = an ordinary folder listing.\n   */\n  order?: ListingOrder;\n  /**\n   * issue #26 — draw the checkbox on each card, the one click that selects.\n   * Default on. Same prop, same meaning as GridView's.\n   */\n  selectable?: boolean;\n}>(), {\n  // ⚠ Not left to `undefined`: Vue casts an absent boolean prop to false, and\n  // the listing would lose its checkboxes wherever the host said nothing.\n  selectable: true,\n});\n\nconst emit = defineEmits<{\n  (e: 'click-card', node: FileNode, mod: ClickMod): void;\n  (e: 'dbl-card', node: FileNode): void;\n  (e: 'context-card', node: FileNode, ev: MouseEvent): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n}>();\n\nconst { t, formatSize, nodeDisplayName, formatDate, formatMonthYear, zonedYearMonth, toDate } =\n  useLocale(() => props.locale);\n\n/* gruplama — this pane's sort, by injection, so the gallery cannot disagree\n * with the list beside it about whether a date heading is honest right now. */\nconst sort = useSortStore();\n\n/**\n * gruplama — THE DATE HEADINGS, from the one module that owns the ladder\n * (`lib/dateGroups`), read identically by ListView and GridView.\n *\n * ⚠ The gallery has no Folders / Files sections to collide with, so nothing\n * here replaces anything: folders keep a run of their own at the top — with no\n * heading, because the gallery has never named one — and each day of files\n * gets its label. Any sort key but `modified` draws nothing at all, exactly as\n * before this existed.\n *\n * ⚠ The tiles are handed to us ALREADY sorted (`FilePane.displayFiles` runs\n * the pane's comparator, folders first, then the key), which is why this\n * groups `props.files` in place rather than re-sorting: a second sort here is\n * a second opinion about the order, and the grid learned that lesson once.\n */\nconst grouped = computed(() =>\n  groupByDate(props.files, {\n    active: groupingActive(sort.key.value, props.order),\n    dateOf: (n) => toDate(n.last_modified),\n    aside: (n) => (n.type === 'dir' ? { id: 'dirs' } : null),\n    labels: { t, formatMonthYear, zonedYearMonth },\n  }),\n);\n\nfunction thumbOf(n: FileNode): string | null {\n  return props.thumbSrc ? props.thumbSrc(n) : (n.thumb_url ?? null);\n}\n\n/* gorunum:v1-preview — the SAME preview the grid card draws, from the same\n * module and with the same bounds. Not a gallery variant: a text file in a\n * gallery is the identical hole (the backend's generic extension-card), and\n * \"open it on the desktop, leave the embeds on the old behaviour\" is how one\n * product becomes two. Only the type scale differs, and that is CSS. */\nconst previews = createFilePreviews({\n  apiBase: props.apiBase,\n  authHeaders: props.authHeaders ? () => props.authHeaders!() : undefined,\n  credentials: props.authCredentials,\n  disabled: () => props.e2eActive === true,\n});\nonBeforeUnmount(() => previews.dispose());\n\nfunction previewKind(n: FileNode) {\n  return previews.kindFor(n);\n}\n\n/** At most one element — a typed local for the template, no `!` per loop. */\nfunction previewFor(n: FileNode): FilePreview[] {\n  const p = previews.get(n);\n  return p ? [p] : [];\n}\n\nfunction bindPreview(el: unknown, n: FileNode) {\n  previews.bind(el instanceof Element ? el : null, n);\n}\n\n/** A card carries a star when the host wired the API and the node is a file\n *  with a server id — the same rule the list row uses. */\nfunction canStar(n: FileNode): boolean {\n  if (props.starEnabled === false) return false;\n  return props.apiBase !== undefined && typeof n.id === 'number' && n.type === 'file';\n}\n\nfunction isSelected(n: FileNode): boolean {\n  return props.selected.has(n.path);\n}\n\n/**\n * issue #26 — the card's checkbox is the one click that selects (a click\n * anywhere else on the card opens it), routed exactly like the list row's:\n * one `click-card` emit marked `check`, one `useSelection.click`.\n */\nfunction onCheckClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, checkMod(ev));\n}\n\nfunction onClick(n: FileNode, ev: MouseEvent) {\n  emit('click-card', n, clickMod(ev, touch.isTap(ev)));\n}\n\nfunction onDbl(n: FileNode) {\n  emit('dbl-card', n);\n}\n\nfunction onCtx(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('context-card', n, ev);\n}\n\nfunction onItemDragStart(n: FileNode, ev: DragEvent) {\n  applyDragGhost(\n    ev,\n    nodeDisplayName(n),\n    props.selected.has(n.path) ? props.selected.size : 1,\n  );\n  emit('item-drag-start', n, ev);\n}\n\n// Drop-target highlight — mirrors GridView (visual layer only).\nconst dropTargetPath = ref<string | null>(null);\n\nfunction onItemDragOver(n: FileNode, ev: DragEvent) {\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropTargetPath.value = n.path;\n}\n\nfunction onItemDragLeave(n: FileNode) {\n  if (dropTargetPath.value === n.path) dropTargetPath.value = null;\n}\n\nfunction onItemDrop(n: FileNode, ev: DragEvent) {\n  dropTargetPath.value = null;\n  if (n.type !== 'dir') return;\n  if (!hasInternalDrag(ev)) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('item-drop-into', n, ev);\n}\n\n/* Long press → the card's menu; a tap is reported as a tap (issue #26). */\nconst touch = useRowTouch<FileNode>(\n  (n, at) =>\n    emit('context-card', n, { ...at, preventDefault: () => {}, stopPropagation: () => {} } as unknown as MouseEvent),\n  {\n    // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n    onTap: (n) => emit('click-card', n, { ctrl: false, shift: false, touch: true }),\n  },\n);\n\n/**\n * zaman:z1 — routed through useLocale.formatDate, the package's one date\n * formatter. It was a bare `toLocaleString()`, i.e. the BROWSER's locale and\n * the BROWSER's zone: the same file's timestamp came out in a different\n * language here than in the list two clicks away, and in a different clock\n * than the viewer had chosen. Neither of those is a gallery decision.\n */\nfunction displayDate(ms: number | undefined): string {\n  return formatDate(ms, { time: true });\n}\n\n// Hover meta line: size for files, entry count (when known) for dirs.\nfunction metaFor(n: FileNode): string {\n  const date = displayDate(n.last_modified);\n  const size = n.type === 'dir' ? '' : formatSize(n.size);\n  return [size, date].filter((s) => !!s).join(' · ');\n}\n</script>\n\n<template>\n  <div\n    class=\"fe-gal\"\n    :class=\"{ 'is-loading': loading, 'has-selection': selectable && selected.size > 0 }\"\n    role=\"listbox\"\n    aria-multiselectable=\"true\"\n    :aria-label=\"t('gallery.aria')\"\n    :aria-busy=\"loading ? 'true' : undefined\"\n  >\n    <template v-for=\"n in files\" :key=\"n.path\">\n    <!-- gruplama — the date label: a grid item spanning every column, so the\n         tiles keep flowing under it. The cards keep `role=\"option\"`; the\n         heading is aria-hidden and the day it names is already in each\n         card's own hover text. -->\n    <p v-if=\"grouped.headingBefore(n)\" class=\"fe-gal__heading\" aria-hidden=\"true\">{{ grouped.headingBefore(n) }}</p>\n    <div\n      class=\"fe-gal__card\"\n      :class=\"{\n        'is-selected': isSelected(n),\n        'is-dir': n.type === 'dir',\n        'is-trash': n.trashed,\n        'is-clipped': clipped?.has(n.path),\n        'is-droptarget': dropTargetPath === n.path,\n      }\"\n      tabindex=\"0\"\n      role=\"option\"\n      :aria-selected=\"isSelected(n) ? 'true' : 'false'\"\n      :aria-label=\"nodeDisplayName(n)\"\n      :data-fe-path=\"n.path /* wiring:d1 - middle-click new-tab delegation */\"\n      draggable=\"true\"\n      @click=\"onClick(n, $event)\"\n      @dblclick=\"onDbl(n)\"\n      @contextmenu=\"onCtx(n, $event)\"\n      @dragstart=\"onItemDragStart(n, $event)\"\n      @dragover=\"onItemDragOver(n, $event)\"\n      @dragleave=\"onItemDragLeave(n)\"\n      @drop=\"onItemDrop(n, $event)\"\n      @touchstart.passive=\"touch.onTouchStart(n, $event)\"\n      @touchend=\"touch.onTouchEnd\"\n      @touchmove.passive=\"touch.onTouchMove\"\n    >\n      <div class=\"fe-gal__thumb\" :ref=\"(el) => bindPreview(el, n)\">\n        <!-- gorunum:v1-preview — a text-readable file shows its own first\n             lines; it never reaches the <img> branch, so no generic\n             placeholder thumbnail is fetched for it either. -->\n        <template v-if=\"previewKind(n)\">\n          <!-- ⚠ Interpolated, never v-html: this is somebody's file content. -->\n          <div\n            v-for=\"p in previewFor(n)\"\n            :key=\"'fprev'\"\n            class=\"fe-fprev\"\n            :class=\"'fe-fprev--' + p.kind\"\n            :style=\"p.kind === 'table' ? { '--fprev-cols': String(p.cols) } : undefined\"\n            aria-hidden=\"true\"\n          >\n            <!-- One grid, cells emitted flat: <template> makes no DOM, so a\n                 short row's padding cells keep every column aligned. -->\n            <template v-if=\"p.kind === 'table'\">\n              <template v-for=\"(row, ri) in p.rows\" :key=\"ri\">\n                <span\n                  v-for=\"(cell, ci) in row\"\n                  :key=\"ci\"\n                  class=\"fe-fprev__cell\"\n                  :class=\"{ 'is-head': ri === 0 }\"\n                >{{ cell }}</span>\n              </template>\n            </template>\n            <template v-else>\n              <div v-for=\"(ln, li) in p.lines\" :key=\"li\" class=\"fe-fprev__line\"><span\n                v-if=\"ln.tint\"\n                class=\"fe-fprev__tint\"\n              >{{ ln.indent }}{{ ln.tint }}</span>{{ ln.text }}</div>\n            </template>\n          </div>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n          <span\n            v-if=\"previewFor(n).length === 0\"\n            class=\"fe-gal__icon fe-gal__icon--svg\"\n            v-html=\"fileIconTile(n)\"\n          ></span>\n        </template>\n        <!-- draggable=\"false\" for the same reason as GridView: HTML5 image\n             drag adds a 'Files' MIME to dataTransfer, which would trip the\n             parent's upload handler on internal drags. -->\n        <img\n          v-else-if=\"thumbOf(n)\"\n          :src=\"thumbOf(n)!\"\n          :alt=\"n.basename\"\n          :class=\"{ 'fe-thumb--page': drawsAsPage(n) /* gorunum:v1-preview — crop a page from its TOP */ }\"\n          loading=\"lazy\"\n          draggable=\"false\"\n        />\n        <!-- ikon:emoji — see GridView: the folder shape survives, the padlock\n             is cut out of it, and the name the 🔒 never had is on the span. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n        <span\n          v-else-if=\"isEncryptedFolder(n)\"\n          class=\"fe-gal__icon fe-gal__icon--svg\"\n          role=\"img\"\n          :aria-label=\"t('e2e.badge')\"\n          v-html=\"encryptedFolderTile()\"\n        ></span>\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/fileIcons -->\n        <span v-else class=\"fe-gal__icon fe-gal__icon--svg\" v-html=\"fileIconTile(n)\"></span>\n        <!-- Same star chip as the grid, same component, same rule: painted\n             when starred, on hover/focus otherwise. It sits above .fe-gal__meta\n             (which is aria-hidden and covers the tile's foot on hover). -->\n        <!-- gorunum:v1-preview — a frame lifted out of a video is, on a card,\n             indistinguishable from a photograph. The badge is the difference,\n             and it is drawn only over a real frame: a video that fell back to\n             its type tile already says what it is. -->\n        <span\n          v-if=\"!previewKind(n) && thumbOf(n) && drawsAsVideo(n)\"\n          class=\"fe-thumb__play\"\n          aria-hidden=\"true\"\n        ></span>\n        <!-- issue #26 — the card's checkbox, the one click that selects: the\n             corner opposite the star, on the same reveal rule plus \"anything\n             is selected\" (styles/base.css .fe-item-check). -->\n        <span\n          v-if=\"selectable\"\n          class=\"fe-item-check fe-gal__check\"\n          data-fe-control\n          @click.stop=\"onCheckClick(n, $event)\"\n          @dblclick.stop\n        >\n          <ItemCheck :on=\"isSelected(n)\" :label=\"nodeDisplayName(n)\" />\n        </span>\n        <div v-if=\"canStar(n)\" class=\"fe-gal__star\" @click.stop @dblclick.stop>\n          <StarButton\n            :starred=\"!!starredIds?.has(n.id!)\"\n            :node-id=\"n.id!\"\n            :api-base=\"apiBase\"\n            :auth-headers=\"authHeaders\"\n            :auth-credentials=\"authCredentials\"\n            :locale=\"locale\"\n            compact\n            card\n            @change=\"(val: boolean) => emit('star-change', n, val)\"\n          />\n        </div>\n        <div class=\"fe-gal__meta\" aria-hidden=\"true\">\n          <span v-if=\"metaFor(n)\" class=\"fe-gal__meta-line\">{{ metaFor(n) }}</span>\n          <span\n            v-if=\"showParentPath && parentDirOf(n.path)\"\n            class=\"fe-gal__meta-line fe-gal__meta-line--path\"\n            :title=\"parentDirOf(n.path)\"\n          >{{ parentDirOf(n.path) }}</span>\n        </div>\n      </div>\n      <div class=\"fe-gal__label\" :title=\"n.basename\">\n        {{ nodeDisplayName(n) }}\n      </div>\n    </div>\n    </template>\n    <div v-if=\"!loading && files.length === 0\" class=\"fe-gal__empty\">\n      {{ t('empty.folder') }}\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FilePane — pane:p1 THE pane. One component, rendered once per half of the\n * window.\n *\n * ⚠⚠ WHY THIS FILE EXISTS, and why adding the missing controls to the old\n * `SecondaryPane` would have been the wrong fix for the second time.\n *\n * The split view used to be two IMPLEMENTATIONS of a pane: `.fe__primary`\n * inside `FileExplorer.vue` on the left, `SecondaryPane.vue` on the right.\n * They shared the three view components and nothing else, so every control\n * that hangs off a listing had to be written twice or it existed only on the\n * left. It was written twice exactly once — the right-click menu, in July\n * 2026, after the owner reported the two halves offering different actions —\n * and the underlying shape was left alone. Two months later the right half was\n * missing six more things: the breadcrumb was a private 28-line computed\n * instead of `Breadcrumb.vue`, and there was no filter row, no view switcher,\n * no sort control, no per-folder column menu and no selection bar at all.\n *\n * So the rule this file enforces is not \"keep them in sync\". It is that there\n * is only one of them:\n *\n *     a feature added to a pane cannot miss the other pane,\n *     because there is only one pane.\n *\n * ⚠ THE THREE DIFFERENCES THAT ARE REAL. Everything else is identical by\n * construction:\n *\n *   1. **Which pane has the keyboard** — `focused`, drawn as the accent line\n *      (`.fe-pane--focus`). It is the only signal of where a shortcut lands,\n *      so it is a prop and never an internal guess.\n *   2. **Where the listing came from** — the main pane's rows are produced by\n *      the explorer's own loader, which also serves search, the trash, the\n *      panel's virtual views and encrypted folders; the split pane asks the\n *      backend for one folder. Expressed as `selfDriven`: false = the host\n *      hands over `rows` / `loading` / `error`, true = this pane runs\n *      `loadFolder()` below. Nothing else in the component branches on it.\n *   3. **Whether it can be closed** — `closable`. A window always has a main\n *      pane; the second one is the one you opened.\n *\n * ⚠ WHAT STAYS WITH THE HOST, and why none of it is pane state: the API\n * client, the clipboard, the context menu and `dispatchItemAction`, uploads,\n * quick look, the inspector, the onboarding tour's targets and the tab strip.\n * Those are properties of the WINDOW — there is one clipboard and one context\n * menu no matter how many panes are open — so a pane that owned any of them\n * would be a second window.\n *\n * ⚠ Selection is HOST-HELD and passed in, which is not a compromise: the\n * explorer routes cut/copy/paste, the inspector, the toolbar's count and every\n * keyboard shortcut through \"the active pane's selection\", so it needs to hold\n * both. It holds two instances of ONE composable (`useSelection`), which is\n * the same single-definition rule one level up. Same for the filters\n * (`lib/fileFilters`) and the sort (`lib/sortOrder`).\n *\n * ⚠⚠ THE SORT IS PER PANE and this component is what makes it so. It creates\n * its own `SortStore` and `provide()`s it, so the filter row's sort control\n * and the list view's column headers inside THIS pane drive THIS pane's order\n * — measured 2026-09-13: with the old module-level singleton, choosing\n * \"Size ↓\" in the right pane silently re-ordered the left one. The main pane\n * keeps the default store, because the explorer's per-folder view memory reads\n * and writes exactly that state.\n *\n * Unscoped styles (`fe-pane*`, and the `fe__primary` / `fe-subhead` / `fe__body`\n * classes the layout already owns) — webcomponent data-v rule.\n */\nimport { computed, provide, ref, watch } from 'vue';\n\nimport type { FileApi } from '../composables/useFileApi';\nimport type { ClickMod } from '../composables/useRowTouch';\nimport type { FileNode, ViewMode } from '../types/FileNode';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport {\n  filterListing,\n  injectTrashRow,\n  hydrateTrashRow,\n  isVirtualViewPath,\n} from '../lib/listing';\nimport { iconFamilyFor } from '../lib/fileIcons';\nimport { applyFilters, filtersActive, type DriveFilters } from '../lib/fileFilters';\nimport {\n  SORT_STORE_KEY,\n  createSortStore,\n  useSortStore,\n  type ListingOrder,\n  type SortStore,\n} from '../lib/sortOrder';\nimport { hasInternalDrag, internalDragItems, internalDragOrigin } from '../lib/dragOut';\nimport Breadcrumb from './Breadcrumb.vue';\nimport FilterBar from './FilterBar.vue';\nimport ViewSwitcher from './ViewSwitcher.vue';\nimport ListView from './ListView.vue';\nimport GridView from './GridView.vue';\nimport GalleryView from './GalleryView.vue';\n\n/** The same literals the view components hardcode for the internal DnD\n *  channel; `-src` carries the ORIGIN DIRECTORY so the host can move across\n *  panes and undo it afterwards. */\nconst FE_DND_MIME = 'application/x-brf-files';\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nexport type PaneId = 'main' | 'split';\n\nconst props = withDefaults(\n  defineProps<{\n    /** Which half this is. Also the `data-pane` hook every measurement uses. */\n    paneId: PaneId;\n    api: FileApi;\n    locale: LocaleCode;\n    /** Resolved theme — forwarded to the children whose popovers are teleported\n     *  out of `.fe`, where the token scope no longer reaches them. */\n    theme?: ThemeMode;\n    /** This pane owns the keyboard. The accent line, and nothing else. */\n    focused?: boolean;\n    /** Offer the × (the split pane). */\n    closable?: boolean;\n\n    // ── addressing ────────────────────────────────────────────────────\n    /** The pane's location, in the host's user-path form. With\n     *  `selfDriven` it is the OPENING location and this pane moves on from\n     *  there; otherwise it is the address, full stop. */\n    path: string;\n    /** true → this pane fetches its own folder (see difference 2 above). */\n    selfDriven?: boolean;\n    /** user path → wire `<adapter>://<rel>`. */\n    qualify: (p: string) => string;\n    /** wire → user path (multi-storage aware). */\n    toUser: (wire: string) => string;\n    /** rootFloor clamp — keeps the pane inside the confine. */\n    clamp: (p: string) => string;\n    /** Override for the storage crumb's label. ⚠ Optional, and normally\n     *  omitted: the pane derives it from its OWN wire path (`paneAdapter`), so\n     *  two panes sitting in two different storages each name their own. The\n     *  old right-hand pane was handed the window's label and printed \"/\" for a\n     *  folder called `thumbfix` — measured 2026-09-13, and the exact shape of\n     *  bug a second implementation produces. */\n    rootLabel?: string;\n    /** The confine in WIRE form, for `Breadcrumb`'s own floor handling. */\n    rootPath?: string;\n    /** rootFloor in user-path form ('' when unconfined). */\n    floor?: string;\n    /** Multi-storage mode: '' is the virtual drives root (no fetch). */\n    multiRoot?: boolean;\n    /** Synthesized storage rows for the virtual drives root. */\n    virtualRows?: () => FileNode[];\n    /** Mirror the virtual `.trash` row at a storage root. Defaults on. */\n    trashVisible?: boolean;\n    /** The navigation panel is already offering Trash, so no pane draws the\n     *  virtual row. Passed down rather than worked out here: the panel is a\n     *  sibling of BOTH panes, and a pane that guessed would list a row the\n     *  other one does not. */\n    navOffersTrash?: boolean;\n\n    // ── the rows, when the host drives them ───────────────────────────\n    rows?: FileNode[];\n    loading?: boolean;\n    error?: string;\n    /** Where these rows got their order (`lib/sortOrder`). A ranked answer\n     *  keeps the server's order and closes every sort control over it. */\n    order?: ListingOrder;\n\n    // ── chrome ────────────────────────────────────────────────────────\n    viewMode: ViewMode;\n    viewModes?: ViewMode[];\n    /** Draw the address row. Off for a host that supplies its own heading. */\n    showCrumbs?: boolean;\n    /** Draw the filter row (and with it the sort control). */\n    showFilterBar?: boolean;\n    /**\n     * surucu:d1-scope — `find` reduces the filter row to its name box (see\n     * `FilterBar`'s own note). The host asks for it where the BODY is not a\n     * listing of files at all — Home. It is NOT asked for at the multi-storage\n     * root: a pane knows perfectly well when it is showing the drive list\n     * (`atVirtualRoot`), and making the host say so for the main pane would\n     * leave the split pane's own drive list with four chips that narrow nothing.\n     */\n    filterMode?: 'full' | 'find';\n    /** What the name box says it narrows, already translated. Ignored at the\n     *  drive root, which names itself. */\n    findLabel?: string;\n    /** Draw the view switcher in the address row. */\n    showViewSwitcher?: boolean;\n    /** Override for what the last crumb's \"Subfolders\" chevron lists. ⚠\n     *  Optional, and normally omitted: the pane already HOLDS the folder's\n     *  listing, so it answers \"what is inside this folder\" from its own rows.\n     *  Passing it from the host is how only one pane ended up with the\n     *  chevron. */\n    crumbSubfolders?: { label: string; adapterPath: string }[];\n    /** Per-folder memory key, for the column menu's two folder rows. */\n    folderKey?: string;\n    /** Print each row's parent folder (a search, a cross-folder view). */\n    showParentPath?: boolean;\n    /** Paths that were cut — dimmed, and never dragged. */\n    clipped?: Set<string>;\n    /** A second narrowing composed AFTER this pane's own filter row (the\n     *  advanced-search dialog's). Null when there is none. */\n    extraFilters?: DriveFilters | null;\n    canWrite?: boolean;\n    canPaste?: boolean;\n\n    // ── the listing's own state, held by the host ─────────────────────\n    selected: Set<string>;\n    filters: DriveFilters;\n\n    // ── forwarded to the view components ──────────────────────────────\n    thumbSrc?: (n: FileNode) => string | null;\n    keepBadgeFor?: (n: FileNode) => 'kept' | 'syncing' | 'cloud' | 'partial' | null;\n    starredIds?: Set<number>;\n    starEnabled?: boolean;\n    apiBase?: string;\n    authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n    authCredentials?: RequestCredentials;\n    /** No reading file bytes for a card preview inside an encrypted folder. */\n    e2eActive?: boolean;\n\n    /** The host is drawing the body itself (Home, a dead deep link, the\n     *  encrypted lock screen) — those are WINDOW states with no listing\n     *  behind them, so the pane's own state chain must not also run. */\n    bodyOverride?: boolean;\n\n    /** Mouse open gesture — 'double' (single selects, double opens) or\n     *  'single' (first click opens). Touch always opens on tap; the checkbox\n     *  always selects. See onViewClick. */\n    openTrigger?: 'single' | 'double';\n  }>(),\n  {\n    showCrumbs: true,\n    showFilterBar: true,\n    showViewSwitcher: true,\n    trashVisible: true,\n    openTrigger: 'double',\n  },\n);\n\nconst emit = defineEmits<{\n  /** This pane was touched — it now owns the keyboard. */\n  (e: 'activate'): void;\n  (e: 'close'): void;\n  /** The pane's location changed (self-driven) or was asked to change. */\n  (e: 'navigate', path: string): void;\n  /** A row was double-clicked / activated. */\n  (e: 'open', node: FileNode): void;\n  /** The virtual `.trash` row was opened — the trash view carries the restore\n   *  actions and belongs to the main pane, so the host decides. */\n  (e: 'open-trash'): void;\n  (e: 'click-row', node: FileNode, mod: { ctrl: boolean; shift: boolean }): void;\n  /** Right-click. `null` = empty space (nothing selected → \"Paste\" only). */\n  (e: 'context', node: FileNode | null, ev: MouseEvent): void;\n  (e: 'clear-selection'): void;\n  (e: 'display-order', nodes: FileNode[]): void;\n  (e: 'item-drag-start', node: FileNode, ev: DragEvent): void;\n  (e: 'item-drop-into', target: FileNode, ev: DragEvent): void;\n  /** A drop on the pane background / a crumb: the host owns move-vs-copy. */\n  (e: 'transfer', p: { sources: string[]; targetWire: string; originWire?: string }): void;\n  (e: 'update:viewMode', v: ViewMode): void;\n  (e: 'update:filters', v: DriveFilters): void;\n  (e: 'crumb-context', payload: { x: number; y: number; adapterPath: string; label: string }): void;\n  (e: 'copy-path', adapterPath: string): void;\n  (e: 'crumb-drop', adapterPath: string, ev: DragEvent): void;\n  (e: 'new-folder'): void;\n  (e: 'upload'): void;\n  (e: 'paste'): void;\n  (e: 'select-all'): void;\n  (e: 'clear-filters'): void;\n  (e: 'star-change', node: FileNode, value: boolean): void;\n  /** The listing failed and the person asked for it again. */\n  (e: 'retry'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ── the pane's sort ───────────────────────────────────────────────────\n * ⚠⚠ The main pane keeps the DEFAULT store on purpose. The explorer's\n * per-folder view memory (`lib/viewPrefs`) restores and records through the\n * module-level `applySort` / `activeSortKey`, i.e. through that store; handing\n * the main pane a fresh one would leave the memory writing to a piece of state\n * nothing renders. The split pane gets its own, which is what makes two sort\n * controls two sorts. */\nconst sort: SortStore = props.paneId === 'main' ? useSortStore() : createSortStore();\nprovide(SORT_STORE_KEY, sort);\n\n/* ── self-driven listing (difference 2) ──────────────────────────────── */\n\nconst ownPath = ref<string>('');\nconst ownRows = ref<FileNode[]>([]);\nconst ownLoading = ref(false);\nconst ownError = ref('');\n/** koru:k1 — the folder's RBAC level as the last `index` reported it. Kept\n *  because the details panel asks the FOCUSED pane for it, and until now the\n *  split pane had no answer to give. */\nconst ownPerm = ref('');\n\nfunction isStorageRow(n: FileNode): boolean {\n  return iconFamilyFor(n) === 'storage';\n}\n\n/** THE location this pane is showing, whichever side is driving. */\nconst panePath = computed(() => (props.selfDriven ? ownPath.value : (props.path ?? '')));\nconst paneRows = computed<FileNode[]>(() =>\n  props.selfDriven ? ownRows.value : (props.rows ?? []),\n);\nconst paneLoading = computed(() => (props.selfDriven ? ownLoading.value : !!props.loading));\nconst paneError = computed(() => (props.selfDriven ? ownError.value : (props.error ?? '')));\n\nconst atVirtualRoot = computed(\n  () => !!props.multiRoot && !(panePath.value ?? '').replace(/^\\/+|\\/+$/g, ''),\n);\n\n/**\n * One folder, through the SAME `api.index` + `lib/listing` helpers the host's\n * own loader uses — so the two panes cannot end up listing different rows for\n * the same folder (the internal-entry filter and the virtual `.trash` row are\n * both shared functions, not copies).\n */\nasync function loadFolder(target?: string): Promise<void> {\n  const requested = props.clamp(target ?? ownPath.value ?? '');\n  ownLoading.value = true;\n  ownError.value = '';\n  try {\n    // Multi-storage virtual root: synthesize the drives list, no backend call.\n    if (props.multiRoot && !requested) {\n      ownRows.value = props.virtualRows ? props.virtualRows() : [];\n      ownPerm.value = ''; /* the drive list is not a folder — no level to carry */\n      ownPath.value = '';\n      emit('navigate', '');\n      return;\n    }\n    const resp = await props.api.index(props.qualify(requested));\n    ownPerm.value = ((resp as { perm?: unknown }).perm as string) || '';\n    ownRows.value = filterListing(resp.files);\n    if (\n      injectTrashRow(ownRows.value, resp.adapter, resp.dirname, props.trashVisible !== false, {\n        navOffersTrash: props.navOffersTrash,\n      })\n    ) {\n      void hydrateTrashRow(ownRows.value, resp.adapter, props.api);\n    }\n    ownPath.value = props.toUser(resp.dirname);\n    emit('navigate', ownPath.value);\n  } catch (err) {\n    ownError.value = err instanceof Error ? err.message : String(err);\n  } finally {\n    ownLoading.value = false;\n  }\n}\n\nif (props.selfDriven) void loadFolder(props.path ?? '');\n\n/** Navigate THIS pane. Self-driven panes fetch; a host-driven pane asks its\n *  host, which is the only thing that knows how to leave a search or a\n *  virtual view on the way. */\nfunction goTo(target: string) {\n  emit('activate');\n  if (props.selfDriven) void loadFolder(target);\n  else emit('navigate', target);\n}\n\n/* ── the address row ───────────────────────────────────────────────────\n * `Breadcrumb.vue`, not a private crumb computed. It already knows about the\n * multi-storage \"/\" crumb, the confined root, the virtual segments' labels,\n * the ✏ path editor and drops onto a crumb — all of which the old right-hand\n * pane either lacked or re-derived. */\n/**\n * ⚠⚠ A VIRTUAL VIEW IS NOT QUALIFIED, and this line is the whole of bug #1.\n *\n * `qualify()` turns a user path into `<adapter>://<rel>` for the backend, and\n * in multi-storage mode it does that by splitting the FIRST SEGMENT off as the\n * storage. Handed `.starred` it answers `.starred://` — perfectly reasonable\n * for `thumbfix`, catastrophic for a sentinel: from there the sentinel is the\n * ADAPTER, `Breadcrumb` draws it as the storage crumb, and a storage crumb is\n * never run through `virtualSegmentLabel`. The resolver was reached on every\n * render and could not possibly match. (Before tonight the host handed\n * `Breadcrumb` its own `dirname`/`adapter` refs, which the virtual views set to\n * `.starred` / `''` — unqualified — so this never arose until each pane began\n * deriving its own.)\n *\n * A view has no storage: `.recent` spans every one of them. So the wire form IS\n * the sentinel, `paneAdapter` below comes out empty, and the segment reaches\n * the resolver as a segment.\n */\nconst paneWire = computed(() =>\n  isVirtualViewPath(panePath.value) ? panePath.value : props.qualify(panePath.value),\n);\n/** The adapter THIS pane is inside. In multi-storage mode the two panes can\n *  be in different storages, so it is read off the pane's own wire path\n *  rather than taken from the window. */\nconst paneAdapter = computed(() => {\n  const w = paneWire.value;\n  const i = w.indexOf('://');\n  return i === -1 ? '' : w.slice(0, i);\n});\n\nfunction onCrumbNavigate(adapterPath: string) {\n  emit('activate');\n  if (!props.selfDriven) {\n    emit('navigate', adapterPath);\n    return;\n  }\n  // Multi-storage emits '' for the global \"/\" crumb — the virtual drives root.\n  if (props.multiRoot && !adapterPath) {\n    void loadFolder('');\n    return;\n  }\n  void loadFolder(props.toUser(adapterPath));\n}\n\n/* ── the rows this pane draws ──────────────────────────────────────────\n * The filter row's narrowing, then the host's extra one (the advanced-search\n * dialog composes with the chips rather than replacing them), then the order.\n *\n * ⚠ Sorted HERE, at the pane, and not inside each view: \"sorted by size\" is a\n * fact about the LISTING, and three components each sorting for themselves is\n * how the grid and the list drifted apart in the first place (filex #67). */\nconst displayFiles = computed<FileNode[]>(() => {\n  const base = applyFilters(paneRows.value, props.filters);\n  return sort.sortListing(\n    props.extraFilters ? applyFilters(base, props.extraFilters) : base,\n    props.order ?? 'sort',\n  );\n});\nconst filtersOn = computed(() => filtersActive(props.filters) || !!props.extraFilters);\n\n/* surucu:d1-scope — the filter row's shape, decided HERE rather than by the\n * host, for the reason the `filterMode` prop documents: the drive list is a\n * state a pane is in, and both panes can be in it independently. */\nconst paneFilterMode = computed<'full' | 'find'>(() =>\n  atVirtualRoot.value ? 'find' : (props.filterMode ?? 'full'),\n);\nconst paneFindLabel = computed(() =>\n  atVirtualRoot.value ? t('filter.find.storages') : (props.findLabel ?? ''),\n);\n\n/* What the last crumb's chevron lists.\n *\n * ⚠ Off `paneRows`, not `displayFiles`: the chevron answers \"what is inside\n * this folder\", and a filter row that is hiding half the listing must not also\n * decide where you are allowed to navigate — a folder you cannot see is still a\n * folder you can walk into.\n * ⚠ An empty array rather than undefined when there are no subfolders: the\n * prop's presence is what draws the control, and a control that vanishes in\n * leaf folders is one nobody learns to look for. */\nconst paneSubfolders = computed(() =>\n  paneRows.value\n    .filter((f) => f.type === 'dir')\n    .map((f) => ({ label: f.basename, adapterPath: f.path })),\n);\n\n/* ── selection + activation ────────────────────────────────────────────\n * The pane never mutates the selection; it reports the gesture and the host's\n * `useSelection` instance for this pane answers. One set of Ctrl/Shift\n * semantics for both panes — the old right pane had a simplified copy in\n * which Shift behaved as Ctrl. */\n/* issue #26 — any click that is not on the checkbox OPENS, so the second click\n * of a habitual double-click lands on whatever the NEW listing put under the\n * pointer (the folder already opened on the first click). Without this guard\n * that click would open a row the user never aimed at — or tick its box — and\n * a file would open twice (two viewer tabs). */\nconst OPEN_GUARD_MS = 500;\nlet openedAt = 0;\n\nfunction withinOpenGuard(): boolean {\n  return Date.now() - openedAt < OPEN_GUARD_MS;\n}\n\nfunction onViewClick(n: FileNode, mod: ClickMod) {\n  if (withinOpenGuard()) return;\n  /* The checkbox is the one click that always reaches the selection — issue\n   * #26's rule, kept on every device and in either open mode. A shift-tick\n   * still extends the range; a plain tick toggles (ctrl: true). */\n  if (mod.check) {\n    emit('activate');\n    emit('click-row', n, { ctrl: true, shift: mod.shift });\n    return;\n  }\n  /* A finger tap always OPENS (the mobile convention — there is no\n   * hover-to-select on a touchscreen). For a mouse the host's `openTrigger`\n   * decides: 'single' opens on this click; 'double' (default) makes a single\n   * click SELECT and leaves opening to onViewDbl. issue #26's \"any click\n   * opens\" is `openTrigger: 'single'`. */\n  if (mod.touch || props.openTrigger === 'single') {\n    openedAt = Date.now();\n    onRowOpen(n);\n    return;\n  }\n  emit('activate');\n  emit('click-row', n, { ctrl: mod.ctrl, shift: mod.shift });\n}\n\nfunction onViewDbl(n: FileNode) {\n  if (withinOpenGuard()) return;\n  openedAt = Date.now();\n  onRowOpen(n);\n}\n\nfunction onViewContext(n: FileNode, ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('activate');\n  emit('context', n, ev);\n}\n\n/** Right-click on genuinely empty space: a selection-less menu (\"Paste\"). The\n *  row menu calls stopPropagation, so this only fires on the background. */\nfunction onBgContext(ev: MouseEvent) {\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('activate');\n  emit('clear-selection');\n  emit('context', null, ev);\n}\n\nfunction onBgClick() {\n  emit('clear-selection');\n}\n\nfunction onRowOpen(n: FileNode) {\n  emit('activate');\n  if (n.basename === '.trash') {\n    emit('open-trash');\n    return;\n  }\n  if (n.type === 'dir' && props.selfDriven) {\n    void loadFolder(isStorageRow(n) ? n.path : props.toUser(n.path));\n    return;\n  }\n  emit('open', n);\n}\n\n/* ── drag source ───────────────────────────────────────────────────────\n * The pane writes the standard payload (the internal MIME, the ORIGIN\n * directory that makes a cross-pane move undoable, and a plain-text\n * fallback) and then hands the event on. The host can still take the drag\n * over — the desktop shell turns it into a real OS drag — which is why the\n * emit comes last and the host is free to `preventDefault`. */\nfunction onRowDragStart(n: FileNode, ev: DragEvent) {\n  if (!ev.dataTransfer) return;\n  if (isStorageRow(n) || atVirtualRoot.value || n.basename === '.trash') {\n    ev.preventDefault();\n    return;\n  }\n  const items = paneRows.value\n    .filter((f) => props.selected.has(f.path) && !isStorageRow(f))\n    .filter((f) => !props.clipped?.has(f.path))\n    .map((f) => ({ path: f.path, basename: f.basename, type: f.type }));\n  const payload = items.length > 0 ? items : [{ path: n.path, basename: n.basename, type: n.type }];\n  ev.dataTransfer.setData(FE_DND_MIME, JSON.stringify(payload));\n  ev.dataTransfer.setData(FE_DND_SRC_MIME, paneWire.value);\n  ev.dataTransfer.setData('text/plain', payload.map((i) => i.path).join('\\n'));\n  ev.dataTransfer.effectAllowed = 'move';\n  emit('item-drag-start', n, ev);\n}\n\n/* ── drop target (dir rows + the pane background) ─────────────────────── */\n\nconst dropBg = ref(false);\n\nfunction acceptDrag(ev: DragEvent): boolean {\n  return hasInternalDrag(ev);\n}\n\nfunction handleDropPayload(ev: DragEvent, targetWire: string) {\n  const items = internalDragItems(ev);\n  if (!items || !targetWire) return;\n  const origin = internalDragOrigin(ev);\n  const sources = items\n    .map((i) => i.path)\n    .filter((p) => p && p !== targetWire && !targetWire.startsWith(p + '/'));\n  if (sources.length === 0) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  emit('transfer', { sources, targetWire, originWire: origin });\n}\n\nfunction onViewDropInto(target: FileNode, ev: DragEvent) {\n  dropBg.value = false;\n  if (target.type !== 'dir' || isStorageRow(target)) return;\n  if (!acceptDrag(ev)) return;\n  emit('item-drop-into', target, ev);\n}\n\nfunction onBgDragOver(ev: DragEvent) {\n  if (!acceptDrag(ev) || atVirtualRoot.value) return;\n  ev.preventDefault();\n  ev.stopPropagation();\n  if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n  dropBg.value = true;\n}\n\nfunction onBgDragLeave() {\n  dropBg.value = false;\n}\n\nfunction onBgDrop(ev: DragEvent) {\n  dropBg.value = false;\n  if (!acceptDrag(ev) || atVirtualRoot.value) return;\n  handleDropPayload(ev, paneWire.value);\n}\n\n/* ── the host's handle on this pane ────────────────────────────────────\n * Keyboard routing, cut/copy/paste and the context menu all act on \"the\n * active pane\"; these are the four things the host cannot work out from its\n * own state. Both panes expose the SAME handle, so the routing in the host is\n * one branch on an id rather than two code paths. */\nfunction reload(): Promise<void> {\n  return props.selfDriven ? loadFolder() : Promise.resolve();\n}\n\nfunction goUp() {\n  const cur = (panePath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const floor = (props.floor || '').replace(/^\\/+|\\/+$/g, '');\n  if (!cur || cur === floor) return;\n  const idx = cur.lastIndexOf('/');\n  goTo(idx === -1 ? '' : cur.slice(0, idx));\n}\n\nfunction getPath(): string {\n  return panePath.value;\n}\n\n/** What is on screen, in the order it is drawn — the list a Select-all or a\n *  Shift-range has to be arithmetic over. */\nfunction visibleNodes(): FileNode[] {\n  return displayFiles.value.filter((n) => !isStorageRow(n));\n}\n\n/**\n * How many rows this pane's folder holds — BEFORE the filter row narrows them,\n * which is what \"12 items\" in the details panel means (`visibleNodes()` is the\n * other question: what is drawn right now).\n */\nfunction rowCount(): number {\n  return paneRows.value.length;\n}\n\n/**\n * The paths this pane's folder HOLDS — unfiltered, and that is the point.\n *\n * ⚠ Not `visibleNodes()`. The one caller asks \"does this row still exist?\", and\n * `visibleNodes()` answers \"is this row currently drawn?\" — two different\n * questions that only agree while the filter row is empty. Answering the first\n * with the second would make typing in the filter box look exactly like a\n * deletion to whoever is asking.\n */\nfunction rowPaths(): string[] {\n  return paneRows.value.map((n) => n.path);\n}\n\n/**\n * koru:k1 — the RBAC level of the folder this pane is in, '' when ACL is not\n * enforced (or when the host drives the rows: it answered the request, so it\n * is holding the `perm` this pane never saw).\n */\nfunction dirPerm(): string {\n  return props.selfDriven ? ownPerm.value : '';\n}\n\ndefineExpose({ reload, goUp, getPath, visibleNodes, loadFolder, rowCount, rowPaths, dirPerm });\n\n/* A host-driven pane whose address moved (a tab switch, a search) has to drop\n * any drop-highlight it was showing; nothing else here is stateful across a\n * navigation. */\nwatch(panePath, () => {\n  dropBg.value = false;\n});\n</script>\n\n<template>\n  <section\n    class=\"fe__primary fe-pane\"\n    :class=\"{\n      'fe-pane--focus': focused,\n      'fe-pane--split': paneId === 'split',\n      'fe-pane--dropover': dropBg,\n    }\"\n    :data-pane=\"paneId\"\n    :data-testid=\"`pane-${paneId}`\"\n    role=\"region\"\n    :aria-label=\"paneId === 'split' ? t('split.pane') : t('toolbar.view_label')\"\n    @pointerdown.capture=\"emit('activate')\"\n  >\n    <!-- The address row. `Breadcrumb.vue` in BOTH panes — the right-hand half\n         used to draw a private crumb strip that knew nothing about the\n         multi-storage root, the confine, the ✏ editor or crumb drops.\n\n         ⚠ Not drawn when it would be EMPTY. Home asks for no crumbs (its cards\n         come from every folder in every storage, so a trail would have to name\n         one) and no view switcher, and as of 2026-09-13 it supplies no heading\n         either — so without this guard the page opened with a 38px bordered\n         strip containing nothing, which reads as a rendering fault rather than\n         as a design. -->\n    <div v-if=\"showCrumbs || !!$slots.heading || showViewSwitcher || closable\" class=\"fe-subhead\">\n      <slot name=\"heading\">\n        <Breadcrumb\n          v-if=\"showCrumbs\"\n          :dirname=\"paneWire\"\n          :adapter=\"paneAdapter\"\n          :root-label=\"rootLabel || paneAdapter\"\n          :locale=\"locale\"\n          :multi-storage-root=\"multiRoot\"\n          :root-path=\"rootPath\"\n          :subfolders=\"crumbSubfolders ?? paneSubfolders\"\n          @navigate=\"onCrumbNavigate\"\n          @copy-path=\"(p: string) => emit('copy-path', p)\"\n          @crumb-context=\"(p) => emit('crumb-context', p)\"\n          @crumb-drop=\"(p: string, ev: DragEvent) => emit('crumb-drop', p, ev)\"\n        />\n      </slot>\n      <div class=\"fe-subhead__actions\">\n        <ViewSwitcher\n          v-if=\"showViewSwitcher\"\n          :view-mode=\"viewMode\"\n          :locale=\"locale\"\n          :modes=\"viewModes\"\n          @update:view-mode=\"(v: ViewMode) => { emit('activate'); emit('update:viewMode', v); }\"\n        />\n        <button\n          v-if=\"closable\"\n          type=\"button\"\n          class=\"fe-btn fe-btn--icon-only fe-pane__close\"\n          :title=\"t('split.close')\"\n          :aria-label=\"t('split.close')\"\n          data-testid=\"pane-close\"\n          @click=\"emit('close')\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M6 6l12 12M18 6L6 18\" />\n          </svg>\n        </button>\n      </div>\n    </div>\n\n    <!-- Where the selection bar lands. Rendered by the pane, declaratively and\n         in the right place, because the row above it only exists after the\n         first tab is seeded — a node inserted by script would end up above it\n         for the rest of the session. The filter row hides behind\n         `.fe-selbar-slot.is-active ~ .fe-filterbar`. -->\n    <div class=\"fe-selbar-slot\"></div>\n\n    <!-- ⚠ No `&& !atVirtualRoot` any more. The drive list KEEPS this row — it\n         is the one place a person can narrow a long list of storages by name —\n         but as the name box alone (`paneFilterMode`), because a drive answers\n         none of the four chips. -->\n    <FilterBar\n      v-if=\"showFilterBar\"\n      :value=\"filters\"\n      :locale=\"locale\"\n      :theme=\"theme\"\n      :mode=\"paneFilterMode\"\n      :find-label=\"paneFindLabel\"\n      :order=\"order\"\n      :shown=\"displayFiles.length\"\n      :total=\"paneRows.length\"\n      :files=\"paneRows\"\n      :can-paste=\"canPaste\"\n      :can-write=\"canWrite\"\n      @update:value=\"(v: DriveFilters) => { emit('activate'); emit('update:filters', v); }\"\n      @new-folder=\"emit('activate'); emit('new-folder')\"\n      @upload=\"emit('activate'); emit('upload')\"\n      @paste=\"emit('activate'); emit('paste')\"\n      @select-all=\"emit('activate'); emit('select-all')\"\n    />\n\n    <!-- Strips that belong to the WINDOW's state rather than to the listing\n         (live presence, the encrypted-folder banners, the trash banner). Only\n         the host can know about them, so it puts them here. -->\n    <slot name=\"banners\"></slot>\n\n    <div\n      class=\"fe__body\"\n      :class=\"{ 'is-dropover': dropBg }\"\n      @click.self=\"onBgClick\"\n      @contextmenu=\"onBgContext\"\n      @dragover=\"onBgDragOver\"\n      @dragleave=\"onBgDragLeave\"\n      @drop=\"onBgDrop\"\n    >\n      <!-- The host draws the body itself for the states that have no listing\n           behind them (Home, a dead deep link, the lock screen). -->\n      <slot v-if=\"bodyOverride\" name=\"body\"></slot>\n\n      <!-- Initial load: skeleton ghosts (view-mode aware) instead of an\n           empty/\"no files\" flash. Only when there is nothing yet — navigation\n           keeps the current list. -->\n      <div v-else-if=\"paneLoading && paneRows.length === 0\" class=\"fe__skeleton\" role=\"status\">\n        <span class=\"fe-sr-only\">{{ t('loading') }}</span>\n        <div v-if=\"viewMode !== 'list'\" class=\"fe-skel-grid\" aria-hidden=\"true\">\n          <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-card\">\n            <div class=\"fe-skel fe-skel--thumb\"></div>\n            <div class=\"fe-skel fe-skel--label\"></div>\n          </div>\n        </div>\n        <div v-else class=\"fe-skel-list\" aria-hidden=\"true\">\n          <div v-for=\"i in 8\" :key=\"i\" class=\"fe-skel-row\">\n            <div class=\"fe-skel fe-skel--icon\"></div>\n            <div class=\"fe-skel fe-skel--name\"></div>\n            <div class=\"fe-skel fe-skel--size\"></div>\n            <div class=\"fe-skel fe-skel--date\"></div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Listing failed with nothing else to show: a retryable error state in\n           the same visual language, in BOTH panes. The right-hand half used to\n           print one unstyled line and a bare button. -->\n      <div v-else-if=\"paneError && paneRows.length === 0\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"60\" cy=\"50\" r=\"28\" />\n          <path d=\"M60 36v18\" />\n          <circle cx=\"60\" cy=\"63\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n          <path d=\"M24 88h72\" stroke-dasharray=\"3 5\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('error.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('error.hint') }}</p>\n        <div class=\"fe-state__actions\">\n          <button\n            type=\"button\"\n            class=\"fe-btn fe-btn--primary\"\n            @click=\"selfDriven ? loadFolder() : emit('retry')\"\n          >\n            {{ t('error.retry') }}\n          </button>\n        </div>\n        <details class=\"fe-state__details\">\n          <summary class=\"fe-state__details-summary\">{{ t('error.details') }}</summary>\n          <pre class=\"fe-state__details-pre\">{{ paneError }}</pre>\n        </details>\n      </div>\n\n      <!-- The folder HAS rows and the filters hid all of them. \"This folder is\n           empty\" would be false, and the way back is the chip row just above,\n           so the message names it and offers the button. -->\n      <div\n        v-else-if=\"!paneLoading && filtersOn && displayFiles.length === 0 && paneRows.length > 0\"\n        class=\"fe-state\"\n        data-testid=\"empty-filtered\"\n      >\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M26 28h68L68 58v24l-16 8V58z\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('filter.empty.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('filter.empty.hint') }}</p>\n        <div class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn\" @click=\"emit('clear-filters')\">\n            {{ t('filter.clear') }}\n          </button>\n        </div>\n      </div>\n\n      <!-- Loaded, zero rows: the host's own empty state when it has one to\n           offer (an empty search, an empty panel view, an empty trash), this\n           pane's plain one otherwise. -->\n      <slot\n        v-else-if=\"!paneLoading && paneRows.length === 0\"\n        name=\"empty\"\n      >\n        <div class=\"fe-state\">\n          <svg\n            class=\"fe-state__art\"\n            viewBox=\"0 0 120 100\"\n            width=\"110\"\n            height=\"92\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n          >\n            <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          </svg>\n          <p class=\"fe-state__title\">{{ t('empty.folder') }}</p>\n        </div>\n      </slot>\n\n      <ListView\n        v-else-if=\"viewMode === 'list'\"\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :folder-key=\"folderKey\"\n        :theme=\"theme\"\n        :thumb-src=\"thumbSrc\"\n        :keep-badge-for=\"keepBadgeFor\"\n        :starred-ids=\"starredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-row=\"onViewClick\"\n        @display-order=\"(nodes: FileNode[]) => emit('display-order', nodes)\"\n        @dbl-row=\"onViewDbl\"\n        @context-row=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n      />\n      <GridView\n        v-else-if=\"viewMode === 'grid'\"\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :sections=\"true\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :keep-badge-for=\"keepBadgeFor\"\n        :thumb-src=\"thumbSrc\"\n        :e2e-active=\"e2eActive\"\n        :starred-ids=\"starredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-card=\"onViewClick\"\n        @display-order=\"(nodes: FileNode[]) => emit('display-order', nodes)\"\n        @dbl-card=\"onViewDbl\"\n        @context-card=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n      />\n      <GalleryView\n        v-else\n        :files=\"displayFiles\"\n        :order=\"order\"\n        :selected=\"selected\"\n        :clipped=\"clipped\"\n        :show-parent-path=\"showParentPath\"\n        :locale=\"locale\"\n        :loading=\"paneLoading\"\n        :thumb-src=\"thumbSrc\"\n        :e2e-active=\"e2eActive\"\n        :starred-ids=\"starredIds\"\n        :star-enabled=\"starEnabled\"\n        :api-base=\"apiBase\"\n        :auth-headers=\"authHeaders\"\n        :auth-credentials=\"authCredentials\"\n        @click-card=\"onViewClick\"\n        @dbl-card=\"onViewDbl\"\n        @context-card=\"onViewContext\"\n        @item-drag-start=\"onRowDragStart\"\n        @item-drop-into=\"onViewDropInto\"\n        @star-change=\"(n: FileNode, v: boolean) => emit('star-change', n, v)\"\n      />\n    </div>\n  </section>\n</template>\n","/**\n * useTabs — wiring:d1 tabs (the workspace tab strip).\n *\n * A LAYER ABOVE FileExplorer's location state, never a replacement for\n * it: each tab is a location snapshot `{ id, path, viewMode, split }`.\n * The composable performs no fetching and owns no navigation — the host\n * activates a tab by running its EXISTING `load(path)` pipeline and\n * reports navigations back through `syncActive()`, which keeps the\n * active snapshot glued to wherever the user actually is.\n *\n * `path` is stored in the SAME form as FileExplorer's `currentPath`\n * (virtual `<storage>/<rel>` in multi-storage mode, bare relative path\n * in single-storage mode) — i.e. the exact string `load(path)` accepts.\n * Storing the wire form (`adapter://rel`) instead would break the\n * rootPath-floor clamp inside load() (the floor is compared in user-path\n * form), so the user-path form is deliberate.\n *\n * Persistence: localStorage under a host-supplied key (the host derives\n * it from the pathPersist scope: disabled when `pathPersist: 'none'`,\n * suffixed with the rootPath confine so embedded instances with\n * different confines never clobber each other). Schema:\n *\n *   { \"v\": 1, \"active\": \"<id>\",\n *     \"tabs\": [ { \"id\", \"path\", \"viewMode\", \"split\": {\"path\"}|null } ] }\n */\n\nimport { computed, ref, watch, type Ref } from 'vue';\nimport type { ViewMode } from '../types/FileNode';\n\n/** Per-tab split state — the secondary pane's own location. */\nexport interface TabSplit {\n  path: string;\n  /** ui-fix — the pane's OWN view mode (list/grid/gallery); undefined\n   *  inherits the main panel's mode at split time. */\n  viewMode?: ViewMode;\n}\n\nexport interface TabState {\n  id: string;\n  /** Location snapshot in `currentPath` form (see module docs). */\n  path: string;\n  viewMode: ViewMode;\n  split: TabSplit | null;\n}\n\nexport interface UseTabsOptions {\n  /** localStorage key; null disables persistence entirely. */\n  storageKey: string | null;\n}\n\nfunction makeId(): string {\n  try {\n    return crypto.randomUUID();\n  } catch {\n    return `t${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n  }\n}\n\nexport function useTabs(opts: UseTabsOptions) {\n  const tabs: Ref<TabState[]> = ref([]);\n  const activeId = ref<string>('');\n\n  const activeTab = computed<TabState | null>(\n    () => tabs.value.find((t) => t.id === activeId.value) ?? null,\n  );\n  const activeIndex = computed(() => tabs.value.findIndex((t) => t.id === activeId.value));\n  const hasMultiple = computed(() => tabs.value.length > 1);\n\n  // ------------------------------------------------------------------\n  // Persistence\n  // ------------------------------------------------------------------\n\n  /** Restore from storage. Returns true when at least one tab loaded. */\n  function restore(): boolean {\n    if (!opts.storageKey) return false;\n    try {\n      const raw = localStorage.getItem(opts.storageKey);\n      if (!raw) return false;\n      const parsed = JSON.parse(raw) as { v?: unknown; active?: unknown; tabs?: unknown };\n      if (!parsed || !Array.isArray(parsed.tabs) || parsed.tabs.length === 0) return false;\n      const clean: TabState[] = [];\n      for (const t of parsed.tabs as Array<Record<string, unknown>>) {\n        if (!t || typeof t.path !== 'string') continue;\n        // ViewMode is validated loosely on purpose: future modes (e.g. the\n        // gallery wave) must survive a round-trip through an older schema.\n        const vm =\n          typeof t.viewMode === 'string' && t.viewMode ? (t.viewMode as ViewMode) : 'list';\n        const rawSplit = t.split as { path?: unknown; viewMode?: unknown } | null | undefined;\n        const split =\n          rawSplit && typeof rawSplit === 'object' && typeof rawSplit.path === 'string'\n            ? {\n                path: rawSplit.path,\n                viewMode:\n                  typeof rawSplit.viewMode === 'string' && rawSplit.viewMode\n                    ? (rawSplit.viewMode as ViewMode)\n                    : undefined,\n              }\n            : null;\n        clean.push({\n          id: typeof t.id === 'string' && t.id ? t.id : makeId(),\n          path: t.path,\n          viewMode: vm,\n          split,\n        });\n      }\n      if (clean.length === 0) return false;\n      tabs.value = clean;\n      activeId.value = clean.some((t) => t.id === parsed.active)\n        ? String(parsed.active)\n        : clean[0].id;\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  function persist(): void {\n    if (!opts.storageKey) return;\n    try {\n      localStorage.setItem(\n        opts.storageKey,\n        JSON.stringify({ v: 1, active: activeId.value, tabs: tabs.value }),\n      );\n    } catch {\n      /* private mode / quota */\n    }\n  }\n\n  watch([tabs, activeId], persist, { deep: true });\n\n  // ------------------------------------------------------------------\n  // Mutations\n  // ------------------------------------------------------------------\n\n  /** Create the first tab (no-op once any tab exists). */\n  function seed(path: string, viewMode: ViewMode): void {\n    if (tabs.value.length > 0) return;\n    const t: TabState = { id: makeId(), path, viewMode, split: null };\n    tabs.value = [t];\n    activeId.value = t.id;\n  }\n\n  /** Update the ACTIVE tab's snapshot (navigation / view-mode change). */\n  function syncActive(patch: Partial<Pick<TabState, 'path' | 'viewMode'>>): void {\n    const t = activeTab.value;\n    if (!t) return;\n    if (patch.path !== undefined) t.path = patch.path;\n    if (patch.viewMode !== undefined) t.viewMode = patch.viewMode;\n  }\n\n  /** Open a new tab right after the active one (browser convention). */\n  function openTab(\n    path: string,\n    o: { viewMode: ViewMode; background?: boolean; split?: TabSplit | null },\n  ): TabState {\n    const t: TabState = { id: makeId(), path, viewMode: o.viewMode, split: o.split ?? null };\n    const idx = activeIndex.value;\n    tabs.value.splice(idx === -1 ? tabs.value.length : idx + 1, 0, t);\n    if (!o.background) activeId.value = t.id;\n    return t;\n  }\n\n  /**\n   * Close a tab. The last remaining tab never closes. Returns the tab\n   * the host must ACTIVATE (right neighbour, else left) when the active\n   * one was closed; null when the visible location is unchanged.\n   */\n  function closeTab(id: string): TabState | null {\n    if (tabs.value.length <= 1) return null;\n    const idx = tabs.value.findIndex((t) => t.id === id);\n    if (idx === -1) return null;\n    const wasActive = tabs.value[idx].id === activeId.value;\n    tabs.value.splice(idx, 1);\n    if (!wasActive) return null;\n    const next = tabs.value[Math.min(idx, tabs.value.length - 1)];\n    activeId.value = next.id;\n    return next;\n  }\n\n  /** Make a tab active. Returns it when the active tab actually changed. */\n  function activate(id: string): TabState | null {\n    const t = tabs.value.find((x) => x.id === id);\n    if (!t || t.id === activeId.value) return null;\n    activeId.value = t.id;\n    return t;\n  }\n\n  /** Cycle: +1 = next, -1 = previous (wraps). */\n  function step(delta: number): TabState | null {\n    if (tabs.value.length < 2) return null;\n    const idx = activeIndex.value === -1 ? 0 : activeIndex.value;\n    const next = tabs.value[(idx + delta + tabs.value.length) % tabs.value.length];\n    return activate(next.id);\n  }\n\n  /** Drag-sort support: move the tab at `from` to position `to`. */\n  function move(from: number, to: number): void {\n    if (from === to) return;\n    if (from < 0 || to < 0 || from >= tabs.value.length || to >= tabs.value.length) return;\n    const list = [...tabs.value];\n    const [t] = list.splice(from, 1);\n    list.splice(to, 0, t);\n    tabs.value = list;\n  }\n\n  /** Set (or clear with null) the ACTIVE tab's split state. */\n  function setSplit(split: TabSplit | null): void {\n    const t = activeTab.value;\n    if (!t) return;\n    t.split = split;\n  }\n\n  return {\n    tabs,\n    activeId,\n    activeTab,\n    activeIndex,\n    hasMultiple,\n    restore,\n    seed,\n    syncActive,\n    openTab,\n    closeTab,\n    activate,\n    step,\n    move,\n    setSplit,\n  };\n}\n\nexport type TabsApi = ReturnType<typeof useTabs>;\n","<script setup lang=\"ts\">\n/**\n * EncryptedFolderModal — create an E2E-encrypted folder (wiring:e2).\n *\n * Collects folder name + password ×2 and an explicit \"I understand there\n * is NO recovery\" acknowledgement. The parent (FileExplorer) performs the\n * actual newfolder + marker-upload dance; this modal never touches the\n * network and never stores the password anywhere.\n *\n * Crypto scheme + threat model: docs/E2E-ENCRYPTION.md.\n */\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { E2E_MIN_PASSWORD_LEN } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** True while the parent is creating the folder + uploading the marker. */\n  busy?: boolean;\n  /** Short id of this installation's E2E escrow key, when one is configured.\n   *  Shown BEFORE the folder is created: escrow means the operator can open\n   *  it without the password, and that is not a detail to discover later. */\n  escrowKid?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: { name: string; password: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst password = ref('');\nconst password2 = ref('');\nconst ack = ref(false);\nconst err = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      name.value = '';\n      password.value = '';\n      password2.value = '';\n      ack.value = false;\n      err.value = null;\n    }\n  },\n);\n\nfunction submit() {\n  if (props.busy) return;\n  const clean = name.value.trim();\n  if (!clean) {\n    err.value = t('modal.newfolder.placeholder');\n    return;\n  }\n  if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..' || clean.startsWith('.filex')) {\n    err.value = t('e2e.create.bad_name');\n    return;\n  }\n  if (password.value.length < E2E_MIN_PASSWORD_LEN) {\n    err.value = t('e2e.create.pw_short');\n    return;\n  }\n  if (password.value !== password2.value) {\n    err.value = t('e2e.create.pw_mismatch');\n    return;\n  }\n  if (!ack.value) {\n    err.value = t('e2e.create.ack_required');\n    return;\n  }\n  err.value = null;\n  emit('submit', { name: clean, password: password.value });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.create.title')\" size=\"sm\" @close=\"emit('close')\">\n    <!-- ⚠ Every field carries a visible <label>. They had placeholders only\n         (v0.41.0 screenshot pass): the name of a field vanished the moment\n         anything was typed into it, and on the two password fields — where\n         what is typed is dots — nothing on screen said which box was which.\n         A placeholder is a hint, not a name; the length rule stays one. -->\n    <form class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('modal.newfolder.placeholder') }}</span>\n        <input v-model=\"name\" type=\"text\" class=\"fe-input\" autocomplete=\"off\" :disabled=\"busy\" />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw_label') }}</span>\n        <input\n          v-model=\"password\"\n          type=\"password\"\n          class=\"fe-input\"\n          :placeholder=\"t('e2e.create.pw_placeholder')\"\n          autocomplete=\"new-password\"\n          :disabled=\"busy\"\n        />\n      </label>\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('e2e.create.pw2_label') }}</span>\n        <input\n          v-model=\"password2\"\n          type=\"password\"\n          class=\"fe-input\"\n          autocomplete=\"new-password\"\n          :disabled=\"busy\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n      <div class=\"fe-e2e-warn\" role=\"alert\">\n        <strong>{{ t('e2e.create.warn_title') }}</strong>\n        <p>{{ t('e2e.create.warn_body') }}</p>\n      </div>\n      <!-- wiring:e2 recovery — disclosure, not a setting. The user cannot\n           turn escrow off for their folder; they can only know about it. -->\n      <div v-if=\"escrowKid\" class=\"fe-e2e-rk__escrow\" role=\"note\">\n        <strong>{{ t('e2e.create.escrow_title') }}</strong>\n        <p>{{ t('e2e.create.escrow_body') }}</p>\n      </div>\n      <label class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" :disabled=\"busy\" />\n        <span>{{ t('e2e.create.ack') }}</span>\n      </label>\n      <p v-if=\"err\" class=\"fe-form__error\">{{ err }}</p>\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"busy\" @click=\"submit\">\n        {{ busy ? t('e2e.create.busy') : t('e2e.create.create') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * RecoveryKeyModal — shows a folder recovery key, exactly once (wiring:e2).\n *\n * This is the only moment the key exists anywhere outside the user's own\n * records. filex does not store it, cannot recompute it, and will never be\n * able to show it again — so the dialog is deliberately hard to dismiss by\n * accident: no backdrop close, no cancel button, and an acknowledgement the\n * user has to tick.\n *\n * ⚠ The key must not leave this component. No logging, no analytics, no\n * emit carrying its value. Copy and download are both local.\n *\n * Crypto scheme: docs/E2E-ENCRYPTION.md and lib/e2ecrypto.ts.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The key itself. Shown, copied, downloaded — never emitted or stored. */\n  recoveryKey: string;\n  /** Folder name, for the downloaded file and the dialog copy. */\n  folderName?: string;\n  /** Set when this installation holds an escrow key for the folder too. */\n  escrowKid?: string | null;\n  /** 'created' = a new folder; 'upgraded' = an existing folder gained recovery. */\n  variant?: 'created' | 'upgraded';\n}>();\n\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst { t } = useLocale(() => props.locale);\nconst ack = ref(false);\nconst copied = ref(false);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      ack.value = false;\n      copied.value = false;\n    }\n  },\n);\n\nconst title = computed(() =>\n  props.variant === 'upgraded' ? t('e2e.recovery.title_upgraded') : t('e2e.recovery.title'),\n);\n\nasync function copy() {\n  try {\n    await navigator.clipboard.writeText(props.recoveryKey);\n    copied.value = true;\n    window.setTimeout(() => (copied.value = false), 2000);\n  } catch {\n    // Clipboard permission denied (or a non-secure origin). The key is on\n    // screen and selectable, so this is a convenience, not the only route.\n    copied.value = false;\n  }\n}\n\nfunction download() {\n  const name = props.folderName || 'folder';\n  const body =\n    `filex recovery key\\n` +\n    `folder: ${name}\\n` +\n    `\\n${props.recoveryKey}\\n\\n` +\n    `This key opens the encrypted folder without its password.\\n` +\n    `Anyone holding it can read the folder. Store it like a password.\\n` +\n    `filex does not keep a copy and cannot show it again.\\n`;\n  const url = URL.createObjectURL(new Blob([body], { type: 'text/plain' }));\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = `filex-recovery-${name}.txt`;\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n  window.setTimeout(() => URL.revokeObjectURL(url), 30_000);\n}\n\nfunction done() {\n  if (!ack.value) return;\n  emit('close');\n}\n</script>\n\n<template>\n  <!-- No backdrop close, and ESC only lands once the box is ticked: the key\n       cannot be shown again, so an accidental dismissal is data loss. -->\n  <Modal :open=\"open\" :title=\"title\" size=\"sm\" :close-on-backdrop=\"false\" @close=\"done\">\n    <div class=\"fe-e2e-rk\">\n      <p class=\"fe-e2e-rk__lead\">\n        {{ variant === 'upgraded' ? t('e2e.recovery.lead_upgraded') : t('e2e.recovery.lead') }}\n      </p>\n\n      <output class=\"fe-e2e-rk__key\" aria-label=\"recovery key\">{{ recoveryKey }}</output>\n\n      <div class=\"fe-e2e-rk__actions\">\n        <button type=\"button\" class=\"fe-btn\" @click=\"copy\">\n          {{ copied ? t('e2e.recovery.copied') : t('e2e.recovery.copy') }}\n        </button>\n        <button type=\"button\" class=\"fe-btn\" @click=\"download\">\n          {{ t('e2e.recovery.download') }}\n        </button>\n      </div>\n\n      <div class=\"fe-e2e-warn\" role=\"alert\">\n        <strong>{{ t('e2e.recovery.warn_title') }}</strong>\n        <p>{{ t('e2e.recovery.warn_body') }}</p>\n      </div>\n\n      <div v-if=\"escrowKid\" class=\"fe-e2e-rk__escrow\" role=\"note\">\n        <strong>{{ t('e2e.recovery.escrow_title') }}</strong>\n        <p>{{ t('e2e.recovery.escrow_body') }}</p>\n        <p class=\"fe-e2e-rk__kid\">{{ t('e2e.recovery.escrow_kid') }}: <code>{{ escrowKid }}</code></p>\n      </div>\n\n      <label class=\"fe-e2e-ack\">\n        <input v-model=\"ack\" type=\"checkbox\" />\n        <span>{{ t('e2e.recovery.ack') }}</span>\n      </label>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" :disabled=\"!ack\" @click=\"done\">\n        {{ t('e2e.recovery.done') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * E2eRecoveryUnlockModal — open an encrypted folder without its password.\n *\n * Two doors, and the dialog is explicit about which one you are using\n * because they are not equivalent:\n *\n *   - the USER RECOVERY KEY, shown once when the folder was created. Opens\n *     the folder and nobody is told, because it is your key.\n *   - the ESCROW KEY, held by the operator of this installation. Opening a\n *     folder with it NOTIFIES the folder's owner. The dialog says so before\n *     the key is typed, not after.\n *\n * The component collects input and validates its shape. All crypto and all\n * network calls happen in the parent (FileExplorer), which owns the marker\n * and the key ring — same division as the password lock screen.\n */\nimport { computed, ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { parseRecoveryKey } from '../lib/e2ecrypto';\nimport type { EscrowAvailability } from '../lib/e2ecrypto';\nimport Modal from '../modals/Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /** The folder has a user recovery key slot (v2 markers created since 0.31). */\n  hasRecovery: boolean;\n  /**\n   * Whether the escrow door applies to THIS folder — see escrowAvailability.\n   * 'predates' and 'other-key' are not \"no escrow tab\"; they are two\n   * different facts the dialog has to state, because an admin who knows the\n   * installation has escrow reads a missing tab as a bug and tries the key\n   * anyway.\n   */\n  escrowState: EscrowAvailability;\n  /** Short id of the escrow key THIS FOLDER was sealed to, when it has one. */\n  escrowKid?: string | null;\n  busy?: boolean;\n  /** Set by the parent after a failed attempt. */\n  error?: string | null;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', payload: { mode: 'recovery' | 'escrow'; value: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n/** The escrow tab is offered only when the key can actually open this\n *  folder. Every other state is explained in words instead. */\nconst hasEscrow = computed(() => props.escrowState === 'available');\n/** The installation has an escrow key that does NOT apply here. Saying so\n *  is the whole point: silence reads as \"not enabled\". */\nconst escrowUnavailableReason = computed(() => {\n  if (props.escrowState === 'predates') return t('e2e.recover.escrow_predates');\n  if (props.escrowState === 'other-key') return t('e2e.recover.escrow_other_key');\n  return null;\n});\nconst mode = ref<'recovery' | 'escrow'>('recovery');\nconst recoveryValue = ref('');\nconst escrowValue = ref('');\nconst localErr = ref<string | null>(null);\n\nwatch(\n  () => props.open,\n  (v) => {\n    if (v) {\n      mode.value = props.hasRecovery ? 'recovery' : 'escrow';\n      recoveryValue.value = '';\n      escrowValue.value = '';\n      localErr.value = null;\n    }\n  },\n);\n\n/** A folder with neither slot is a pre-0.31 folder: the password is the\n *  only way in, and saying so is more useful than an empty dialog. */\nconst nothingAvailable = computed(() => !props.hasRecovery && !hasEscrow.value);\n\nconst shownError = computed(() => localErr.value || props.error || null);\n\nfunction submit() {\n  if (props.busy || nothingAvailable.value) return;\n  localErr.value = null;\n  if (mode.value === 'recovery') {\n    // Check the shape locally so a typo reads as a typo rather than as a\n    // wrong key — the two failures call for different next steps.\n    if (!parseRecoveryKey(recoveryValue.value)) {\n      localErr.value = t('e2e.recover.bad_format');\n      return;\n    }\n    emit('submit', { mode: 'recovery', value: recoveryValue.value });\n    return;\n  }\n  if (!escrowValue.value.trim()) {\n    localErr.value = t('e2e.recover.escrow_required');\n    return;\n  }\n  emit('submit', { mode: 'escrow', value: escrowValue.value });\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('e2e.recover.title')\" size=\"sm\" @close=\"emit('close')\">\n    <div class=\"fe-e2e-recover\">\n      <p v-if=\"nothingAvailable\" class=\"fe-e2e-recover__none\">\n        {{ t('e2e.recover.none') }}\n      </p>\n\n      <template v-else>\n        <div v-if=\"hasRecovery && hasEscrow\" class=\"fe-e2e-recover__tabs\" role=\"tablist\">\n          <button\n            type=\"button\"\n            role=\"tab\"\n            class=\"fe-e2e-recover__tab\"\n            :class=\"{ 'fe-e2e-recover__tab--on': mode === 'recovery' }\"\n            :aria-selected=\"mode === 'recovery'\"\n            @click=\"mode = 'recovery'\"\n          >\n            {{ t('e2e.recover.tab_recovery') }}\n          </button>\n          <button\n            type=\"button\"\n            role=\"tab\"\n            class=\"fe-e2e-recover__tab\"\n            :class=\"{ 'fe-e2e-recover__tab--on': mode === 'escrow' }\"\n            :aria-selected=\"mode === 'escrow'\"\n            @click=\"mode = 'escrow'\"\n          >\n            {{ t('e2e.recover.tab_escrow') }}\n          </button>\n        </div>\n\n        <form v-if=\"mode === 'recovery'\" class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n          <p class=\"fe-e2e-recover__hint\">{{ t('e2e.recover.recovery_hint') }}</p>\n          <input\n            v-model=\"recoveryValue\"\n            type=\"text\"\n            class=\"fe-input fe-e2e-recover__key\"\n            :placeholder=\"t('e2e.recover.recovery_placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :disabled=\"busy\"\n          />\n        </form>\n\n        <form v-else class=\"fe-e2e-form\" @submit.prevent=\"submit\">\n          <div class=\"fe-e2e-warn\" role=\"alert\">\n            <strong>{{ t('e2e.recover.escrow_warn_title') }}</strong>\n            <p>{{ t('e2e.recover.escrow_warn_body') }}</p>\n          </div>\n          <p v-if=\"escrowKid\" class=\"fe-e2e-recover__hint\">\n            {{ t('e2e.recover.escrow_kid') }}: <code>{{ escrowKid }}</code>\n          </p>\n          <textarea\n            v-model=\"escrowValue\"\n            class=\"fe-input fe-e2e-recover__escrow\"\n            rows=\"5\"\n            :placeholder=\"t('e2e.recover.escrow_placeholder')\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            :disabled=\"busy\"\n          ></textarea>\n        </form>\n      </template>\n\n      <!-- ⚠ Shown whenever the installation has an escrow key that cannot\n           open THIS folder. A folder created before escrow was adopted must\n           not merely lack a tab; it must say why, or the absence reads as a\n           bug and the operator burns an afternoon on it. -->\n      <p v-if=\"escrowUnavailableReason\" class=\"fe-e2e-recover__note\">\n        {{ escrowUnavailableReason }}\n      </p>\n\n      <p v-if=\"shownError\" class=\"fe-form__error\">{{ shownError }}</p>\n    </div>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" :disabled=\"busy\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"busy || nothingAvailable\"\n        @click=\"submit\"\n      >\n        {{ busy ? t('e2e.recover.busy') : t('e2e.recover.unlock') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","/**\n * nodeRow — the starred / recently-opened / tag endpoints answer with raw node\n * rows (relative `path`, numeric `storage_id`, RFC3339 stamps), not the\n * listing shape. This turns one row into the `FileNode` every view renders.\n *\n * Pure on purpose: the explorer wraps it with its own config, and the unit\n * test pins the two facts the context menu depends on — `perm` and\n * `read_only` — without mounting the component.\n */\nimport type { FileNode } from '../types';\n\n/** What the explorer knows about the install, as far as a row needs it. */\nexport interface NodeRowContext {\n  /** `config.storages` — names, and the host's read-only flag per storage. */\n  storages: ReadonlyArray<{ name: string; readOnly?: boolean }>;\n  /** Multi-storage root mode: a row that cannot be addressed by storage name\n   *  is dropped rather than guessed into somebody else's drive. */\n  multiStorageRoot: boolean;\n}\n\nconst PERM_LEVELS = new Set(['none', 'viewer', 'editor', 'owner']);\n\n/** tablo:t1 — an RFC3339 stamp from a node row as unix ms, or undefined. A\n *  string we cannot parse is left undefined rather than turned into `NaN`,\n *  which would print as \"Invalid Date\" and sort unpredictably. */\nexport function rowMillis(v: unknown): number | undefined {\n  if (typeof v !== 'string' || !v) return undefined;\n  const ms = Date.parse(v);\n  return Number.isFinite(ms) ? ms : undefined;\n}\n\n/**\n * The storage NAME is what a qualified path needs, and a node row does not\n * carry the id-to-name mapping. The backend fills `storage` for exactly this\n * (handlers/meta.go, `(*Meta).rows`); against an older server the only safe\n * fallback is the single-storage case — guessing in a multi-storage install\n * sends the user to a path in somebody else's drive.\n */\nexport function nodeRowToFileNode(\n  row: Record<string, unknown>,\n  ctx: NodeRowContext,\n): FileNode | null {\n  const rel = String(row?.path ?? '').replace(/^\\/+/, '');\n  if (!rel) return null;\n  const configured = ctx.storages ?? [];\n  const storageName =\n    typeof row.storage === 'string' && row.storage\n      ? row.storage\n      : configured.length === 1\n        ? configured[0].name\n        : '';\n  if (ctx.multiStorageRoot && !storageName) return null;\n  const name = String(row.name ?? rel.split('/').pop() ?? '');\n  const isDir = row.type === 'dir';\n  const size = typeof row.size === 'number' ? row.size : 0;\n  const id = typeof row.id === 'number' ? row.id : undefined;\n  /* ⚠⚠ THE CONTEXT MENU MUST BE THE SAME EVERYWHERE (owner, 2026-09-19). The\n     menu gates Rename / Delete / Move to / Share on the row's own `perm` and\n     on the storage's `read_only` — a folder listing carries both, and until\n     these two lines a Recent / Starred / tag / Home row carried neither, so\n     the menu fell back to the folder opened LAST: nothing on the landing page\n     (every write verb gone), or a stale writable folder (every write verb\n     offered on a read-only mount). The row says for itself what may be done\n     to it, because in these views there is no folder to ask.\n     `read_only` prefers the server's word and falls back to the host's own\n     storage list for a server that predates the field. */\n  const perm =\n    typeof row.perm === 'string' && PERM_LEVELS.has(row.perm)\n      ? (row.perm as FileNode['perm'])\n      : undefined;\n  const hostReadOnly = configured.find((s) => s.name === storageName)?.readOnly === true;\n  const readOnly = typeof row.read_only === 'boolean' ? row.read_only : hostReadOnly;\n  return {\n    type: isDir ? 'dir' : 'file',\n    id,\n    /* tablo:t1 — ⚠⚠ THE DATE. A node row carries `backend_mtime` (what the\n       storage says) and `db_mtime` (what our last scan recorded) as RFC3339\n       strings; `FileNode.last_modified` is unix MILLISECONDS. Nothing mapped\n       between the two, so every row from Recent, Starred and a tag view\n       arrived with no date at all — measured on Recent: eleven rows, eleven em\n       dashes in the Modified column, and a Modified column header you could\n       click that then sorted nothing. It also made the date grouping this view\n       is supposed to show impossible, because every row fell in the \"No date\"\n       bucket. Storage first: `backend_mtime` is the file's own truth and\n       `db_mtime` only says when we last looked at it. */\n    last_modified: rowMillis(row.backend_mtime) ?? rowMillis(row.db_mtime),\n    path: storageName ? `${storageName}://${rel}` : rel,\n    basename: name,\n    extension: isDir\n      ? ''\n      : name.includes('.')\n        ? (name.split('.').pop() || '').toLowerCase()\n        : '',\n    storage: storageName,\n    visibility: 'private',\n    size,\n    file_size: size,\n    mime_type: typeof row.mime === 'string' ? row.mime : '',\n    ...(perm ? { perm } : {}),\n    read_only: readOnly,\n    // Keyed by node id. A file with no rendered thumbnail 404s here and the\n    // view falls back to its icon — the contract the ordinary listing has too.\n    thumb_url: !isDir && id !== undefined ? `/api/files/thumb/${id}` : undefined,\n    extra_metadata: {},\n  } as unknown as FileNode;\n}\n","/**\n * tags.ts — the list of tags that exist, for the navigation panel.\n *\n * `GET /api/files/manager/tags/all` is one query per call, and the panel is\n * rendered by every mounted explorer: the web app, the desktop app and every\n * embed on a page (work.example.com renders two side by side). Asking on each mount\n * would multiply a database scan by however many explorers a host happens to\n * put on screen, for a list that changes when somebody edits a tag — i.e.\n * rarely.\n *\n * So: a MODULE-level cache, shared by every instance in the page.\n *   - in-flight requests are deduped, so N explorers mounting in the same tick\n *     produce ONE request;\n *   - the answer is reused for TTL_MS;\n *   - `invalidateTagCache()` drops it the moment tags are written, so the\n *     panel is never stale after the user's own edit — which is the only\n *     staleness a user can actually notice.\n *\n * Keyed by apiBase: the desktop app can point at a different server between\n * mounts and must not be handed the previous server's tags.\n */\n\nconst TTL_MS = 60_000;\n\ninterface CacheEntry {\n  at: number;\n  tags: string[];\n}\n\nconst cache = new Map<string, CacheEntry>();\nconst inflight = new Map<string, Promise<string[]>>();\n\nexport interface TagListOptions {\n  apiBase?: string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** Skip the cache (after a tag edit). */\n  force?: boolean;\n}\n\n/** Drop every cached tag list. Called after a successful tag write. */\nexport function invalidateTagCache(): void {\n  cache.clear();\n  inflight.clear();\n}\n\n/**\n * Every distinct tag, alphabetical, as the backend returns them. Never\n * throws: an older backend with no such route, or a caller with no\n * permission, gets an empty list and the panel simply shows no tag section.\n */\nexport async function fetchAllTags(opts: TagListOptions = {}): Promise<string[]> {\n  const base = opts.apiBase ?? '';\n  const key = base || '(same-origin)';\n  if (!opts.force) {\n    const hit = cache.get(key);\n    if (hit && Date.now() - hit.at < TTL_MS) return hit.tags;\n    const pending = inflight.get(key);\n    if (pending) return pending;\n  }\n  const run = (async () => {\n    try {\n      const res = await fetch(`${base}/api/files/manager/tags/all`, {\n        headers: await (opts.authHeaders ?? (() => ({})))(),\n        credentials: opts.authCredentials ?? 'same-origin',\n      });\n      if (!res.ok) return [];\n      const body = await res.json();\n      const tags: string[] = Array.isArray(body?.tags)\n        ? body.tags.filter((x: unknown): x is string => typeof x === 'string' && x !== '')\n        : [];\n      cache.set(key, { at: Date.now(), tags });\n      return tags;\n    } catch {\n      return [];\n    } finally {\n      inflight.delete(key);\n    }\n  })();\n  inflight.set(key, run);\n  return run;\n}\n\n/**\n * Nodes carrying `tag`, as raw node rows (`{id, path, name, type, …}`) — the\n * same shape `star/list` and `recent` answer with, so the caller maps them\n * through its own `nodeRowToFileNode`.\n */\nexport async function fetchTaggedRows(\n  tag: string,\n  opts: TagListOptions = {},\n  limit = 200,\n): Promise<Record<string, unknown>[]> {\n  const base = opts.apiBase ?? '';\n  const res = await fetch(\n    `${base}/api/files/manager/tagged?tag=${encodeURIComponent(tag)}&limit=${limit}`,\n    {\n      headers: await (opts.authHeaders ?? (() => ({})))(),\n      credentials: opts.authCredentials ?? 'same-origin',\n    },\n  );\n  if (!res.ok) throw new Error(String(res.status));\n  const body = await res.json();\n  return Array.isArray(body?.nodes) ? body.nodes : [];\n}\n","/**\n * What a transfer between two places actually means.\n *\n * Three gestures land on the same wire call — drag a row onto a folder, paste\n * after Ctrl+X, paste after Ctrl+C — and they do NOT mean the same thing once\n * the two ends live in different storages:\n *\n *   • Ctrl+C → paste is a copy, wherever it lands.\n *   • Ctrl+X → paste is a move, wherever it lands. Across storages the server\n *     streams the bytes over and then deletes the original; before v0.27.0 the\n *     explorer quietly downgraded this to a copy and the user was left with the\n *     file in both places, believing they had moved it.\n *   • Dragging is a move inside one storage and a COPY across two — the rule\n *     Explorer and Finder have taught everyone: a drag between drives copies.\n *\n * Kept as a pure function so both the pane path and the clipboard path ask the\n * same question, and so the answer is testable without a server.\n */\n\n/** `alpha://a/b` → `alpha`; a bare path → `''`. */\nexport function wireAdapterOf(p: string): string {\n  const i = String(p ?? '').indexOf('://');\n  return i === -1 ? '' : p.slice(0, i);\n}\n\n/** What the caller asked for. `auto` is a drag: let the storages decide. */\nexport type TransferIntent = 'auto' | 'copy' | 'move';\n\nexport interface TransferPlan {\n  /** What to actually ask the server for. */\n  kind: 'copy' | 'move';\n  /** True when at least one source lives in another storage than the target. */\n  cross: boolean;\n}\n\nexport function resolveTransfer(\n  sources: string[],\n  targetWire: string,\n  intent: TransferIntent = 'auto',\n): TransferPlan {\n  const target = wireAdapterOf(targetWire);\n  // A source with no prefix is a legacy embedder's bare path: it can only mean\n  // \"the same storage I am looking at\", so it never counts as crossing.\n  const cross = sources.some((p) => {\n    const a = wireAdapterOf(p);\n    return a !== '' && target !== '' && a !== target;\n  });\n  if (intent === 'copy') return { kind: 'copy', cross };\n  if (intent === 'move') return { kind: 'move', cross };\n  return { kind: cross ? 'copy' : 'move', cross };\n}\n","/**\n * downloadSelection — hand the browser ONE archive for a set of files.\n *\n * # What was there before\n *\n * `downloadFile(n)` is `window.open(api.downloadUrl(n.path), '_blank')` — one\n * tab, one body, one file. Five selected rows would have been five\n * `window.open` calls, and the browser stops the second one: they are popups\n * once the user gesture has been spent. That is the whole reason the selection\n * bar HID Download the moment a second row was selected, rather than doing\n * something bad with it.\n *\n * # Why two steps\n *\n * A download has to be a NAVIGATION. `fetch()` + `URL.createObjectURL(blob)`\n * buffers the entire archive in the tab before a single byte reaches disk,\n * which is exactly what a 4 GB selection cannot survive. Only a navigation\n * streams.\n *\n * But a navigation is a GET: it carries its arguments in the URL, where 300\n * selected paths do not fit, and it carries no `Authorization` header, which is\n * how the embedded hosts (work.example.com, fishapp) authenticate. So the server\n * splits it — an authenticated POST that resolves and authorizes the member\n * list and returns a short ticket URL, then a plain navigation to that URL.\n * `POST /api/files/archive/download` → `GET /z/<ticket>`.\n *\n * # Why an iframe and not window.open\n *\n * ⚠ The navigation happens AFTER an await. The user's gesture token is spent by\n * then, so `window.open` at that point is a popup and gets blocked — the same\n * failure the whole feature exists to avoid, moved one step later where it is\n * harder to notice. `location.href = url` is not blocked, but if the server\n * ever answers with a text error instead of an attachment the app navigates\n * away and the user loses their place. A hidden iframe is neither: an\n * attachment response is handed to the download manager, and an error body\n * lands somewhere invisible.\n */\n\nimport type { FileApi } from '../composables/useFileApi';\n\n/** What the mint returns. Mirrors `archiveDownloadInfo` in the Go handler. */\nexport interface ArchiveTicket {\n  /** Path to navigate to. Server-relative, e.g. `/z/<token>`. */\n  url: string;\n  ticket: string;\n  /** Filename the browser will save, e.g. `Faturalar.zip`. */\n  name: string;\n  /** How many files the archive will contain, after the server expanded any\n   *  selected folders and dropped what the caller may not read. */\n  files: number;\n  /** Uncompressed total. NOT the archive's size — see the Go handler on why\n   *  there is no such number until the last member is deflated. */\n  bytes: number;\n  expires_at: string;\n}\n\n/**\n * The mint endpoint for a given manager URL.\n *\n * Derived by swapping the trailing `/manager` segment, which is how every\n * route outside the endpoint map is built in useFileApi (`/permissions`,\n * `/versions`, `/comments`, `/ws-ticket`). Doing it this way rather than\n * hardcoding `/api/files/...` is what keeps a cross-origin embed working: the\n * host configured `apiBase`, and the archive call has to land on the same\n * origin as the rest of the explorer.\n */\nexport function archiveTicketUrl(managerUrl: string): string {\n  const base = managerUrl.split('?')[0];\n  return base.replace(/\\/manager$/, '/archive/download');\n}\n\n/**\n * Where the ticket URL should be fetched from.\n *\n * The server answers a server-relative `/z/<token>`, which is correct for the\n * same-origin case and wrong for an embed whose API lives on another host. The\n * origin comes from the manager URL, which is the one thing that is always\n * right.\n */\nexport function absoluteTicketUrl(managerUrl: string, ticketUrl: string): string {\n  if (/^https?:\\/\\//i.test(ticketUrl)) return ticketUrl;\n  const base = managerUrl.split('?')[0];\n  const m = /^(https?:\\/\\/[^/]+)/i.exec(base);\n  return m ? m[1] + ticketUrl : ticketUrl;\n}\n\n/**\n * Ask the server to prepare an archive of `paths` and return the ticket.\n *\n * Throws the same shaped error every other call in useFileApi throws — a\n * localized `message` plus `status`/`detail` — so a caller can toast\n * `err.message` and branch on `err.status` (409 = nothing readable in the\n * selection, 413 = too many files).\n */\nexport async function requestArchive(\n  api: Pick<FileApi, 'jsonFetch' | 'endpoints'>,\n  paths: string[],\n  name?: string,\n): Promise<ArchiveTicket> {\n  const url = archiveTicketUrl(api.endpoints.manager);\n  return api.jsonFetch<ArchiveTicket>(url, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(name ? { paths, name } : { paths }),\n  });\n}\n\n/**\n * How long a download iframe is left in the document.\n *\n * It only has to outlive the moment the browser reads the response headers and\n * hands the body to its download manager; the transfer itself continues after\n * the element is gone. Sixty seconds is slack for a storage that takes a while\n * to produce the first byte, and is short enough that a session of repeated\n * downloads does not accumulate frames.\n */\nexport const DOWNLOAD_FRAME_TTL_MS = 60_000;\n\n/**\n * Navigate to `url` in a way that saves a file instead of moving the page.\n *\n * Exported separately from `downloadArchive` so a caller that already has a\n * ticket (a retry, a test) can trigger it, and so the DOM half can be replaced\n * in an environment that has no document.\n */\nexport function triggerFileNavigation(url: string, doc: Document = document): void {\n  const frame = doc.createElement('iframe');\n  frame.hidden = true;\n  frame.setAttribute('aria-hidden', 'true');\n  frame.style.display = 'none';\n  frame.src = url;\n  doc.body.appendChild(frame);\n  setTimeout(() => frame.remove(), DOWNLOAD_FRAME_TTL_MS);\n}\n\n/**\n * Mint an archive for `paths` and start downloading it.\n *\n * Resolves with the ticket once the download has been STARTED — not once it has\n * finished, which the page cannot observe. A caller that wants to say \"12 files\"\n * in a toast reads it off the returned ticket.\n */\nexport async function downloadArchive(\n  api: Pick<FileApi, 'jsonFetch' | 'endpoints'>,\n  paths: string[],\n  opts: { name?: string; doc?: Document } = {},\n): Promise<ArchiveTicket> {\n  const ticket = await requestArchive(api, paths, opts.name);\n  triggerFileNavigation(\n    absoluteTicketUrl(api.endpoints.manager, ticket.url),\n    opts.doc ?? document,\n  );\n  return ticket;\n}\n","/**\n * destinationTree — the rules behind \"choose a folder\".\n *\n * filex had no folder chooser. Copy and move existed (cut/paste, drag between\n * panes) but both required the destination to already be on screen, which is\n * why there was no \"Move to…\" or \"Copy to…\" anywhere: the verb was never the\n * missing part, the picker was. `NewDocumentModal` grew a private one-level\n * browser for its own \"where should this document go?\" question, and a second\n * private copy for Move/Copy would have been the moment the two started\n * disagreeing about what a writable folder is.\n *\n * Everything here is DOM-free and synchronous so the rules can be tested\n * without mounting anything. The component\n * (`modals/DestinationPickerModal.vue`) owns the reactive state and the\n * listing calls; this module owns the answers.\n *\n * # Wire paths\n *\n * A destination is an adapter-qualified wire path — `main://belgeler/2026` —\n * exactly what `api.copy` / `api.moveAsync` take and what the backend resolves\n * to a storage. The tree therefore spans storages, because copy and move\n * already do: `internal/ops` streams bytes between two drivers when the source\n * and destination storages differ. A picker that could only offer folders in\n * the current storage would hide a capability the product already has.\n */\n\nimport type { FileNode } from '../types/FileNode';\n\n/**\n * The browser's top level: the list of drives rather than a folder.\n *\n * It cannot collide with a real destination because every wire path contains\n * `://` and this string does not. (The same sentinel and the same reasoning as\n * NewDocumentModal's private browser, which this module is meant to replace.)\n */\nexport const DRIVES = '@@drives';\n\n/** Split `adapter://rel` into its two halves; a bare path has no adapter. */\nexport function splitWire(p: string): [string, string] {\n  const i = p.indexOf('://');\n  if (i < 0) return ['', trimSlashes(p)];\n  return [p.slice(0, i), trimSlashes(p.slice(i + 3))];\n}\n\n/** Rebuild `adapter://rel`. An empty rel is the storage root. */\nexport function joinWire(adapter: string, rel: string): string {\n  const r = trimSlashes(rel);\n  return r ? `${adapter}://${r}` : `${adapter}://`;\n}\n\nfunction trimSlashes(s: string): string {\n  return s.replace(/^\\/+|\\/+$/g, '');\n}\n\n/**\n * The wire path one level up, or null when there is nowhere further up.\n *\n * `multiDrive` decides what sits above a storage root: with more than one\n * storage the answer is the list of drives, with exactly one there is nothing\n * above the root and the Up button must be disabled rather than land the user\n * on a one-row list of the drive they are already in.\n */\nexport function parentOfWire(p: string, multiDrive: boolean): string | null {\n  if (p === DRIVES) return null;\n  const [adapter, rel] = splitWire(p);\n  if (!adapter) return null;\n  if (!rel) return multiDrive ? DRIVES : null;\n  const parts = rel.split('/');\n  parts.pop();\n  return joinWire(adapter, parts.join('/'));\n}\n\n/** The last segment of a wire path — what a breadcrumb or a row shows. */\nexport function labelOfWire(p: string, drivesLabel: string): string {\n  if (p === DRIVES) return drivesLabel;\n  const [adapter, rel] = splitWire(p);\n  if (!rel) return adapter || drivesLabel;\n  const parts = rel.split('/');\n  return parts[parts.length - 1] || adapter;\n}\n\n/** Every step from the storage root down to `p`, for a clickable breadcrumb. */\nexport function crumbsOfWire(p: string): Array<{ label: string; path: string }> {\n  if (p === DRIVES || !p) return [];\n  const [adapter, rel] = splitWire(p);\n  if (!adapter) return [];\n  const out = [{ label: adapter, path: joinWire(adapter, '') }];\n  if (!rel) return out;\n  let acc = '';\n  for (const seg of rel.split('/')) {\n    acc = acc ? `${acc}/${seg}` : seg;\n    out.push({ label: seg, path: joinWire(adapter, acc) });\n  }\n  return out;\n}\n\n/**\n * May the caller write into a folder with this `perm`?\n *\n * ⚠ `undefined` AND `''` both mean \"this storage does not enforce ACL\", which\n * is the pre-RBAC default and full access. The declared type says one of four\n * levels, but the wire really does carry `''` for an unenforced storage, so\n * reading both as allowed is the truthful reading and not a convenience.\n *\n * This is deliberately the same predicate as `FileExplorer.permCanEdit` and\n * `NewDocumentModal.permAllowsWrite`. Two answers to \"may I write here\" is how\n * a dialog ends up offering a destination the toolbar hides.\n */\nexport function permAllowsWrite(perm: string | undefined | null): boolean {\n  return perm === undefined || perm === null || perm === '' || perm === 'editor' || perm === 'owner';\n}\n\n/** Is `child` the same as, or inside, `ancestor`? Both are wire paths. */\nexport function isAtOrInside(child: string, ancestor: string): boolean {\n  if (child === DRIVES || ancestor === DRIVES) return false;\n  const [ca, cr] = splitWire(child);\n  const [aa, ar] = splitWire(ancestor);\n  if (ca !== aa) return false;\n  if (ar === '') return true;\n  return cr === ar || cr.startsWith(ar + '/');\n}\n\n/**\n * Why this folder cannot be the destination, or null when it can.\n *\n * `'self'` and `'descendant'` are kept apart because they need different\n * sentences. \"You cannot move a folder into itself\" and \"…into a folder inside\n * it\" are the two halves of the mistake, and a single message covering both\n * reads as a riddle at the moment the person is trying to work out what they\n * did wrong.\n *\n * ⚠ This is a courtesy, not a control. The same refusal exists in\n * `internal/ops.SubmitTo` and answers 400 whatever the picker offered —\n * measured on a live local storage 2026-09-13, where the API accepted the\n * request and the queue worker failed it minutes later with an errno.\n */\nexport function blockedReason(\n  candidate: string,\n  moving: string[] | undefined,\n): 'self' | 'descendant' | null {\n  if (!moving || moving.length === 0) return null;\n  if (candidate === DRIVES) return null;\n  const norm = (p: string) => {\n    const [a, r] = splitWire(p);\n    return joinWire(a, r);\n  };\n  const c = norm(candidate);\n  for (const src of moving) {\n    if (!src) continue;\n    // Order matters: equality is also \"inside\", and the two need different\n    // sentences.\n    if (c === norm(src)) return 'self';\n    if (isAtOrInside(candidate, src)) return 'descendant';\n  }\n  return null;\n}\n\n/** One row in the picker's list. */\nexport interface DestinationRow {\n  /** Wire path of the folder. */\n  path: string;\n  /** What to show — the folder's own name. */\n  label: string;\n  /** May the caller write into it? Drives the disabled Choose button. */\n  writable: boolean;\n  /** Set when this row is one of the folders being moved, or inside one. */\n  blocked: 'self' | 'descendant' | null;\n}\n\n/**\n * Turn a listing into rows.\n *\n * ⚠ An unwritable folder is LISTED and stays OPENABLE. The grant that allows\n * writing may live on a subfolder, so hiding the parent would make the\n * destination unreachable; hiding it also tells the user their folder is gone\n * rather than that they may not write into it. Same rule NewDocumentModal\n * settled on.\n *\n * ⚠ A blocked folder (the one being moved, or inside it) is also listed rather\n * than hidden: seeing it greyed out with a reason is how a person understands\n * the refusal. It is not openable, because everything under it is blocked too\n * and walking into a dead end is not navigation.\n */\nexport function destinationRows(\n  files: FileNode[] | undefined,\n  moving?: string[],\n): DestinationRow[] {\n  const out: DestinationRow[] = [];\n  for (const f of files ?? []) {\n    if (f.type !== 'dir') continue;\n    out.push({\n      path: f.path,\n      label: f.basename,\n      writable: permAllowsWrite(f.perm as string | undefined),\n      blocked: blockedReason(f.path, moving),\n    });\n  }\n  return out;\n}\n\n/** The drives level: one row per storage, each its own root. */\nexport function driveRows(storages: string[] | undefined, moving?: string[]): DestinationRow[] {\n  return (storages ?? []).map((name) => {\n    const path = joinWire(name, '');\n    return {\n      path,\n      label: name,\n      // A storage root's own writability is not knowable from the drive list;\n      // it is answered by the listing when the user opens it. Offering it as\n      // writable here and letting the listing correct that is the honest\n      // order — the alternative greys out every drive until each is opened.\n      writable: true,\n      blocked: blockedReason(path, moving),\n    };\n  });\n}\n\n/**\n * Where the picker should open.\n *\n * The current folder, because that is where the person is standing and most\n * destinations are near it. Falls back to the drives list when there is more\n * than one storage and no current folder, and to the single storage's root\n * when there is only one.\n */\nexport function initialLocation(\n  current: string | undefined,\n  storages: string[] | undefined,\n): string {\n  const multi = (storages?.length ?? 0) > 1;\n  if (current && current.includes('://')) return current;\n  if (multi) return DRIVES;\n  const only = storages?.[0];\n  return only ? joinWire(only, '') : DRIVES;\n}\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  /* wiring:e2 — hosts hide the encrypted option (e.g. already inside an\n   * encrypted folder / feature-gated embeds). Default: shown. */\n  encryptedOption?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', name: string): void;\n  /* wiring:e2 — user picked \"Create encrypted folder…\" — the parent swaps\n   * this modal for EncryptedFolderModal. */\n  (e: 'encrypted'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\nconst err = ref<string | null>(null);\n\nwatch(() => props.open, (v) => {\n  if (v) {\n    name.value = '';\n    err.value = null;\n  }\n});\n\nfunction submit() {\n  const clean = name.value.trim();\n  if (!clean) {\n    err.value = t('modal.newfolder.placeholder');\n    return;\n  }\n  if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') {\n    err.value = t('modal.newfolder.invalid');\n    return;\n  }\n  emit('submit', clean);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('modal.newfolder.title')\" size=\"sm\" @close=\"emit('close')\">\n    <form @submit.prevent=\"submit\">\n      <!-- A visible name, as in the encrypted-folder dialog this one opens. -->\n      <label class=\"fe-field\">\n        <span class=\"fe-field__label\">{{ t('modal.newfolder.placeholder') }}</span>\n        <input\n          v-model=\"name\"\n          type=\"text\"\n          class=\"fe-input\"\n          autocomplete=\"off\"\n          @keydown.enter.prevent=\"submit\"\n        />\n      </label>\n      <p v-if=\"err\" class=\"fe-form__error\">{{ err }}</p>\n      <!-- wiring:e2 — encrypted-folder entry point lives inside the normal\n           new-folder flow so every trigger (toolbar / context menu / palette)\n           reaches it without extra wiring. -->\n      <button\n        v-if=\"encryptedOption !== false\"\n        type=\"button\"\n        class=\"fe-e2e-optlink\"\n        @click=\"emit('encrypted')\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-e2e-optlink__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n        {{ t('e2e.create.option') }}\n      </button>\n      <!-- /wiring:e2 -->\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('modal.newfolder.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"submit\">\n        {{ t('modal.newfolder.create') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * DestinationPickerModal — \"choose a folder\", as one component.\n *\n * # Why it exists\n *\n * `Move to…` and `Copy to…` were missing from the selection bar, and the\n * missing part was never the verb: `transferItems` already moves and copies,\n * across storages, and cut+paste has always done it. What did not exist\n * anywhere in the client was a way to SAY WHERE. `dirsOnly` — the backend's\n * folders-only listing — had zero consumers; `api.subfolders()` had been\n * written and never called.\n *\n * # Why a component and not two buttons' private dialog\n *\n * `NewDocumentModal` already grew a private one-level browser for its own\n * \"where should this go?\" question. A second private copy for Move/Copy is how\n * the two start disagreeing — about what a writable folder is, about whether an\n * unwritable one is hidden or greyed, about what sits above a storage root. So\n * this takes its inputs as props and answers with one event, and the rules live\n * in `lib/destinationTree.ts` where they can be tested without a DOM. Anything\n * that needs a folder — Move, Copy, and the new-document flow next — mounts\n * this.\n *\n * # Contract\n *\n *   <DestinationPickerModal\n *     :open=\"show\" :api=\"api\" :locale=\"locale\"\n *     :storages=\"['main','s3']\"        // drive names; >1 adds a drives level\n *     :start-at=\"'main://belgeler'\"     // where to open (the current folder)\n *     :moving=\"['main://belgeler/eski']\" // folders that may not be the target\n *     mode=\"move\"                        // titles the dialog and its button\n *     @pick=\"(wirePath) => …\"\n *     @close=\"show = false\"\n *   />\n *\n * `pick` emits an adapter-qualified wire path — exactly what `api.copy` and\n * `api.moveAsync` take.\n */\nimport { computed, ref, watch } from 'vue';\nimport Modal from './Modal.vue';\nimport { useLocale } from '../composables/useLocale';\nimport type { FileApi, ManagerResponse } from '../composables/useFileApi';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { iconTile } from '../lib/fileIcons';\nimport {\n  DRIVES,\n  type DestinationRow,\n  blockedReason,\n  crumbsOfWire,\n  destinationRows,\n  driveRows,\n  initialLocation,\n  labelOfWire,\n  parentOfWire,\n  permAllowsWrite,\n} from '../lib/destinationTree';\n\nconst props = defineProps<{\n  open: boolean;\n  api: Pick<FileApi, 'index'>;\n  locale: LocaleCode;\n  /** Storage names. More than one adds a drives level above the roots. */\n  storages?: string[];\n  /** Wire path to open at — normally the folder the user is looking at. */\n  startAt?: string;\n  /**\n   * Folders that must not be offered: what is being moved. A destination equal\n   * to one of these, or inside one, is shown greyed with a reason rather than\n   * hidden, because a folder that silently vanishes reads as data loss.\n   */\n  moving?: string[];\n  /** Titles the dialog and names its confirm button. */\n  mode?: 'move' | 'copy' | 'choose';\n  /** The parent is running the operation: the dialog stays up but inert. */\n  busy?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'pick', path: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst at = ref<string>(DRIVES);\nconst rows = ref<DestinationRow[]>([]);\nconst loading = ref(false);\n/** The listing of `at` itself — what says whether the CURRENT folder is writable. */\nconst here = ref<ManagerResponse | undefined>(undefined);\nconst failed = ref(false);\n\nconst multiDrive = computed(() => (props.storages?.length ?? 0) > 1);\n\n/**\n * One listing cache for the life of the dialog.\n *\n * Walking up and back down is the normal way people use a picker, and without\n * this every Up button press costs another round trip to a storage that may be\n * an S3 bucket on another continent.\n */\nlet cache = new Map<string, ManagerResponse>();\n\nwatch(\n  () => props.open,\n  (isOpen) => {\n    if (!isOpen) return;\n    cache = new Map();\n    void goTo(initialLocation(props.startAt, props.storages));\n  },\n  { immediate: true },\n);\n\nasync function load(path: string): Promise<ManagerResponse | undefined> {\n  const hit = cache.get(path);\n  if (hit) return hit;\n  try {\n    const resp = await props.api.index(path);\n    cache.set(path, resp);\n    return resp;\n  } catch {\n    // A folder that cannot be listed is a folder that cannot be offered. The\n    // dialog says so in its own body; a listing failure inside a picker is not\n    // an error the host should be made to toast.\n    return undefined;\n  }\n}\n\nasync function goTo(path: string): Promise<void> {\n  at.value = path;\n  failed.value = false;\n  if (path === DRIVES) {\n    here.value = undefined;\n    rows.value = driveRows(props.storages, props.moving);\n    return;\n  }\n  loading.value = true;\n  const resp = await load(path);\n  // A second navigation may have started while this listing was in flight;\n  // only the newest one gets to write the rows.\n  if (at.value !== path) return;\n  loading.value = false;\n  here.value = resp;\n  failed.value = !resp;\n  rows.value = destinationRows(resp?.files, props.moving);\n}\n\nconst parent = computed(() => parentOfWire(at.value, multiDrive.value));\nconst crumbs = computed(() => crumbsOfWire(at.value));\n\n/** Why the CURRENT folder cannot be chosen, or null when it can. */\nconst hereBlocked = computed(() => blockedReason(at.value, props.moving));\n\nconst hereWritable = computed(() => {\n  if (at.value === DRIVES) return false;\n  if (!here.value) return false;\n  if (here.value.read_only) return false;\n  return permAllowsWrite(here.value.perm as string | undefined);\n});\n\nconst canChoose = computed(\n  () => !props.busy && at.value !== DRIVES && hereWritable.value && hereBlocked.value === null,\n);\n\n/**\n * Is the line under the list a REFUSAL or a prompt?\n *\n * \"Open a storage to choose a folder inside it\" is not a mistake anybody made —\n * it is the drives level telling you what to do next. Painting it in the danger\n * colour, which is what happened the first time this was drawn, makes the very\n * first screen of the dialog look like something has gone wrong.\n */\nconst reasonIsRefusal = computed(() => at.value !== DRIVES);\n\n/** The one line under the list that says why Choose is off, if it is. */\nconst reason = computed<string>(() => {\n  if (at.value === DRIVES) return t('destpicker.pick_a_drive');\n  if (hereBlocked.value === 'self') return t('destpicker.blocked.self');\n  if (hereBlocked.value === 'descendant') return t('destpicker.blocked.descendant');\n  if (failed.value) return t('destpicker.unreadable');\n  if (here.value && !hereWritable.value) return t('destpicker.readonly_here');\n  return '';\n});\n\nconst title = computed(() => {\n  if (props.mode === 'move') return t('destpicker.title.move');\n  if (props.mode === 'copy') return t('destpicker.title.copy');\n  return t('destpicker.title.choose');\n});\n\nconst confirmLabel = computed(() => {\n  if (props.mode === 'move') return t('destpicker.confirm.move');\n  if (props.mode === 'copy') return t('destpicker.confirm.copy');\n  return t('destpicker.confirm.choose');\n});\n\nfunction rowTitle(row: DestinationRow): string {\n  if (row.blocked === 'self') return t('destpicker.blocked.self');\n  if (row.blocked === 'descendant') return t('destpicker.blocked.descendant');\n  if (!row.writable) return t('destpicker.readonly');\n  return row.label;\n}\n\nfunction openRow(row: DestinationRow): void {\n  // A blocked row is a dead end — everything under it is blocked too — so\n  // walking into it would be navigation that cannot end anywhere.\n  if (row.blocked) return;\n  void goTo(row.path);\n}\n\nfunction choose(): void {\n  if (!canChoose.value) return;\n  emit('pick', at.value);\n}\n\nconst drivesLabel = computed(() => t('destpicker.drives'));\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"title\"\n    size=\"md\"\n    @close=\"emit('close')\"\n  >\n    <div class=\"fe-destpick\" data-testid=\"destpicker\">\n      <div class=\"fe-destpick__bar\">\n        <button\n          type=\"button\"\n          class=\"fe-destpick__up\"\n          :disabled=\"!parent\"\n          :title=\"t('destpicker.up')\"\n          :aria-label=\"t('destpicker.up')\"\n          data-testid=\"destpicker-up\"\n          @click=\"goTo(parent as string)\"\n        >\n          <svg\n            class=\"fe-ficon\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n          >\n            <path d=\"M12 19V5M5 12l7-7 7 7\" />\n          </svg>\n        </button>\n        <nav class=\"fe-destpick__crumbs\" :aria-label=\"t('destpicker.crumbs')\">\n          <button\n            v-if=\"multiDrive\"\n            type=\"button\"\n            class=\"fe-destpick__crumb\"\n            :class=\"{ 'is-current': at === DRIVES }\"\n            @click=\"goTo(DRIVES)\"\n          >\n            {{ drivesLabel }}\n          </button>\n          <template v-for=\"c in crumbs\" :key=\"c.path\">\n            <span class=\"fe-destpick__sep\" aria-hidden=\"true\">/</span>\n            <button\n              type=\"button\"\n              class=\"fe-destpick__crumb\"\n              :class=\"{ 'is-current': c.path === at }\"\n              @click=\"goTo(c.path)\"\n            >\n              {{ c.label }}\n            </button>\n          </template>\n          <span v-if=\"!multiDrive && !crumbs.length\" class=\"fe-destpick__crumb is-current\">\n            {{ labelOfWire(at, drivesLabel) }}\n          </span>\n        </nav>\n      </div>\n\n      <ul class=\"fe-destpick__rows\" data-testid=\"destpicker-rows\">\n        <li v-if=\"loading\" class=\"fe-destpick__note\">{{ t('destpicker.loading') }}</li>\n        <li v-else-if=\"failed\" class=\"fe-destpick__note\">{{ t('destpicker.unreadable') }}</li>\n        <li v-else-if=\"!rows.length\" class=\"fe-destpick__note\">{{ t('destpicker.empty') }}</li>\n        <li v-for=\"row in rows\" :key=\"row.path\">\n          <button\n            type=\"button\"\n            class=\"fe-destpick__row\"\n            :class=\"{ 'is-locked': !row.writable, 'is-blocked': !!row.blocked }\"\n            :disabled=\"!!row.blocked\"\n            :title=\"rowTitle(row)\"\n            :data-testid=\"'destpicker-row-' + row.label\"\n            @click=\"openRow(row)\"\n          >\n            <span class=\"fe-destpick__rowicon\" aria-hidden=\"true\" v-html=\"iconTile('folder')\"></span>\n            <span class=\"fe-destpick__rowname\">{{ row.label }}</span>\n            <span v-if=\"row.blocked\" class=\"fe-destpick__rowtag\">{{ t('destpicker.tag.blocked') }}</span>\n            <span v-else-if=\"!row.writable\" class=\"fe-destpick__rowtag\">{{ t('destpicker.readonly') }}</span>\n            <svg\n              class=\"fe-destpick__rowinto\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              aria-hidden=\"true\"\n              focusable=\"false\"\n            >\n              <path d=\"M9 5l7 7-7 7\" />\n            </svg>\n          </button>\n        </li>\n      </ul>\n\n      <p\n        v-if=\"reason\"\n        class=\"fe-destpick__reason\"\n        :class=\"{ 'is-hint': !reasonIsRefusal }\"\n        data-testid=\"destpicker-reason\"\n      >\n        {{ reason }}\n      </p>\n      <p v-else class=\"fe-destpick__target\" data-testid=\"destpicker-target\">\n        {{ t('destpicker.target', { name: labelOfWire(at, drivesLabel) }) }}\n      </p>\n    </div>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('destpicker.cancel') }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"!canChoose\"\n        data-testid=\"destpicker-confirm\"\n        @click=\"choose\"\n      >\n        {{ confirmLabel }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * NewDocumentModal — \"New document\": pick a type, name it, choose where it\n * goes, get an empty file of that type back.\n *\n * ## Why the type list is not in this file\n *\n * The obvious implementation is a constant array of extensions right here.\n * It would be wrong in two directions at once.\n *\n * Downwards: the server is the only party that knows whether it can PRODUCE\n * the bytes. An empty `.md` is an empty file, but an empty `.docx` is a ZIP of\n * XML parts, and if this deployment's binary holds no template for a format\n * then offering it creates a file no program will open. That answer arrives in\n * `capabilities.newdoc_types` (internal/newdoc), and it is the `types` prop.\n *\n * Upwards: the server does NOT know whether this browser can OPEN the result.\n * OnlyOffice may be unconfigured, may be configured but failing its probe, or\n * may be overridden by the embedder to a URL the backend cannot see. So each\n * row names the service its editor needs (`requires`) and the host answers\n * with `onlyOfficeReady` / `drawioReady` — the same resolution the explorer\n * already does for the viewers themselves.\n *\n * ⚠ The rule that falls out of this: **a type nobody here can open is not\n * offered**. Creating `report.docx` on an install with no document server\n * hands somebody a file and then refuses to open it, which is a worse outcome\n * than the entry not being there. When a whole family is withheld this way the\n * dialog says so in one quiet line, because \"why is Word missing\" should not\n * require reading the source.\n *\n * ## Where \"where\" is asked\n *\n * ⚠ Not here. This dialog grew its own one-level folder browser — an Up\n * button, a row list, a \"Save here\" — and `modals/DestinationPickerModal.vue`\n * was then written for Move to / Copy to, which is the same question with the\n * same rules (what counts as writable, whether an unwritable folder is hidden\n * or greyed, what sits above a storage root). Two choosers is how those rules\n * start disagreeing, so there is one: this mounts the picker and keeps only\n * the answer.\n *\n * ## Where the write is checked\n *\n * In three places, and only the last one counts. The browser hides folders the\n * person cannot write to; the dialog refuses to submit into one; the SERVER\n * checks ACL and read-only state and refuses regardless of what arrived. The\n * first two are courtesies that keep somebody from typing a name for thirty\n * seconds before being told no.\n *\n * Name collisions are the same shape: this dialog asks the destination listing\n * first and says \"already here\" BEFORE the write, and the create endpoint\n * answers 409 anyway.\n */\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type { LocaleCode, ThemeMode } from '../types/ExplorerConfig';\nimport type { NewDocType } from '../types/FileNode';\nimport type { FileApi, ManagerResponse, NewFileResponse } from '../composables/useFileApi';\nimport { useLocale } from '../composables/useLocale';\nimport { iconTile, iconFamilyFor, typeLabelFor } from '../lib/fileIcons';\nimport { crumbsOfWire, permAllowsWrite, splitWire } from '../lib/destinationTree';\nimport Modal from './Modal.vue';\nimport DestinationPickerModal from './DestinationPickerModal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  theme?: ThemeMode;\n  /** The host's API wrapper — the dialog does its own listing + create. */\n  api: FileApi;\n  /**\n   * `capabilities.newdoc_types`. Undefined/null on a server that predates the\n   * feature; the host should not offer the entry at all in that case, and if\n   * it does anyway the dialog degrades to its empty state rather than guessing.\n   */\n  types?: NewDocType[] | null;\n  /** Adapter-qualified folder in view, e.g. `main://docs`. Empty at the root. */\n  currentPath: string;\n  /** Storage names, for the destination browser's top level. */\n  storages?: string[];\n  /** Resolved by the host: is there a usable OnlyOffice / drawio? */\n  onlyOfficeReady?: boolean;\n  drawioReady?: boolean;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'created', file: NewFileResponse): void;\n  (e: 'error', payload: { message: string }): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\n/* ================================================================== types */\n\nfunction satisfied(ty: NewDocType): boolean {\n  if (ty.requires === 'onlyoffice') return !!props.onlyOfficeReady;\n  if (ty.requires === 'drawio') return !!props.drawioReady;\n  return true;\n}\n\nconst offered = computed(() => (props.types ?? []).filter(satisfied));\n\n/** Services that are holding a type back, so the dialog can say which. */\nconst withheld = computed(() => {\n  const out: string[] = [];\n  for (const ty of props.types ?? []) {\n    if (!satisfied(ty) && ty.requires && !out.includes(ty.requires)) out.push(ty.requires);\n  }\n  return out;\n});\n\n/**\n * The withheld services as one sentence.\n *\n * ⚠ Joined in script rather than looped in the template with a `<span> </span>`\n * separator: Vue's compiler drops a whitespace-only text node between\n * elements, so the two sentences rendered welded together\n * (\"...here.Diagrams need...\") — measured in a browser, invisible in a unit\n * test that asserts on textContent.\n */\nconst withheldText = computed(() =>\n  withheld.value.map((svc) => t('newdoc.withheld.' + svc)).join(' '),\n);\n\n/** Sections, in the order the server listed them. */\nconst groups = computed(() => {\n  const order: string[] = [];\n  const bucket = new Map<string, NewDocType[]>();\n  for (const ty of offered.value) {\n    if (!bucket.has(ty.group)) {\n      bucket.set(ty.group, []);\n      order.push(ty.group);\n    }\n    bucket.get(ty.group)!.push(ty);\n  }\n  return order.map((g) => ({ group: g, types: bucket.get(g)! }));\n});\n\nconst selected = ref<string>('');\nconst selectedType = computed(() => offered.value.find((ty) => ty.ext === selected.value) ?? null);\n\n/**\n * The words for a type come from `typeLabelFor` — the same table the listing's\n * Type column reads. A second table here would be a second answer to \"what is\n * a .csv\", and the two would disagree the first week somebody edited one.\n */\nfunction labelFor(ext: string): string {\n  return typeLabelFor({ type: 'file', extension: ext }, t);\n}\nfunction tileFor(ext: string): string {\n  return iconTile(iconFamilyFor({ type: 'file', extension: ext, basename: 'x.' + ext }));\n}\n\n/* =========================================================== destinations */\n\nconst dest = ref('');\n/** The picker is up. Also gates Create: a half-answered \"where\" is not a where. */\nconst pickingDest = ref(false);\n\n/** Listing cache for the name check. The picker keeps its own for its rows. */\nconst dirCache = new Map<string, ManagerResponse>();\n\nfunction canWrite(resp: ManagerResponse | undefined): boolean {\n  if (!resp) return false;\n  if (resp.read_only) return false;\n  return permAllowsWrite(resp.perm as string | undefined);\n}\n\nasync function loadDir(p: string): Promise<ManagerResponse | undefined> {\n  if (dirCache.has(p)) return dirCache.get(p);\n  try {\n    const resp = await props.api.index(p);\n    dirCache.set(p, resp);\n    return resp;\n  } catch {\n    // A folder that cannot be listed is a folder we cannot offer. Silence is\n    // right here: the caller renders \"you cannot write here\" / \"no subfolders\",\n    // and a listing failure inside a picker is not an error the host should toast.\n    return undefined;\n  }\n}\n\n/** `main://a/b` → `main / a / b` — the trail, from the one place that\n *  decomposes a wire path (lib/destinationTree). */\nconst destLabel = computed(() =>\n  dest.value ? crumbsOfWire(dest.value).map((c) => c.label).join(' / ') : '',\n);\n\nconst destWritable = ref(true);\nconst destChecked = ref(false);\n\n/* ================================================================== naming */\n\nconst name = ref('');\nconst nameTouched = ref(false);\nconst collision = ref(false);\nconst busy = ref(false);\nconst failure = ref<string | null>(null);\n\nconst finalName = computed(() => {\n  const base = name.value.trim();\n  const ext = selectedType.value?.ext ?? '';\n  if (!base || !ext) return base;\n  return base.toLowerCase().endsWith('.' + ext) ? base : base + '.' + ext;\n});\n\nconst nameHasSeparator = computed(() => /[\\\\/]/.test(name.value));\n\nfunction freeName(taken: Set<string>, ext: string): string {\n  const base = t('newdoc.untitled');\n  if (!taken.has((base + '.' + ext).toLowerCase())) return base;\n  for (let i = 2; i < 100; i++) {\n    const cand = `${base} (${i})`;\n    if (!taken.has((cand + '.' + ext).toLowerCase())) return cand;\n  }\n  return base;\n}\n\nfunction takenNames(resp: ManagerResponse | undefined): Set<string> {\n  const s = new Set<string>();\n  for (const f of resp?.files ?? []) s.add(f.basename.toLowerCase());\n  return s;\n}\n\nlet checkSeq = 0;\nlet checkTimer: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Ask the destination what is already in it: the write permission and the\n * names, in one listing. Debounced because it runs on every keystroke.\n */\nasync function refreshDestination(opts: { suggest?: boolean } = {}) {\n  const seq = ++checkSeq;\n  const target = dest.value;\n  if (!target) {\n    destChecked.value = false;\n    collision.value = false;\n    return;\n  }\n  const resp = await loadDir(target);\n  if (seq !== checkSeq || target !== dest.value) return;\n  destWritable.value = canWrite(resp);\n  destChecked.value = true;\n  const taken = takenNames(resp);\n  const ext = selectedType.value?.ext ?? '';\n  if (opts.suggest && !nameTouched.value && ext) {\n    name.value = freeName(taken, ext);\n  }\n  collision.value = !!finalName.value && taken.has(finalName.value.toLowerCase());\n}\n\nfunction scheduleCheck() {\n  if (checkTimer) clearTimeout(checkTimer);\n  checkTimer = setTimeout(() => void refreshDestination(), 220);\n}\n\n/* ================================================================ lifecycle */\n\nfunction defaultDestination(): string {\n  const cur = (props.currentPath || '').trim();\n  const [adapter] = splitWire(cur);\n  // Standing in a real folder: that folder. Making somebody navigate to where\n  // they already are is the small insult that makes a feature feel unfinished.\n  if (adapter) return cur;\n  const names = props.storages ?? [];\n  if (names.length === 1) return names[0] + '://';\n  return '';\n}\n\nwatch(\n  () => props.open,\n  async (isOpen) => {\n    if (!isOpen) return;\n    dirCache.clear();\n    failure.value = null;\n    collision.value = false;\n    nameTouched.value = false;\n    busy.value = false;\n    name.value = '';\n    selected.value = offered.value[0]?.ext ?? '';\n    dest.value = defaultDestination();\n    destChecked.value = false;\n    destWritable.value = true;\n    /* Nowhere to write yet (several storages and no folder in view): ask\n     * first, because a name typed against no destination is a name typed\n     * twice. */\n    pickingDest.value = !dest.value;\n    await refreshDestination({ suggest: true });\n  },\n);\n\n// A different type means a different extension, so the suggested name has to\n// be re-asked against the destination (Untitled.md may be free where\n// Untitled.docx is not).\nwatch(selected, () => {\n  void refreshDestination({ suggest: true });\n});\nwatch(name, () => {\n  collision.value = false;\n  scheduleCheck();\n});\nwatch(dest, () => {\n  void refreshDestination({ suggest: true });\n});\n\n/* ================================================================== actions */\n\nfunction pick(ext: string) {\n  selected.value = ext;\n}\n\n/** Roving focus across the tiles — a radiogroup is expected to move on arrows. */\nfunction onTileKey(e: KeyboardEvent, ext: string) {\n  const list = offered.value.map((ty) => ty.ext);\n  const i = list.indexOf(ext);\n  let next = -1;\n  if (e.key === 'ArrowRight' || e.key === 'ArrowDown') next = (i + 1) % list.length;\n  else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') next = (i - 1 + list.length) % list.length;\n  else if (e.key === 'Home') next = 0;\n  else if (e.key === 'End') next = list.length - 1;\n  if (next < 0) return;\n  e.preventDefault();\n  selected.value = list[next];\n  void nextTick(() => {\n    const el = document.querySelector<HTMLElement>(`[data-newdoc-ext=\"${list[next]}\"]`);\n    el?.focus();\n  });\n}\n\nfunction onDestinationPicked(path: string) {\n  dest.value = path;\n  pickingDest.value = false;\n}\n\n/**\n * ⚠ Escape with the picker open must close the PICKER, not this dialog.\n *\n * `Modal` listens for Escape on `document`, and there are two of them on\n * screen; the outer one registered first, so it hears it first. Swallowing\n * that first close here is what stops one keypress from throwing away a name\n * somebody just typed. (The picker's own Modal then fires, closes the picker,\n * and the flag is already down — the second close is a no-op.)\n */\nfunction onOuterClose() {\n  if (pickingDest.value) {\n    pickingDest.value = false;\n    return;\n  }\n  emit('close');\n}\n\nconst canCreate = computed(\n  () =>\n    !busy.value &&\n    !!selectedType.value &&\n    !!dest.value &&\n    !pickingDest.value &&\n    !!name.value.trim() &&\n    !nameHasSeparator.value &&\n    !collision.value &&\n    (!destChecked.value || destWritable.value),\n);\n\nasync function create() {\n  if (!canCreate.value || !selectedType.value) return;\n  busy.value = true;\n  failure.value = null;\n  try {\n    const res = await props.api.newFile(dest.value, name.value.trim(), selectedType.value.ext);\n    emit('created', res);\n  } catch (e) {\n    const err = e as Error & { status?: number };\n    if (err.status === 409) {\n      // The server refused for the reason the dialog warns about. Say it in\n      // the same place rather than throwing a toast over the form.\n      collision.value = true;\n    } else {\n      failure.value = err.message || String(e);\n      emit('error', { message: failure.value });\n    }\n  } finally {\n    busy.value = false;\n  }\n}\n</script>\n\n<template>\n  <Modal\n    :open=\"open\"\n    :title=\"t('newdoc.title')\"\n    size=\"lg\"\n    :theme=\"theme\"\n    @close=\"onOuterClose\"\n  >\n    <div class=\"fe-newdoc\" data-testid=\"newdoc-modal\">\n      <!-- Nothing to offer. Either the server sent no types (too old) or every\n           one of them needs a service this install has not got. -->\n      <div v-if=\"!offered.length\" class=\"fe-newdoc__empty\" data-testid=\"newdoc-empty\">\n        <p class=\"fe-newdoc__empty-title\">{{ t('newdoc.empty.title') }}</p>\n        <p class=\"fe-newdoc__empty-body\">\n          {{ withheld.length ? t('newdoc.empty.blocked') : t('newdoc.empty.body') }}\n        </p>\n      </div>\n\n      <template v-else>\n        <div\n          class=\"fe-newdoc__types\"\n          role=\"radiogroup\"\n          :aria-label=\"t('newdoc.type.label')\"\n        >\n          <section v-for=\"g in groups\" :key=\"g.group\" class=\"fe-newdoc__group\">\n            <h3 class=\"fe-newdoc__grouplabel\">{{ t('newdoc.group.' + g.group) }}</h3>\n            <div class=\"fe-newdoc__grid\">\n              <button\n                v-for=\"ty in g.types\"\n                :key=\"ty.ext\"\n                type=\"button\"\n                role=\"radio\"\n                class=\"fe-newdoc__type\"\n                :class=\"{ 'is-selected': selected === ty.ext }\"\n                :aria-checked=\"selected === ty.ext\"\n                :tabindex=\"selected === ty.ext ? 0 : -1\"\n                :data-newdoc-ext=\"ty.ext\"\n                :data-testid=\"'newdoc-type-' + ty.ext\"\n                @click=\"pick(ty.ext)\"\n                @keydown=\"onTileKey($event, ty.ext)\"\n              >\n                <span class=\"fe-newdoc__tile\" aria-hidden=\"true\" v-html=\"tileFor(ty.ext)\"></span>\n                <span class=\"fe-newdoc__ext\">.{{ ty.ext }}</span>\n                <span class=\"fe-newdoc__kind\">{{ labelFor(ty.ext) }}</span>\n              </button>\n            </div>\n          </section>\n\n          <!-- Why a family is missing. One quiet line, only when something was\n               actually withheld — an operator reading \"Office documents need a\n               document server\" knows what to do; an empty space teaches nobody. -->\n          <p v-if=\"withheldText\" class=\"fe-newdoc__withheld\" data-testid=\"newdoc-withheld\">\n            {{ withheldText }}\n          </p>\n        </div>\n\n        <div class=\"fe-newdoc__field\">\n          <label class=\"fe-newdoc__label\" for=\"fe-newdoc-name\">{{ t('newdoc.name') }}</label>\n          <div class=\"fe-newdoc__nameline\">\n            <input\n              id=\"fe-newdoc-name\"\n              v-model=\"name\"\n              type=\"text\"\n              class=\"fe-input fe-newdoc__name\"\n              autocomplete=\"off\"\n              spellcheck=\"false\"\n              data-testid=\"newdoc-name\"\n              :placeholder=\"t('newdoc.name.placeholder')\"\n              @input=\"nameTouched = true\"\n              @keydown.enter.prevent=\"create\"\n            />\n            <span v-if=\"selectedType\" class=\"fe-newdoc__suffix\">.{{ selectedType.ext }}</span>\n          </div>\n          <p v-if=\"nameHasSeparator\" class=\"fe-form__error\">{{ t('newdoc.err.slash') }}</p>\n          <p v-else-if=\"collision\" class=\"fe-form__error\" data-testid=\"newdoc-collision\">\n            {{ t('newdoc.err.exists', { name: finalName }) }}\n          </p>\n        </div>\n\n        <div class=\"fe-newdoc__field\">\n          <span class=\"fe-newdoc__label\">{{ t('newdoc.location') }}</span>\n          <div class=\"fe-newdoc__dest\">\n            <span class=\"fe-newdoc__destpath\" data-testid=\"newdoc-dest\">\n              {{ dest ? destLabel : t('newdoc.location.none') }}\n            </span>\n            <button\n              type=\"button\"\n              class=\"fe-newdoc__changebtn\"\n              data-testid=\"newdoc-change\"\n              @click=\"pickingDest = true\"\n            >\n              {{ t('newdoc.location.change') }}\n            </button>\n          </div>\n          <p\n            v-if=\"destChecked && !destWritable\"\n            class=\"fe-form__error\"\n            data-testid=\"newdoc-noaccess\"\n          >\n            {{ t('newdoc.location.noaccess') }}\n          </p>\n        </div>\n\n        <p v-if=\"failure\" class=\"fe-form__error\" data-testid=\"newdoc-failure\">{{ failure }}</p>\n      </template>\n    </div>\n\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"onOuterClose\">\n        {{ t('newdoc.cancel') }}\n      </button>\n      <button\n        v-if=\"offered.length\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--primary\"\n        :disabled=\"!canCreate\"\n        data-testid=\"newdoc-create\"\n        @click=\"create\"\n      >\n        {{ busy ? t('newdoc.creating') : t('newdoc.create') }}\n      </button>\n    </template>\n  </Modal>\n\n  <!-- tasi:m1 — THE folder chooser, the same component Move to / Copy to\n       mount. A SIBLING of the dialog above rather than a child of it: `Modal`\n       is not teleported, so nesting would put a `position: fixed` overlay\n       inside a card that clips its overflow, and a backdrop click meant for\n       the picker would bubble into the dialog's own dismiss. -->\n  <DestinationPickerModal\n    :open=\"pickingDest\"\n    :api=\"api\"\n    :locale=\"locale\"\n    mode=\"choose\"\n    :storages=\"storages\"\n    :start-at=\"dest || currentPath\"\n    @close=\"pickingDest = false\"\n    @pick=\"onDestinationPicked\"\n  />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  currentName: string;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'submit', name: string): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\nconst name = ref('');\n\nwatch(\n  () => [props.open, props.currentName] as const,\n  ([isOpen, cur]) => {\n    if (isOpen) {\n      name.value = cur;\n    }\n  },\n);\n\nfunction submit() {\n  const clean = name.value.trim();\n  if (!clean) return;\n  if (/[\\\\/]/.test(clean) || clean === '.' || clean === '..') return;\n  emit('submit', clean);\n}\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('modal.rename.title')\" size=\"sm\" @close=\"emit('close')\">\n    <form @submit.prevent=\"submit\">\n      <input\n        v-model=\"name\"\n        type=\"text\"\n        class=\"fe-input\"\n        autocomplete=\"off\"\n        @keydown.enter.prevent=\"submit\"\n      />\n    </form>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('modal.rename.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"submit\">\n        {{ t('modal.rename.save') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport Modal from './Modal.vue';\n\nconst props = defineProps<{\n  open: boolean;\n  locale: LocaleCode;\n  count: number;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'close'): void;\n  (e: 'confirm'): void;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n</script>\n\n<template>\n  <Modal :open=\"open\" :title=\"t('modal.delete.title')\" size=\"sm\" @close=\"emit('close')\">\n    <p>{{ t('modal.delete.message', { count }) }}</p>\n    <template #actions>\n      <button type=\"button\" class=\"fe-btn\" @click=\"emit('close')\">\n        {{ t('modal.delete.cancel') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-btn--danger\" @click=\"emit('confirm')\">\n        {{ t('modal.delete.confirm') }}\n      </button>\n    </template>\n  </Modal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * ConvertModal — universal file converter via a hidden, embedded iframe to\n * the p2r3/convert fork running at `convertUrl` (loaded with `?embed=1`).\n *\n * The iframe performs the actual conversion in-browser (WASM handlers); we\n * drive it headlessly over postMessage (protocol defined in the fork's\n * `setupEmbedBridge`):\n *   1. iframe → { source:'convert-embed', event:'ready' }\n *   2. we    → { target:'convert-embed', cmd:'listFormats', id }\n *      iframe→ { source, id, ok, formats:[{index,ext,format,mime,name,from,to}] }\n *   3. user searches + picks a target format\n *   4. we fetch the source bytes, → { cmd:'convert', name, bytes, fromIndex, toIndex }\n *      iframe→ { ok, name, ext, bytes:ArrayBuffer }\n *   5. we wrap the bytes in a File and upload it to the current folder.\n */\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport type { LocaleCode } from '../types/ExplorerConfig';\nimport { useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  /** Converter base, e.g. https://fm.example.com/convert */\n  convertUrl: string;\n  /** Source file name with extension, e.g. \"clip.avi\" */\n  fileName: string;\n  /** Lazily fetch the source file bytes (api.fetchArrayBuffer bound to the path). */\n  fetchBytes: () => Promise<ArrayBuffer>;\n  /** Upload the produced File into the current folder (api.uploadMultipart bound to dir). */\n  upload: (file: File) => Promise<void>;\n  locale: LocaleCode;\n}>();\n\nconst { t } = useLocale(() => props.locale);\n\nconst emit = defineEmits<{ (e: 'close'): void; (e: 'done', name: string): void }>();\n\ninterface Fmt {\n  index: number; ext: string; format: string; mime: string;\n  name: string; from: boolean; to: boolean; category: string | null;\n}\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst status = ref<'loading' | 'ready' | 'converting' | 'done' | 'error'>('loading');\nconst error = ref<string | null>(null);\nconst formats = ref<Fmt[]>([]);\nconst search = ref('');\nconst selectedTo = ref<Fmt | null>(null);\n\nconst srcExt = computed(() => (props.fileName.split('.').pop() || '').toLowerCase());\n\nconst fromFmt = computed<Fmt | null>(() => {\n  const ins = formats.value.filter((f) => f.from);\n  return (\n    ins.find((f) => (f.ext || '').toLowerCase() === srcExt.value) ||\n    ins.find((f) => (f.format || '').toLowerCase() === srcExt.value) ||\n    null\n  );\n});\n\nconst toList = computed<Fmt[]>(() => {\n  const q = search.value.trim().toLowerCase();\n  const seen = new Set<string>();\n  const uniq: Fmt[] = [];\n  for (const f of formats.value) {\n    if (!f.to) continue;\n    const key = (f.ext || f.format || '').toLowerCase();\n    if (!key || seen.has(key)) continue;\n    seen.add(key);\n    uniq.push(f);\n  }\n  uniq.sort((a, b) => (a.ext || a.format).localeCompare(b.ext || b.format));\n  if (!q) return uniq;\n  return uniq.filter(\n    (f) =>\n      (f.ext || '').toLowerCase().includes(q) ||\n      (f.format || '').toLowerCase().includes(q) ||\n      (f.name || '').toLowerCase().includes(q) ||\n      (f.mime || '').toLowerCase().includes(q),\n  );\n});\n\nconst iframeSrc = computed(() => `${props.convertUrl.replace(/\\/$/, '')}/?embed=1`);\n\nlet msgId = 0;\nconst pending = new Map<number, { resolve: (v: any) => void; reject: (e: any) => void }>();\n\nfunction send(cmd: string, extra: Record<string, unknown> = {}, transfer: Transferable[] = []): Promise<any> {\n  const id = ++msgId;\n  return new Promise((resolve, reject) => {\n    pending.set(id, { resolve, reject });\n    iframeRef.value?.contentWindow?.postMessage({ target: 'convert-embed', id, cmd, ...extra }, '*', transfer);\n    setTimeout(() => {\n      if (pending.has(id)) { pending.delete(id); reject(new Error('convert timeout')); }\n    }, 180000);\n  });\n}\n\nfunction onMessage(ev: MessageEvent) {\n  const d = ev.data;\n  if (!d || d.source !== 'convert-embed') return;\n  if (d.event === 'ready') { void loadFormats(); return; }\n  const p = pending.get(d.id);\n  if (!p) return;\n  pending.delete(d.id);\n  if (d.ok) p.resolve(d); else p.reject(new Error(d.error || 'convert error'));\n}\n\nasync function loadFormats() {\n  try {\n    const res = await send('listFormats');\n    formats.value = res.formats || [];\n    status.value = 'ready';\n    if (!fromFmt.value) {\n      error.value = t('convert.unsupported_input');\n    }\n  } catch (e) {\n    error.value = (e as Error).message;\n    status.value = 'error';\n  }\n}\n\nasync function doConvert() {\n  if (!selectedTo.value || !fromFmt.value) return;\n  status.value = 'converting';\n  error.value = null;\n  try {\n    const buf = await props.fetchBytes();\n    const res = await send(\n      'convert',\n      { name: props.fileName, bytes: buf, fromIndex: fromFmt.value.index, toIndex: selectedTo.value.index },\n      [buf],\n    );\n    const base = props.fileName.replace(/\\.[^.]+$/, '');\n    const ext = res.ext || selectedTo.value.ext || selectedTo.value.format;\n    const outName = `${base}.${ext}`;\n    const file = new File([res.bytes], outName, { type: selectedTo.value.mime || 'application/octet-stream' });\n    await props.upload(file);\n    status.value = 'done';\n    emit('done', outName);\n  } catch (e) {\n    error.value = (e as Error).message;\n    status.value = 'error';\n  }\n}\n\nonMounted(() => window.addEventListener('message', onMessage));\nonBeforeUnmount(() => window.removeEventListener('message', onMessage));\n</script>\n\n<template>\n  <div class=\"filex-cv__bg\" @click.self=\"emit('close')\">\n    <div class=\"filex-cv\">\n      <header class=\"filex-cv__head\">\n        <h3>{{ t('convert.title') }} — {{ fileName }}</h3>\n        <button\n          class=\"filex-cv__x\"\n          type=\"button\"\n          :title=\"t('convert.close')\"\n          :aria-label=\"t('convert.close')\"\n          @click=\"emit('close')\"\n        >\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </header>\n\n      <div v-if=\"status === 'loading'\" class=\"filex-cv__msg\">\n        {{ t('convert.loading') }}\n      </div>\n\n      <div v-else-if=\"status === 'done'\" class=\"filex-cv__msg filex-cv__ok\">\n        <p>\n          <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n          <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('check')\"></span>\n          {{ t('convert.done') }}\n        </p>\n        <button class=\"filex-cv__convert\" @click=\"emit('close')\">{{ t('convert.close') }}</button>\n      </div>\n\n      <template v-else>\n        <p class=\"filex-cv__src\">\n          {{ t('convert.from') }}: <b>{{ srcExt || '?' }}</b>\n        </p>\n        <input\n          v-model=\"search\"\n          class=\"filex-cv__search\"\n          :placeholder=\"t('convert.search_format')\"\n        />\n        <div class=\"filex-cv__list\">\n          <button\n            v-for=\"f in toList\"\n            :key=\"f.index\"\n            :class=\"['filex-cv__fmt', { 'is-sel': selectedTo?.index === f.index }]\"\n            @click=\"selectedTo = f\"\n          >\n            <b>{{ (f.ext || f.format).toUpperCase() }}</b>\n            <small>{{ f.name }}</small>\n          </button>\n          <div v-if=\"toList.length === 0\" class=\"filex-cv__empty\">\n            {{ t('convert.no_format') }}\n          </div>\n        </div>\n        <div v-if=\"error\" class=\"filex-cv__err\">{{ error }}</div>\n        <footer class=\"filex-cv__foot\">\n          <button\n            class=\"filex-cv__convert\"\n            :disabled=\"!selectedTo || !fromFmt || status === 'converting'\"\n            @click=\"doConvert\"\n          >\n            {{ status === 'converting' ? t('convert.converting') : t('convert.convert') }}\n          </button>\n        </footer>\n      </template>\n\n      <!-- hidden headless converter engine -->\n      <iframe ref=\"iframeRef\" :src=\"iframeSrc\" class=\"filex-cv__frame\" title=\"converter\" />\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-cv__bg {\n  position: fixed; inset: 0; z-index: 1000;\n  background: rgba(0, 0, 0, 0.55);\n  display: flex; align-items: center; justify-content: center;\n}\n.filex-cv {\n  width: min(560px, 92vw); max-height: 80vh; overflow: hidden;\n  display: flex; flex-direction: column;\n  background: var(--fe-bg, #fff); color: var(--fe-text, #1a1f29);\n  border: 1px solid var(--fe-border, #e2e6ed); border-radius: 12px;\n  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);\n}\n.filex-cv__head {\n  display: flex; align-items: center; justify-content: space-between;\n  padding: 12px 16px; border-bottom: 1px solid var(--fe-border, #e2e6ed);\n}\n.filex-cv__head h3 { margin: 0; font-size: 14px; font-weight: 600; }\n.filex-cv__x {\n  display: inline-flex; align-items: center; justify-content: center;\n  border: 0; background: none; cursor: pointer; font-size: 16px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-cv__x .fe-aicon { color: currentColor; }\n.filex-cv__ok .fe-icon { display: inline-flex; vertical-align: -0.2em; }\n.filex-cv__msg { padding: 28px; text-align: center; color: var(--fe-text-muted, #5a6475); }\n.filex-cv__ok { color: #059669; }\n.filex-cv__src { padding: 12px 16px 0; font-size: 13px; color: var(--fe-text-muted, #5a6475); }\n.filex-cv__search {\n  margin: 8px 16px; padding: 8px 10px;\n  border: 1px solid var(--fe-border, #e2e6ed); border-radius: 8px;\n  background: var(--fe-bg-elev, #f7f8fa); color: inherit; font-size: 13px;\n}\n.filex-cv__list {\n  flex: 1; overflow-y: auto; padding: 4px 12px 12px;\n  display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 8px;\n}\n.filex-cv__fmt {\n  display: flex; flex-direction: column; gap: 2px; align-items: flex-start;\n  padding: 8px 10px; cursor: pointer; text-align: left;\n  border: 1px solid var(--fe-border, #e2e6ed); border-radius: 8px;\n  background: var(--fe-bg-elev, #f7f8fa); color: inherit;\n}\n.filex-cv__fmt small { color: var(--fe-text-muted, #5a6475); font-size: 11px; }\n.filex-cv__fmt.is-sel { border-color: #44c878; background: rgba(68, 200, 120, 0.12); }\n.filex-cv__empty { grid-column: 1 / -1; text-align: center; color: var(--fe-text-muted, #5a6475); padding: 16px; }\n.filex-cv__err { padding: 0 16px; color: var(--fe-danger, #dc2626); font-size: 13px; }\n.filex-cv__foot { padding: 12px 16px; border-top: 1px solid var(--fe-border, #e2e6ed); text-align: right; }\n.filex-cv__convert {\n  padding: 8px 18px; border: 0; border-radius: 8px; cursor: pointer;\n  background: #44c878; color: #03200f; font-weight: 600; font-size: 13px;\n}\n.filex-cv__convert:disabled { opacity: 0.5; cursor: default; }\n.filex-cv__frame { position: absolute; width: 0; height: 0; border: 0; left: -9999px; }\n</style>\n","// The one-line download command shown next to a fresh share link.\n//\n// It exists because a link is often made for a SERVER, not a person: the fast\n// way to get the file onto a box is to paste one curl, not to open a browser.\n// The command lived in the old standalone share dialog and was left behind\n// when link creation moved into the \"Share / Permissions\" panel — so it lives\n// here now, in one place, and both surfaces render the same string.\n\n/** Wrap a value in single quotes for safe paste into a POSIX shell — an\n *  embedded single quote becomes the standard '\\'' dance. */\nexport function shQuote(value: string): string {\n  return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport interface ShareCliTarget {\n  /** The public /s/<token> URL. */\n  url: string;\n  /** The PIN, when the link has one (it rides in the querystring — the\n   *  download endpoint accepts ?pin=). */\n  pin?: string | null;\n  /** File name, for an explicit -o. Unknown → curl takes the server's\n   *  Content-Disposition name with -OJ. */\n  filename?: string | null;\n  /** Folder links serve a browse PAGE at the bare URL; the archive is behind\n   *  ?zip=wait, which blocks until the ZIP is built and then streams it. */\n  isDir?: boolean;\n}\n\n/**\n * shareCliCommand renders the copy-paste curl for a share link.\n *\n * -L is not optional: an S3-backed instance answers with a 302 to a presigned\n * URL, and without it curl saves the redirect page instead of the file.\n */\nexport function shareCliCommand(share: ShareCliTarget | null | undefined): string {\n  if (!share?.url) return '';\n  let url = share.url;\n  const params: string[] = [];\n  if (share.isDir) params.push('zip=wait');\n  if (share.pin) params.push('pin=' + encodeURIComponent(share.pin));\n  if (params.length) url += (url.includes('?') ? '&' : '?') + params.join('&');\n\n  let target = '-OJ ';\n  if (share.filename) {\n    target = `-o ${shQuote(share.isDir ? `${share.filename}.zip` : share.filename)} `;\n  }\n  return `curl -fSL ${target}${shQuote(url)}`;\n}\n","// The server caps how long a new share link may live (`share_max_ttl_days` in\n// /api/capabilities, set by the admin under Protection; default 7 days). The\n// dialogs read it so they only OFFER expiries the server will honour — a\n// \"30 days\" option that quietly becomes 7 days is a lie on the screen, and a\n// \"Never\" option that becomes a week is a worse one.\n//\n// One helper for every surface: the Share / Permissions panel, the standalone\n// share dialog, the desktop app and the embeds all render the same choices\n// from the same rule. A surface that clamps differently would mean the same\n// product behaves two ways.\n\nimport { formatInstant } from '../composables/useLocale'; /* zaman:z1 */\n\nexport interface ExpiryOption {\n  /** Days; 0 = never. */\n  v: number;\n  l: string;\n}\n\n/** The stock expiry choices before the ceiling is applied (days; 0 = never). */\nexport const STOCK_EXPIRY_DAYS = [0, 1, 7, 30];\n\n/**\n * clampExpiryOptions returns the options a dialog may show under a ceiling\n * of `maxDays` (0/undefined = no ceiling → every option as is). Options past\n * the ceiling and \"never\" are dropped; the ceiling itself is added as the\n * longest choice when the stock list does not already contain it.\n */\nexport function clampExpiryOptions(\n  days: number[],\n  maxDays: number | undefined,\n  label: (days: number) => string,\n): ExpiryOption[] {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  let list = max ? days.filter((d) => d > 0 && d <= max) : days.slice();\n  if (max && !list.includes(max)) list.push(max);\n  list = Array.from(new Set(list)).sort((a, b) => (a === 0 ? -1 : b === 0 ? 1 : a - b));\n  return list.map((d) => ({ v: d, l: label(d) }));\n}\n\n/**\n * defaultExpiryDays is what a fresh dialog preselects: the ceiling when there\n * is one (the server would apply it anyway — showing it up front is honest),\n * otherwise \"never\".\n */\nexport function defaultExpiryDays(maxDays: number | undefined): number {\n  return maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n}\n\n/**\n * clampExpiryDate pulls a free-form expiry (datetime input) under the ceiling.\n * Returns the ISO string to send, or null for \"never\" when there is no\n * ceiling. `now` is injectable for tests.\n */\nexport function clampExpiryDate(\n  chosen: Date | null,\n  maxDays: number | undefined,\n  now: Date = new Date(),\n): { iso: string | null; clamped: boolean } {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return { iso: chosen ? chosen.toISOString() : null, clamped: false };\n  const limit = new Date(now.getTime() + max * 86400000);\n  if (!chosen || chosen.getTime() > limit.getTime()) return { iso: limit.toISOString(), clamped: true };\n  return { iso: chosen.toISOString(), clamped: false };\n}\n\n/** Value for a `<input type=\"datetime-local\" max=…>` under the ceiling (local time, minute precision). */\nexport function expiryInputMax(maxDays: number | undefined, now: Date = new Date()): string | undefined {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return undefined;\n  const limit = new Date(now.getTime() + max * 86400000);\n  const pad = (n: number) => String(n).padStart(2, '0');\n  return `${limit.getFullYear()}-${pad(limit.getMonth() + 1)}-${pad(limit.getDate())}T${pad(limit.getHours())}:${pad(limit.getMinutes())}`;\n}\n\n/** \"Valid until 30 Aug 2026, 14:05\" / \"Does not expire\" from the server's `expires_at`. */\nexport function validUntilLine(\n  expiresAt: string | null | undefined,\n  locale: 'tr' | 'en',\n  /** The explorer whose clock applies (lib/timezone EXPLORER_CLOCK). */\n  clock?: symbol,\n): string {\n  if (!expiresAt) return locale === 'tr' ? 'Bu bağlantının süresi yoktur.' : 'This link does not expire.';\n  const d = new Date(expiresAt);\n  // zaman:z1 — the viewer's chosen clock, not the browser's. \"Valid until\n  // 14:05\" is a deadline, and a deadline printed in somebody else's zone is\n  // the worst kind of wrong: it looks actionable. Both halves of that — the\n  // zone AND the locale tag — come from `formatInstant`, which is the one\n  // place either is decided. This file used to pass the zone correctly and\n  // then map the tag itself, to 'en-GB', while useLocale mapped it to\n  // 'en-US': the same deadline was spelled \"20 Sept 2026, 13:53\" in the share\n  // dialog and \"Sep 20, 2026, 1:53 PM\" in the listing behind it.\n  const when = Number.isNaN(d.getTime())\n    ? expiresAt\n    : formatInstant(d, locale, { dateStyle: 'medium', timeStyle: 'short' }, clock);\n  return locale === 'tr' ? `Bu bağlantı ${when} tarihine kadar geçerli.` : `This link is valid until ${when}.`;\n}\n\n/** The hint under an expiry control: what the server will allow at most. */\nexport function ttlCeilingHint(maxDays: number | undefined, locale: 'tr' | 'en'): string {\n  const max = maxDays && maxDays > 0 ? Math.floor(maxDays) : 0;\n  if (!max) return '';\n  return locale === 'tr'\n    ? `Bağlantılar en fazla ${max} gün geçerli olabilir (sunucu ayarı).`\n    : `Links can be valid for at most ${max} day${max === 1 ? '' : 's'} (server setting).`;\n}\n\n/**\n * The share dialog's muted detail line: its facts joined with \" · \".\n *\n * ⚠ The first fact is a whole sentence (\"This link is valid until …, 10:00\n * AM.\") and the ones after it are fragments (\"3 downloads\"), so a plain join\n * printed \"10:00 AM. · 3 downloads\" — a full stop in the middle of a line. A\n * fact that is followed by another loses its closing full stop; the last one\n * keeps whatever it has.\n */\nexport function shareDetailLine(facts: Array<string | null | undefined>): string {\n  const kept = facts.filter((f): f is string => !!f);\n  return kept.map((f, i) => (i < kept.length - 1 ? f.replace(/\\.\\s*$/, '') : f)).join(' · ');\n}\n","<script setup lang=\"ts\">\n/**\n * Access modal — \"Share / Permissions\", the popup behind the explorer's\n * `access` action.\n *\n * gorunum:v2-share — the LOOK changed, the capabilities did not.\n *\n * It used to open as three peer tabs (People · Link · Request files), each a\n * grid of controls competing for the first glance. Nine times in ten the\n * person who opened it wants one thing: turn the link on and copy it. So the\n * dialog now leads with exactly that — one switch, one plain sentence saying\n * who can open the item right now, and the link with its Copy button — and\n * everything else sits underneath in a **named** second tier:\n *\n *   · \"Bağlantı seçenekleri\" — PIN, expiry, download cap, the one-line curl,\n *     e-mail delivery, the OS share sheet, and every existing download link.\n *   · \"Erişimi olanlar\"      — the per-user/per-group grants (owner only).\n *   · \"Dosya İste\"           — the inbound drop link (folders only).\n *\n * ⚠ Second tier, not \"Advanced\": each section says what is in it and carries a\n * one-glance summary of its own state (\"PIN · 7 gün · 3 indirme\"), because a\n * control nobody can find is a control that does not exist. `initialTab` still\n * decides which section opens with the dialog, so \"Request files\" still lands\n * on the drop link.\n *\n * ⚠ No `<style>` block: the CSS lives in `styles/base.css`\n * (`gorunum:v2-share`). A scoped style block here is silently dropped in the\n * web-component build — see web/tests/api/scopedStyles.test.ts.\n */\nimport { ref, onMounted, onBeforeUnmount, computed, inject, watch } from 'vue';\nimport type { FileApi, Grant, UserSuggestion } from '../composables/useFileApi';\nimport type { ShareInfo } from '../types/FileNode';\nimport { shareCliCommand } from '../lib/shareCli';\nimport {\n  STOCK_EXPIRY_DAYS,\n  clampExpiryOptions,\n  defaultExpiryDays,\n  shareDetailLine,\n  ttlCeilingHint,\n  validUntilLine,\n} from '../lib/shareTtl';\nimport { EXPLORER_CLOCK } from '../lib/timezone';\nimport { resolveLocale } from '../locales/resolve';\nimport { formatByteSize, useLocale } from '../composables/useLocale';\nimport { actionIconSvg } from '../lib/actionIcons';\nimport { fileIconTile } from '../lib/fileIcons';\n\nconst props = defineProps<{\n  api: FileApi;\n  path: string; // adapter://rel of the target item\n  isDir?: boolean; // folder → grants cascade; file → no `/…` inheritance hint\n  size?: number; // bytes, for the share-mail body (files only)\n  locale?: 'tr' | 'en';\n  /** Server ceiling on a new link's life in days (capabilities.share_max_ttl_days).\n   *  undefined/0 = no ceiling. The expiry choices are derived from it. */\n  shareMaxTtlDays?: number;\n  /**\n   * surucu:d1 — which part of the dialog the caller wants opened. Absent =\n   * 'perms', the behaviour every existing caller has.\n   *\n   * The drive shell's \"Request files\" needs 'drop': the file-drop link lives\n   * in this dialog, and a menu entry that opened it anywhere else would be a\n   * menu entry that lied about what it does.\n   *\n   * ⚠ A hint, not a lock: `load()` still falls back to the link tier when the\n   * caller turns out not to be an owner, because the grants section is not\n   * theirs to see.\n   */\n  initialTab?: 'perms' | 'share' | 'drop';\n}>();\nconst emit = defineEmits<{ (e: 'close'): void }>();\n\nconst localeCode = computed(() => resolveLocale(props.locale));\nconst { t } = useLocale(() => localeCode.value);\nconst tr = computed(() => localeCode.value !== 'en');\nfunction L(t: string, e: string): string {\n  return tr.value ? t : e;\n}\n\n// Split adapter://rel for a friendlier path chip.\nconst pathParts = computed(() => {\n  const m = /^([^:]+):\\/\\/(.*)$/.exec(props.path);\n  const adapter = m ? m[1] : '';\n  const rel = m ? m[2] : props.path;\n  const segs = rel.split('/').filter(Boolean);\n  return { adapter, name: segs.length ? segs[segs.length - 1] : adapter, rel };\n});\n// The type tile beside the title — the same badge the listing draws, so the\n// dialog is visibly about the row the user right-clicked.\nconst titleTile = computed(() => {\n  const name = pathParts.value.name;\n  const dot = name.lastIndexOf('.');\n  return fileIconTile({\n    type: props.isDir ? 'dir' : 'file',\n    extension: !props.isDir && dot > 0 ? name.slice(dot + 1) : '',\n  });\n});\n\ntype Section = 'link' | 'people' | 'drop';\nconst open = ref<Record<Section, boolean>>({ link: false, people: false, drop: false });\nfunction toggleSection(s: Section) {\n  open.value = { ...open.value, [s]: !open.value[s] };\n}\nconst canManage = ref(false); // owner/admin → can see the grants section\n\n// ── permissions state ──\nconst loading = ref(true);\nconst err = ref('');\nconst direct = ref<Grant[]>([]);\nconst inherited = ref<Grant[]>([]);\nconst storageRbac = ref(true);\nconst email = ref('');\nconst level = ref<'viewer' | 'editor' | 'owner'>('viewer');\nconst busy = ref(false);\nconst notice = ref('');\nconst noAccount = ref(false);\nconst createRole = ref<'user' | 'viewer'>('user');\nconst inviteResult = ref<{ tempPassword?: string } | null>(null);\nconst suggestions = ref<UserSuggestion[]>([]);\nconst showSuggest = ref(false);\nlet searchTimer: ReturnType<typeof setTimeout> | undefined;\n\nconst levels: Array<{ v: 'viewer' | 'editor' | 'owner'; l: string; d: string }> = [\n  { v: 'viewer', l: L('Görüntüleyen', 'Viewer'), d: L('görüntüle + indir', 'view + download') },\n  { v: 'editor', l: L('Düzenleyen', 'Editor'), d: L('oku + yaz + sil', 'read + write + delete') },\n  { v: 'owner', l: L('Sahip', 'Owner'), d: L('düzenle + izin yönet', 'edit + manage access') },\n];\nfunction levelLabel(v: string): string {\n  return levels.find((o) => o.v === v)?.l ?? v;\n}\n\n// ── share state ──\nconst shares = ref<ShareInfo[]>([]);\nconst shareBusy = ref(false);\nconst sharePwd = ref(false);\nconst shareExpiry = ref(defaultExpiryDays(props.shareMaxTtlDays)); // days; 0 = never\nconst shareResult = ref<{ url: string; pin?: string | null; expiresAt?: string | null; clamped?: boolean } | null>(null);\nconst shareErr = ref('');\nconst copied = ref('');\n// prefilled recipient when the owner chose \"share link\" for a no-account email\nconst shareMailTo = ref('');\nconst shareMailBusy = ref(false);\nconst shareMailNotice = ref('');\n\n/**\n * ⚠ `listShares` returns BOTH kinds of link — a download link (`/s/…`) and a\n * file-drop link (`/d/…`) are the same row with a different `kind`. They used\n * to be listed together under \"Existing links\", which meant an upload link\n * appeared in the download tab and the \"link sharing\" state could not be read\n * off the list at all. Split at the source: each section owns its own kind.\n *\n * `kind` is absent from the `ShareInfo` type but present on the wire (see\n * backend/internal/api/handlers/share.go), so it is read through a narrow cast\n * rather than by widening a shared type this dialog does not own.\n */\nfunction shareKind(s: ShareInfo): string {\n  return (s as ShareInfo & { kind?: string }).kind ?? 'download';\n}\nconst downloadShares = computed(() => shares.value.filter((s) => shareKind(s) !== 'drop'));\nconst dropShares = computed(() => shares.value.filter((s) => shareKind(s) === 'drop'));\n\n// ⚠ Derived from the server's ceiling, never a fixed list: offering \"30 days\"\n// on a server that keeps links for 7 would show a choice that is not one.\n// The same helper drives every surface (see lib/shareTtl.ts).\nfunction expiryLabel(days: number): string {\n  if (days === 0) return L('Süresiz', 'Never');\n  return tr.value ? `${days} gün` : `${days} day${days === 1 ? '' : 's'}`;\n}\nconst expiryOptions = computed(() => clampExpiryOptions(STOCK_EXPIRY_DAYS, props.shareMaxTtlDays, expiryLabel));\nconst ttlHint = computed(() => ttlCeilingHint(props.shareMaxTtlDays, tr.value ? 'tr' : 'en'));\nwatch(\n  () => props.shareMaxTtlDays,\n  () => {\n    // The ceiling can arrive after mount (capabilities load async): snap a\n    // selection the server would not honour back to what it will.\n    const allowed = expiryOptions.value.map((o) => o.v);\n    if (!allowed.includes(shareExpiry.value)) shareExpiry.value = defaultExpiryDays(props.shareMaxTtlDays);\n    if (!allowed.includes(dropExpiry.value)) dropExpiry.value = defaultExpiryDays(props.shareMaxTtlDays);\n  },\n);\n\n// ⚠ The download cap lived in the old standalone ShareModal and was left\n// behind when this panel took over link creation — the server has honoured\n// `max_downloads` the whole time, there was simply no way to set it. A select\n// rather than a number box: \"let this be opened three times\" is the whole use\n// case, and typing a number to say it is friction.\nconst shareMaxDl = ref(0); // 0 = unlimited\nconst maxDlOptions = [\n  { v: 0, l: L('Sınırsız', 'Unlimited') },\n  { v: 1, l: L('1 indirme', '1 download') },\n  { v: 3, l: L('3 indirme', '3 downloads') },\n  { v: 5, l: L('5 indirme', '5 downloads') },\n  { v: 10, l: L('10 indirme', '10 downloads') },\n  { v: 25, l: L('25 indirme', '25 downloads') },\n];\n\n// ⚠ The one-line curl went missing the same way the download cap did: it was\n// part of the old standalone share dialog, and link creation moved here\n// without it. A share link is regularly made FOR a server (\"pull this onto the\n// box\"), and that reader has no browser — so the command comes back, built by\n// the shared helper both surfaces use.\nconst shareCli = computed(() =>\n  shareCliCommand(\n    shareResult.value\n      ? {\n          url: shareResult.value.url,\n          pin: shareResult.value.pin,\n          filename: pathParts.value.name,\n          isDir: !!props.isDir,\n        }\n      : null,\n  ),\n);\n\n// ── file-drop (public upload link) state ──\nconst dropPwd = ref(false);\nconst dropExpiry = ref(defaultExpiryDays(props.shareMaxTtlDays)); // days; 0 = never\nconst dropShowAdv = ref(false);\nconst dropMaxFiles = ref<string>('');\nconst dropMaxSizeMB = ref<string>('');\nconst dropAllowedExt = ref<string>('');\nconst dropAskName = ref(true);\nconst dropBusy = ref(false);\nconst dropErr = ref('');\nconst dropResult = ref<{ url: string; pin?: string | null; expiresAt?: string | null; clamped?: boolean } | null>(null);\nconst dropMailTo = ref('');\nconst dropMailBusy = ref(false);\nconst dropMailNotice = ref('');\n\n// splitEmails turns a free-text recipient field into a deduped address list —\n// comma / semicolon / whitespace separated, so one input handles many people.\nfunction splitEmails(raw: string): string[] {\n  const seen = new Set<string>();\n  const out: string[] = [];\n  for (const part of raw.split(/[,;\\s]+/)) {\n    const e = part.trim().toLowerCase();\n    if (e && e.includes('@') && !seen.has(e)) {\n      seen.add(e);\n      out.push(e);\n    }\n  }\n  return out;\n}\n\n// mailResultNotice renders a sent/failed summary from the share-mail response.\nfunction mailResultNotice(res: { sent?: string[]; failed?: string[] }): string {\n  const sent = res.sent?.length ?? 0;\n  const failed = res.failed?.length ?? 0;\n  if (failed === 0) return L(`E-posta gönderildi ✓ (${sent})`, `Email sent ✓ (${sent})`);\n  return L(`${sent} gönderildi, ${failed} başarısız`, `${sent} sent, ${failed} failed`);\n}\n\nasync function reload() {\n  loading.value = true;\n  err.value = '';\n  try {\n    const r = await props.api.listPermissions(props.path);\n    direct.value = r.direct ?? [];\n    inherited.value = r.inherited ?? [];\n    storageRbac.value = r.storage_rbac;\n    canManage.value = true;\n  } catch (e) {\n    // 403 = caller is editor (not owner): no grants section, link only.\n    const st = (e as { status?: number }).status;\n    if (st === 403) {\n      canManage.value = false;\n      // Editor (not owner): the grants section is not theirs — close it and\n      // leave the link tier, which is the whole dialog for them.\n      // ⚠ Unless the caller asked for the drop link, which an editor may\n      // perfectly well mint.\n      open.value = { ...open.value, people: false };\n    } else {\n      err.value = e instanceof Error ? e.message : String(e);\n    }\n  } finally {\n    loading.value = false;\n  }\n}\nasync function reloadShares() {\n  try {\n    const r = await props.api.listShares(props.path);\n    shares.value = r.shares ?? [];\n  } catch {\n    shares.value = [];\n  }\n}\nfunction onKey(e: KeyboardEvent) {\n  if (e.key === 'Escape') emit('close');\n}\nonMounted(async () => {\n  // surucu:d1 — the caller's entry point decides which section opens with the\n  // dialog.\n  //\n  // ⚠ The DEFAULT (no `initialTab`, i.e. the plain \"Share / Permissions\"\n  // action) now opens NOTHING. It used to land on the permissions tab, which\n  // meant the common case — turn the link on, copy it — arrived buried under a\n  // grant editor. The link tier is the answer to the default question; the\n  // grants are one click away with their own state (\"2 people\") readable from\n  // the closed heading. A caller that explicitly wants the grants still says\n  // so, and \"Request files\" still lands on the drop link.\n  if (props.initialTab === 'drop') open.value = { ...open.value, drop: true };\n  else if (props.initialTab === 'perms') open.value = { ...open.value, people: true };\n  document.addEventListener('keydown', onKey);\n  await reload();\n  await reloadShares();\n});\nonBeforeUnmount(() => {\n  if (searchTimer) clearTimeout(searchTimer);\n  document.removeEventListener('keydown', onKey);\n});\n\nfunction onEmailInput() {\n  noAccount.value = false;\n  inviteResult.value = null;\n  notice.value = '';\n  const q = email.value.trim();\n  if (searchTimer) clearTimeout(searchTimer);\n  if (q.length < 1) {\n    suggestions.value = [];\n    showSuggest.value = false;\n    return;\n  }\n  searchTimer = setTimeout(async () => {\n    try {\n      const r = await props.api.searchUsers(q);\n      suggestions.value = r.users ?? [];\n      showSuggest.value = suggestions.value.length > 0;\n    } catch {\n      showSuggest.value = false;\n    }\n  }, 180);\n}\nasync function pickUser(u: UserSuggestion) {\n  showSuggest.value = false;\n  email.value = u.email;\n  let lvl = level.value;\n  if (u.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n  busy.value = true;\n  notice.value = '';\n  try {\n    await props.api.addPermission({ path: props.path, user_id: u.id, level: lvl, is_dir: !!props.isDir });\n    email.value = '';\n    suggestions.value = [];\n    await reload();\n    notice.value = L('Yetki verildi.', 'Access granted.');\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\nasync function submitEmail() {\n  const addr = email.value.trim().toLowerCase();\n  if (!addr || !addr.includes('@')) {\n    notice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n    return;\n  }\n  showSuggest.value = false;\n  busy.value = true;\n  notice.value = '';\n  inviteResult.value = null;\n  try {\n    const res = await props.api.resolveEmail(addr);\n    if (res.found && res.user) {\n      let lvl = level.value;\n      if (res.user.role === 'viewer' && lvl !== 'viewer') lvl = 'viewer';\n      await props.api.addPermission({ path: props.path, user_id: res.user.id, level: lvl, is_dir: !!props.isDir });\n      email.value = '';\n      await reload();\n      notice.value = L('Yetki verildi.', 'Access granted.');\n    } else {\n      noAccount.value = true;\n    }\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\nasync function inviteCreateUser() {\n  busy.value = true;\n  notice.value = '';\n  try {\n    const r = await props.api.invitePermission({\n      path: props.path, email: email.value.trim().toLowerCase(),\n      level: level.value, create_user: true, role: createRole.value, is_dir: !!props.isDir,\n      locale: resolveLocale(props.locale),\n    });\n    inviteResult.value = { tempPassword: r.temp_password };\n    notice.value = r.emailed\n      ? L('Kullanıcı açıldı, davet e-postası gönderildi.', 'User created, invite emailed.')\n      : L('Kullanıcı açıldı. Geçici parolayı iletin.', 'User created. Share the temp password.');\n    noAccount.value = false; email.value = '';\n    await reload();\n  } catch (e) {\n    notice.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    busy.value = false;\n  }\n}\n// \"Just send a share link\" → open the link options with the address prefilled\n// so the owner creates a link (with their chosen expiry/PIN) and mails it\n// from there.\nfunction gotoShareWithMail() {\n  shareMailTo.value = email.value.trim().toLowerCase();\n  noAccount.value = false;\n  notice.value = '';\n  open.value = { ...open.value, link: true };\n}\nasync function changeLevel(g: Grant, newLevel: string) {\n  if (newLevel === g.level) return;\n  busy.value = true;\n  try { await props.api.updatePermission(g.id, newLevel); await reload(); }\n  catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n  finally { busy.value = false; }\n}\nasync function removeGrant(g: Grant) {\n  busy.value = true;\n  try { await props.api.deletePermission(g.id); await reload(); }\n  catch (e) { notice.value = e instanceof Error ? e.message : String(e); }\n  finally { busy.value = false; }\n}\nfunction glabel(g: Grant): string {\n  return g.user_display_name || g.user_email || `#${g.user_id}`;\n}\nfunction ginitial(g: Grant): string {\n  return (g.user_display_name || g.user_email || '?').charAt(0).toUpperCase();\n}\n\n// ── share actions ──\nfunction expiresAtISO(): string | null {\n  if (!shareExpiry.value) return null;\n  return new Date(Date.now() + shareExpiry.value * 86400000).toISOString();\n}\nasync function createLink() {\n  shareBusy.value = true;\n  shareErr.value = '';\n  shareResult.value = null;\n  shareMailNotice.value = '';\n  try {\n    const r = await props.api.createShare({\n      path: props.path,\n      password: sharePwd.value,\n      expires_at: expiresAtISO(),\n      // null, not 0 — the server reads 0 as \"no cap given\" either way, but a\n      // null says it explicitly and keeps the payload honest.\n      max_downloads: shareMaxDl.value || null,\n    });\n    shareResult.value = {\n      url: r.share.url,\n      pin: r.share.password_pin ?? null,\n      expiresAt: r.share.expires_at ?? null,\n      clamped: !!r.share.expiry_clamped,\n    };\n    await reloadShares();\n  } catch (e) {\n    shareErr.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    shareBusy.value = false;\n  }\n}\n\n/**\n * gorunum:v2-share — the switch.\n *\n * ON with nothing minted mints one with whatever the options tier currently\n * says (that is the default: the server's ceiling as the expiry, no PIN, no\n * cap). OFF revokes every DOWNLOAD link on this item, because that is what\n * \"link sharing is off\" has to mean — a switch that left a live link behind\n * would be the most dangerous control in the dialog.\n *\n * ⚠ Drop links are deliberately untouched: they are an inbound door managed by\n * its own section, and revoking someone's upload invitation because the owner\n * turned off downloads is not what either control says.\n */\nasync function toggleLink() {\n  if (shareBusy.value) return;\n  if (linkOn.value) {\n    shareBusy.value = true;\n    shareErr.value = '';\n    try {\n      for (const s of downloadShares.value) await props.api.revokeShare(s.uuid);\n      shareResult.value = null;\n      await reloadShares();\n    } catch (e) {\n      shareErr.value = e instanceof Error ? e.message : String(e);\n    } finally {\n      shareBusy.value = false;\n    }\n    return;\n  }\n  await createLink();\n}\n\nasync function sendShareMail() {\n  const list = splitEmails(shareMailTo.value);\n  if (!list.length) {\n    shareMailNotice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n    return;\n  }\n  if (!shareResult.value?.url) return;\n  shareMailBusy.value = true;\n  shareMailNotice.value = '';\n  try {\n    const res = await props.api.shareMail({\n      path: props.path, emails: list, url: shareResult.value.url,\n      pin: shareResult.value.pin ?? undefined,\n      expires_days: shareExpiry.value || undefined,\n      locale: resolveLocale(props.locale),\n      is_dir: !!props.isDir,\n      size: props.size,\n    });\n    shareMailNotice.value = mailResultNotice(res);\n  } catch (e) {\n    const detail = (e as { detail?: string }).detail ?? '';\n    if (detail.includes('not_configured')) {\n      shareMailNotice.value = L('SMTP ayarlı/doğrulanmış değil — linki elle iletin.', 'SMTP not set up/verified — share the link manually.');\n    } else if (detail.includes('send_failed')) {\n      shareMailNotice.value = L('Gönderilemedi (geçici hata) — tekrar deneyin.', 'Send failed (temporary) — please retry.');\n    } else {\n      shareMailNotice.value = e instanceof Error ? e.message : String(e);\n    }\n  } finally {\n    shareMailBusy.value = false;\n  }\n}\n\n// ── file-drop (upload link) actions ──\nfunction dropExpiresAtISO(): string | null {\n  if (!dropExpiry.value) return null;\n  return new Date(Date.now() + dropExpiry.value * 86400000).toISOString();\n}\nasync function createDropLink() {\n  dropBusy.value = true;\n  dropErr.value = '';\n  dropResult.value = null;\n  dropMailNotice.value = '';\n  try {\n    const drop_settings: Record<string, unknown> = { ask_name: dropAskName.value };\n    if (dropMaxFiles.value) drop_settings.max_files = Number(dropMaxFiles.value);\n    if (dropMaxSizeMB.value) drop_settings.max_file_size_mb = Number(dropMaxSizeMB.value);\n    const exts = dropAllowedExt.value.split(/[,\\s]+/).map((s) => s.trim().replace(/^\\./, '')).filter(Boolean);\n    if (exts.length) drop_settings.allowed_ext = exts;\n    const r = await props.api.createShare({\n      path: props.path,\n      kind: 'drop',\n      password: dropPwd.value,\n      expires_at: dropExpiresAtISO(),\n      drop_settings,\n    });\n    dropResult.value = {\n      url: r.share.url,\n      pin: r.share.password_pin ?? null,\n      expiresAt: r.share.expires_at ?? null,\n      clamped: !!r.share.expiry_clamped,\n    };\n    await reloadShares();\n  } catch (e) {\n    dropErr.value = e instanceof Error ? e.message : String(e);\n  } finally {\n    dropBusy.value = false;\n  }\n}\nasync function sendDropMail() {\n  const list = splitEmails(dropMailTo.value);\n  if (!list.length) {\n    dropMailNotice.value = L('Geçerli bir e-posta girin.', 'Enter a valid email.');\n    return;\n  }\n  if (!dropResult.value?.url) return;\n  dropMailBusy.value = true;\n  dropMailNotice.value = '';\n  try {\n    const res = await props.api.shareMail({\n      path: props.path, emails: list, url: dropResult.value.url,\n      pin: dropResult.value.pin ?? undefined,\n      expires_days: dropExpiry.value || undefined,\n      locale: resolveLocale(props.locale),\n      is_dir: true,\n      mode: 'drop',\n    });\n    dropMailNotice.value = mailResultNotice(res);\n  } catch (e) {\n    const detail = (e as { detail?: string }).detail ?? '';\n    if (detail.includes('not_configured')) {\n      dropMailNotice.value = L('SMTP ayarlı/doğrulanmış değil — linki elle iletin.', 'SMTP not set up/verified — share the link manually.');\n    } else {\n      dropMailNotice.value = e instanceof Error ? e.message : String(e);\n    }\n  } finally {\n    dropMailBusy.value = false;\n  }\n}\nasync function revoke(s: ShareInfo) {\n  shareBusy.value = true;\n  try {\n    await props.api.revokeShare(s.uuid);\n    // ⚠ The lead tier reads `shareResult` first. Revoking the link that is\n    // showing up there has to clear it too, or the dialog goes on offering a\n    // Copy button — and a switch reading ON — for a link the server has just\n    // thrown away.\n    if (shareResult.value && shareResult.value.url === s.url) shareResult.value = null;\n    await reloadShares();\n  } catch (e) { shareErr.value = e instanceof Error ? e.message : String(e); }\n  finally { shareBusy.value = false; }\n}\nfunction copy(text: string, tag = 'url') {\n  navigator.clipboard?.writeText(text);\n  copied.value = tag;\n  setTimeout(() => { if (copied.value === tag) copied.value = ''; }, 1400);\n}\n\n// ── native share (Web Share API) ──\n// Same OS share sheet the fishapp uses (Windows share / Android share). Only\n// shown when the browser supports it (secure context + navigator.share, e.g.\n// Chrome/Edge on Windows, Android). The shared text mirrors the invite email\n// body (see backend mail_templates.go) so a WhatsApp/mail forward reads the\n// same as an emailed link.\nconst canShare = computed(() => typeof navigator !== 'undefined' && typeof navigator.share === 'function');\n\n/**\n * The size line in the share message, spelled the way the SERVER spells it.\n *\n * ⚠ This one really does have to mirror `humanSize()` in\n * backend/internal/api/handlers/mail_templates.go — the same file forwarded\n * by e-mail and by the OS share sheet must not carry two different sizes. So\n * the mirroring is stated as arguments to the one formatter (1024, always one\n * decimal, a dot and English letters, because that is what Go's `%.1f %cB`\n * prints) instead of being a fifth private copy of the arithmetic.\n *\n * ⚠ It is therefore the one place in the UI that is NOT decimal, so a share\n * message reads \"1.4 MB\" where the listing row reads \"1.5 MB\". The register\n * entry for this was right about the real fix: the e-mail should render from\n * one source rather than the UI copying its rounding.\n */\nfunction humanSize(b?: number): string {\n  if (!b || b <= 0) return '';\n  return formatByteSize(b, { base: 1024, digits: 'fixed1', numberLocale: null });\n}\n\nfunction expiryLine(days: number): string {\n  if (days > 0) return L(`Bu bağlantı ${days} gün geçerlidir.`, `This link is valid for ${days} day(s).`);\n  return L('Bu bağlantının süresi yoktur.', 'This link does not expire.');\n}\n// What the server actually stored — shown under a fresh link so the real\n// expiry is visible even when the server shortened the request.\n// The explorer this dialog belongs to reads deadlines on its own clock.\nconst clock = inject(EXPLORER_CLOCK, undefined);\n\nfunction validUntil(r: { expiresAt?: string | null } | null): string {\n  return validUntilLine(r?.expiresAt ?? null, tr.value ? 'tr' : 'en', clock);\n}\n\n/* ── the top tier: one switch, one sentence, one link ──────────────────── */\n\n/** The link the header row shows: the one just minted, else the oldest live one. */\nconst primaryLink = computed(() => shareResult.value?.url ?? downloadShares.value[0]?.url ?? '');\nconst linkOn = computed(() => !!primaryLink.value);\n\n/**\n * The plain sentence. It says who can open the item RIGHT NOW, which is the\n * question the dialog exists to answer.\n *\n * ⚠ The PIN claim is only made about a link this dialog minted: `listShares`\n * does not return `password_pin` (by design — the server will not re-serve a\n * PIN), so for a link that was already there we say how many exist rather than\n * guessing at its protection. A confident wrong sentence about who can read a\n * file is worse than a vaguer true one.\n */\nconst whoLine = computed(() => {\n  if (!linkOn.value) return t('access.who.private');\n  if (shareResult.value) return shareResult.value.pin ? t('access.who.pin') : t('access.who.link');\n  return t('access.who.existing', { n: downloadShares.value.length });\n});\n\n/** The muted second line under it: what the server actually stored. */\nconst linkDetail = computed(() => {\n  const bits: string[] = [];\n  if (shareResult.value) {\n    bits.push(validUntil(shareResult.value));\n    if (shareResult.value.clamped) bits.push(L('(sunucu sınırı uygulandı)', '(server limit applied)'));\n    if (shareMaxDl.value) bits.push(maxDlOptions.find((o) => o.v === shareMaxDl.value)?.l ?? '');\n  } else if (downloadShares.value[0]) {\n    const s = downloadShares.value[0];\n    bits.push(validUntil({ expiresAt: s.expires_at ?? null }));\n    if (s.max_downloads) bits.push(maxDlOptions.find((o) => o.v === s.max_downloads)?.l ?? String(s.max_downloads));\n  }\n  return shareDetailLine(bits);\n});\n\n/* Section summaries — a named section still has to say what is inside it, or\n   the reader has to open all three to find the control they came for. */\nconst linkSummary = computed(() => {\n  const bits: string[] = [];\n  bits.push(sharePwd.value ? t('access.sum.pin_on') : t('access.sum.pin_off'));\n  bits.push(expiryLabel(shareExpiry.value));\n  if (shareMaxDl.value) bits.push(maxDlOptions.find((o) => o.v === shareMaxDl.value)?.l ?? '');\n  return bits.filter(Boolean).join(' · ');\n});\nconst peopleSummary = computed(() => {\n  const n = direct.value.length + inherited.value.length;\n  return n ? t('access.sum.people', { n }) : t('access.sum.people_none');\n});\nconst dropSummary = computed(() =>\n  dropShares.value.length ? t('access.sum.drop', { n: dropShares.value.length }) : t('access.sum.drop_none'),\n);\n\n// Text + title for a download-share link, mirroring shareMailText().\nfunction shareBody(): { title: string; text: string } {\n  const name = pathParts.value.name;\n  const url = shareResult.value?.url ?? '';\n  const pin = shareResult.value?.pin ?? '';\n  const kind = props.isDir ? L('klasör', 'folder') : L('dosya', 'file');\n  const title = tr.value\n    ? `${name} ${props.isDir ? 'klasörü' : 'dosyası'} sizinle paylaşıldı`\n    : `${name} has been shared with you`;\n  const lines: string[] = [];\n  lines.push(L('Merhaba,', 'Hello,'), '');\n  lines.push(L(`Sizinle bir ${kind} paylaşıldı:`, `A ${kind} has been shared with you:`), '');\n  if (props.isDir) {\n    lines.push(L(`Klasör: ${name}`, `Folder: ${name}`));\n  } else {\n    lines.push(L(`Dosya: ${name}`, `File: ${name}`));\n    const sz = humanSize(props.size);\n    if (sz) lines.push(L(`Boyut: ${sz}`, `Size: ${sz}`));\n  }\n  lines.push('', L('İndirmek için:', 'Download it here:'), url);\n  if (pin) lines.push('', L(`PIN (erişim kodu): ${pin}`, `PIN (access code): ${pin}`));\n  lines.push('', expiryLine(shareExpiry.value));\n  return { title, text: lines.join('\\n') };\n}\n\n// Text + title for a file-drop (upload) link, mirroring dropInviteMailText().\nfunction dropBody(): { title: string; text: string } {\n  const folder = pathParts.value.name;\n  const url = dropResult.value?.url ?? '';\n  const pin = dropResult.value?.pin ?? '';\n  const maxFiles = Number(dropMaxFiles.value) || 20;\n  const maxMB = Number(dropMaxSizeMB.value) || 500;\n  const exts = dropAllowedExt.value.split(/[,\\s]+/).map((s) => s.trim().replace(/^\\./, '')).filter(Boolean);\n  const title = L(`${folder} adlı klasöre dosya eklemeniz istendi`, `You've been asked to add files to ${folder}`);\n  const lines: string[] = [];\n  lines.push(L('Merhaba,', 'Hello,'), '');\n  lines.push(L('Dosya yüklemeniz istendi.', \"You've been invited to upload files.\"), '');\n  lines.push(L(`Klasör: ${folder}`, `Folder: ${folder}`));\n  lines.push(L(`Sınır: en fazla ${maxFiles} dosya, dosya başına ${maxMB} MB.`, `Limit: up to ${maxFiles} file(s), ${maxMB} MB per file.`));\n  lines.push(exts.length\n    ? L(`İzinli türler: ${exts.join(', ')}`, `Allowed types: ${exts.join(', ')}`)\n    : L('İzinli türler: tüm türler', 'Allowed types: all'));\n  lines.push('', L('Dosyalarınızı buradan yükleyebilirsiniz:', 'Upload your files here:'), url);\n  if (pin) lines.push('', L(`PIN (erişim kodu): ${pin}`, `PIN (access code): ${pin}`));\n  lines.push('', expiryLine(dropExpiry.value));\n  return { title, text: lines.join('\\n') };\n}\n\nasync function nativeShare(body: { title: string; text: string }) {\n  if (!canShare.value) return;\n  try {\n    await navigator.share(body);\n  } catch {\n    // user cancelled (AbortError) or the target rejected — nothing to do.\n  }\n}\n</script>\n\n<template>\n  <div class=\"fx-perm-overlay fe-share__scrim\" @click.self=\"emit('close')\">\n    <!-- ⚠ `fx-perm-modal` is kept alongside the new class: e2e/shots/capture.mjs\n         and the embedders' own harnesses address the dialog by it. -->\n    <div class=\"fx-perm-modal fe-share\" role=\"dialog\" aria-modal=\"true\" :aria-label=\"t('access.title', { name: pathParts.name })\">\n      <header class=\"fe-share__head\">\n        <span class=\"fe-share__tile\" aria-hidden=\"true\" v-html=\"titleTile\"></span>\n        <div class=\"fe-share__headtext\">\n          <h3 class=\"fe-share__title\">{{ t('access.title', { name: pathParts.name }) }}</h3>\n          <span class=\"fe-share__path\" :title=\"path\">{{ pathParts.adapter }}</span>\n        </div>\n        <button type=\"button\" class=\"fe-share__close\" :aria-label=\"t('access.close')\" :title=\"t('access.close')\" @click=\"emit('close')\">\n          <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n        </button>\n      </header>\n\n      <div class=\"fe-share__body\">\n        <!-- ───────── tier 1: the link, the whole reason people open this ───── -->\n        <div class=\"fe-share__lead\">\n          <div class=\"fe-share__switchrow\">\n            <span class=\"fe-share__leadicon\" aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n            <span class=\"fe-share__leadlabel\">{{ t('access.link.switch') }}</span>\n            <button\n              type=\"button\"\n              class=\"fe-share__switch\"\n              role=\"switch\"\n              :aria-checked=\"linkOn ? 'true' : 'false'\"\n              :aria-label=\"t('access.link.switch')\"\n              data-testid=\"share-switch\"\n              :disabled=\"shareBusy\"\n              @click=\"toggleLink\"\n            ><span class=\"fe-share__knob\"></span></button>\n          </div>\n          <p class=\"fe-share__who\" data-testid=\"share-who\">{{ whoLine }}</p>\n\n          <template v-if=\"linkOn\">\n            <div class=\"fe-share__linkrow\">\n              <a :href=\"primaryLink\" target=\"_blank\" rel=\"noopener\" class=\"fe-share__url\" :title=\"primaryLink\">{{ primaryLink }}</a>\n              <button type=\"button\" class=\"fe-share__copy\" data-testid=\"share-copy\" @click=\"copy(primaryLink, 'new')\">\n                <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                <span>{{ copied === 'new' ? t('access.copied') : t('access.copy') }}</span>\n              </button>\n            </div>\n            <p v-if=\"linkDetail\" class=\"fe-share__detail\" data-testid=\"share-valid-until\">{{ linkDetail }}</p>\n            <div v-if=\"shareResult?.pin\" class=\"fe-share__pinrow\">\n              <span class=\"fe-share__pinlabel\">PIN</span>\n              <code class=\"fe-share__pin\">{{ shareResult?.pin }}</code>\n              <button type=\"button\" class=\"fe-share__mini\" @click=\"copy(shareResult?.pin ?? '', 'sharepin')\">\n                {{ copied === 'sharepin' ? t('access.copied') : t('access.copy') }}\n              </button>\n            </div>\n          </template>\n          <div v-if=\"shareErr\" class=\"fe-share__warn\">{{ shareErr }}</div>\n        </div>\n\n        <!-- ───────── tier 2: named sections, one click each ───────────────── -->\n        <div class=\"fe-share__sections\">\n          <!-- Link options: PIN · expiry · download cap · curl · e-mail · links -->\n          <section class=\"fe-share__section\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.link ? 'true' : 'false'\"\n              data-testid=\"share-options-toggle\"\n              @click=\"toggleSection('link')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.link }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.link') }}</span>\n              <span class=\"fe-share__secmeta\">{{ linkSummary }}</span>\n            </button>\n            <div v-if=\"open.link\" class=\"fe-share__panel\">\n              <div class=\"fe-share__opts\">\n                <label class=\"fe-share__check\">\n                  <input type=\"checkbox\" v-model=\"sharePwd\" />\n                  <span>{{ L('PIN ile koru', 'Protect with a PIN') }}</span>\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('Süre', 'Expiry') }}</span>\n                  <select v-model.number=\"shareExpiry\" class=\"fe-share__select\" data-testid=\"share-expiry\">\n                    <option v-for=\"o in expiryOptions\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n                  </select>\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('İndirme limiti', 'Download limit') }}</span>\n                  <select v-model.number=\"shareMaxDl\" class=\"fe-share__select\">\n                    <option v-for=\"o in maxDlOptions\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n                  </select>\n                </label>\n              </div>\n              <p v-if=\"ttlHint\" class=\"fe-share__hint\" data-testid=\"share-ttl-hint\">{{ ttlHint }}</p>\n              <button type=\"button\" class=\"fx-perm-create fe-share__btn fe-share__btn--primary fe-share__btn--wide\" :disabled=\"shareBusy\" @click=\"createLink\">\n                {{ L('Bağlantı oluştur', 'Create link') }}\n              </button>\n\n              <p v-if=\"!shareResult && shareMailTo\" class=\"fe-share__hint\">\n                {{ L('Bir bağlantı oluşturun, ardından', 'Create a link, then it will be sent to') }}\n                <strong>{{ shareMailTo }}</strong> {{ L('adresine gönderin.', '.') }}\n              </p>\n\n              <template v-if=\"shareResult\">\n                <!-- one-line download command, for pulling the file onto a server -->\n                <div class=\"fx-perm-cli fe-share__cli\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('Komut satırı', 'Command line') }}</span>\n                  <div class=\"fe-share__clirow\">\n                    <code class=\"fe-share__clicmd\" :title=\"shareCli\">{{ shareCli }}</code>\n                    <button type=\"button\" class=\"fe-share__mini\" @click=\"copy(shareCli, 'sharecli')\">\n                      {{ copied === 'sharecli' ? t('access.copied') : t('access.copy') }}\n                    </button>\n                  </div>\n                </div>\n\n                <!-- send by email (one or more, comma/space separated) -->\n                <div class=\"fe-share__mailrow\">\n                  <input v-model=\"shareMailTo\" type=\"text\" class=\"fe-share__input\" autocomplete=\"off\"\n                    :placeholder=\"L('e-posta(lar) — virgülle ayırın', 'email(s) — comma separated')\" @keyup.enter=\"sendShareMail\" />\n                  <button type=\"button\" class=\"fe-share__btn\" :disabled=\"shareMailBusy\" @click=\"sendShareMail\">\n                    {{ L('Gönder', 'Send') }}\n                  </button>\n                </div>\n                <div v-if=\"shareMailNotice\" class=\"fe-share__notice\">{{ shareMailNotice }}</div>\n\n                <!-- native share (OS share sheet) — same as the fishapp Share button -->\n                <button v-if=\"canShare\" type=\"button\" class=\"fe-share__btn fe-share__btn--wide\" @click=\"nativeShare(shareBody())\">\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n                  <span>{{ L('Paylaş', 'Share') }}</span>\n                </button>\n              </template>\n\n              <div class=\"fe-share__list\">\n                <h4 class=\"fe-share__listhead\">{{ L('Mevcut bağlantılar', 'Existing links') }}</h4>\n                <p v-if=\"!downloadShares.length\" class=\"fe-share__empty\">{{ L('Yok', 'None') }}</p>\n                <div v-for=\"s in downloadShares\" :key=\"s.uuid\" class=\"fe-share__row\">\n                  <span class=\"fe-share__url\" :title=\"s.url\">{{ s.url }}</span>\n                  <button type=\"button\" class=\"fe-share__mini\" @click=\"copy(s.url, s.uuid)\">\n                    {{ copied === s.uuid ? t('access.copied') : t('access.copy') }}\n                  </button>\n                  <button type=\"button\" class=\"fe-share__del\" :disabled=\"shareBusy\" :title=\"L('İptal', 'Revoke')\"\n                    :aria-label=\"L('İptal', 'Revoke')\" @click=\"revoke(s)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </section>\n\n          <!-- People with access: the per-user / inherited grants -->\n          <section v-if=\"canManage\" class=\"fe-share__section\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.people ? 'true' : 'false'\"\n              data-testid=\"share-people-toggle\"\n              @click=\"toggleSection('people')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.people }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.people') }}</span>\n              <span class=\"fe-share__secmeta\">{{ peopleSummary }}</span>\n            </button>\n            <div v-if=\"open.people\" class=\"fe-share__panel\">\n              <div v-if=\"!storageRbac\" class=\"fe-share__warn\">\n                {{ L('Bu diskte RBAC kapalı — izinler yalnızca RBAC açık disklerde geçerli.', 'RBAC is off on this storage — grants only apply when RBAC is enabled.') }}\n              </div>\n              <div v-if=\"err\" class=\"fe-share__warn\">{{ err }}</div>\n              <p v-if=\"loading\" class=\"fe-share__hint\">{{ L('Yükleniyor…', 'Loading…') }}</p>\n              <template v-else>\n                <div class=\"fe-share__add\">\n                  <div class=\"fe-share__emailwrap\">\n                    <input v-model=\"email\" type=\"email\" class=\"fe-share__input\" autocomplete=\"off\"\n                      :placeholder=\"L('İsim veya e-posta', 'Name or email')\"\n                      @input=\"onEmailInput\" @keyup.enter=\"submitEmail\" @focus=\"onEmailInput\" />\n                    <ul v-if=\"showSuggest\" class=\"fe-share__suggest\">\n                      <li v-for=\"u in suggestions\" :key=\"u.id\" @mousedown.prevent=\"pickUser(u)\">\n                        <span class=\"fe-share__av fe-share__av--sm\">{{ (u.display_name || u.email).charAt(0).toUpperCase() }}</span>\n                        <span class=\"fe-share__suggesttxt\">\n                          <span class=\"fe-share__suggestname\">{{ u.display_name || u.email }}</span>\n                          <span class=\"fe-share__suggestmeta\">{{ u.email }} · {{ u.role }}</span>\n                        </span>\n                      </li>\n                    </ul>\n                  </div>\n                  <select v-model=\"level\" class=\"fe-share__select\" :title=\"levels.find(o => o.v === level)?.d\">\n                    <option v-for=\"o in levels\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n                  </select>\n                  <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" :disabled=\"busy\" @click=\"submitEmail\">\n                    {{ L('Ekle', 'Add') }}\n                  </button>\n                </div>\n\n                <div v-if=\"noAccount\" class=\"fe-share__invite\">\n                  <p class=\"fe-share__hint\">{{ L('Bu e-postada hesap yok. Ne yapmak istersiniz?', 'No account for this email — what next?') }}</p>\n                  <div class=\"fe-share__inviterow\">\n                    <select v-model=\"createRole\" class=\"fe-share__select\">\n                      <option value=\"user\">{{ L('Kullanıcı', 'User') }}</option>\n                      <option value=\"viewer\">{{ L('Görüntüleyen', 'Viewer') }}</option>\n                    </select>\n                    <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" :disabled=\"busy\" @click=\"inviteCreateUser\">\n                      {{ L('Kullanıcı oluştur + yetki ver', 'Create user + grant') }}\n                    </button>\n                  </div>\n                  <button type=\"button\" class=\"fe-share__linkbtn\" :disabled=\"busy\" @click=\"gotoShareWithMail\">\n                    {{ L('Sadece paylaşım linki gönder →', 'Just send a share link →') }}\n                  </button>\n                </div>\n                <div v-if=\"notice\" class=\"fe-share__notice\">{{ notice }}</div>\n                <div v-if=\"inviteResult?.tempPassword\" class=\"fe-share__notice\">\n                  {{ L('Geçici parola:', 'Temp password:') }} <code class=\"fe-share__pin\">{{ inviteResult.tempPassword }}</code>\n                </div>\n\n                <div class=\"fe-share__list\">\n                  <h4 class=\"fe-share__listhead\">{{ L('Erişimi olanlar', 'People with access') }}</h4>\n                  <p v-if=\"!direct.length && !inherited.length\" class=\"fe-share__empty\">\n                    {{ L('Henüz kimseyle paylaşılmadı.', 'Not shared with anyone yet.') }}\n                  </p>\n                  <div v-for=\"g in direct\" :key=\"'d' + g.id\" class=\"fe-share__row\">\n                    <span class=\"fe-share__av\">{{ ginitial(g) }}</span>\n                    <span class=\"fe-share__person\" :title=\"g.user_email\">{{ glabel(g) }}</span>\n                    <select class=\"fe-share__select fe-share__select--sm\" :value=\"g.level\"\n                      @change=\"changeLevel(g, ($event.target as HTMLSelectElement).value)\">\n                      <option v-for=\"o in levels\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n                    </select>\n                    <button type=\"button\" class=\"fe-share__del\" :disabled=\"busy\" :title=\"L('Kaldır', 'Remove')\"\n                      :aria-label=\"L('Kaldır', 'Remove')\" @click=\"removeGrant(g)\">\n                      <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                    </button>\n                  </div>\n                  <div v-for=\"g in inherited\" :key=\"'i' + g.id\" class=\"fe-share__row fe-share__row--dim\">\n                    <span class=\"fe-share__av fe-share__av--dim\">{{ ginitial(g) }}</span>\n                    <span class=\"fe-share__person\" :title=\"g.user_email\">{{ glabel(g) }}</span>\n                    <span class=\"fe-share__badge\">{{ levelLabel(g.level) }}</span>\n                    <span class=\"fe-share__from\" :title=\"L('Üst klasörden gelir', 'Inherited from') + ': ' + (g.path_prefix || '/')\">\n                      {{ g.path_prefix || '/' }}\n                    </span>\n                  </div>\n                </div>\n              </template>\n            </div>\n          </section>\n\n          <!-- Request files: the inbound drop link (folders only) -->\n          <section v-if=\"isDir\" class=\"fe-share__section\">\n            <button\n              type=\"button\"\n              class=\"fe-share__sechead\"\n              :aria-expanded=\"open.drop ? 'true' : 'false'\"\n              data-testid=\"share-drop-toggle\"\n              @click=\"toggleSection('drop')\"\n            >\n              <svg class=\"fe-share__caret\" :class=\"{ 'is-open': open.drop }\" viewBox=\"0 0 24 24\" fill=\"none\"\n                stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n                aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 6l6 6-6 6\" /></svg>\n              <span class=\"fe-share__seclabel\">{{ t('access.section.drop') }}</span>\n              <span class=\"fe-share__secmeta\">{{ dropSummary }}</span>\n            </button>\n            <div v-if=\"open.drop\" class=\"fe-share__panel\">\n              <p class=\"fe-share__hint\">\n                {{ L('Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.', 'A public link that lets anyone UPLOAD files into this folder. Uploaders never see the folder\\'s existing files.') }}\n              </p>\n              <div class=\"fe-share__opts\">\n                <label class=\"fe-share__check\">\n                  <input type=\"checkbox\" v-model=\"dropPwd\" />\n                  <span>{{ L('PIN ile koru', 'Protect with a PIN') }}</span>\n                </label>\n                <label class=\"fe-share__field\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('Süre', 'Expiry') }}</span>\n                  <select v-model.number=\"dropExpiry\" class=\"fe-share__select\" data-testid=\"drop-expiry\">\n                    <option v-for=\"o in expiryOptions\" :key=\"o.v\" :value=\"o.v\">{{ o.l }}</option>\n                  </select>\n                </label>\n              </div>\n              <p v-if=\"ttlHint\" class=\"fe-share__hint\">{{ ttlHint }}</p>\n              <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary fe-share__btn--wide\" data-testid=\"drop-create\" :disabled=\"dropBusy\" @click=\"createDropLink\">\n                {{ L('Bağlantı oluştur', 'Create link') }}\n              </button>\n\n              <button type=\"button\" class=\"fe-share__linkbtn\" :aria-expanded=\"dropShowAdv ? 'true' : 'false'\" @click=\"dropShowAdv = !dropShowAdv\">\n                {{ dropShowAdv ? L('Yükleme sınırlarını gizle', 'Hide upload limits') : L('Yükleme sınırları', 'Upload limits') }}\n              </button>\n              <div v-if=\"dropShowAdv\" class=\"fe-share__adv\">\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('En fazla dosya', 'Max files') }}</span>\n                  <input v-model=\"dropMaxFiles\" type=\"number\" min=\"1\" class=\"fe-share__input fe-share__input--sm\" placeholder=\"20\" />\n                </label>\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('Dosya başı MB', 'MB / file') }}</span>\n                  <input v-model=\"dropMaxSizeMB\" type=\"number\" min=\"1\" class=\"fe-share__input fe-share__input--sm\" placeholder=\"500\" />\n                </label>\n                <label class=\"fe-share__advrow\">\n                  <span class=\"fe-share__fieldlabel\">{{ L('İzinli türler', 'Allowed types') }}</span>\n                  <input v-model=\"dropAllowedExt\" type=\"text\" class=\"fe-share__input fe-share__input--sm\" :placeholder=\"L('hepsi (örn. pdf, jpg)', 'all (e.g. pdf, jpg)')\" />\n                </label>\n                <label class=\"fe-share__check\">\n                  <input type=\"checkbox\" v-model=\"dropAskName\" />\n                  <span>{{ L('Yükleyenin adını sor', 'Ask uploader name') }}</span>\n                </label>\n              </div>\n\n              <div v-if=\"dropErr\" class=\"fe-share__warn\">{{ dropErr }}</div>\n\n              <template v-if=\"dropResult\">\n                <div class=\"fe-share__linkrow\">\n                  <a :href=\"dropResult.url\" target=\"_blank\" rel=\"noopener\" class=\"fe-share__url\" :title=\"dropResult.url\">{{ dropResult.url }}</a>\n                  <button type=\"button\" class=\"fe-share__copy\" data-testid=\"drop-copy\" @click=\"copy(dropResult.url, 'drop')\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('copy')\"></span>\n                    <span>{{ copied === 'drop' ? t('access.copied') : t('access.copy') }}</span>\n                  </button>\n                </div>\n                <p class=\"fe-share__detail\">\n                  {{ validUntil(dropResult) }}\n                  <span v-if=\"dropResult.clamped\">{{ L('(sunucu sınırı uygulandı)', '(server limit applied)') }}</span>\n                </p>\n                <div v-if=\"dropResult.pin\" class=\"fe-share__pinrow\">\n                  <span class=\"fe-share__pinlabel\">PIN</span>\n                  <code class=\"fe-share__pin\">{{ dropResult.pin }}</code>\n                  <button type=\"button\" class=\"fe-share__mini\" @click=\"copy(dropResult.pin, 'droppin')\">\n                    {{ copied === 'droppin' ? t('access.copied') : t('access.copy') }}\n                  </button>\n                </div>\n\n                <!-- email the upload link to one or more people -->\n                <div class=\"fe-share__mailrow\">\n                  <input v-model=\"dropMailTo\" type=\"text\" class=\"fe-share__input\" autocomplete=\"off\"\n                    :placeholder=\"L('e-posta(lar) — virgülle ayırın', 'email(s) — comma separated')\" @keyup.enter=\"sendDropMail\" />\n                  <button type=\"button\" class=\"fe-share__btn\" :disabled=\"dropMailBusy\" @click=\"sendDropMail\">\n                    {{ L('Gönder', 'Send') }}\n                  </button>\n                </div>\n                <div v-if=\"dropMailNotice\" class=\"fe-share__notice\">{{ dropMailNotice }}</div>\n\n                <!-- native share (OS share sheet) — same as the fishapp Share button -->\n                <button v-if=\"canShare\" type=\"button\" class=\"fe-share__btn fe-share__btn--wide\" @click=\"nativeShare(dropBody())\">\n                  <span aria-hidden=\"true\" v-html=\"actionIconSvg('access')\"></span>\n                  <span>{{ L('Paylaş', 'Share') }}</span>\n                </button>\n              </template>\n\n              <div class=\"fe-share__list\">\n                <h4 class=\"fe-share__listhead\">{{ L('Mevcut bağlantılar', 'Existing links') }}</h4>\n                <p v-if=\"!dropShares.length\" class=\"fe-share__empty\">{{ L('Yok', 'None') }}</p>\n                <div v-for=\"s in dropShares\" :key=\"s.uuid\" class=\"fe-share__row\">\n                  <span class=\"fe-share__url\" :title=\"s.url\">{{ s.url }}</span>\n                  <button type=\"button\" class=\"fe-share__mini\" @click=\"copy(s.url, s.uuid)\">\n                    {{ copied === s.uuid ? t('access.copied') : t('access.copy') }}\n                  </button>\n                  <button type=\"button\" class=\"fe-share__del\" :disabled=\"shareBusy\" :title=\"L('İptal', 'Revoke')\"\n                    :aria-label=\"L('İptal', 'Revoke')\" @click=\"revoke(s)\">\n                    <span aria-hidden=\"true\" v-html=\"actionIconSvg('close')\"></span>\n                  </button>\n                </div>\n              </div>\n            </div>\n          </section>\n        </div>\n      </div>\n\n      <footer class=\"fe-share__foot\">\n        <button type=\"button\" class=\"fe-share__btn fe-share__btn--primary\" data-testid=\"share-done\" @click=\"emit('close')\">\n          {{ t('access.done') }}\n        </button>\n      </footer>\n    </div>\n  </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FileExplorer — the public Vue component, panel + PWA + standalone use.\n *\n * Orchestrates:\n *   - Directory listing (useFileApi)\n *   - Chunked multipart upload (useUploadChunked) + drag & drop\n *   - Selection + keyboard shortcuts\n *   - Context menu (Teleport-based) with per-target actions\n *   - Modal flows: newFolder / rename / delete / share / preview\n *   - Eager Monaco preload so the code-edit path is snappy\n *\n * All backend endpoints arrive via the `config` prop. Auth is bearer\n * (PWA / OIDC) / CSRF (panel) / basic / none — `useFileApi` swallows\n * the difference.\n */\nimport { computed, customRef, nextTick, onBeforeUnmount, onMounted, ref, watch, watchEffect } from 'vue';\nimport type { ExplorerConfig, ThemeMode } from './types/ExplorerConfig';\nimport type {\n  FileNode,\n  ShareInfo,\n  ViewMode,\n  ClipboardState,\n  Capabilities,\n} from './types/FileNode';\nimport { isExternalUsable } from './types/FileNode';\nimport { useFileApi, type GlobalSearchHit, type ManagerResponse } from './composables/useFileApi';\nimport {\n  useUploadChunked,\n  isStagedUnsupported,\n  type UploadJob,\n} from './composables/useUploadChunked';\nimport { useSelection } from './composables/useSelection';\nimport { useKeyboardShortcuts } from './composables/useKeyboardShortcuts';\nimport { useLocale } from './composables/useLocale';\nimport { usePendingOps, type PendingOp } from './composables/usePendingOps';\nimport { useRealtime } from './composables/useRealtime';\nimport { useThumbs } from './composables/useThumbs';\nimport { preloadEditor } from './composables/useMonacoLoader';\nimport PresenceBar from './components/PresenceBar.vue';\n\nimport Toolbar, { type SelectionMode } from './components/Toolbar.vue';\nimport StarButton from './components/StarButton.vue';\nimport TagPicker from './components/TagPicker.vue';\nimport {\n  activeSortDir,\n  activeSortKey,\n  applySort,\n  defaultSortDir,\n  globalSort,\n  setSortLocale,\n  type ListingOrder,\n} from './lib/sortOrder'; /* surucu:d1-sort */\nimport {\n  attachViewPrefsStore,\n  folderKey as makeFolderKey,\n  folderMemoryEnabled,\n  folderPrefs,\n  rememberFolder,\n  touchFolder,\n  viewPrefsReady,\n} from './lib/viewPrefs'; /* tablo:t1 */\nimport { resolveUiProfile } from './lib/uiProfile';\nimport RecentlyOpened from './components/RecentlyOpened.vue';\nimport {\n  EMPTY_FILTERS,\n  applyFilters,\n  filtersActive,\n  type DriveFilters,\n} from './lib/fileFilters' /* surucu:d1 */;\nimport ContextMenu, { type ContextAction } from './components/ContextMenu.vue';\nimport UploadProgress from './components/UploadProgress.vue';\nimport PendingOpsTray from './components/PendingOpsTray.vue';\nimport InspectorPanel from './components/InspectorPanel.vue'; /* koru:k1 */\nimport SideNav, { type NavDest } from './components/SideNav.vue'; /* gezinti:g1 */\nimport HomeView from './components/HomeView.vue'; /* gorunum:v3-shell */\nimport ConnectionsPanel from './components/ConnectionsPanel.vue'; /* gezinti:g1 */\nimport TokensPanel from './components/TokensPanel.vue'; /* gezinti:g1 */\n/* cila:c wiring */\nimport CommandPalette from './components/CommandPalette.vue';\nimport AdvancedSearch from './components/AdvancedSearch.vue' /* gorunum:v1-advsearch */;\nimport {\n  advQueryString,\n  advSearchTruncated,\n  type AdvCountResult,\n  type AdvScope,\n  type AdvSearchRequest,\n} from './lib/advSearch' /* gorunum:v1-advsearch */;\nimport ShortcutsHelp from './components/ShortcutsHelp.vue';\n/* /cila:c wiring */\n/* wiring:c1 — tema galerisi */\nimport ThemeGallery from './components/ThemeGallery.vue';\nimport {\n  useThemeState,\n  useThemeModeState,\n  applyThemeToEl,\n  syncThemeStyle,\n  type ThemeModePref,\n} from './lib/themes';\n/* /wiring:c1 */\n/* zaman:z3 — the embed's own time-zone setting + this instance's tiers */\nimport TimeZoneDialog from './components/TimeZoneDialog.vue';\nimport { useExplorerTimeZone } from './composables/useExplorerTimeZone';\nimport { connectionsBase } from './composables/useConnections';\n/* wiring:c2 — shortcut settings modal + Space quick-look overlay */\nimport ShortcutSettings from './components/ShortcutSettings.vue';\nimport QuickLook from './components/QuickLook.vue';\n/* /wiring:c2 */\n/* wiring:c3 — unified operations center */\nimport OperationsCenter from './components/OperationsCenter.vue';\nimport { useOperations } from './composables/useOperations';\n/* /wiring:c3 */\n/* wiring:c4 */\nimport OnboardingTour from './components/OnboardingTour.vue';\n/* /wiring:c4 */\n/* wiring:d1 — tabs + per-tab split */\nimport TabBar from './components/TabBar.vue';\nimport FilePane from './components/FilePane.vue';\nimport { useTabs, type TabState } from './composables/useTabs';\n/* /wiring:d1 */\n/* wiring:e2 — end-to-end encrypted folders (docs/E2E-ENCRYPTION.md) */\nimport EncryptedFolderModal from './components/EncryptedFolderModal.vue';\nimport RecoveryKeyModal from './components/RecoveryKeyModal.vue';\nimport E2eRecoveryUnlockModal from './components/E2eRecoveryUnlockModal.vue';\nimport {\n  createKeyRing,\n  createEncryptedFolder,\n  upgradeMarkerV1,\n  addEscrowSlot,\n  declineEscrowSlot,\n  escrowOfferState,\n  parseMarker,\n  unlockWithPassword,\n  unlockWithRecoveryKey,\n  unlockWithEscrowKey,\n  importEscrowPrivateKey,\n  markerHasRecovery,\n  escrowAvailability,\n  bytesToB64,\n  b64ToBytes,\n  encryptFile,\n  decryptFile,\n  hasMagic,\n  E2E_MARKER_NAME,\n  E2E_MAX_FILE_BYTES,\n  type E2eMarker,\n} from './lib/e2ecrypto';\n/* /wiring:e2 */\n\n/* ui-fix — listing helpers shared with SecondaryPane (single source: the\n   internal-entry filter + virtual `.trash` row must be identical in both\n   panes or split view shows mismatched rows). */\nimport {\n  filterListing,\n  virtualSegmentLabel,\n  isVirtualViewPath,\n  makeTagSegment,\n  tagOfPath,\n  showHiddenFiles,\n  setShowHiddenFiles,\n  injectTrashRow,\n  hydrateTrashRow as hydrateTrashRowShared,\n} from './lib/listing';\nimport { nodeRowToFileNode as nodeRowToFileNodePure } from './lib/nodeRow'; /* Recent / Starred / tag / Home rows — one shape, with `perm` + `read_only` */\nimport { iconFamilyFor, isStorageRow } from './lib/fileIcons'; /* pane:p1 — the storage-row predicate's one home */\nimport { actionIconSvg } from './lib/actionIcons'; /* inceleme:r1 — the drop overlay's mark, off the emoji font */\nimport { setNodeStarred } from './lib/star';\nimport { fetchAllTags, fetchTaggedRows, invalidateTagCache } from './lib/tags';\nimport { resolveTransfer, type TransferIntent } from './lib/transfer';\nimport { downloadArchive } from './lib/downloadSelection'; /* tasi:m1 */\nimport { labelOfWire } from './lib/destinationTree'; /* tasi:m1 */\nimport {\n  activeNativeDrag,\n  beginNativeDrag,\n  canDownloadUrlDrag,\n  dragKey,\n  downloadUrlPayload,\n  endNativeDrag,\n  hasInternalDrag,\n  internalDragItems,\n  internalDragOrigin,\n  type DragItem,\n} from './lib/dragOut';\n\nimport NewFolderModal from './modals/NewFolderModal.vue';\nimport NewDocumentModal from './modals/NewDocumentModal.vue'; /* belge:n1 */\nimport RenameModal from './modals/RenameModal.vue';\nimport DeleteConfirmModal from './modals/DeleteConfirmModal.vue';\nimport Modal from './modals/Modal.vue'; /* tablo:t1 — the empty-trash confirmation */\nimport PreviewModal from './modals/PreviewModal.vue';\nimport ConvertModal from './modals/ConvertModal.vue';\nimport PermissionsModal from './modals/PermissionsModal.vue';\nimport DestinationPickerModal from './modals/DestinationPickerModal.vue'; /* tasi:m1 */\nimport { resolveLocale } from './locales/resolve';\n\nconst props = defineProps<{\n  config: ExplorerConfig;\n}>();\n\nconst emit = defineEmits<{\n  (e: 'share-created', payload: { path: string; url: string; pin: string | null }): void;\n  (e: 'file-opened', file: { path: string; basename: string }): void;\n  (e: 'error', err: { message: string; context?: unknown }): void;\n  (e: 'upload-progress', p: { uploadId: string; percent: number; done: boolean }): void;\n  (\n    e: 'selection-change',\n    items: Array<{ path: string; basename: string; type: 'file' | 'dir' }>,\n  ): void;\n  // Fires whenever the viewed folder changes (virtual `<storage>/<rel>` form).\n  // Lets a host (e.g. the Explore page's realtime layer) track the current\n  // folder without reaching into internal state.\n  (e: 'navigate', p: { path: string }): void;\n  /**\n   * gorunum:v2-topbar — the user asked for a refresh (the header's button or\n   * the palette's command; both reach `refreshAll`).\n   *\n   * The explorer reloads the LISTING itself; this is for the half it cannot\n   * know about. `config.storages` is the host's answer to \"which drives may I\n   * show you\", computed before the explorer was mounted, and nothing inside\n   * here can recompute it — so a drive added from somewhere else stayed\n   * invisible until the whole page was reloaded. The Explore page used to\n   * paper over that with a Refresh button of its own in the page bar; the bar\n   * is gone, so the one Refresh has to mean both halves.\n   *\n   * ⚠ A notification, not a request: the explorer does not wait for the host\n   * and does not care whether it does anything. An embedder with a fixed\n   * storage list simply ignores it.\n   */\n  (e: 'refresh'): void;\n}>();\n\n// --------------------------------------------------------------------\n// State\n// --------------------------------------------------------------------\n\nconst api = useFileApi(props.config);\n\n// Locale up-front: the pendingOps onSettled callback below (and the undo-toast\n// helpers) need `t()` at runtime, so the catalogue must be constructed before\n// they are wired. Depends only on props — safe this early.\nconst locale = computed(() => resolveLocale(props.config.locale));\n/* surucu:d1-sort — the alphabet the `type` key sorts in (lib/sortOrder sorts\n * by the word the Type column PRINTS, so \"Image\" and \"Görsel\" each fall in\n * their own order).\n * ⚠ Pushed from HERE as well as from FilterBar and ListView, and that is not a\n * third copy of a decision — it is one value, pushed by the component that\n * always exists. This file is now the one that sorts; the filter row is absent\n * at a virtual root and the list is absent in grid and gallery, so relying on\n * either would leave the comparator on a stale alphabet exactly when they are\n * not mounted. */\nwatch(locale, (l) => setSortLocale(l), { immediate: true });\nconst { t, formatSize } = useLocale(locale); /* tablo:t1 — the empty-trash confirmation names the space */\n\n// Live collaboration (WebSocket file-change events + presence), bundled into the\n// core so every consumer — the native panel AND the embedded webcomponent —\n// gets it. Auth is a short-lived ticket fetched through the same API (works\n// same-origin and proxied cross-origin); it degrades to polling when no live\n// socket is available.\nconst realtime = useRealtime(api, { reload: () => load() });\nconst presenceUsers = realtime.presenceUsers;\n// True while the live socket is unavailable and the explorer runs on the\n// polling fallback — drives the small \"no live connection\" badge. Healthy\n// connections show nothing.\nconst realtimeDegraded = realtime.degraded;\nfunction realtimeRoom(vp: string): string | null {\n  const p = (vp || '').replace(/^\\/+|\\/+$/g, '');\n  if (p === '.trash' || p.startsWith('.trash/')) return null;\n  // The wire form must go through the mode-aware qualify(), exactly like every\n  // API call: in single-storage mode currentPath is a BARE relative path\n  // (\"projeler/5\") — virtualToWire would mistake its first segment for an\n  // adapter (\"projeler://5\") and subscribe a nonexistent room, so presence and\n  // live changes silently missed the real folder. An empty p is the storage\n  // root — a real room (\"main://\") — not \"no room\"; only the multi-storage\n  // drives list (no adapter yet) has none.\n  const wire = qualify(p);\n  if (!wire || !wire.includes('://') || wire.startsWith('://')) return null;\n  return wire;\n}\nonMounted(() => {\n  realtime.start();\n  realtime.subscribe(realtimeRoom(currentPath.value));\n});\nonBeforeUnmount(() => realtime.stop());\n\n// Authenticated thumbnails — raw thumb_url is root-relative + header-less,\n// which only ever worked for the native same-origin SPA (embedded hosts got\n// empty/broken <img>s). See useThumbs.\nconst thumbs = useThumbs(props.config.apiBase, api);\n\nconst chunked = useUploadChunked(props.config, api);\n\n// Undo registry for async pending ops: when a cleanly-invertible operation\n// (move → reverse move, trash-delete → restore) is queued, its inverse is\n// registered under the op id; once the op settles OK the toast grows a\n// \"Geri Al\" action. Ops without an entry keep the plain settled toast.\nconst opUndo = new Map<number, { message: string; fn: () => Promise<void> }>();\n\nconst pendingOps = usePendingOps(props.config, api, {\n  onSettled: (op: PendingOp) => {\n    const undo = opUndo.get(op.id);\n    opUndo.delete(op.id);\n    if (op.status === 'error') {\n      flashToast(op.error_message || t('toast.failed'));\n    } else if (undo) {\n      undoToast(`${undo.message} (${op.progress_total})`, undo.fn);\n    } else {\n      const verb =\n        op.op_type === 'copy'\n          ? t('toast.copied')\n          : op.op_type === 'move'\n            ? t('toast.moved')\n            : t('toast.deleted');\n      flashToast(`${verb} (${op.progress_total})`);\n    }\n    void load();\n    void splitPaneRef.value?.reload(); /* wiring:d1 — refresh the secondary pane too */\n  },\n});\n\nconst loading = ref(false);\n// rootPath confinement (UX): when set, the explorer treats this folder as its\n// floor — it opens there, never lists the drives root, and can't navigate\n// above it. Security is enforced server-side (X-Filex-Root / token root scope);\n// this is purely the clean-embed presentation. `rootFloor` is the virtual form\n// (`<storage>/<rel>`) used for path comparisons in multi-storage mode.\nconst rootPathProp = (props.config.rootPath || '').trim(); // qualified `<adapter>://<rel>`\nconst rootFloor = rootPathProp.replace('://', '/').replace(/^\\/+|\\/+$/g, '');\nconst initialFloorPath = rootFloor || props.config.initialPath || '';\nconst currentPath = ref<string>(initialFloorPath);\nconst adapter = ref<string>(props.config.defaultAdapter || 'brf');\nconst dirname = ref<string>(initialFloorPath);\nconst files = ref<FileNode[]>([]);\n// RBAC effective level for the current directory ('' = ACL not enforced on\n// this storage → no gating). Drives which write/manage actions are offered.\nconst dirPerm = ref<string>('');\n/** The listed folder sits on a read-only storage (`read_only` on the index\n *  response). Folded into permCanEdit so every write affordance — toolbar,\n *  sidebar menu, context menu, drop zone, editor mode — reads the same fact. */\nconst dirReadOnly = ref(false);\n// The dead deep-link state: set to the requested path when a listing came\n// back 404 (folder doesn't exist) or 403 (RBAC-hidden — rendered identically\n// on purpose so a denied folder doesn't reveal that it exists). '' = none.\nconst notFoundPath = ref<string>('');\n// Listing failure that is NOT a dead link (network error, 5xx): remembered so\n// the body can render a retryable error state instead of a misleading \"this\n// folder is empty\". Only shown when no listing is visible — a failed\n// navigation away from a healthy listing keeps the current list + toast,\n// exactly as before.\nconst loadError = ref<string>('');\nlet loadErrorPath: string | undefined;\nfunction retryLoad() {\n  void load(loadErrorPath);\n}\n\nconst VIEW_MODE_KEY = 'brf-file-explorer:view-mode';\n/**\n * tablo:t1 — true while a folder's REMEMBERED setup is being restored, as\n * opposed to a person choosing one.\n *\n * ⚠⚠ Without this the whole design inverts. `brf-file-explorer:view-mode` is\n * the GLOBAL default — what a folder nobody has configured opens as — and the\n * per-folder memory is layered over it. If restoring a folder's grid view also\n * wrote the global key, then merely WALKING INTO one folder you once set to\n * grid would make grid the default for the entire product, and the person\n * would have no way to tell which folder did it. Restoring is not choosing.\n * The same flag also keeps the watcher below from re-recording what it just\n * applied.\n */\nlet restoringFolderView = false;\nconst viewMode = customRef<ViewMode>((track, trigger) => {\n  let value: ViewMode = (() => {\n    try {\n      const stored = localStorage.getItem(VIEW_MODE_KEY);\n      if (stored === 'list' || stored === 'grid' || stored === 'gallery') return stored; /* wiring:d2 */\n    } catch {\n      /* private mode */\n    }\n    return props.config.viewMode ?? 'list';\n  })();\n  return {\n    get() {\n      track();\n      return value;\n    },\n    set(next) {\n      if (next === value) return;\n      value = next;\n      if (!restoringFolderView) {\n        try {\n          localStorage.setItem(VIEW_MODE_KEY, next);\n        } catch {\n          /* quota */\n        }\n      }\n      trigger();\n    },\n  };\n});\n/* cila:a density — Toolbar owns the persisted preference (filex.density);\n   mirrored here only so the root `.fe` can carry fe--density-compact. */\nconst density = ref<'comfortable' | 'compact'>('comfortable');\nconst searchQuery = ref('');\n// trashMode — true while viewing the filex trash (soft-deleted nodes from the\n// backend trash endpoint), entered by opening the virtual `.trash` row and\n// exited by any normal navigation (load() resets it). Replaces a brittle\n// `currentPath.startsWith('fileman/.trash')` check that never matched the\n// filex backend's storage layout, so trash always looked empty.\nconst trashMode = ref(false);\n// The storage the trash view was entered from, so \"up\" returns there (not the\n// global root). Set in loadTrash().\nconst trashOrigin = ref<string>('');\nconst trashActive = computed(() => trashMode.value);\n\n/* === gezinti:g1 — the navigation panel's virtual views ===================\n * Recent / Starred / Shared with me / Trash are listings with no folder behind\n * them: the rows come from a per-user endpoint and each carries its own\n * adapter-qualified path, so opening one navigates the ordinary way. The\n * pattern is trashMode's, generalised — including the part that matters most,\n * that load() clears the mode, or the view sticks and every later navigation\n * renders under the wrong heading. */\ntype NavView = '' | 'home' | 'recent' | 'starred' | 'shared' | 'trash' | 'tag';\nconst navView = ref<NavView>('');\n/** Where the view was entered from, so \"up\" goes back there. */\nconst navViewOrigin = ref<string>('');\n\n/**\n * gorunum:v1 — when a row's NAME is not enough to know where it is.\n *\n * Recent, Starred, Shared with me and a tag view each draw rows gathered from\n * every folder in the storage, so two files called `report.pdf` are two\n * identical lines. The listing already knows how to print a row's folder — it\n * did it for search hits only. Trash is left out on purpose: a trashed row's\n * stored path is its trash key, not the folder it came from, so the column\n * would print an internal name.\n */\nconst crossFolderView = computed(\n  () => navView.value !== '' && navView.value !== 'trash' && navView.value !== 'home',\n);\n\n/* === tablo:t1 — per-folder view memory ==================================\n * \"x folder'ında son görünüm nasıl kaldı ise öyle görünümde göstermemiz\n * lazım.\" A folder opens the way you left it. The rule, the cap and the split\n * between what is per-folder and what is a global preference are all argued in\n * `lib/viewPrefs`; this is only the wiring — the two moments the explorer is\n * the one that knows something: a navigation ended, and a person changed a\n * view.\n */\n\n/** An embed's opt-out. A product mounting filex in a two-inch panel does not\n *  want a remembered gallery view arriving from somebody's main window. */\nconst folderMemoryOn = computed(() => props.config.rememberFolderView !== false);\n\n/**\n * The key the folder on screen is remembered under.\n *\n * `currentPath` is already the qualified `<storage>/<rel>` form, so the first\n * segment is the storage ref — and the ref is swapped for the storage's\n * immutable `uid` when the host supplies one (`config.storages[].uid`), which\n * is the difference between a memory that survives a rename and one that does\n * not. See the note on `folderKey` for what happens until it does.\n *\n * The virtual views (`.recent`, `.starred`, `.tag~x`) have no storage and so\n * key on their own sentinel — which is how Recent gets a remembered sort of\n * its own without a special case anywhere.\n */\nconst currentFolderKey = computed(() => {\n  if (!folderMemoryOn.value) return '';\n  const path = String(currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!path) return '';\n  const [first, ...rest] = path.split('/');\n  const st = (props.config.storages ?? []).find((s) => s.name === first);\n  return makeFolderKey(st?.uid || first, rest.join('/'));\n});\n\n/** The GLOBAL default view mode — what a folder nobody has configured opens\n *  as. Read from the same key the `viewMode` ref persists to, so there is one\n *  answer rather than a second copy drifting beside it. */\nfunction globalViewMode(): ViewMode {\n  try {\n    const stored = localStorage.getItem(VIEW_MODE_KEY);\n    if (stored === 'list' || stored === 'grid' || stored === 'gallery') return stored;\n  } catch {\n    /* private mode */\n  }\n  return props.config.viewMode ?? 'list';\n}\n\n/** What we last RESTORED, so the recorder below can tell a restore's echo from\n *  a person's choice.\n *\n * ⚠⚠ A signature and not a boolean flag, and the difference is a bug I would\n * otherwise have shipped: Vue's watchers are asynchronous, so a `restoring =\n * true … restoring = false` fence around the assignment is already back down\n * by the time the recorder runs and every navigation would record itself as a\n * deliberate choice — which would mean walking through a folder configures it.\n * The `viewMode` setter's own guard CAN be a flag because a `customRef` setter\n * runs synchronously inside the fence; these two need different mechanisms\n * because they run at different times. */\nlet appliedSig = '';\n\nfunction viewSig(key: string): string {\n  return `${key}|${viewMode.value}|${activeSortKey()}|${activeSortDir()}`;\n}\n\n/** A navigation ended: put this folder back the way it was left. */\nfunction applyFolderView(key: string) {\n  if (!key) return;\n  touchFolder(key); // LRU clock — only bumps folders already remembered\n  const p = folderPrefs(key);\n  restoringFolderView = true;\n  try {\n    /* ⚠ The `else` halves matter as much as the `if`s. Without them a folder\n     * with no memory of its own would inherit whatever the PREVIOUS folder was\n     * restored to — walk from a remembered gallery into a plain folder and it\n     * comes up as a gallery, which reads as the memory leaking rather than as\n     * a default holding. A folder with no memory follows the global default,\n     * and that has to be asserted, not assumed. */\n    const wantView = p?.v ?? globalViewMode();\n    if (wantView !== viewMode.value) viewMode.value = wantView;\n    if (p?.k) applySort(p.k, p.d ?? defaultSortDir(p.k));\n    else {\n      const g = globalSort();\n      applySort(g.key, g.dir);\n    }\n  } finally {\n    restoringFolderView = false;\n  }\n  appliedSig = viewSig(key);\n}\n\n/**\n * tablo:t1 — hand `lib/viewPrefs` its transport.\n *\n * The document lives on the user row (migration 00039), so this is the one\n * place that knows the base URL, the auth headers and the credentials mode.\n * Started in `onMounted`, i.e. in the same turn as the first listing — the\n * prefs are a single row and the listing has to walk a storage, so the prefs\n * land first in practice, and nothing is applied to a folder until they do.\n */\nonMounted(() => {\n  const base = props.config.apiBase ?? '';\n  const url = `${base}/api/files/manager/view-prefs`;\n  attachViewPrefsStore({\n    async load() {\n      const res = await fetch(url, {\n        headers: await buildAuthHeaders(),\n        credentials: api.credentialsMode(),\n      });\n      /* ⚠ A 401 is not an error here, it is an ANSWER: an app token or a\n       * public share link has no person to remember anything for. Returning\n       * null degrades to \"remember nothing, write nothing\", which is what the\n       * module does with it — no retry loop, no console noise. */\n      if (!res.ok) return null;\n      const body = (await res.json()) as { prefs?: unknown };\n      return body?.prefs ?? null;\n    },\n    save(doc) {\n      void (async () => {\n        try {\n          const payload = JSON.stringify({ prefs: doc });\n          await fetch(url, {\n            method: 'PUT',\n            headers: { ...(await buildAuthHeaders()), 'Content-Type': 'application/json' },\n            credentials: api.credentialsMode(),\n            body: payload,\n            /* ⚠ `keepalive` is what lets the save fired on `pagehide` outlive\n             * the page — but browsers cap a keepalive body at 64 KB and reject\n             * the request outright above it. The document is capped far below\n             * that (300 folders ≈ 33 KB), so this only ever guards the\n             * pathological case; sending it without keepalive is strictly\n             * better than having it rejected. */\n            keepalive: payload.length < 60000,\n          });\n        } catch {\n          /* Fire and forget. A view preference is never worth a toast, and the\n             next save carries the whole document again. */\n        }\n      })();\n    },\n  });\n});\n\n/* ⚠ `flush: 'post'` so this is the LAST word in the tick. A tab switch sets\n * the path and the tab's own remembered view mode in the same turn; running\n * before it would apply the folder's memory and then have the tab overwrite\n * it, which is the one arrangement in which the feature silently does nothing\n * on exactly the gesture people use most.\n *\n * ⚠⚠ `viewPrefsReady()` is a DEPENDENCY, not a guard, and that is what stops\n * the flash the other way round: the first folder is usually open before the\n * document lands, so this has to re-run when it does. Reading it here means\n * the applier fires once more the moment the answer exists, and the folder\n * settles into its remembered view without anybody having navigated again. */\nwatch(\n  [currentFolderKey, () => viewPrefsReady()],\n  ([key, rdy]) => {\n    if (!rdy) return;\n    applyFolderView(key);\n  },\n  { immediate: true, flush: 'post' },\n);\n\n/** A person changed a view. Record it against the folder — and note that the\n *  GLOBAL default was already written by the control they used (`setSort`\n *  persists; the `viewMode` setter persists), which is what makes \"Apply to\n *  all folders\" a pure forget rather than a second write. */\nwatch(\n  () => [currentFolderKey.value, viewMode.value, activeSortKey(), activeSortDir()] as const,\n  ([key, v, k, d]) => {\n    /* ⚠ Nothing is recorded before the document has landed. Until then the\n     * state on screen is this session's defaults, not the person's choices,\n     * and writing it back would overwrite everything they had arranged with\n     * whatever the app happened to boot into. */\n    if (!key || !viewPrefsReady()) return;\n    const sig = viewSig(key);\n    if (sig === appliedSig) return; // the restore, echoing back\n    appliedSig = sig;\n    rememberFolder(key, { v, k, d });\n  },\n  /* ⚠⚠ `post`, and registered AFTER the applier, for a reason that is not\n   * stylistic. A navigation changes `currentFolderKey`, which is a dependency\n   * of BOTH watchers. Left pre-flush this one would run first, while the view\n   * state is still the folder you just LEFT, and write that folder's view mode\n   * and sort against the folder you just arrived in — every walk through the\n   * tree quietly configuring the next folder with the last one's setup. Post\n   * puts the applier first; by the time this runs, `appliedSig` matches and it\n   * correctly does nothing. */\n  { flush: 'post' },\n);\n/** The tag being browsed while navView === 'tag' ('' otherwise). */\nconst navTag = ref<string>('');\n/** Sentinel parked in `dirname` so the breadcrumb can label the view. The tag\n *  view's sentinel is built per tag (`makeTagSegment`) — see lib/listing. */\nconst NAV_VIEW_DIRNAME: Record<Exclude<NavView, '' | 'trash' | 'tag'>, string> = {\n  home: '.home',\n  recent: '.recent',\n  starred: '.starred',\n  shared: '.shared',\n};\n\n/**\n * A path that is a virtual view rather than a folder. Used by load() so a\n * sentinel reaching it — a restored tab, a pasted `#.tag~invoices`, a reload,\n * the breadcrumb's own crumb — opens the VIEW instead of asking the backend\n * for a folder called `.starred` and landing on \"not found\". (That was already\n * true of the four shipped views; the tag view would have inherited it.)\n */\nfunction virtualViewOf(path: string): { kind: Exclude<NavView, ''>; tag: string } | null {\n  /* ⚠ The \"is this a sentinel at all?\" half is `lib/listing`'s\n     `isVirtualViewPath`, not a second reading of the map here: FilePane has to\n     answer the same question before it qualifies a path (a qualified sentinel\n     becomes an adapter and stops being translatable), and two answers to it is\n     how the breadcrumb ended up printing `.starred`. This function adds only\n     what the panel needs on top: WHICH view. */\n  if (!isVirtualViewPath(path)) return null;\n  const clean = String(path ?? '').replace(/^\\/+|\\/+$/g, '');\n  const tag = tagOfPath(clean);\n  if (tag) return { kind: 'tag', tag };\n  const kind = clean.slice(1) as Exclude<NavView, '' | 'tag'>;\n  return { kind, tag: '' };\n}\n\n// When the caller can see exactly ONE storage, the multi-storage root is a\n// one-row list that carries no information — the user clicks through it every\n// single time. Treat that storage as the floor instead: open it directly and\n// stop offering an \"up\" that only leads back to the one row.\n//\n// Empty string means \"not in that situation\" (single-storage mode, or more\n// than one storage visible), which leaves every existing path untouched.\nconst soleStorageName = computed(() => {\n  if (!multiStorageRoot.value) return '';\n  const list = props.config.storages ?? [];\n  return list.length === 1 ? list[0].name : '';\n});\n\n// canGoUp/goUp — toolbar's \"↑ Up one level\" button. In single-storage\n// mode \"\" means the storage root; in multi-storage mode \"\" means\n// the global root (storage list). Both → no parent → button hidden.\nconst canGoUp = computed(() => {\n  const p = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (rootFloor && p === rootFloor) return false; // at the confined floor — nowhere above\n  if (soleStorageName.value && p === soleStorageName.value) return false;\n  return p.length > 0;\n});\n\n// True when the explorer is showing the synthetic storage list and\n// there's no real backend folder to mutate. New Folder / Upload /\n// Paste are hidden in this state.\nconst atVirtualRoot = computed(() => {\n  // gezinti:g1 — a virtual view (Recent / Starred / Shared with me) has no\n  // backend folder behind it either. \"New folder\" there would have to invent a\n  // destination, and \"upload\" would have to guess one.\n  //\n  // ⚠ gorunum:v3-shell — Home is in that set, and it is now the LANDING view,\n  // so the \"+ New\" menu opens with its three rows disabled on the first screen\n  // a person sees. That is deliberate and it is not a bug to \"fix\" by picking\n  // a drive: with several storages there is no honest answer to \"upload where\",\n  // and an entry that silently chose one would put somebody's file in a place\n  // they did not name. (With exactly one visible storage the question does not\n  // arise — `soleStorageName` opens that storage as the root, so \"My files\" is\n  // a real folder.) The reference stand enables it because it has one drive.\n  if (navView.value && navView.value !== 'trash') return true;\n  if (!multiStorageRoot.value) return false;\n  return !((currentPath.value ?? '').replace(/^\\/+|\\/+$/g, ''));\n});\n\n/* surucu:d1-scope — WHERE THE FILTER ROW IS DRAWN, 2026-09-13.\n *\n * ⚠⚠ There is no longer a LIST of places. The row is drawn everywhere, and the\n * only question left is which SHAPE it takes — and that is answered by what the\n * rows are, not by which view you are in:\n *\n *     rows are files  → the whole row (Type · People · Modified · Size · find ·\n *                       sort · ⋮). A folder, the trash, Starred, Shared,\n *                       Recent, a tag — \"it is a listing like any other\"\n *                       (owner, on the tag view), and the four chips answer\n *                       from fields those rows carry.\n *     rows are not    → the name box alone. The drive list (each row is a\n *                       storage) and Home (three blocks of cards).\n *\n * ⚠ It used to be `!atVirtualRoot`, which is a different question altogether:\n * that flag answers \"is there a backend folder here to create in / upload to\".\n * Borrowing it cost the row its place in six views at once, including the two\n * the owner asked for it back in (\"root folder'da filtre barı kalsın … orada\n * adam isterse storage ismi aratabilir\" and \"Home sayfasında da filtreleme\n * barını getirelim\").\n */\n/** Home's body is three blocks of cards, not a listing — name box only. The\n *  drive root reaches the same shape through the pane's own `atVirtualRoot`,\n *  because a pane knows when it is showing drives and both panes can be. */\nconst filterRowMode = computed<'full' | 'find'>(() =>\n  navView.value === 'home' ? 'find' : 'full',\n);\n\nfunction goUp() {\n  // Leaving the trash view returns to the storage it was opened from, not the\n  // global storage-list root.\n  if (trashMode.value) {\n    void load(trashOrigin.value);\n    return;\n  }\n  /* gezinti:g1 — the other virtual views behave the same way. */\n  if (navView.value) {\n    void load(navViewOrigin.value);\n    return;\n  }\n  const cur = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!cur || cur === rootFloor) return;\n  // The button is hidden here, but Alt+↑ / Backspace still route through.\n  if (soleStorageName.value && cur === soleStorageName.value) return;\n  const idx = cur.lastIndexOf('/');\n  let parent = idx === -1 ? '' : cur.slice(0, idx);\n  // Never step above the confined floor.\n  if (rootFloor && !(parent === rootFloor || parent.startsWith(rootFloor + '/'))) parent = rootFloor;\n  void load(parent);\n}\n\n/**\n * gorunum:v1 — what the ACTIVE view is showing, in the order it shows it.\n *\n * A shift-range is arithmetic over a list, and this used to run it over\n * `files` — the backend's answer — while the user was looking at a sorted or\n * folder-hoisted one. Measured on a seeded storage: shift-clicking the first\n * and fourth visible rows selected eight, because the folder the view had\n * lifted to the top still sat last in `files`. The view now says what it drew\n * (`display-order`) and the range is computed over that; `files` remains the\n * fallback for the moment before the first paint and for surfaces that publish\n * nothing.\n */\nconst displayOrder = ref<FileNode[]>([]);\n\n/**\n * gorunum:v1 — where the previewed file sits in what the user is looking at.\n *\n * Counted over the DISPLAYED order, not over `files`: the viewer's \"3 of 9\"\n * and its chevrons have to agree with the listing behind them, and that order\n * is the view's, not the backend's. Directories are skipped — the viewer\n * cannot open one, so counting them would promise a step that does nothing.\n */\nconst previewables = computed<FileNode[]>(() =>\n  (displayOrder.value.length ? displayOrder.value : files.value).filter((n) => n.type !== 'dir'),\n);\nconst previewPosition = computed(() => {\n  const list = previewables.value;\n  const path = previewTarget.value?.path;\n  const i = path ? list.findIndex((n) => n.path === path) : -1;\n  return { index: i === -1 ? 0 : i + 1, total: i === -1 ? 0 : list.length };\n});\nfunction onPreviewNav(delta: number) {\n  const list = previewables.value;\n  const i = list.findIndex((n) => n.path === previewTarget.value?.path);\n  if (i === -1) return;\n  const next = list[i + delta];\n  if (next) previewTarget.value = next;\n}\nconst selection = useSelection(() => (displayOrder.value.length ? displayOrder.value : files.value));\nwatch(\n  () => [...selection.selected.value],\n  () => {\n    emit(\n      'selection-change',\n      selection.nodes.value.map((n) => ({ path: n.path, basename: n.basename, type: n.type })),\n    );\n    // Presence focus: a single selected file is what the user is \"on\"; a\n    // multi-select or folder selection clears it.\n    const focusFiles = selection.nodes.value.filter((n) => n.type === 'file');\n    realtime.setFocus(focusFiles.length === 1 ? focusFiles[0].basename : null);\n  },\n);\n\nconst clipboard = ref<ClipboardState>({ mode: null, items: [], sourcePath: null });\n\nconst capabilitiesData = ref<Capabilities | null>(null);\n/* zaman:z3 — the two clock tiers only an explorer instance can know: the zone\n * its host configured, and the account behind its credential when that\n * credential is a person's. Ranked in lib/timezone, never here. */\nconst showTimeZone = ref(false);\nuseExplorerTimeZone({\n  config: () => props.config,\n  capabilities: capabilitiesData,\n  fetchMe: () => api.jsonFetch(`${connectionsBase(props.config)}/api/auth/me`),\n});\n// Longest life a new share link may be given (server setting, days; 0 = no\n// ceiling). Both share dialogs derive their expiry choices from it.\nconst shareMaxTtlDays = computed(() => capabilitiesData.value?.share_max_ttl_days ?? 0);\n\n// Creative UI state: starred / tags / recently-opened. The component\n// helpers (StarButton, TagPicker, RecentlyOpened) handle their own\n// API calls — the explorer just tracks the cross-row state needed to\n// render inline stars and keep the recents tray in sync.\nconst starredIds = ref(new Set<number>());\nconst showRecents = ref(false);\nconst showTagPicker = ref(false);\nconst tagPickerNode = ref<FileNode | null>(null);\nconst recentRefreshKey = ref(0);\n\nasync function loadStarred() {\n  try {\n    const headers = await buildAuthHeaders();\n    const base = props.config.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/star/list?limit=500`, {\n      headers,\n      // ⚠ NOT 'include'. With a bearer token the request is cross-origin for\n      // every embedder that serves the UI from a different origin to the API\n      // (the desktop app is one), and a credentialed request may not be\n      // answered with `Access-Control-Allow-Origin: *` — which is what filex\n      // sends. This one line made starred files fail silently in every such\n      // install while the rest of the explorer worked.\n      credentials: api.credentialsMode(),\n    });\n    if (!res.ok) return;\n    const body = await res.json();\n    const rows: { id?: number }[] = Array.isArray(body)\n      ? body\n      : Array.isArray(body?.entries)\n        ? body.entries\n        : Array.isArray(body?.nodes)\n          ? body.nodes\n          : [];\n    starredIds.value = new Set(rows.map((n) => n.id).filter((id): id is number => typeof id === 'number'));\n  } catch {\n    // Silent — backend may be older without the meta routes.\n  }\n}\n\nfunction onStarChange(n: FileNode, value: boolean) {\n  if (typeof n.id !== 'number') return;\n  const next = new Set(starredIds.value);\n  if (value) next.add(n.id);\n  else next.delete(n.id);\n  starredIds.value = next;\n}\n\n/* === yildiz:s1 — starring as an ACTION ================================\n * The star shipped as an indicator in ONE view: `StarButton` was rendered by\n * ListView and nowhere else, so a user in grid view (the mode the navigation\n * panel's own screenshots show) had a Starred view with no way to fill it.\n * It is a verb, like tagging — so it is a menu entry beside Tags, a chip on\n * every card, and a key.\n *\n * ⚠ ONE implementation of the request: `lib/star.ts`. StarButton calls it,\n * this calls it. A menu cannot render a component, but it must not grow its\n * own fetch either — that is the second path that drifts.\n */\n/** Which of `targets` can carry a star: files the server knows by id.\n *\n * Empty when the identity surfaces are suppressed, which is the one\n * chokepoint the context menu, the toolbar and the keyboard action all go\n * through — so the affordance disappears everywhere at once rather than in\n * the two places somebody remembered. Offering to star a file while the\n * Starred view is hidden would write into a list the person cannot open,\n * and under a shared app token that list belongs to everyone at once. */\nfunction starableNodes(targets: FileNode[]): FileNode[] {\n  if (!identitySurfaces.value) return [];\n  return targets.filter((n) => typeof n.id === 'number' && n.type === 'file');\n}\n\n/** True when EVERY starable target is starred — i.e. the action reads\n *  \"Unstar\". A mixed selection reads \"Star\" and stars the rest, which is the\n *  behaviour that needs no explanation. */\nfunction selectionAllStarred(targets: FileNode[]): boolean {\n  const list = starableNodes(targets);\n  return list.length > 0 && list.every((n) => starredIds.value.has(n.id as number));\n}\n\n/**\n * Toggle the star on a selection. Optimistic like the button, and rolled back\n * per node on failure — a partial failure must not leave the set lying about\n * what the server holds.\n */\nasync function toggleStar(targets: FileNode[]) {\n  const list = starableNodes(targets);\n  if (list.length === 0) return;\n  const next = !selectionAllStarred(list);\n  const opts = {\n    apiBase: props.config.apiBase ?? '',\n    authHeaders: () => buildAuthHeaders(),\n    authCredentials: api.credentialsMode(),\n  };\n  const set = new Set(starredIds.value);\n  for (const n of list) {\n    if (next) set.add(n.id as number);\n    else set.delete(n.id as number);\n  }\n  starredIds.value = set;\n  let failed = 0;\n  await Promise.all(\n    list.map(async (n) => {\n      try {\n        await setNodeStarred(n.id as number, next, opts);\n      } catch {\n        failed += 1;\n        const rollback = new Set(starredIds.value);\n        if (next) rollback.delete(n.id as number);\n        else rollback.add(n.id as number);\n        starredIds.value = rollback;\n      }\n    }),\n  );\n  if (failed > 0) flashToast(t('star.failed'));\n  // Starring is what fills the Starred view; if that IS the view on screen,\n  // an unstar has to remove the row instead of leaving a listing that\n  // disagrees with its own heading.\n  if (navView.value === 'starred') await loadNavView('starred');\n}\n/* === /yildiz:s1 === */\n\nasync function markRecent(n: FileNode) {\n  if (typeof n.id !== 'number') return;\n  try {\n    const base = props.config.apiBase ?? '';\n    await fetch(`${base}/api/files/manager/recent`, {\n      method: 'POST',\n      headers: await buildAuthHeaders({ 'Content-Type': 'application/json' }),\n      credentials: api.credentialsMode(),\n      body: JSON.stringify({ node_id: n.id }),\n    });\n    recentRefreshKey.value += 1;\n  } catch {\n    // Silent — the open succeeds, recent tracking is best-effort.\n  }\n}\n\nfunction openTagPickerFor(n: FileNode) {\n  if (typeof n.id !== 'number') return;\n  tagPickerNode.value = n;\n  showTagPicker.value = true;\n}\n\n/* etiket:t1 — the user just changed a node's tags, so the cached \"every tag\n * that exists\" list is wrong RIGHT NOW, which is the only staleness anybody\n * notices. Drop it and re-ask; if a tag view is on screen, refresh it too —\n * removing a file's tag has to remove it from the listing that is named after\n * that tag. */\n/**\n * etiket:t1 — \"show me everything tagged this\", from a FILE.\n *\n * ⚠⚠ The missing half of the tag feature, reported 2026-09-13 (\"taglediğim\n * dosya klasör tag'ine gitmiyor\"): the view existed, the panel's Tags section\n * listed every tag, and from a file's own chip there was no way in — you had to\n * read the word off the chip and go find it again in the panel.\n *\n * ⚠ It is `loadTagView`, not a variant of it. The panel's Tags section, a\n * restored tab, a pasted `#.tag~invoices` and now a chip all land in the one\n * loader, so there is one definition of what a tag view IS.\n *\n * ⚠ The modal is closed on the way. It is opened over a listing to EDIT tags;\n * once the chip has navigated, leaving it up means a dialog about one file\n * covering the view of all the others that share its tag.\n */\nfunction openTagView(tag: string) {\n  showTagPicker.value = false;\n  void loadTagView(tag);\n}\n\nfunction onNodeTagsChanged() {\n  invalidateTagCache();\n  void loadNavTags(true);\n  if (navView.value === 'tag' && navTag.value) void loadTagView(navTag.value);\n}\n\nfunction onRecentOpen(entry: { id: number; storage_id?: number; path: string; name: string }) {\n  // RecentlyOpened emits the bare row. The same converter Recent / Starred /\n  // a tag / Home use gives openNode a row with its storage-qualified path AND\n  // its own `perm` + `read_only`, so the editor-vs-preview split reads the\n  // row's level, not the folder's. The bare synthesis stays as the fallback\n  // for a row the converter cannot address (no storage name at a\n  // multi-storage root) — it was the only shape until 2026-09-19.\n  const node =\n    nodeRowToFileNode(entry as unknown as Record<string, unknown>) ??\n    ({\n      type: 'file',\n      path: entry.path,\n      basename: entry.name,\n      extension: (entry.name.split('.').pop() || '').toLowerCase(),\n      id: entry.id,\n    } as unknown as FileNode);\n  showRecents.value = false;\n  openNode(node);\n}\n\n/**\n * Right-click on a row of the Recently-opened tray: the SAME menu a listing\n * row gets (owner: \"CONTEXT MENÜ HER YERDE AYNI OLMALI\"). The tray's row is\n * the raw node row the endpoint answers with, so it goes through\n * `nodeRowToFileNode` like Recent / Starred / a tag / Home do and arrives\n * with its own `perm` + `read_only`; `onContextTarget` then treats it like a\n * Home card — a target outside this pane's listing. The tray closes first,\n * as it does on open: it is a modal over the listing, and the verb the menu\n * runs (Rename, Move to…) opens a dialog of its own.\n */\nfunction onRecentContext(row: Record<string, unknown>, ev: MouseEvent) {\n  const node = nodeRowToFileNode(row);\n  if (!node) return;\n  showRecents.value = false;\n  void onContextTarget(node, ev);\n}\n\n// Resolution order for each external viewer: explicit config override → live\n// backend probe. The probe is the source of truth: an operator can flip the\n// service \"on\" but if last_check failed (state='error') we still hide the\n// entry so users don't get 503s on click. Explicit config wins because\n// embedders sometimes terminate TLS in front of filex and the backend can't\n// see the public URL.\nconst effectiveOnlyOfficeBase = computed<string | null>(() => {\n  if (props.config.onlyOfficeBase) return props.config.onlyOfficeBase;\n  const ext = capabilitiesData.value?.external?.onlyoffice;\n  if (ext && !isExternalUsable(ext)) return null;\n  return capabilitiesData.value?.onlyoffice_url || null;\n});\n\nconst effectiveOnlyOfficeConfigEndpoint = computed<string | null>(() => {\n  if (!effectiveOnlyOfficeBase.value) return null;\n  return api.endpoints.onlyOfficeConfig || null;\n});\n\nconst effectiveDrawioUrl = computed<string | null>(() => {\n  const override = props.config.drawioUrl || props.config.drawioBase;\n  if (override) return override;\n  const ext = capabilitiesData.value?.external?.drawio;\n  if (ext && !isExternalUsable(ext)) return null;\n  return capabilitiesData.value?.drawio_url || null;\n});\n\n// Universal converter (p2r3/convert fork). convert_url is only populated by\n// the backend when the \"convert\" external service is enabled, so a simple\n// presence check is enough gating.\nconst effectiveConvertUrl = computed<string | null>(\n  () => props.config.convertBase || capabilitiesData.value?.convert_url || null,\n);\n\n/* belge:n1 — what the SERVER can create, crossed with what WE could open.\n * `null` (a backend older than the feature) hides the entry entirely. */\nconst newDocTypes = computed(() => capabilitiesData.value?.newdoc_types ?? null);\nconst canNewDocument = computed(() => {\n  const list = newDocTypes.value;\n  if (!list || list.length === 0) return false;\n  return list.some((ty) =>\n    ty.requires === 'onlyoffice'\n      ? !!effectiveOnlyOfficeBase.value\n      : ty.requires === 'drawio'\n        ? !!effectiveDrawioUrl.value\n        : true,\n  );\n});\n\n// Upload\nconst uploadJobs = ref<UploadJob[]>([]);\nconst fileInputEl = ref<HTMLInputElement | null>(null);\n\n// Modals\nconst showNewFolder = ref(false);\nconst showNewDocument = ref(false); /* belge:n1 */\nconst showRename = ref(false);\nconst showDelete = ref(false);\nconst showPreview = ref(false);\nconst renameTarget = ref<FileNode | null>(null);\n/* ui-fix — does the open rename/delete/new-folder modal belong to the side\n * pane? (the menu is identical to the main pane's; this routes the mutation\n * to the right one.) */\nconst mutationInPane = ref(false);\nconst previewTarget = ref<FileNode | null>(null);\nconst previewMode = ref<'edit' | 'view'>('edit');\nconst showConvert = ref(false);\nconst convertTarget = ref<FileNode | null>(null);\nconst showPerm = ref(false);\nconst permTarget = ref<FileNode | null>(null);\n/* tasi:m1 — \"Move to…\" / \"Copy to…\" ask the SAME dialog where; only the mode\n * differs, so there is one piece of state and not two dialogs. */\nconst showDestPicker = ref(false);\nconst destPickerMode = ref<'move' | 'copy'>('move');\nconst destPickerTargets = ref<FileNode[]>([]);\nconst destPickerBusy = ref(false);\n\n/* === koru:k1 — inspector (details) panel ===\n * Open/closed preference persists under `filex.inspector`; the panel itself\n * mounts with v-if so the closed state leaves zero DOM behind. */\nconst INSPECTOR_LS_KEY = 'filex.inspector';\nconst showInspector = ref<boolean>(\n  (() => {\n    try {\n      return localStorage.getItem(INSPECTOR_LS_KEY) === '1';\n    } catch {\n      return false;\n    }\n  })(),\n);\nfunction persistInspector(v: boolean) {\n  try {\n    localStorage.setItem(INSPECTOR_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* quota / private mode */\n  }\n}\nfunction toggleInspector() {\n  showInspector.value = !showInspector.value;\n  persistInspector(showInspector.value);\n}\nfunction openInspector() {\n  if (!showInspector.value) {\n    showInspector.value = true;\n    persistInspector(true);\n  }\n}\nfunction closeInspector() {\n  if (showInspector.value) {\n    showInspector.value = false;\n    persistInspector(false);\n  }\n}\n\n/* === gezinti:g1 — navigation panel (SideNav) =============================\n * One explorer with the navigation everybody already knows, collapsible so the\n * existing UI keeps its width when somebody does not want it (GitHub #14).\n *\n * The panel is NOT gated on role or profile: administrators get it too, and\n * so is everything else the header and the panel draw. Gating any of it would\n * be exactly the \"one behaviour on one surface\" split this shared package\n * exists to prevent — which is precisely what a per-role profile in the web\n * app turned out to be. */\nconst uiProfile = computed(() => resolveUiProfile(props.config.uiProfile));\n/**\n * Is this the REDUCED explorer — one pane, one folder, list/grid only?\n *\n * ⚠⚠ This is the only question `uiProfile` still answers, and it is a question\n * about REDUCTION, never about LOOK. The shell (the header with its one search\n * field, the filter row, \"+ New\", the Folders/Files sections, the info panel's\n * tabs, the storage line) is what filex IS — it is not a profile anything can\n * be put into, so nothing below reads a profile to decide whether to draw it.\n * The day that distinction blurs again, the profiles become two products with\n * one name, which is exactly what this pass undid.\n *\n * ⚠ There are TWO values, and the rule for everything else — a typo, or the\n * profile removed after v0.40.0 — lives in `lib/uiProfile` together with the\n * argument for it. Nothing here branches on a retired name; this file asks one\n * question of a value that has already been resolved.\n */\nconst simpleUi = computed(() => uiProfile.value === 'simple');\n\n/**\n * ⚠ `showInfoPanel` is documented public API (\"whether the info panel toggle\n * is visible\") and until now nothing read it: an embedder who set it to false\n * got the toggle anyway. Default stays TRUE, so every existing embed —\n * including the admin SPA, which passes `showInfoPanel: true` — is unchanged.\n * It hides the TOGGLE, exactly as documented; the inspector itself stays\n * reachable from the context menu, which is what the option says.\n */\nconst infoPanelToggle = computed(() => props.config.showInfoPanel !== false);\n/* === surucu:d1 — the shell (GitHub #14, the reporter's mockups) ===========\n * There is no `driveShell` computed any more, and its absence is the point:\n * the filter row, \"+ New\", the info-panel tabs and the storage line are drawn\n * because this is filex, not because a caller passed a string. Grep for\n * `surucu:d1` to find them; every one of them is now unconditional or gated on\n * something real (a folder to filter, a person to have a quota).\n */\n\nconst SIDENAV_LS_KEY = 'filex.sidenav';\nconst sideNavExpanded = ref<boolean>(\n  (() => {\n    try {\n      const v = localStorage.getItem(SIDENAV_LS_KEY);\n      if (v === '1') return true;\n      if (v === '0') return false;\n    } catch {\n      /* private mode / embed with site data blocked */\n    }\n    // No stored choice: expanded. A collapsed default would ship a navigation\n    // panel most people never discover, which is the problem it was built for.\n    return true;\n  })(),\n);\nfunction persistSideNav(v: boolean) {\n  try {\n    localStorage.setItem(SIDENAV_LS_KEY, v ? '1' : '0');\n  } catch {\n    /* quota / private mode — the choice just will not survive the session */\n  }\n}\n/**\n * Narrow mode: the panel is a drawer over the listing, and this is its open\n * state. Deliberately NOT persisted and NOT the same ref as the desktop\n * collapse: at 390px a remembered \"expanded\" would reopen the drawer on top of\n * the files every single time the explorer mounts.\n */\nconst navDrawerOpen = ref(false);\n/**\n * Is the panel part of this deployment at all? On by default everywhere —\n * except under `rootPath`, where there is no storage list to show and the views\n * would list files from outside the folder the embed was confined to.\n */\nconst sideNavEnabled = computed(() => props.config.sideNav ?? !rootPathProp);\nconst navVisible = computed(\n  () => sideNavEnabled.value && (isNarrow.value ? navDrawerOpen.value : true),\n);\n/**\n * Is the navigation panel already offering Trash as a destination?\n *\n * ⚠ Keyed to `sideNavEnabled`, NOT to `navVisible`. Three cases decided here,\n * and each one is a judgement about whether the person has a way to the bin\n * that is not this row:\n *\n *   - collapsed to the icon rail → OFFERING. The entry is still rendered, still\n *     one click, still labelled for a screen reader; only its text is gone.\n *   - the drawer under 560px, closed → OFFERING. The toolbar's panel toggle is\n *     on screen at every width, so the destination is one tap away. Keying this\n *     to `navVisible` instead would add and remove a row from the LISTING every\n *     time somebody opened or closed the drawer — the folder changing under\n *     them for a reason that has nothing to do with the folder.\n *   - no panel at all (`sideNav: false`, or the default under `rootPath`) → NOT\n *     offering, and the row stays. That is the case it was invented for: a\n *     listing with no other door to the bin.\n *\n * `trashVisible: false` is handled inside the helper and outranks all of it —\n * it means no Trash anywhere, panel entry included.\n */\nconst navOffersTrash = computed(\n  () => sideNavEnabled.value && props.config.trashVisible !== false,\n);\n\n/** What the toolbar toggle reports as pressed. */\nconst navToggleOn = computed(() =>\n  isNarrow.value ? navDrawerOpen.value : sideNavExpanded.value,\n);\nfunction toggleSideNav() {\n  if (!sideNavEnabled.value) return;\n  if (isNarrow.value) {\n    navDrawerOpen.value = !navDrawerOpen.value;\n    return;\n  }\n  sideNavExpanded.value = !sideNavExpanded.value;\n  persistSideNav(sideNavExpanded.value);\n}\nfunction closeNavDrawer() {\n  navDrawerOpen.value = false;\n}\n\n/** Storages the caller reaches only through a grant — marked in the panel. */\nconst sharedStorageNames = ref<string[]>([]);\n\n/**\n * The Connections entries — \"How to connect\" and \"API keys\" — and the two\n * overlays they open. Both surfaces already lived in this package\n * (ConnectionsPanel, TokensPanel) and neither was reachable from inside the\n * explorer: our own web app wired the buttons in its page shell, so an\n * embedder's users had no path to a protocol guide or to the API token those\n * guides tell them to use.\n *\n * ⚠ Not gated on role. The backend decides — ConnectionsPanel renders what the\n * API returns (a non-admin gets the guides and a \"why not\" card instead of the\n * storage form), and /api/tokens caps every scope against the caller's own role.\n */\nconst connectionsEnabled = computed(() => props.config.connections ?? !simpleUi.value);\n\n/**\n * Is this caller an integration rather than a person (backend migration 00030)?\n *\n * A filex API token authenticates AS its owner, so from here a shared embed\n * token and somebody's own token are indistinguishable — only the server knows\n * which kind it is, and it says so in `capabilities.caller_kind`. A host that\n * already knows can say so with `config.callerKind`, which wins — purely to\n * spare the flash of a Starred row that appears and then disappears when\n * capabilities land.\n *\n * ⚠ Defaults to \"person\" in every unknown state — no config, capabilities not\n * back yet, or a server too old to answer. The cost of guessing wrong that way\n * is one row too many for a moment; guessing the other way would hide Recent\n * and API keys from every ordinary user of every older server.\n */\nconst callerIsApp = computed(\n  () => (props.config.callerKind ?? capabilitiesData.value?.caller_kind) === 'app',\n);\n/**\n * The identity-bearing surfaces: API keys, Recent, Starred, Shared with me.\n * ⚠ Suppression is per token KIND, never per role — a viewer is still a person\n * with their own recents. And it is not the whole panel: Upload, the storages,\n * Trash and \"How to connect\" stay useful inside an embed.\n */\nconst identitySurfaces = computed(() => !callerIsApp.value);\nconst showConnections = ref(false);\nconst showTokens = ref(false);\nfunction openConnections() {\n  showTokens.value = false;\n  showConnections.value = true;\n}\nfunction openTokens() {\n  // Belt and braces: the panel entry is gone for an app token, but a host may\n  // also open this overlay from its own chrome, and /api/tokens would answer\n  // that caller with a 403 it has nowhere to show.\n  if (callerIsApp.value) return;\n  showConnections.value = false;\n  showTokens.value = true;\n}\nfunction closeOverlays() {\n  showConnections.value = false;\n  showTokens.value = false;\n}\nconst anyOverlayOpen = computed(() => showConnections.value || showTokens.value);\n/** ConnectionsPanel reports its own failures; surface them the way the\n *  explorer surfaces everything else rather than swallowing them. */\nfunction onConnectionsError(err: unknown) {\n  const msg = err instanceof Error ? err.message : String(err);\n  emit('error', { message: msg, context: { op: 'connections' } });\n  flashToast(msg);\n}\n\n/**\n * View modes the toolbar offers. `simple` drops gallery: a four-way switcher\n * is one of the things #14 named as power-user chrome, and gallery is the one\n * nobody outside a photo folder reaches for.\n */\nconst allowedViewModes = computed<ViewMode[] | undefined>(() =>\n  simpleUi.value ? ['list', 'grid'] : undefined,\n);\n// A stored 'gallery' outlives a switch to the simple profile, and the button\n// that would take the user back out of it is the one the profile hides.\nwatchEffect(() => {\n  if (simpleUi.value && viewMode.value === 'gallery') viewMode.value = 'grid';\n});\n\n/* === surucu:d1 — the filter row =========================================\n * Three chips over the listing in hand: Type · Modified · Size.\n *\n * ⚠ CLIENT-SIDE, and that is the honest place for them, not a shortcut. The\n * listing endpoint reads exactly six parameters (`action`, `path`, `filter`,\n * `storage`, `parent`, `cache`) and has no `limit`/`offset` either — so the\n * rows in hand ARE the folder, and filtering them here answers the whole\n * question rather than \"the first page of it\". Wiring a chip to a `min_size`\n * the server never reads would look identical and change nothing.\n *\n * ⚠ Reset on navigation. A filter that survives a folder change makes the next\n * folder look empty, and the reason is off-screen the moment you scroll.\n */\nconst driveFilters = ref<DriveFilters>({ ...EMPTY_FILTERS });\n/* gorunum:v1-advsearch — declared HERE, beside the row's own state, and not\n   down with the rest of the dialog's wiring: `filtersOn` and `displayFiles`\n   read them, and a ref declared after a computed that touches it is the exact\n   \"Cannot access X before initialization\" this file was taken down by once\n   before (see the navVisible watcher note in onMounted). */\nconst advFilters = ref<DriveFilters | null>(null);\nconst advScope = ref<AdvScope>('name');\n/**\n * surucu:d1-sort — WHERE THE ROWS IN HAND GOT THEIR ORDER, and the only place\n * in the bundle that knows. `files` is a search answer exactly when\n * `searchQuery` is set (`load()` picks `action=search` / `/api/files/search`\n * off that same ref), and a search answer is RANKED: the backend scores every\n * candidate (`internal/search/scorer.go`, ported from VS Code's Quick Open)\n * and returns best-first.\n *\n * ⚠⚠ Owner's ruling, 2026-09-12, verbatim (translated from Turkish): \"the\n * filter in advanced search should belong to it alone. The other, ordinary\n * search and the ⌘K side must stay in relevance order.\" Measured the next day\n * on qldemo with the query `s`: the server ranked `Documents/server.ts` first\n * and the list drew it FIFTEENTH of seventeen, because the active sort key was\n * applied to everything the listing shows. Nothing looked broken — the grid\n * and the list agreed with each other and every test was green — because\n * re-alphabetising a ranked list is indistinguishable from sorting a folder.\n *\n * ⚠ Both scopes, one answer: the advanced dialog's content search lands in\n * `files` through this same ref, so it is covered without a second rule. The\n * ⌘K palette never needed one — it renders its own hits straight from\n * `paletteGlobalSearch` and reaches for no comparator (verified, not assumed).\n *\n * ⚠ Declared HERE, above `displayFiles`, for the reason the `advFilters` note\n * above gives: a ref/computed declared after the computed that reads it is the\n * \"Cannot access X before initialization\" this file was taken down by once.\n *\n * ⚠ And NOT a module-level flag in `lib/sortOrder`: the split view's secondary\n * pane only ever lists (`SecondaryPane.loadPane` calls `index`), so a global\n * \"we are searching\" would silently unsort the pane that is not.\n */\nconst listingOrder = computed<ListingOrder>(() => (searchQuery.value ? 'relevance' : 'sort'));\n/* pane:p1 — `filtersOn` and `displayFiles` USED TO LIVE HERE, and they are the\n * clearest example of what this refactor is for: they compose the filter row's\n * narrowing, the advanced dialog's narrowing and the sort into the rows a\n * listing draws — a PANE's job, done once in the host, which is why the split\n * view's right-hand half had no filter row for two months and would have had\n * to grow a second copy of this to get one. They are `FilePane`'s\n * `displayFiles` / `filtersOn` now, and every pane has them.\n *\n * ⚠ `advFilters` stays here, and it is not an exception: it belongs to the\n * advanced SEARCH, which is the window's (one search field, one dialog, one\n * set of results). It is handed to the main pane as `extra-filters`, which is\n * a narrowing composed AFTER the pane's own chips rather than instead of them.\n * ⚠ `listingOrder` stays here for the same reason and is passed as `order`:\n * whether the rows in hand were RANKED by the server is a fact about the\n * answer the host fetched, not a preference the pane holds. The split pane\n * only ever lists a folder, so it is never in relevance mode — which is\n * exactly why a global \"we are searching\" flag would have been wrong.\n */\n\n/* gorunum:v2-topbar / pane:p1 — the breadcrumb's \"Subfolders\" chevron used to\n * be fed from here, which is why only the left-hand pane had one: the host\n * knows ONE folder's listing and there are two panes. It is derived inside\n * `FilePane` now, from the rows that pane is holding. */\n\nfunction clearDriveFilters() {\n  advFilters.value = null /* gorunum:v1-advsearch — the escape hatch clears BOTH */;\n  setDriveFilters({ ...EMPTY_FILTERS });\n}\nfunction setDriveFilters(v: DriveFilters) {\n  driveFilters.value = v;\n  // A selection the filter just hid would still be what Delete acts on, with\n  // nothing on screen to say so.\n  selection.clear();\n}\nwatch(\n  () => `${currentPath.value}|${navView.value}`,\n  () => {\n    if (filtersActive(driveFilters.value)) driveFilters.value = { ...EMPTY_FILTERS };\n    /* gorunum:v1-advsearch — the advanced filters belong to the search that\n       set them, so they survive the rebase a search causes (a search moves\n       `currentPath` to the storage root, which is what fires this watcher) and\n       are dropped the moment there is no search left to belong to. */\n    if (!searchQuery.value) advFilters.value = null;\n  },\n);\n\n/* === gorunum:v1-advsearch — the Advanced search dialog ===================\n *\n * One results surface: whatever the dialog asks for lands in `files` through\n * the same `load()` a toolbar search lands in. There is no second list, no\n * \"search results\" page and no separate empty state — the dialog composes a\n * query, the explorer runs it, and the rows arrive where rows always arrive.\n *\n * Two things the dialog cannot do itself, and they live here because this is\n * where the API client is:\n *\n *  1. **Scope routing.** `name` is served by the manager's\n *     `?action=search&filter=…`, which is what the toolbar already uses and\n *     what returns adapter-qualified rows. `content`/`all` exist ONLY on\n *     `/api/files/search` (the manager's search action hardcodes\n *     `search.ScopeName`), whose rows are raw node rows — so they are mapped\n *     onto the listing shape below.\n *  2. **The live count**, which is a real query. See `advSearchCount`.\n */\nconst showAdvSearch = ref(false);\n/** The folder the dialog was opened from, frozen for its lifetime. */\nconst advPathBase = ref('');\n\n/**\n * Whether the content scopes may be offered at all.\n *\n * ⚠ This USED to be a capability check: `/api/files/search` answered with a\n * `storage_id` and no storage name, the explorer has no id→name map, and a row\n * wearing the wrong drive's name is worse than a scope we did not offer — so\n * the tabs were gated to single-storage installs, where the guess could not be\n * wrong. `handlers/search.go` now labels every hit with its drive's name (and\n * its owner) in `describeHits`, so there is nothing left to guess and the\n * scopes are offered everywhere. Kept as a computed rather than deleted: the\n * prop is public API, and an embedder pointed at an older backend still gets\n * hits with no `storage` — which `advHitToNode` falls back for, row by row.\n */\nconst advContentAvailable = computed(() => true);\n\n/** How many hits we ask the content endpoint for. The manager's search action\n *  uses 250 internally; matching it keeps the two scopes comparable. */\nconst ADV_CONTENT_LIMIT = 250;\n\n/** Map one raw search hit onto the listing shape.\n *\n *  ⚠ The drive comes from the HIT (`describeHits` puts it there), not from the\n *  pane we happen to be standing in — a content search spans storages, so\n *  `adapter.value` is only the right answer by accident. It stays as the\n *  fallback for a backend older than that field. */\nfunction advHitToNode(h: GlobalSearchHit, storageName: string): FileNode {\n  const rel = String(h.path ?? '').replace(/^\\/+/, '');\n  const drive = typeof h.storage === 'string' && h.storage ? h.storage : storageName;\n  const name = String(h.name ?? rel.split('/').pop() ?? '');\n  const dot = name.lastIndexOf('.');\n  const mtime = typeof h.backend_mtime === 'string' ? h.backend_mtime : h.updated_at;\n  const ms = typeof mtime === 'string' ? Date.parse(mtime) : NaN;\n  return {\n    id: typeof h.id === 'number' ? h.id : undefined,\n    path: drive ? `${drive}://${rel}` : rel,\n    basename: name,\n    relativePath: rel,\n    type: h.type === 'dir' ? 'dir' : 'file',\n    extension: dot > 0 ? name.slice(dot + 1).toLowerCase() : '',\n    size: typeof h.size === 'number' ? h.size : 0,\n    // ⚠ Left UNSET when the row carries no parseable timestamp rather than\n    // defaulted to 0 or to now: `matchesModified` treats a missing timestamp\n    // as \"unknown\" and drops the row from a date filter, which is the honest\n    // answer. Stamping it with `Date.now()` would file every such file under\n    // \"Today\".\n    last_modified: Number.isNaN(ms) ? undefined : ms,\n    mime_type: typeof h.mime === 'string' ? h.mime : '',\n    /* The content snippet the hit came with, so a content match can show why\n       it matched. Undefined on name-only hits, exactly as the backend sends. */\n    snippet: typeof h.snippet === 'string' && h.snippet ? h.snippet : undefined,\n    /* Owner, so the People filter and the Owner column mean the same thing in a\n       content result as they do in a folder listing. Undefined rather than\n       guessed when the backend does not send it. */\n    owner_id: typeof h.owner_id === 'number' ? h.owner_id : undefined,\n    owner_name: typeof h.owner_name === 'string' ? h.owner_name : undefined,\n    owner_self: h.owner_self === true ? true : undefined,\n  };\n}\n\n/** Run one advanced search and hand back the rows, unfiltered. */\nasync function advFetchRows(scope: AdvScope, query: string, target: string): Promise<FileNode[]> {\n  if (scope === 'name') {\n    const resp = await api.search(target, query);\n    return filterListing(resp.files);\n  }\n  const hits = await api.globalSearch(query, { limit: ADV_CONTENT_LIMIT, scope });\n  const storageName = adapter.value || (props.config.storages ?? [])[0]?.name || '';\n  return filterListing(hits.map((h) => advHitToNode(h, storageName)));\n}\n\n/** The target `load()` would use for the current position. */\nfunction advTarget(): string {\n  const requested = currentPath.value ?? '';\n  return multiStorageRoot.value ? virtualToWire(requested) : qualify(requested);\n}\n\n/**\n * The dialog's live count — a REAL query, not an estimate.\n *\n * ⚠ It costs exactly what pressing Search costs: the same request, the same\n * rows, the same client-side narrowing. There is no cheaper way to answer it —\n * neither endpoint has a count mode — so the dialog prints that the number is\n * produced by running the search rather than letting it look free.\n *\n * `capped` is the other half of the honesty: when the server returned as many\n * hits as it was allowed to, the client-side filters narrowed a window and the\n * number describes the rows that came back, not the storage.\n */\nasync function advSearchCount(req: AdvSearchRequest): Promise<AdvCountResult> {\n  const query = advQueryString(req);\n  const rows = await advFetchRows(req.scope, query, advTarget());\n  const limit = req.scope === 'name' ? 250 : ADV_CONTENT_LIMIT;\n  return {\n    count: applyFilters(rows, req.filters).length,\n    capped: advSearchTruncated(rows.length, limit),\n  };\n}\n\nfunction openAdvancedSearch(seed: string) {\n  advPathBase.value = qualify(currentPath.value ?? '') || '';\n  advSearchSeed.value = seed;\n  showAdvSearch.value = true;\n}\nconst advSearchSeed = ref('');\n\nfunction applyAdvancedSearch(req: AdvSearchRequest) {\n  showAdvSearch.value = false;\n  advScope.value = req.scope;\n  advFilters.value = filtersActive(req.filters) ? { ...req.filters } : null;\n  const q = advQueryString(req);\n  // Same text as the box already holds → the `searchQuery` watcher will not\n  // fire, so the reload (which the new scope/filters need) is issued here.\n  if (q === searchQuery.value) void load();\n  else searchQuery.value = q;\n}\n\n/** Typing in the toolbar field is a plain search again — it replaces whatever\n *  the dialog set rather than silently inheriting filters the user cannot see\n *  from a box that shows only words. */\nfunction onToolbarSearch(v: string) {\n  advFilters.value = null;\n  advScope.value = 'name';\n  /* gorunum:v3-shell — Home has no listing behind it, and `searchQuery` is\n     watched by `load()`. Setting it here re-entered loadNavView('home') on\n     every keystroke — two fetches per pause, for a narrowing that could not\n     appear anywhere. The words are not lost: Enter hands them to the command\n     palette (Toolbar `searchEscalates`), which is the \"everywhere\" search the\n     field's own ⌘K chip advertises. */\n  if (navView.value === 'home') return;\n  searchQuery.value = v;\n}\n/* === /gorunum:v1-advsearch === */\n\n/**\n * surucu:d1 — what the header field says it will search: the folder you are\n * standing in, by name. At a storage root that is the storage; in a panel view\n * (\"Recent\", a tag) it is that view's own name, because searching from there\n * searches what is on screen.\n */\nconst driveScopeLabel = computed(() => {\n  /* ⚠ The field searches the WHOLE storage (`?action=search` filters by\n     storage id only — see handlers/manager.go vfSearch), and at the virtual\n     root every storage. Naming the open FOLDER here (\"Search in Photos\") was\n     a lie the user found: results came from the whole storage. The scope is\n     the storage; the folder-scoped box is FilterBar's \"Filter in this\n     folder…\". Home, the virtual root and the cross-storage views (Recent,\n     Starred, Shared, tags) have no single storage → the everywhere wording.\n     ⚠ `multiStorageRoot` is the MODE (the admin explorer is always in it), not\n     the place: inside a storage the scope is that storage. Gating on the mode\n     printed \"Search all storages\" on every admin folder (caught by\n     e2e/tests/107 on the v0.42.2 chain). */\n  if (navView.value || atVirtualRoot.value) return '';\n  const name = adapter.value;\n  if (!name) return '';\n  const st = (props.config.storages ?? []).find((s) => s.name === name);\n  return st?.label || name;\n});\n\n/**\n * surucu:d1 — the ⌘K escalation. The header field searches THIS folder (it\n * sets `searchQuery`, which the loader answers with `action=search`); this\n * hands the same words to the command palette, which is where \"everywhere\",\n * the saved searches and the commands live. One box, one shortcut, and the\n * hint printed on the box does what it says.\n */\nconst paletteSeed = ref('');\nfunction openPaletteWith(q: string) {\n  paletteSeed.value = q;\n  showPalette.value = true;\n}\n\n/**\n * surucu:d1 — \"Request files\" from the New menu: the access modal on the\n * CURRENT folder, opened on its file-drop tab. The modal already owns that\n * surface; this only gives it a target, since the folder you are standing in\n * is not a selected row and has no FileNode of its own.\n */\nconst permInitialTab = ref<'perms' | 'share' | 'drop' | undefined>(undefined);\nfunction openFileRequest() {\n  const path = qualify(currentPath.value);\n  if (!path) return;\n  const segs = currentPath.value.split('/').filter(Boolean);\n  permTarget.value = {\n    path,\n    basename: segs.length ? segs[segs.length - 1] : adapter.value,\n    type: 'dir',\n  };\n  permInitialTab.value = 'drop';\n  showPerm.value = true;\n}\n\n/** surucu:d1 — a link minted from the details panel; same event the share\n *  dialog emits, so a host listening for `share-created` hears both. */\nfunction onInspectorShareCreated(payload: { path: string; url: string }) {\n  emit('share-created', { path: payload.path, url: payload.url, pin: null });\n  flashToast(t('inspector.copied'));\n}\n\n/* === surucu:d1 — the storage line under the navigation ==================\n * Fetched once per mount. The gate is `identitySurfaces` and nothing else: a\n * quota is one PERSON's ceiling, so an app token has nobody to have one, but\n * every surface that has a person behind it draws the same line — this is the\n * shell, not a profile. `quotaMe()` answers null for a server without the\n * route, and null renders nothing at all.\n */\nconst quotaSnapshot = ref<{ used: number; total: number; unlimited: boolean } | null>(null);\nasync function loadQuota() {\n  if (!identitySurfaces.value) {\n    quotaSnapshot.value = null;\n    return;\n  }\n  const q = await api.quotaMe();\n  if (!q) {\n    quotaSnapshot.value = null;\n    return;\n  }\n  const unlimited = !!q.unlimited || q.quota_bytes <= 0;\n  // ⚠ No ceiling AND nothing counted = nothing to say, so say nothing.\n  //\n  // Measured, not guessed: `used_bytes` is `SUM(nodes.size) WHERE owner_id = me`\n  // and `nodes.owner_id` is set by the UPLOAD path only — it is nil for every\n  // file a storage sync discovered (handlers/shared.go). On an install whose\n  // drives were mounted rather than uploaded into, the honest figure is\n  // therefore \"0 B\", and a line reading \"0 B used\" under a drive visibly full\n  // of files reads as a broken widget, not as a fact about quota. With a quota\n  // set the line still earns its place — the ceiling is real and uploads count\n  // against it — so only the no-quota-no-usage case is dropped.\n  quotaSnapshot.value =\n    unlimited && q.used_bytes <= 0\n      ? null\n      : { used: q.used_bytes, total: q.quota_bytes, unlimited };\n}\n\n/**\n * nodeRowToFileNode — the starred / recently-opened / tag endpoints answer\n * with raw node rows (relative `path`, numeric `storage_id`), not the listing\n * shape. The conversion itself lives in `lib/nodeRow` (pure, unit-tested);\n * this binds it to the explorer's config. Every view that lists such rows —\n * Recent, Starred, a tag, the Home cards, the Recently-opened tray — goes\n * through here, so they all carry the same `perm` + `read_only` the context\n * menu gates its write verbs on.\n */\nfunction nodeRowToFileNode(row: Record<string, unknown>): FileNode | null {\n  return nodeRowToFileNodePure(row, {\n    storages: props.config.storages ?? [],\n    multiStorageRoot: multiStorageRoot.value,\n  });\n}\n\n/** GET one of the view endpoints. Returns rows already in listing shape. */\nasync function fetchNavRows(kind: 'recent' | 'starred' | 'shared'): Promise<FileNode[]> {\n  const base = props.config.apiBase ?? '';\n  const url =\n    kind === 'shared'\n      ? `${base}/api/files/manager/shared-with-me?limit=200`\n      : kind === 'starred'\n        ? `${base}/api/files/manager/star/list?limit=200`\n        : `${base}/api/files/manager/recent?limit=50`;\n  // ⚠ await. `buildAuthHeaders` is async because a token may be a function the\n  // desktop shell resolves per call; spreading the un-awaited promise sends the\n  // request with no Authorization header and it fails silently with a 401.\n  const res = await fetch(url, {\n    headers: await buildAuthHeaders(),\n    // ⚠ NOT 'include' — same reason as loadStarred: a credentialed\n    // cross-origin request cannot be answered with `ACAO: *`.\n    credentials: api.credentialsMode(),\n  });\n  if (!res.ok) throw new Error(String(res.status));\n  const body = await res.json();\n  if (kind === 'shared') {\n    // The shared endpoint already answers in the listing shape, and reports\n    // which storages are grant-only in the same call.\n    sharedStorageNames.value = Array.isArray(body?.storages) ? body.storages : [];\n    return (Array.isArray(body?.files) ? body.files : []) as FileNode[];\n  }\n  const rows: Record<string, unknown>[] = Array.isArray(body?.nodes) ? body.nodes : [];\n  return rows.map(nodeRowToFileNode).filter((n): n is FileNode => n !== null);\n}\n\n/* === gorunum:v3-shell — the Home view's own state ========================\n * Two lists and a flag, and nothing else: the storages are already\n * `config.storages` (the host's list, kept current by its own Refresh) and the\n * cards come from GridView, so Home adds no third source of truth about what\n * exists — it only asks the two per-user endpoints the panel's Recent and\n * Starred rows already ask.\n *\n * ⚠ `files` stays EMPTY while Home is open. Home is not a listing: it renders\n * its own sections, and putting its rows in `files` would hand the selection,\n * the inspector, the keyboard range and every `files.length` in this file a\n * list nobody is standing in.\n */\nconst homeRecent = ref<FileNode[]>([]);\nconst homeStarred = ref<FileNode[]>([]);\nconst homeLoading = ref(false);\n\n/**\n * The storages Home draws.\n *\n * ⚠ Straight from `config.storages`, NOT a second fetch. The host already\n * decided which drives this caller may see (RBAC on the server, then\n * `fetchVisibleStorages` in our own app) and the navigation panel two hundred\n * pixels to the left is rendering that same array — a Home that asked for its\n * own copy could show a drive the panel beside it hides.\n */\nconst homeStorages = computed(() => props.config.storages ?? []);\n\nasync function loadHome() {\n  homeLoading.value = true;\n  try {\n    // ⚠ Both at once and neither fatal on its own: a server without the\n    // starred endpoint must still be able to show somebody their recents.\n    const [r, st] = await Promise.all([\n      fetchNavRows('recent').catch(() => [] as FileNode[]),\n      fetchNavRows('starred').catch(() => [] as FileNode[]),\n    ]);\n    homeRecent.value = r;\n    homeStarred.value = st;\n  } finally {\n    homeLoading.value = false;\n  }\n}\n\n/** Open one of the panel views in the main pane. */\nasync function loadNavView(kind: Exclude<NavView, ''>) {\n  closeNavDrawer();\n  if (kind === 'home') {\n    // ⚠ The mode is set BEFORE the fetch, unlike the listing views below: Home\n    // renders its own sections with their own loading line, so there is\n    // nothing to hold back — and setting it afterwards would leave the\n    // previous folder's files on screen under the panel row that already reads\n    // as selected.\n    if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n    navView.value = 'home';\n    navTag.value = '';\n    trashMode.value = false;\n    e2eRoot.value = '';\n    forgetFolderPerm();\n    selection.clear();\n    files.value = [];\n    dirname.value = NAV_VIEW_DIRNAME.home;\n    currentPath.value = NAV_VIEW_DIRNAME.home;\n    adapter.value = '';\n    await loadHome();\n    return;\n  }\n  if (kind === 'tag') {\n    // The tag view needs a name; the panel calls loadTagView directly.\n    if (navTag.value) await loadTagView(navTag.value);\n    return;\n  }\n  if (kind === 'trash') {\n    void probeTrashPolicy(); /* tablo:t1 — in parallel: the banner is above the\n                                listing and must not wait behind it */\n    await loadTrash();\n    // ⚠ After loadTrash, not before: loadTrash goes through load()-adjacent\n    // state and the mode has to be the last word, or the panel row for Trash\n    // never lights up.\n    navView.value = 'trash';\n    navTag.value = '';\n    return;\n  }\n  loading.value = true;\n  // ⚠ Only when coming from a real folder. Stepping Starred → Recent used to\n  // record `.starred` as the origin, so \"up\" out of Recent landed in Starred\n  // and the user had to press it twice to get back to their files.\n  if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n  navView.value = kind;\n  navTag.value = '';\n  trashMode.value = false;\n  e2eRoot.value = '';\n  forgetFolderPerm();\n  selection.clear();\n  try {\n    files.value = await fetchNavRows(kind);\n    dirname.value = NAV_VIEW_DIRNAME[kind];\n    currentPath.value = NAV_VIEW_DIRNAME[kind];\n    // These three span every storage, so the crumb reads \"/ > Starred\", not\n    // \"/ > My files > Starred\", which would name a storage half the rows are\n    // not in. Trash keeps its storage crumb: trash IS per-storage.\n    adapter.value = '';\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    files.value = [];\n    emit('error', { message: msg, context: { op: `nav-view:${kind}` } });\n    flashToast(msg);\n  } finally {\n    loading.value = false;\n  }\n}\n\n/* === etiket:t1 — the tag view ==========================================\n * \"Tagged files should show up inside the tag.\" A tag is not a folder: its\n * files live all over the tree and in every storage, so this is the same\n * shape as Starred — a per-user endpoint answering with node rows, each\n * carrying its own qualified path, so opening one navigates normally.\n *\n * The sentinel is `.tag~<name>` (lib/listing). Every surface that renders a\n * path segment — tab strip, breadcrumb, inspector heading, the address-bar\n * hash — goes through `virtualSegmentLabel`, so none of them can print the\n * sentinel the way the strip once printed `.shared`.\n */\nasync function loadTagView(tag: string) {\n  closeNavDrawer();\n  const name = String(tag ?? '').trim();\n  if (!name) return;\n  loading.value = true;\n  if (!navView.value) navViewOrigin.value = currentPath.value ?? '';\n  navView.value = 'tag';\n  navTag.value = name;\n  trashMode.value = false;\n  e2eRoot.value = '';\n  forgetFolderPerm();\n  selection.clear();\n  try {\n    const rows = await fetchTaggedRows(name, {\n      apiBase: props.config.apiBase ?? '',\n      authHeaders: () => buildAuthHeaders(),\n      authCredentials: api.credentialsMode(),\n    });\n    files.value = rows.map(nodeRowToFileNode).filter((n): n is FileNode => n !== null);\n    const seg = makeTagSegment(name);\n    dirname.value = seg;\n    currentPath.value = seg;\n    // Spans every storage, like Starred/Recent/Shared — so no storage crumb.\n    adapter.value = '';\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    files.value = [];\n    emit('error', { message: msg, context: { op: `nav-view:tag:${name}` } });\n    flashToast(msg);\n  } finally {\n    loading.value = false;\n  }\n}\n\n/**\n * The tags that exist, for the panel's Tags section.\n *\n * ⚠ WHEN this loads was a deliberate decision, not a default: `tags/all` is a\n * distinct-scan and the panel renders in every mounted explorer (a page can\n * hold several). It is therefore NOT fetched during mount — it is asked for\n * once the first listing is on screen, through a module-level cache that\n * dedupes concurrent callers and reuses the answer for a minute\n * (lib/tags.ts). N explorers on a page cost ONE query; a navigation costs\n * none. The cache is dropped the instant the user edits tags, which is the\n * only staleness anybody can notice.\n */\nconst navTags = ref<string[]>([]);\nconst navTagsLoaded = ref(false);\n\nasync function loadNavTags(force = false) {\n  if (!navVisible.value) return; // no panel → nobody can see the list\n  navTags.value = await fetchAllTags({\n    apiBase: props.config.apiBase ?? '',\n    authHeaders: () => buildAuthHeaders(),\n    authCredentials: api.credentialsMode(),\n    force,\n  });\n  navTagsLoaded.value = true;\n}\n\n/* === /etiket:t1 === */\n\n/**\n * gorunum:v3-shell — what the panel's first group does.\n *\n * ⚠ \"My files\" is answered with an ordinary navigation, not with a view. It\n * opens the ROOT — the storage list in a multi-storage install, the storage\n * root in a single-storage one, and the confined floor inside a `rootPath`\n * embed (load() clamps it, so the row cannot be used to climb out of a\n * confined explorer). `load('')` also clears `navView`, which is what takes\n * the panel's highlight off whichever view you were in.\n */\nfunction openNavDest(dest: NavDest) {\n  if (dest === 'myfiles') {\n    closeNavDrawer();\n    void load('');\n    return;\n  }\n  void loadNavView(dest);\n}\n\n/** Panel to a storage root. */\nfunction openNavStorage(name: string) {\n  closeNavDrawer();\n  void load(multiStorageRoot.value ? name : '');\n}\n\n/**\n * Which storages are grant-only, asked once at mount so the panel can mark them\n * before anybody opens the shared view. `limit=1` on purpose: the storage list\n * is built from every grant, the page size only bounds the item rows.\n */\nasync function loadSharedStorages() {\n  try {\n    const base = props.config.apiBase ?? '';\n    const res = await fetch(`${base}/api/files/manager/shared-with-me?limit=1`, {\n      headers: await buildAuthHeaders(),\n      credentials: api.credentialsMode(),\n    });\n    if (!res.ok) return;\n    const body = await res.json();\n    sharedStorageNames.value = Array.isArray(body?.storages) ? body.storages : [];\n  } catch {\n    // Silent — an older backend has no such endpoint, and the panel is still\n    // useful without the shared markers.\n  }\n}\n/* === /gezinti:g1 === */\n/**\n * What a user path READS AS — the folder's own name, or the view's.\n *\n * ⚠ Takes the path as an argument rather than reading `currentPath`, because\n * there are two panes and the details panel follows whichever one has the\n * keyboard (see `inspectorDirLabel`).\n *\n * ⚠ The `trashMode` special case it used to open with is gone, and that is a\n * removal, not an omission: the trash view parks `.trash` in `currentPath`, and\n * `virtualSegmentLabel('.trash')` is `t('node.trash')` — the same string, by\n * the same route as every other view. One of the two was going to be forgotten\n * the next time a view was added; it is the one that could be.\n */\nfunction folderLabelOf(path: string): string {\n  const p = (path ?? '').replace(/^\\/+|\\/+$/g, '');\n  /* No path = the top of the tree. In multi-storage that is the DRIVE LIST, so\n     naming it after `adapter` — whichever storage was loaded last — would head\n     the panel with a drive the person is not looking at. */\n  if (!p) return multiStorageRoot.value ? t('breadcrumb.root') : (adapter.value || t('breadcrumb.root'));\n  const seg = p.split('/').pop() || p;\n  /* etiket:t1 — a THIRD surface that renders a path segment, and it had the\n     same hole the tab strip did: in a virtual view the details panel headed\n     itself \".starred\". Same shared resolver, so it cannot drift again. */\n  return virtualSegmentLabel(seg, t) || seg;\n}\nfunction onInspectorManage(n: FileNode) {\n  permTarget.value = n;\n  showPerm.value = true;\n}\n/* === /koru:k1 === */\n\n// RBAC helpers. '' means ACL is not enforced on this storage → full access\n// (the pre-RBAC default). Otherwise 'editor'/'owner' may write; only 'owner'\n// manages permissions. Enforcement is server-side; this just shapes the menu.\nfunction permCanEdit(p: string | undefined): boolean {\n  // A read-only storage refuses every write on the server (403 \"storage is\n  // read-only\") whatever level the ACL grants — an owner of a read-only mount\n  // is an owner who cannot write. Say so here rather than after the click:\n  // until this line the toolbar offered New folder / Upload and the sidebar's\n  // \"+ New\" menu on a read-only mount, and the user found out from the error\n  // (issue #30). The level itself is left alone: 'owner' still opens the\n  // permissions panel, sharing a read-only file is still allowed.\n  if (dirReadOnly.value) return false;\n  // undefined = ACL not enforced (dev / unwired) → full access. In production\n  // the backend always sends a level; 'none'/'viewer' cannot write, only\n  // 'editor'/'owner' can.\n  return p === undefined || p === 'editor' || p === 'owner';\n}\nfunction permIsOwner(p: string | undefined): boolean {\n  return p === 'owner';\n}\n/* ⚠⚠ THE CONTEXT MENU MUST BE THE SAME EVERYWHERE (owner, 2026-09-19: \"son\n * kullanılanlar, ana sayfa gibi sayfalarda context menu eksik kalıyor.\n * CONTEXT MENÜ HER YERDE AYNI OLMALI\").\n *\n * `dirPerm` / `dirReadOnly` describe the FOLDER being listed, and only\n * `load()` sets them. Recent, Starred, Shared, a tag view and Home list rows\n * from every storage and have no folder — so whatever folder was open LAST\n * answered for them. On the landing page that is no folder at all\n * (`dirPerm === ''`), and `permCanEdit('')` is false, so the menu on a Home\n * card or a Recent row came up without Rename / Delete / Move to / Share.\n * After a writable folder had been visited the stale level said yes to\n * everything, including rows on a read-only mount. Intermittent, therefore\n * reported as \"eksik kalıyor\" rather than \"yok\".\n *\n * Three rules restore one menu:\n *   1. entering a virtual view forgets the folder (`forgetFolderPerm`), so\n *      nothing stale can leak into it;\n *   2. a row answers for itself — its own `perm` (every listing carries it\n *      now, `handlers/meta.go`) and its own storage's `read_only`;\n *   3. a multi-selection is as weak as its weakest row, because the server\n *      refuses the whole batch on the one row the caller may not touch.\n * What stays hidden in a virtual view is only what is structurally\n * impossible there — New folder, Upload, Paste need a destination folder\n * (`atVirtualRoot`).\n */\nfunction forgetFolderPerm() {\n  dirPerm.value = '';\n  dirReadOnly.value = false;\n}\n/** A view whose rows span every storage: no folder is behind it. */\nconst inVirtualView = computed(() => !!navView.value && navView.value !== 'trash');\n/** The row's own level; the folder's when the row has none. In a virtual view\n *  a row without a level (a server older than `handlers/meta.go`'s `perm`)\n *  is ungated — the server enforces, this only shapes the menu — rather than\n *  gated by an empty folder level that would hide every write verb. */\nfunction rowPerm(n: FileNode): string | undefined {\n  if (typeof n.perm === 'string') return n.perm;\n  return inVirtualView.value ? undefined : dirPerm.value;\n}\n/** The row sits on a read-only storage: its own `read_only` (nav/tag rows),\n *  else the host's storage list — a folder listing's rows carry no flag of\n *  their own because `dirReadOnly` already answers for the whole folder. */\nfunction nodeReadOnly(n: FileNode): boolean {\n  if (n.read_only === true) return true;\n  const storage = typeof n.storage === 'string' ? n.storage : '';\n  if (!storage) return false;\n  return (props.config.storages ?? []).some((s) => s.name === storage && s.readOnly === true);\n}\n/** May the caller write THIS row — level and read-only mount folded together.\n *  The one predicate behind the editor/preview split and the menu's write\n *  verbs, so a Home card and a listing row cannot disagree. */\nfunction nodeCanEdit(n: FileNode): boolean {\n  return permCanEdit(rowPerm(n)) && !nodeReadOnly(n);\n}\nconst PERM_RANK: Record<string, number> = { none: 0, viewer: 1, editor: 2, owner: 3 };\n// Effective perm for a selection: a single entry's own perm, the WEAKEST of a\n// multi-selection's own perms, else the directory perm (background / rows\n// that carry no level).\nfunction selPerm(sel: FileNode[]): string | undefined {\n  if (sel.length === 0) return dirPerm.value;\n  let weakest: string | undefined;\n  let ungated = false;\n  for (const n of sel) {\n    const p = rowPerm(n);\n    if (p === undefined) {\n      ungated = true;\n      continue;\n    }\n    if (weakest === undefined || (PERM_RANK[p] ?? 0) < (PERM_RANK[weakest] ?? 0)) weakest = p;\n  }\n  // An ungated row (no level, unwired ACL) never strengthens a selection\n  // that also holds a gated one; alone, it stays ungated.\n  return weakest ?? (ungated ? undefined : dirPerm.value);\n}\n/** Any row of the selection on a read-only storage → the selection is. */\nfunction selReadOnly(sel: FileNode[]): boolean {\n  return sel.some(nodeReadOnly);\n}\n// Can the current user write into the directory being viewed? Gates the\n// toolbar New Folder / Upload / Paste + drag-drop upload.\nconst canWriteHere = computed(() => permCanEdit(dirPerm.value));\n// Empty-state affordances: the \"drop files here\" hint + upload button only\n// make sense in a real writable folder (not the virtual drives root, not the\n// trash view).\nconst emptyCanUpload = computed(\n  () => canWriteHere.value && !atVirtualRoot.value && !trashMode.value,\n);\n\n// Context menu\nconst ctxRef = ref<InstanceType<typeof ContextMenu> | null>(null);\nconst rootEl = ref<HTMLElement | null>(null);\nconst toolbarRef = ref<InstanceType<typeof Toolbar> | null>(null);\n\n/* bag:b4 — narrow/embed mini mode.\n * isNarrow: container width < 560px (ResizeObserver on the .fe root, so it\n * tracks the EMBED container, not the viewport) → root gets `fe--narrow`,\n * the toolbar collapses and the upload FAB appears.\n * isCoarse: touch-first device → context menus render as a bottom sheet. */\nconst isNarrow = ref(false);\nconst isCoarse = ref(false);\nlet narrowRO: ResizeObserver | undefined;\nlet coarseMq: MediaQueryList | undefined;\nfunction syncCoarsePointer(e?: MediaQueryListEvent | MediaQueryList) {\n  isCoarse.value = !!(e && 'matches' in e && e.matches);\n}\nonMounted(() => {\n  if (typeof ResizeObserver !== 'undefined' && rootEl.value) {\n    narrowRO = new ResizeObserver((entries) => {\n      const w = entries[0]?.contentRect?.width ?? rootEl.value?.clientWidth ?? 0;\n      isNarrow.value = w > 0 && w < 560;\n    });\n    narrowRO.observe(rootEl.value);\n  }\n  if (typeof window !== 'undefined' && window.matchMedia) {\n    coarseMq = window.matchMedia('(pointer: coarse)');\n    syncCoarsePointer(coarseMq);\n    coarseMq.addEventListener?.('change', syncCoarsePointer);\n  }\n});\nonBeforeUnmount(() => {\n  narrowRO?.disconnect();\n  narrowRO = undefined;\n  coarseMq?.removeEventListener?.('change', syncCoarsePointer);\n  coarseMq = undefined;\n});\n/* /bag:b4 */\n\n// Toast (tiny, no lib). Evolved into a snackbar: plain messages keep the old\n// 2.5s auto-hide; messages carrying an action (\"Geri Al\") stay 8s and can be\n// dismissed by click or Esc.\ninterface ToastState {\n  message: string;\n  actionLabel?: string;\n  action?: () => void | Promise<void>;\n}\nconst toast = ref<ToastState | null>(null);\nlet toastTimer: ReturnType<typeof setTimeout> | undefined;\nfunction showToast(state: ToastState, ms: number) {\n  toast.value = state;\n  if (toastTimer) clearTimeout(toastTimer);\n  toastTimer = setTimeout(() => (toast.value = null), ms);\n}\nfunction flashToast(msg: string) {\n  showToast({ message: msg }, 2500);\n}\nfunction undoToast(message: string, undo: () => Promise<void>) {\n  showToast({ message, actionLabel: t('toast.undo'), action: undo }, 8000);\n}\nfunction dismissToast() {\n  if (toastTimer) {\n    clearTimeout(toastTimer);\n    toastTimer = undefined;\n  }\n  toast.value = null;\n}\nasync function runToastAction() {\n  const act = toast.value?.action;\n  dismissToast();\n  if (!act) return;\n  try {\n    await act();\n    flashToast(t('toast.undone'));\n    await load();\n  } catch {\n    flashToast(t('toast.undo_failed'));\n  }\n}\n\n// --------------------------------------------------------------------\n// Data loading\n// --------------------------------------------------------------------\n\n// multiStorageRoot — when on, \"/\" is a virtual folder listing every\n// configured storage as a clickable dir. Path semantics shift:\n//\n//   \"\"           → global root, list storages\n//   \"<storage>\"  → that storage's root (api: `<storage>://`)\n//   \"<storage>/<rel>\"  → deeper folder (api: `<storage>://<rel>`)\n//\n// `qualify()` is overridden inside this mode to translate the\n// slash-separated user path into the wire `<adapter>://<rel>` form.\nconst multiStorageRoot = computed(() => props.config.multiStorageRoot === true);\n\nfunction splitVirtualPath(p: string): { adapter: string; rel: string } {\n  const clean = p.replace(/^\\/+|\\/+$/g, '');\n  if (!clean) return { adapter: '', rel: '' };\n  const slash = clean.indexOf('/');\n  if (slash === -1) return { adapter: clean, rel: '' };\n  return { adapter: clean.slice(0, slash), rel: clean.slice(slash + 1) };\n}\n\nfunction virtualToWire(p: string): string {\n  // Convert `s3-test/example` → `s3-test://example`. Pass-through\n  // when the input already carries `://` (legacy callers).\n  if (p.includes('://')) return p;\n  const { adapter, rel } = splitVirtualPath(p);\n  if (!adapter) return ''; // global root — no wire form\n  return rel ? `${adapter}://${rel}` : `${adapter}://`;\n}\n\nfunction wireToVirtual(p: string): string {\n  // Convert `s3-test://example` → `s3-test/example`.\n  const idx = p.indexOf('://');\n  if (idx === -1) return p.replace(/^\\/+|\\/+$/g, '');\n  const adapter = p.slice(0, idx);\n  const rel = p.slice(idx + 3).replace(/^\\/+|\\/+$/g, '');\n  return rel ? `${adapter}/${rel}` : adapter;\n}\n\nfunction virtualStorageRows(): FileNode[] {\n  // Synthesize a FileNode for every configured storage. Used as the\n  // \"/\" listing in multi-storage mode.\n  const list = props.config.storages ?? [];\n  return list.map((s) => ({\n    type: 'dir',\n    path: s.name, // virtual path (no adapter prefix)\n    basename: s.label || s.name,\n    extension: '',\n    storage: s.name,\n    visibility: 'private',\n    file_size: 0,\n    mime_type: 'inode/storage',\n    extra_metadata: { driver: s.driver, readOnly: s.readOnly },\n  } as unknown as FileNode));\n}\n\n// Flip dot-file visibility. Both panes filter at load time rather than in a\n// computed, so the listings are re-fetched instead of re-filtered — that keeps\n// selection and the operations that read `files` working on exactly what is\n// on screen.\nfunction toggleHiddenFiles() {\n  setShowHiddenFiles(!showHiddenFiles.value);\n  void load();\n  void splitPaneRef.value?.reload();\n}\n\n/**\n * gorunum:v2-topbar — what the Refresh control actually means.\n *\n * ⚠ ONE function behind BOTH doors (the header's button and the palette's\n * `refresh` command). They used to be two separate `() => load()` arrow\n * functions in the template, which is how one of them would have quietly kept\n * reloading only half of what the other does.\n *\n * The listing is ours; the storage list is the host's (`config.storages`), so\n * the host is told and re-answers it in its own time. Nothing here waits on\n * that: the folder is on screen again either way.\n */\nfunction refreshAll() {\n  void load();\n  emit('refresh');\n}\n\nasync function load(path?: string) {\n  /* === etiket:t1 — a sentinel is a VIEW, not a folder ===================\n   * A restored tab, a reload on `#.trash` / `#.starred` / `#.tag~invoices`,\n   * or the breadcrumb crumb for the view you are standing in all arrive here\n   * as a plain path. Without this they went to the backend as a FOLDER NAME\n   * and came back 404, so a view that exists and is merely empty greeted the\n   * user with \"Folder not found — this folder does not exist, was moved, or\n   * you do not have access to it\" (measured on `#.trash` and `#.starred`,\n   * v0.30.1). The trash is not missing; it is empty, and it has a state that\n   * says so.\n   *\n   * ⚠ Through `virtualViewOf` → the ONE map in lib/listing.ts, never a second\n   * list of names here: two copies of that mapping are what printed `.shared`\n   * in the tab strip two days ago, and the tag view adds a dynamic third kind.\n   *\n   * ⚠ Only a sentinel this build KNOWS is intercepted. Anything else keeps\n   * going — a user may genuinely own a folder called `.config`, and with\n   * hidden files shown they can open it.\n   *\n   * ⚠ And only when the view is actually REACHABLE here. Under `rootPath` the\n   * panel is off on purpose (the views span storages and would list files\n   * outside the folder the embed was confined to), so a stale hash from\n   * another deployment must not smuggle them in: it falls back to the root —\n   * which the floor clamp below then turns into the confined folder.\n   *\n   * ⚠ No recursion: neither loader calls load(), and the fallback passes '',\n   * which is not a sentinel.\n   */\n  const asView = virtualViewOf(path ?? currentPath.value ?? '');\n  if (asView) {\n    const reachable =\n      asView.kind === 'trash' ? props.config.trashVisible !== false : sideNavEnabled.value;\n    if (!reachable) {\n      // Clear it explicitly: if the fallback lands on the path we are already\n      // on, watch(currentPath) never fires and the dead hash would survive to\n      // the next reload (the same trap leaveNotFound documents).\n      writePersistedPath('');\n      return await load('');\n    }\n    if (asView.kind === 'tag') await loadTagView(asView.tag);\n    else await loadNavView(asView.kind);\n    return;\n  }\n  /* A different folder is a different listing, and a selection belongs to the\n   * listing it was made in.\n   *\n   * ⚠⚠ Measured 2026-09-14 (v0.41.0 screenshot pass): double-clicking into an\n   * encrypted folder left \"1 selected\" — cut, copy, DELETE — hanging over its\n   * lock screen, and those actions were aimed at the folder the person was now\n   * standing INSIDE. Two stale things carried it: the selection itself, and\n   * `displayOrder`, the rows the view last drew. The lock screen (like the\n   * not-found state) draws no view, so nothing replaced the parent's rows, and\n   * `selection.nodes` kept resolving the double-clicked folder against them.\n   * A plain folder hid the bug only because its own view re-published its rows\n   * and the stale path stopped resolving — the selection was still there, and\n   * stepping back up brought it back to life.\n   *\n   * ⚠ Only when the FOLDER changes. A reload of the same folder (a realtime\n   * refresh, a mutation's re-render, a search rebased onto it) keeps what the\n   * person picked. Same rule the split pane applies in `onPaneNavigate`. */\n  const leaving = String(currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const arriveAt = (to: string) => {\n    if (String(to ?? '').replace(/^\\/+|\\/+$/g, '') === leaving) return;\n    selection.clear();\n    displayOrder.value = [];\n  };\n  loading.value = true;\n  // Any normal navigation exits trash mode (the trash view is entered only\n  // by opening the virtual `.trash` row, which calls loadTrash()).\n  trashMode.value = false;\n  /* gezinti:g1 — and every other virtual view, for the same reason: without\n     this the mode sticks and the breadcrumb keeps saying \"Starred\" over a\n     folder listing. */\n  navView.value = '';\n  navTag.value = '';\n  let requested = path ?? currentPath.value ?? '';\n  try {\n    notFoundPath.value = '';\n    loadError.value = '';\n    // Clamp to the confined floor: an empty/above-floor request (incl. a stale\n    // persisted path or the drives root) snaps back to rootPath. This both\n    // suppresses the multi-storage drives list and blocks up-navigation.\n    if (rootFloor) {\n      const p = String(requested).replace(/^\\/+|\\/+$/g, '');\n      if (!p || !(p === rootFloor || p.startsWith(rootFloor + '/'))) requested = rootFloor;\n    }\n\n    // Multi-storage virtual root — synthesize a list of storages\n    // instead of calling the backend.\n    if (multiStorageRoot.value && !virtualToWire(requested)) {\n      // One visible storage → skip the one-row list and open it. Recursion is\n      // bounded: the recursive call carries a non-empty path, so\n      // virtualToWire() resolves and this branch is not re-entered.\n      if (soleStorageName.value) return await load(soleStorageName.value);\n      arriveAt('');\n      currentPath.value = '';\n      adapter.value = '';\n      dirname.value = '';\n      e2eRoot.value = ''; /* wiring:e2 — no lock screen at the virtual root */\n      files.value = virtualStorageRows();\n      return;\n    }\n\n    const target = multiStorageRoot.value\n      ? virtualToWire(requested)\n      : qualify(requested);\n\n    /* gorunum:v1-advsearch — a content-scoped search cannot come from the\n       manager's search action (it hardcodes `search.ScopeName`), so it is\n       fetched from /api/files/search and projected onto the listing shape\n       here. Everything downstream — the views, the selection, the inspector —\n       sees ordinary rows, which is the point: one results surface. */\n    const advContent = !!searchQuery.value && advScope.value !== 'name';\n    const resp: ManagerResponse = advContent\n      ? {\n          adapter: adapter.value,\n          storages: (props.config.storages ?? []).map((s) => s.name),\n          dirname: dirname.value,\n          read_only: false,\n          files: await advFetchRows(advScope.value, searchQuery.value, target),\n        }\n      : searchQuery.value\n        ? await api.search(target, searchQuery.value)\n        : await api.index(target);\n    adapter.value = resp.adapter;\n    dirname.value = resp.dirname;\n    dirPerm.value = (resp.perm as string) || '';\n    dirReadOnly.value = resp.read_only === true;\n    /* wiring:e2 — backend tells us when this dir sits inside an encrypted\n       subtree; '' resets on every plain folder. Drives the lock screen. */\n    e2eRoot.value = typeof resp.e2e_root === 'string' ? resp.e2e_root : '';\n    /* /wiring:e2 */\n    // currentPath is the user-facing form: `s3-test/example` in\n    // multi-storage mode, the bare relative path otherwise.\n    const arrived = multiStorageRoot.value ? wireToVirtual(resp.dirname) : stripAdapter(resp.dirname);\n    arriveAt(arrived);\n    files.value = filterListing(resp.files);\n    // Inject virtual `.trash` entry at root only — shared helper so the\n    // split-view secondary pane shows the exact same row (no row-offset).\n    // ⚠ …and NOT into a search result. The search response's `dirname` is the\n    // scope it searched, so it is the storage root exactly as an `index` of\n    // that folder would be; only this call site knows which of the two it just\n    // asked for.\n    if (\n      injectTrashRow(files.value, resp.adapter, resp.dirname, props.config.trashVisible !== false, {\n        isSearchResult: !!searchQuery.value,\n        navOffersTrash: navOffersTrash.value,\n      })\n    ) {\n      void hydrateTrashRowShared(files.value, resp.adapter, api);\n    }\n    currentPath.value = arrived;\n  } catch (err) {\n    const e = err instanceof Error ? err.message : String(err);\n    const status = (err as { status?: number }).status;\n    if (status === 404 || status === 403) {\n      // Dead deep link (deleted folder, phantom path or RBAC-hidden dir):\n      // show the dedicated not-found state instead of a toast over a stale\n      // listing that reads as \"this folder is empty\".\n      notFoundPath.value = String(requested);\n      arriveAt(String(requested));\n      e2eRoot.value = ''; /* wiring:e2 — no lock screen left over on a dead link */\n      files.value = [];\n      emit('error', { message: e, context: { path } });\n      return;\n    }\n    // Real failure (network, 5xx). Never swallowed: the error still emits, and\n    // it surfaces either as the retryable error state (nothing else on screen)\n    // or as the classic toast over the still-visible previous listing.\n    loadError.value = e;\n    loadErrorPath = typeof requested === 'string' ? requested : undefined;\n    emit('error', { message: e, context: { path } });\n    if (files.value.length > 0) flashToast(e);\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction stripAdapter(p: string): string {\n  const idx = p.indexOf('://');\n  return idx === -1 ? p : p.slice(idx + 3);\n}\n\n// \"Go to root\" escape hatch on the not-found state. load('') clamps to the\n// confined rootFloor on embeds, so this is safe everywhere.\nfunction leaveNotFound() {\n  notFoundPath.value = '';\n  // Cold-load on a dead deep link: currentPath is still '' (the 404 never\n  // committed it), so navigating to root doesn't change it and the\n  // watch(currentPath) persistence never fires — the dead hash would\n  // survive and a reload would land on the 404 again. Clear it explicitly;\n  // if load('') clamps to a confined floor path, the watch fires with the\n  // new path and rewrites the hash correctly anyway.\n  writePersistedPath('');\n  void load('');\n}\n\n// (hydrateTrashRow moved to lib/listing.ts — shared with SecondaryPane.)\n\n// loadTrash — show the backend trash (soft-deleted nodes) as a flat listing.\n// Entered by opening the virtual `.trash` row. Each row keeps its node `id`\n// so restore can target it. Permanent delete is admin-only / auto-purge, so\n// the only mutation offered here is Restore.\n/* === tablo:t1 — the trash banner ======================================\n *\n * The reference build draws, above the listing: what the trash IS, and the one\n * irreversible action. We had neither — and the second half is a real\n * regression rather than a missing decoration, because the only \"Empty trash\"\n * in the whole repo is on the admin page `web/src/views/Trash.vue`, reached\n * from the admin panel's own sidebar. An end user, who never sees the admin\n * panel, had no way to empty their own trash at all.\n *\n * ⚠⚠ RETENTION IS A CLAIM, NOT A DECORATION. The reference says \"30 days\";\n * ours must say what THIS deployment actually does, and `trash.retention_days`\n * is a setting an operator changes. A banner stating the wrong number is worse\n * than no banner, because people act on it — they leave something in the\n * trash believing they have a month. So the number is asked for, and when the\n * answer does not come the wording drops the period instead of guessing one.\n *\n * ⚠⚠ ONE PROBE ANSWERS BOTH QUESTIONS. `GET /api/admin/protection` carries\n * the real retention and is refused to anyone who is not an operator — and\n * `POST /api/admin/trash/empty` is gated on exactly the same thing. So its\n * status code tells us the number AND whether this caller may empty anything,\n * without a UI-side role check. That matters here: this file's own rule is\n * that the BACKEND decides what a caller may see (see the note on\n * `connections` in ExplorerConfig), and a client-side `role === \"admin\"` would\n * be us guessing at an answer the server is willing to give.\n */\nconst trashRetentionDays = ref<number | null>(null);\n/** True only when the server has confirmed this caller may purge. */\nconst trashCanEmpty = ref(false);\nconst trashEmptying = ref(false);\nconst showTrashConfirm = ref(false);\n\nasync function probeTrashPolicy() {\n  trashRetentionDays.value = null;\n  trashCanEmpty.value = false;\n  try {\n    const res = await fetch(`${props.config.apiBase ?? ''}/api/admin/protection`, {\n      headers: await buildAuthHeaders(),\n      credentials: api.credentialsMode(),\n    });\n    /* ⚠ A 403 is the ANSWER \"you are not an operator\", not a failure: it is\n     * the ordinary case for every end user, and it must not reach the error\n     * emitter or the toast. */\n    if (!res.ok) return;\n    const body = (await res.json()) as { trash_retention_days?: unknown };\n    const d = body?.trash_retention_days;\n    if (typeof d === 'number' && d > 0) trashRetentionDays.value = d;\n    trashCanEmpty.value = true;\n  } catch {\n    /* offline / CORS — same as \"not allowed\": say nothing we cannot verify */\n  }\n}\n\n/** What the banner promises. Named the number, or explicitly not. */\nconst trashBannerText = computed(() =>\n  trashRetentionDays.value !== null\n    ? t('trash.retention', { days: trashRetentionDays.value })\n    : t('trash.retention_unknown'),\n);\n\n/** How much is about to go. The confirmation names both, because \"empty the\n *  trash?\" with no quantity is a question nobody can answer. */\nconst trashTotalBytes = computed(() =>\n  files.value.reduce((sum, n) => {\n    const v = typeof n.size === 'number' ? n.size : (n as Record<string, unknown>).file_size;\n    return sum + (typeof v === 'number' ? v : 0);\n  }, 0),\n);\n/** ⚠ A total of zero is reported as \"we do not know\", not as \"0 B\". A server\n *  that does not send sizes would otherwise have us telling somebody that\n *  deleting their files frees nothing, on the last screen before it happens.\n *  A genuinely empty set never reaches here — the button is disabled. */\nconst trashSizeKnown = computed(() => trashTotalBytes.value > 0);\n/** Which sentence the confirmation uses: with or without a size. Singular or\n *  plural is `t()`'s business (composables/useLocale → countedKey). */\nconst trashConfirmKey = computed(() =>\n  trashSizeKnown.value ? 'trash.empty_confirm_body' : 'trash.empty_confirm_body_nosize',\n);\n\nasync function emptyTrash() {\n  showTrashConfirm.value = false;\n  if (!trashCanEmpty.value || trashEmptying.value) return;\n  trashEmptying.value = true;\n  try {\n    const res = await fetch(`${props.config.apiBase ?? ''}/api/admin/trash/empty`, {\n      method: 'POST',\n      headers: await buildAuthHeaders(),\n      credentials: api.credentialsMode(),\n    });\n    if (!res.ok) throw new Error(String(res.status));\n    await loadTrash();\n    flashToast(t('trash.emptied'));\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    emit('error', { message: msg, context: { op: 'trash:empty' } });\n    flashToast(msg);\n  } finally {\n    trashEmptying.value = false;\n  }\n}\n\nasync function loadTrash() {\n  loading.value = true;\n  trashOrigin.value = adapter.value || '';\n  trashMode.value = true;\n  e2eRoot.value = ''; /* wiring:e2 — the trash view is outside the encrypted context */\n  selection.clear();\n  try {\n    const { entries } = await api.listTrash();\n    files.value = entries.map(\n      (e) =>\n        ({\n          type: 'file',\n          id: e.id,\n          path: e.storage_name ? `${e.storage_name}://${e.path}` : e.path,\n          basename: e.name,\n          extension: e.name.includes('.') ? e.name.split('.').pop() || '' : '',\n          storage: e.storage_name || '',\n          visibility: 'private',\n          /* tablo:t1 — ⚠ BOTH. Every view reads `size` (the Size column, the\n             info panel, the empty-trash confirmation); only the upload code\n             reads `file_size`. Setting one of the two left every trashed row\n             with a blank Size cell and made \"this permanently deletes 2 items\n             (0 B)\" a false statement about two real files. */\n          size: e.size,\n          file_size: e.size,\n          mime_type: e.mime || '',\n          extra_metadata: { deleted_at: e.deleted_at, ttl_days: e.ttl_days ?? null },\n        }) as unknown as FileNode,\n    );\n    dirname.value = '.trash';\n    currentPath.value = '.trash';\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    emit('error', { message: msg, context: { op: 'trash-list' } });\n    flashToast(msg);\n  } finally {\n    loading.value = false;\n  }\n}\n\n/**\n * qualify — return `<adapter>://<rel>` for backend calls.\n *\n * The backend's manager handler picks a storage by parsing the\n * adapter prefix. Without one it falls back to `storages[0]`,\n * which 404s on every non-default storage (S3/SFTP/WebDAV in a\n * multi-storage install). All API callers (rename/move/delete/\n * upload/preview/download/share/copy) must use a qualified path.\n *\n * In multi-storage mode `currentPath` is `<storage>/<rel>` (no\n * `://`), so qualify forwards through `virtualToWire` which\n * splits the first segment off as the adapter. In single-storage\n * mode the legacy bare-relative path is glued onto `adapter.value`.\n *\n * `stripAdapter()` stays for cosmetic display logic only\n * (breadcrumb root check, inRoot computation, openPageBase).\n */\nfunction qualify(p: string): string {\n  if (p && p.includes('://')) return p;\n  if (multiStorageRoot.value) {\n    const wire = virtualToWire(p ?? '');\n    if (wire) return wire;\n    return adapter.value ? `${adapter.value}://` : '';\n  }\n  if (!p) return `${adapter.value}://`;\n  return `${adapter.value}://${p.replace(/^\\/+/, '')}`;\n}\n\n// ----------------------------------------------------------------\n// Undo helpers — compute the inverse of cleanly-invertible operations\n// (move → reverse move, rename → rename back, trash → restore). All\n// paths here are wire form (`<adapter>://<rel>`).\n// ----------------------------------------------------------------\n\nfunction wireBasename(p: string): string {\n  const idx = p.indexOf('://');\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? rel : rel.slice(slash + 1);\n}\n\nfunction wireParent(p: string): string {\n  const idx = p.indexOf('://');\n  const prefix = idx === -1 ? '' : p.slice(0, idx + 3);\n  const rel = (idx === -1 ? p : p.slice(idx + 3)).replace(/\\/+$/, '');\n  const slash = rel.lastIndexOf('/');\n  return slash === -1 ? prefix : prefix + rel.slice(0, slash);\n}\n\n/* ui-fix — do two wire paths point at the SAME directory (safe against a\n * trailing slash and against the bare `adapter://` root)? Dropping an item\n * into the folder it is ALREADY in (source parent === target) must be a\n * no-op; otherwise the backend answers with a \"copy onto itself\" 400. */\nfunction sameDir(a: string, b: string): boolean {\n  const norm = (s: string) => {\n    const i = s.indexOf('://');\n    const pre = i === -1 ? '' : s.slice(0, i + 3);\n    const rel = (i === -1 ? s : s.slice(i + 3)).replace(/\\/+$/, '');\n    return pre + rel;\n  };\n  return norm(a) === norm(b);\n}\n\nfunction wireJoin(dir: string, name: string): string {\n  if (!dir) return name;\n  return dir.endsWith('://') || dir.endsWith('/') ? dir + name : `${dir}/${name}`;\n}\n\n/**\n * Does anything in `targetWire` already carry the name of one of `sources`?\n * Asked BEFORE a move is queued, because the answer decides whether the move\n * can be undone.\n *\n * ⚠ The server never moves onto a taken name — it keeps both, and the moved\n * item lands as `name-copy` (ops.MoveDest). The undo moves `target/<name>`\n * back, so after a collision it would move the item that WAS ALREADY THERE.\n * A colliding move is therefore offered no undo, and says so.\n *\n * Case-insensitive, and \"could not list\" counts as a collision: both err on\n * the side of withholding an undo rather than offering one that moves the\n * wrong file.\n */\nasync function movedNamesCollide(sources: string[], targetWire: string): Promise<boolean> {\n  try {\n    const res = await api.index(targetWire);\n    const taken = new Set((res.files ?? []).map((f) => String(f.basename ?? '').toLowerCase()));\n    return sources.some((s) => taken.has(wireBasename(s).toLowerCase()));\n  } catch {\n    return true;\n  }\n}\n\n// Register the inverse of a queued async move under its op id: once the op\n// settles OK, the toast offers \"Geri Al\" which queues the reverse move. The\n// inverse op deliberately gets NO undo entry of its own (no redo ping-pong).\nfunction registerMoveUndo(\n  opId: number,\n  sources: string[],\n  targetWire: string,\n  originWire: string | undefined,\n  collides: boolean,\n) {\n  if (!originWire || !targetWire || collides) return;\n  const movedPaths = sources.map((p) => wireJoin(targetWire, wireBasename(p)));\n  if (movedPaths.length === 0) return;\n  opUndo.set(opId, {\n    message: t('toast.moved'),\n    fn: async () => {\n      const { op } = await api.moveAsync(movedPaths, originWire, targetWire);\n      pendingOps.register(op);\n    },\n  });\n}\n\nwatch(\n  () => searchQuery.value,\n  () => void load(),\n);\n\n// ----------------------------------------------------------------\n// Path persistence\n// ----------------------------------------------------------------\nconst PATH_LS_KEY = 'brf-file-explorer:path';\n\nfunction persistMode(): 'hash' | 'localStorage' | 'hash+localStorage' | 'none' {\n  return props.config.pathPersist ?? 'hash';\n}\n\nfunction hashPersistEnabled(): boolean {\n  const m = persistMode();\n  return m === 'hash' || m === 'hash+localStorage';\n}\n\n// A pasted/hand-edited hash can carry a stray `%` (a folder literally named\n// \"100%\") that decodeURIComponent rejects — fall back to the raw text.\nfunction safeDecode(s: string): string {\n  try {\n    return decodeURIComponent(s);\n  } catch {\n    return s;\n  }\n}\n\nfunction readLsPath(): string {\n  try {\n    return localStorage.getItem(PATH_LS_KEY) || '';\n  } catch {\n    return '';\n  }\n}\n\nfunction readHashPath(): string {\n  const h = window.location.hash || '';\n  if (!h.startsWith('#')) return '';\n  return safeDecode(h.slice(1)).replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction readPersistedPath(): string {\n  if (typeof window === 'undefined') return '';\n  const mode = persistMode();\n  if (mode === 'none') return '';\n  if (mode === 'localStorage') return readLsPath();\n  const fromHash = readHashPath();\n  if (fromHash || mode === 'hash') return fromHash;\n  // hash+localStorage with an empty hash: an explicit start path\n  // (?storage= deep link / rootPath floor) outranks the remembered folder.\n  if (initialFloorPath) return '';\n  return readLsPath();\n}\n\nfunction writePersistedPath(path: string) {\n  if (typeof window === 'undefined') return;\n  const mode = persistMode();\n  if (mode === 'none') return;\n  if (mode === 'localStorage' || mode === 'hash+localStorage') {\n    try {\n      if (path) localStorage.setItem(PATH_LS_KEY, path);\n      else localStorage.removeItem(PATH_LS_KEY);\n    } catch {\n      /* private mode / quota */\n    }\n    if (mode === 'localStorage') return;\n  }\n  // Encode per segment so folder names with `%`/`#`/`?` survive the URL\n  // round-trip while `/` separators stay readable.\n  const encoded = path ? path.split('/').map(encodeURIComponent).join('/') : '';\n  const target = encoded ? `#${encoded}` : '';\n  if ((window.location.hash || '') === target) return;\n  // replaceState never fires `hashchange`, so onHashChange only ever sees\n  // genuine external edits (paste, back/forward) — no self-echo to suppress.\n  //\n  // ⚠⚠ `history.state`, NEVER `null`. This mirrors the current folder into the\n  // hash, and it runs inside a host that may be a router-driven SPA: the admin\n  // app is vue-router, which keeps its own bookkeeping (scroll position, the\n  // position counter, `back`/`forward` links) in `history.state`. Passing\n  // `null` here erased it, vue-router warned\n  //   \"history.state seems to have been manually replaced without preserving\n  //    the necessary values\"\n  // and the NEXT navigation — into Home, or out to the admin panel — rendered\n  // a blank page. Measured 2026-09-13. Preserving the object costs nothing:\n  // the explorer has no state of its own to put there, only a URL to change.\n  history.replaceState(\n    history.state,\n    '',\n    target || window.location.pathname + window.location.search,\n  );\n}\n\nfunction onHashChange() {\n  if (!hashPersistEnabled()) return;\n  const p = readHashPath();\n  if (p && p !== currentPath.value) {\n    void load(p);\n  }\n}\n\nwatch(currentPath, (p) => {\n  writePersistedPath(p);\n  emit('navigate', { path: p });\n  realtime.subscribe(realtimeRoom(p));\n});\n\n// Let a host force a soft re-fetch of the current folder (reusing the existing\n// list-fetch) — used by the realtime layer to refresh on live change events\n// without a full component remount.\ndefineExpose({ reload: () => load() });\n\nonMounted(async () => {\n  // Eagerly start fetching Monaco — the user doesn't pay for it\n  // perceptually; click-to-edit hits an in-memory cache.\n  preloadEditor();\n\n  const fromPersist = readPersistedPath();\n  await load(fromPersist || undefined);\n  await nextTick();\n  rootEl.value?.focus();\n  // Best-effort initial fetch — silent if the older backend doesn't\n  // expose /api/files/manager/starred. Without this stars never light\n  // up on first render even when the row IS starred server-side.\n  void loadStarred();\n  /* gezinti:g1 — which storages are grant-only, so the panel can mark them\n     before anybody opens the shared view. */\n  void loadSharedStorages();\n  /* etiket:t1 — the panel's tag list. AFTER the first listing has been\n     awaited above, never racing it: `tags/all` is a distinct-scan and the\n     folder the user asked for is the only thing on the critical path. The\n     module-level cache in lib/tags.ts means several explorers on one page\n     still cost a single query. */\n  void loadNavTags();\n  /* surucu:d1 — the storage line. After the listing, like the tag list: it is\n     a status, and the folder somebody asked for is the critical path. */\n  void loadQuota();\n  /* ⚠ The panel is not always on screen at mount. Below 560px it is a DRAWER\n     that starts closed, so `navVisible` is false and the call above returns\n     without asking for anything — measured at 390px: the drawer opened with\n     no Tags section at all. Ask again the first time the panel appears.\n     ⚠ Registered HERE and not beside loadNavTags: `watch` evaluates its\n     source immediately, `navVisible` reads `isNarrow`, and `isNarrow` is\n     declared further down the file — so a watcher created at setup time threw\n     \"Cannot access 'isNarrow' before initialization\" and took the whole\n     explorer down with it (measured: blank pane, two TDZ errors in the\n     console). In onMounted every ref exists. */\n  watch(navVisible, (visible) => {\n    if (visible && !navTagsLoaded.value) void loadNavTags();\n  });\n  if (hashPersistEnabled()) {\n    window.addEventListener('hashchange', onHashChange);\n  }\n  if (api.endpoints.opsList) {\n    pendingOps.startPolling();\n  }\n  if (api.endpoints.capabilities) {\n    api\n      .capabilities()\n      .then((cap) => {\n        capabilitiesData.value = cap;\n      })\n      .catch(() => {\n        /* swallow — `onlyoffice_url` falls back to null */\n      });\n  }\n});\n\n// --------------------------------------------------------------------\n// Keyboard\n// --------------------------------------------------------------------\n\n/* cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) state */\nconst showPalette = ref(false);\nconst showShortcutsHelp = ref(false);\n/* /cila:c wiring */\n\n/* bul:s3 — palette \"everywhere\" search + open-hit navigation */\n\n// Debounce/min-chars live in the palette; this is just the API call.\nfunction paletteGlobalSearch(q: string): Promise<GlobalSearchHit[]> {\n  return api.globalSearch(q, { limit: 8, scope: 'all' });\n}\n\n/**\n * Open a global-search hit: navigate to the file's folder, then select +\n * preview it through the existing openNode mechanics. Hits come back as raw\n * node rows (in-storage relative `path`, numeric `storage_id`), so the\n * storage segment for multi-storage mode is resolved best-effort: an\n * explicit name on the hit (future backends) > the only configured storage\n * > the storage currently open. A wrong guess lands on the existing\n * \"folder not found\" state, which is already a graceful dead-end.\n */\nasync function openSearchHit(hit: GlobalSearchHit) {\n  const rel = String(hit.path ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!rel) return;\n  const isDir = hit.type === 'dir';\n  const slash = rel.lastIndexOf('/');\n  const targetRel = isDir ? rel : slash === -1 ? '' : rel.slice(0, slash);\n  let target = targetRel;\n  if (multiStorageRoot.value) {\n    const configured = props.config.storages ?? [];\n    const storageName =\n      (typeof hit.storage === 'string' && hit.storage) ||\n      (typeof hit.storage_name === 'string' && hit.storage_name) ||\n      (configured.length === 1 ? configured[0].name : '') ||\n      adapter.value;\n    if (!storageName) return;\n    target = targetRel ? `${storageName}/${targetRel}` : storageName;\n  }\n  await load(target);\n  if (isDir) return;\n  const name = String(hit.name ?? rel.slice(slash + 1));\n  const node = files.value.find((f) => f.type === 'file' && f.basename === name);\n  if (node) {\n    selection.click(node.path);\n    openNode(node);\n  }\n}\n/* /bul:s3 */\n\nuseKeyboardShortcuts(rootEl, {\n  onDelete: () => {\n    /* ui-fix — the shortcut goes to the active pane too (consistent with the menu). */\n    if (paneIsActive.value) {\n      const psel = splitSelection.nodes.value;\n      if (psel.length) {\n        paneCtxTargets.value = psel;\n        mutationInPane.value = true;\n        showDelete.value = true;\n      }\n    } else if (!selection.isEmpty.value) {\n      mutationInPane.value = false;\n      showDelete.value = true;\n    }\n  },\n  onRename: () => {\n    if (paneIsActive.value) {\n      const psel = splitSelection.nodes.value;\n      if (psel.length === 1) {\n        renameTarget.value = psel[0];\n        mutationInPane.value = true;\n        showRename.value = true;\n      }\n    } else if (selection.nodes.value.length === 1) {\n      renameTarget.value = selection.nodes.value[0];\n      mutationInPane.value = false;\n      showRename.value = true;\n    }\n  },\n  onSelectAll: () => (paneIsActive.value ? splitSelection.selectAll() : selection.selectAll()) /* wiring:d1 pane-route */,\n  onOpen: () => {\n    /* wiring:d1 pane-route — one `openNode`, whichever pane asked. A folder\n       opens IN the pane that had the keyboard; a file opens in the preview,\n       which is the window's, so there is nothing to route. */\n    if (paneIsActive.value) {\n      const pn = splitSelection.nodes.value[0];\n      if (pn) onPaneOpen('split', pn);\n      return;\n    }\n    const n = selection.nodes.value[0];\n    if (n) openNode(n);\n  },\n  onClose: () => {\n    showNewFolder.value = false;\n    showRename.value = false;\n    showDelete.value = false;\n    showPreview.value = false;\n    ctxRef.value?.hide();\n    dismissToast();\n    /* gezinti:g1 — an open Connections / API-keys overlay is the topmost thing\n       on screen, so Esc dismisses that before anything under it. */\n    if (anyOverlayOpen.value) {\n      closeOverlays();\n      return;\n    }\n    /* gezinti:g1 — Esc closes the navigation drawer first. It is the topmost\n       thing on a narrow screen, so dismissing something underneath it while it\n       covers the listing reads as Esc doing nothing. */\n    if (navDrawerOpen.value) {\n      closeNavDrawer();\n      return;\n    }\n    /* koru:k1 — Esc closes the narrow-mode inspector overlay only; the wide\n       side panel is a persistent surface toggled by `i` / the toolbar. */\n    if (isNarrow.value) closeInspector();\n  },\n  onFocusSearch: () => toolbarRef.value?.focusSearch(),\n  onCut: () => (paneIsActive.value ? paneCut() : cut()) /* wiring:d1 pane-route */,\n  onCopy: () => (paneIsActive.value ? paneCopy() : copyToClipboard()) /* wiring:d1 pane-route */,\n  onPaste: () => (paneIsActive.value ? void panePaste() : void paste()) /* wiring:d1 pane-route */,\n  onGoUp: () => (paneIsActive.value ? splitPaneRef.value?.goUp() : goUp()) /* wiring:d1 pane-route */,\n  /* cila:c wiring */\n  onPathJump: () => {\n    /* surucu:d1 — the shortcut from anywhere else opens a BLANK palette. The\n       seed belongs to the drive header's field; leaving the last one in place\n       would reopen the palette pre-filled with a query the user has since\n       moved on from. */\n    paletteSeed.value = '';\n    showPalette.value = true;\n  },\n  onShowHelp: () => {\n    showShortcutsHelp.value = true;\n  },\n  /* /cila:c wiring */\n  onQuickLook: () => quickLookToggle() /* wiring:c2 */,\n  onToggleHidden: () => toggleHiddenFiles(),\n  onStar: () => void toggleStar(selection.nodes.value) /* yildiz:s1 */,\n  onToggleInspector: () => toggleInspector() /* koru:k1 */,\n  /* wiring:d1 — tab actions (registry: tab-new/close/next/prev) */\n  onTabNew: () => newTabHere(),\n  onTabClose: () => closeTabById(tabsActiveId.value),\n  onTabNext: () => nextTab(),\n  onTabPrev: () => prevTab(),\n  /* /wiring:d1 */\n  /* tus:t1 — the menu verbs, routed through the SAME dispatcher the right-click\n   * menu and the toolbar use (dispatchItemAction), so a key and a click cannot\n   * drift apart. The ones that act on a selection do nothing without one, which\n   * is what the menu does too. */\n  onNewFolder: () => {\n    showNewFolder.value = true;\n  },\n  onUpload: () => triggerUpload(),\n  onRefresh: () => void load(),\n  onDownload: () => void dispatchItemAction('download', activeTargets()),\n  onPreview: () => void dispatchItemAction('preview', activeTargets()),\n  onShare: () => void dispatchItemAction('access', activeTargets()),\n  onTags: () => void dispatchItemAction('tags', activeTargets()),\n  onConvert: () => void dispatchItemAction('convert', activeTargets()),\n  onOpenTab: () => void dispatchItemAction('open-tab', activeTargets()),\n  onCopyPath: () => {\n    const n = activeTargets()[0];\n    if (n) void onCopyPath(n.path);\n  },\n  onCopyId: () => void dispatchItemAction('copy-id', activeTargets()),\n  onRestore: () => void dispatchItemAction('restore', activeTargets()),\n  /* /tus:t1 */\n  hasSelection: () => !selection.isEmpty.value,\n});\n\n/**\n * tus:t1 / pane:p1 — THE rows a verb acts on, whoever asked for it.\n *\n * The active pane's selection when the split pane has focus, otherwise the\n * main listing's. It began as the keyboard's rule (hence tus:t1) and it is now\n * everybody's: the keyboard shortcuts, the selection bar's count and mode, the\n * action list the bar renders and the handler it dispatches through all read\n * this one function.\n *\n * ⚠ Measured 2026-09-13, before that was true: the toolbar read\n * `selection.nodes` directly, so ticking rows in the RIGHT pane raised no bar\n * at all while the LEFT pane's bar went on describing a selection nobody was\n * touching. Two answers to \"what is selected\" is how that happens; there is\n * one now.\n */\nfunction activeTargets(): FileNode[] {\n  if (paneIsActive.value) return splitSelection.nodes.value;\n  return selection.nodes.value;\n}\n\n// --------------------------------------------------------------------\n// Actions\n// --------------------------------------------------------------------\n\nconst OFFICE_EXTS = new Set([\n  'docx', 'xlsx', 'pptx',\n  'doc', 'xls', 'ppt',\n  'odt', 'ods', 'odp',\n]);\nconst TEXT_CODE_EXTS = new Set([\n  'txt', 'md', 'markdown', 'log', 'csv', 'tsv', 'conf', 'ini',\n  'env', 'toml', 'cfg',\n  'json', 'jsonc', 'yaml', 'yml', 'xml', 'svg',\n  'js', 'mjs', 'cjs', 'ts', 'tsx', 'jsx',\n  'css', 'scss', 'sass', 'less',\n  'html', 'htm', 'vue', 'svelte',\n  'php', 'py', 'rb', 'rs', 'go', 'java', 'kt', 'swift',\n  'cpp', 'c', 'h', 'hpp', 'cs', 'dart',\n  'sh', 'bash', 'zsh', 'sql', 'lua', 'pl', 'r',\n  'dockerfile', 'gradle', 'gitignore',\n]);\n\nfunction openNode(n: FileNode) {\n  // The virtual `.trash` row opens the backend trash listing, not a real dir.\n  if (n.basename === '.trash') {\n    void loadTrash();\n    return;\n  }\n  if (n.type === 'dir') {\n    // Multi-storage virtual rows have a bare path (`s3-test`); pass\n    // them straight to load() which will treat them as the wire form\n    // for that storage's root. Real backend rows still come back as\n    // `<adapter>://<rel>` and stripAdapter turns them into the user\n    // path semantics load() expects.\n    const target = multiStorageRoot.value\n      ? wireToVirtual(n.path)\n      : stripAdapter(n.path);\n    void load(target);\n    return;\n  }\n  /* wiring:e2 — opening a file inside an encrypted folder: while unlocked,\n     decrypt + show a read-only preview (the blob URL feeds the existing\n     viewers); while locked nothing opens at all (the lock screen already\n     hides the listing). */\n  if (e2eUnlocked.value && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  if (e2eLocked.value && n.type === 'file') return;\n  /* /wiring:e2 */\n  // Host-owned open (desktop app): a file opens in the host's OWN window per\n  // document, not in the in-page overlay. Emit and stop — the host listens on\n  // `file-opened` and spawns the window. Directories still navigate inline\n  // (handled above); Space quick-look still peeks in-page. E2E files fell into\n  // the decrypted in-page branch above, so a host window never gets ciphertext.\n  if (props.config.openInHost && n.type === 'file') {\n    emit('file-opened', { path: n.path, basename: n.basename });\n    void markRecent(n);\n    return;\n  }\n  // \"Aç\" / double-click contract: open in a new tab against the\n  // standalone editor route, regardless of file type. The editor page\n  // picks the right viewer (OnlyOffice for office, Monaco for code/\n  // text, drawio iframe for .drawio, image/PDF/3D viewers otherwise)\n  // and wires save-on-change. This is the shape brf-mono ships and\n  // what users expect from a Files-style file manager.\n  //\n  // Capability gate: if we already know the required backend is offline\n  // (OnlyOffice for office docs, drawio for diagrams), don't launch a\n  // new tab that we'd just render a \"service not configured\" fallback\n  // inside — drop into the in-page preview instead, which is the same\n  // dead-end UI but without the tab-switching whiplash.\n  // Double-click contract: in-page modal preview. Office docs and\n  // other read-only kinds open in view mode so a quick peek doesn't\n  // mount an editing surface on top of the content. Code/markdown\n  // open in edit so the user gets the fast \"open, tweak, Ctrl+S\"\n  // loop. Modal's \"Yeni sekmede aç\" button still launches the\n  // standalone fullscreen editor route when richer editing is wanted.\n  const ext = (n.extension || '').toLowerCase();\n  // RBAC: viewers (no edit on this item) always get the read-only preview\n  // modal — never the editable surface. This is the \"view vs edit\" split.\n  previewMode.value = nodeCanEdit(n)\n    ? previewModeForExt(ext)\n    : 'view';\n  previewTarget.value = n;\n  showPreview.value = true;\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\nconst VIEW_DEFAULT_EXTS = new Set<string>([\n  ...OFFICE_EXTS,\n  'drawio', 'dio',\n  'pdf', 'epub', 'ipynb', 'tiff', 'tif', 'psd',\n  'mmd', 'mermaid',\n  'glb', 'gltf', 'obj', 'stl', 'fbx', '3ds',\n  'zip', 'rar', '7z', 'tar', 'gz', 'tgz',\n  'jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'avif', 'svg', 'heic',\n  'mp4', 'webm', 'mov', 'mkv', 'm4v', 'ogv',\n  'mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus',\n]);\n\nfunction previewModeForExt(ext: string): 'view' | 'edit' {\n  if (VIEW_DEFAULT_EXTS.has(ext)) return 'view';\n  return 'edit';\n}\n\nasync function restoreSelection(targets?: FileNode[]) {\n  const nodes = targets ?? selection.nodes.value;\n  if (nodes.length === 0) return;\n  try {\n    // filex trash: restore by node id, then refresh the trash listing.\n    if (trashMode.value) {\n      const ids = nodes\n        .map((n) => (n as { id?: number }).id)\n        .filter((x): x is number => typeof x === 'number');\n      const { restored, taken } = await api.restoreIds(ids);\n      flashToast(\n        taken.length\n          ? t('toast.restore_taken', { n: taken.length, name: taken[0] })\n          : t('toast.restored', { n: restored }),\n      );\n      selection.clear();\n      await loadTrash();\n      return;\n    }\n    // Legacy path-based restore (brf-mono `.trash/` convention).\n    if (!api.endpoints.restore) return;\n    const items = nodes.map((n) => n.path); // qualified\n    const { restored } = await api.restore(items);\n    flashToast(t('toast.restored', { n: restored }));\n    selection.clear();\n    await load();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'restore' } });\n  }\n}\n\nfunction previewNode(n: FileNode) {\n  /* wiring:e2 — the preview is fed from the decrypted blob as well */\n  if (e2eUnlocked.value && n.type === 'file') {\n    void e2eOpenPreview(n);\n    return;\n  }\n  /* /wiring:e2 */\n  previewMode.value = 'view';\n  previewTarget.value = n;\n  showPreview.value = true;\n  void markRecent(n);\n}\n\n/**\n * openNodeInNewTab — launches the standalone /files/edit route in a\n * fresh tab. Used by the context-menu \"Aç\" action; double-click stays\n * on the in-page modal path. Dirs still navigate inline (no editor for\n * directories). Falls back to the modal if no `openPageBase` is wired\n * by the embedder.\n */\nfunction openNodeInNewTab(n: FileNode) {\n  if (n.type === 'dir') {\n    const target = multiStorageRoot.value\n      ? wireToVirtual(n.path)\n      : stripAdapter(n.path);\n    void load(target);\n    return;\n  }\n  /* wiring:e2 — the standalone editor route pulls the RAW (encrypted) bytes\n     from the server, so inside an encrypted folder every \"Aç\" falls back to\n     the in-page decrypted preview. */\n  if (e2eActive.value) {\n    if (e2eUnlocked.value) void e2eOpenPreview(n);\n    return;\n  }\n  /* /wiring:e2 */\n  // Host-owned open (desktop): the context-menu \"Aç\" opens the host window\n  // too, so Enter/double-click/\"Aç\" are ONE open path — not a window here and\n  // a system-browser tab there. openNode carries the `file-opened` emit.\n  if (props.config.openInHost) {\n    openNode(n);\n    return;\n  }\n  // RBAC: a viewer (no edit on this item) can't use the editable \"Aç\"\n  // surface — drop to the read-only in-page preview instead.\n  if (!nodeCanEdit(n)) {\n    previewNode(n);\n    return;\n  }\n  const ext = (n.extension || '').toLowerCase();\n  const base = props.config.openPageBase;\n  if (!base) {\n    // Embedder didn't supply a standalone editor route — keep the\n    // in-page modal as the only available affordance.\n    openNode(n);\n    return;\n  }\n  // Context-menu \"Aç\" is the intent-to-edit action — request edit\n  // mode so OnlyOffice / Monaco mount with write permissions.\n  // Read-only inspection lives on the \"Önizle\" entry + the dbl-click\n  // in-page modal.\n  const abs = absolutePageUrl(base);\n  const sep = abs.includes('?') ? '&' : '?';\n  const url =\n    `${abs}${sep}path=${encodeURIComponent(n.path)}` +\n    `&type=${encodeURIComponent(ext)}` +\n    `&mode=edit`;\n  window.open(url, '_blank', 'noopener');\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\ntype ContextMode = 'selection' | 'breadcrumb' | 'pane' /* ui-fix — side-pane right-click */;\nconst ctxMode = ref<ContextMode>('selection');\nconst breadcrumbCtxPath = ref<string>('');\n/* ui-fix — target nodes of the side pane's right-click menu (pane selection). */\nconst paneCtxTargets = ref<FileNode[]>([]);\nconst breadcrumbCtxLabel = ref<string>('');\n\n/* pane:p1 — `activeTargets()`, not `selection`: the bar describes the pane the\n * keyboard is in. See the function's own note for what reading `selection`\n * directly here used to cost. */\nconst selectionMode = computed<SelectionMode>(() => {\n  const sel = activeTargets();\n  if (sel.length === 0) return 'none';\n  if (sel.length === 1) return sel[0].type === 'dir' ? 'single-dir' : 'single-file';\n  return 'multi';\n});\n\nasync function onToolbarAction(key: string) {\n  const sel = activeTargets();\n  // The toolbar's \"Aç\" opens the in-page preview/editor modal (quick peek);\n  // everything else shares dispatchItemAction with the context menu so the two\n  // identical menus also behave identically.\n  if (key === 'open') {\n    if (sel[0]) openNode(sel[0]);\n    return;\n  }\n  await dispatchItemAction(key, sel);\n}\n\n// ─── desktop selective sync — \"keep on this computer\" ──────────────────\n// Present only when the desktop shell passes config.desktopSync; the web\n// admin and the embeds never see these entries. State is PULLED, not pushed:\n// the kept list is re-read as a menu opens, so the component needs no event\n// channel back to the shell and cannot go stale in a way that outlives one\n// right-click.\nconst desktopSync = computed(() => props.config.desktopSync ?? null);\nconst keptPairs = ref<Array<{ remote: string; local: string }>>([]);\n\nasync function refreshKept(): Promise<void> {\n  if (!desktopSync.value) return;\n  try {\n    keptPairs.value = await desktopSync.value.kept();\n  } catch {\n    // Shell went away mid-call; a stale entry only mislabels a menu item.\n  }\n}\n\n/** The folder the engine is working on RIGHT NOW (null between runs). Drives\n *  the ⟳ row badges and the bottom progress strip. */\nconst keepActive = ref<{\n  remote: string;\n  phase: 'inventory' | 'plan' | 'transfer' | 'settling';\n  done: number;\n  total: number;\n} | null>(null);\n\nasync function refreshKeepStatus(): Promise<void> {\n  const ds = desktopSync.value;\n  if (!ds?.status) return;\n  try {\n    keepActive.value = (await ds.status()).active ?? null;\n  } catch {\n    keepActive.value = null;\n  }\n}\n\n// The shell pokes on every engine output line — during a transfer that can be\n// several a second, and each refresh is an IPC round-trip. Trailing-edge\n// throttle: at most one refresh per 300ms, and the FINAL poke always lands,\n// so the strip cannot get stuck showing a finished transfer.\nlet keepPokeTimer: ReturnType<typeof setTimeout> | null = null;\n// The shell holds the callback and only drops it on the NEXT mount, so a poke\n// can arrive after this instance is gone — pokes then set refs nothing reads.\n// Cheap to make explicit rather than rely on that being harmless.\nlet keepAlive = true;\nfunction onKeepPoke(): void {\n  if (keepPokeTimer || !keepAlive) return;\n  keepPokeTimer = setTimeout(() => {\n    keepPokeTimer = null;\n    if (!keepAlive) return;\n    void refreshKeepStatus();\n    void refreshKept();\n  }, 300);\n}\n\nonMounted(() => {\n  void refreshKept();\n  void refreshKeepStatus();\n  desktopSync.value?.onChange?.(onKeepPoke);\n});\nonBeforeUnmount(() => {\n  keepAlive = false;\n  if (keepPokeTimer) {\n    clearTimeout(keepPokeTimer);\n    keepPokeTimer = null;\n  }\n});\n\n/** Adapter-qualified remote for a row. Virtual storage rows carry a bare\n *  name (`docs`), real rows a wire path (`docs://reports`). */\nfunction keepRemoteOf(node: FileNode): string {\n  const p = String(node.path ?? '');\n  return p.includes('://') ? p.replace(/\\/+$/, '') : `${p}://`;\n}\n\ntype KeepState = 'none' | 'kept' | 'inherited' | 'partial';\n\n/** True when `child` lives strictly inside `parent` (both wire-form). */\nfunction remoteInside(child: string, parent: string): boolean {\n  if (parent.endsWith('://')) return child.startsWith(parent) && child !== parent;\n  return child === parent ? false : child.startsWith(parent + '/');\n}\n\n/** How `remote` relates to the kept set: exactly a pair, inside one\n *  (inherited), an ancestor of some (partial), or unrelated. */\nfunction keepStateOf(remote: string): KeepState {\n  if (keptPairs.value.some((p) => p.remote === remote)) return 'kept';\n  if (keptPairs.value.some((p) => remoteInside(remote, p.remote))) return 'inherited';\n  if (keptPairs.value.some((p) => remoteInside(p.remote, remote))) return 'partial';\n  return 'none';\n}\n\ntype KeepBadge = 'kept' | 'syncing' | 'cloud' | 'partial';\n\n/**\n * The availability badge for one row: on this computer, being synced right\n * now, holding kept items somewhere below (partial), or online-only. Every\n * row gets one — that is the OneDrive/Drive grammar people already read —\n * except the rows where it would be a lie or noise: trash, and the `.trash`\n * row itself. `partial` is what saves the user from drilling into every\n * folder to find out whether anything inside is on this computer.\n */\nfunction keepBadgeFor(n: FileNode): KeepBadge | null {\n  if (!desktopSync.value || trashActive.value) return null;\n  if (n.basename === '.trash') return null;\n  const r = keepRemoteOf(n);\n  const act = keepActive.value;\n  if (act && (r === act.remote || remoteInside(r, act.remote) || remoteInside(act.remote, r))) {\n    return 'syncing';\n  }\n  const st = keepStateOf(r);\n  if (st === 'kept' || st === 'inherited') return 'kept';\n  if (st === 'partial') return 'partial';\n  return 'cloud';\n}\n\n/** Bottom strip: what to say while the engine works. */\nconst keepStripLabel = computed<string>(() => {\n  const act = keepActive.value;\n  if (!act) return '';\n  const name = act.remote.endsWith('://')\n    ? act.remote.slice(0, -'://'.length)\n    : act.remote.slice(act.remote.lastIndexOf('/') + 1);\n  if (act.phase === 'transfer' && act.total > 0) {\n    return t('keep.strip_transfer', {\n      name,\n      done: String(act.done),\n      total: String(act.total),\n      pct: String(Math.min(100, Math.round((act.done * 100) / act.total))),\n    });\n  }\n  if (act.phase === 'settling') return t('keep.strip_settling', { name });\n  return t('keep.strip_inventory', { name });\n});\n\nconst keepStripPercent = computed<number | null>(() => {\n  const act = keepActive.value;\n  if (!act || act.phase !== 'transfer' || act.total <= 0) return null;\n  return Math.min(100, Math.round((act.done * 100) / act.total));\n});\n\n/** Menu entries for one selected folder OR file, by its keep state. Empty\n *  for multi-selections, trash, encrypted folders, or a web mount. */\nfunction keepActionsFor(sel: FileNode[]): ContextAction[] {\n  const ds = desktopSync.value;\n  const single = sel.length === 1 && (sel[0]?.type === 'dir' || sel[0]?.type === 'file');\n  if (!ds || !single || trashActive.value || e2eActive.value || sel[0]?.e2e === true) return [];\n  const st = keepStateOf(keepRemoteOf(sel[0]!));\n  return [\n    { divider: true, key: 'sep-keep', label: '' },\n    { key: 'keep-local', label: t('ctx.keep_local'), hidden: st === 'kept' || st === 'inherited' },\n    { key: 'keep-online', label: t('ctx.keep_online'), hidden: st !== 'kept' },\n    { key: 'keep-inherited', label: t('ctx.keep_inherited'), disabled: true, hidden: st !== 'inherited' },\n    { key: 'keep-reveal', label: t('ctx.keep_reveal'), hidden: st !== 'kept' && st !== 'inherited' },\n  ];\n}\n\n/**\n * The context target when it is NOT part of this pane's listing.\n *\n * Home's Recent and Starred cards are the only rows in the product that a\n * person can right-click without them being in `files` — they come from their\n * own endpoints. `selection.nodes` can never resolve them (it filters the\n * listing by selected path), so without this the menu is built from an empty\n * selection and renders the blank-canvas menu. Empty in every other case, so\n * the ordinary selection path is unaffected.\n */\nconst ctxUnlistedTargets = ref<FileNode[]>([]);\n\nasync function onContextTarget(node: FileNode, ev: MouseEvent) {\n  ctxMode.value = 'selection';\n  void refreshKept(); // menu labels react if the kept set changed since last look\n  if (!selection.has(node.path)) {\n    selection.click(node.path);\n    await nextTick();\n  }\n  // ⚠⚠ Fall back to the node that was actually clicked.\n  //\n  // `selection.nodes` is the CURRENT LISTING filtered by the selected paths\n  // (`useSelection(() => displayOrder ?? files)`), so it can only ever resolve\n  // a row that is in this pane's listing. Home is not a listing: its Recent\n  // and Starred cards come from their own endpoints and are absent from\n  // `files`, so selecting one left `selection.nodes` EMPTY and the menu opened\n  // with zero targets — which is the signature of a right-click on blank\n  // canvas. Measured 2026-09-13: the ⋮ and the right-click on every Home card\n  // opened a one-line \"Show hidden files\" menu instead of the fifteen-line\n  // file menu, in both Recent and Starred. HomeView's own header says these\n  // cards carry \"the same right-click menu as the listing\", so this is the\n  // contract being restored, not a new behaviour.\n  //\n  // In a real listing `selection.nodes` is non-empty by the line above, so\n  // multi-selection is untouched — this only rescues the case where the path\n  // cannot be resolved against the current pane.\n  //\n  // ⚠ BOTH halves are needed. `show()` decides what the chosen action RUNS on;\n  // `contextActions` decides what the menu LISTS, and it reads\n  // `selection.nodes` on its own. Setting only the first left the actions\n  // correct and the menu still empty, which looks identical to the bug.\n  ctxUnlistedTargets.value = selection.nodes.value.length ? [] : [node];\n  const targets = selection.nodes.value.length ? selection.nodes.value : [node];\n  ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, targets);\n}\n\nfunction onContextCanvas(ev: MouseEvent) {\n  ev.preventDefault();\n  ctxMode.value = 'selection';\n  selection.clear();\n  // Blank canvas has no target — drop any node left over from a card menu, or\n  // the next right-click on empty space would offer that file's actions.\n  ctxUnlistedTargets.value = [];\n  ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, []);\n}\n\nfunction onCrumbContext(payload: { x: number; y: number; adapterPath: string; label: string }) {\n  ctxMode.value = 'breadcrumb';\n  breadcrumbCtxPath.value = payload.adapterPath;\n  breadcrumbCtxLabel.value = payload.label;\n  ctxRef.value?.show({ clientX: payload.x, clientY: payload.y }, []);\n}\n\n/**\n * pane:p1 — right-click in EITHER pane, through one door.\n *\n * The menu itself was already single-source (`selectionActionList`); this is\n * the other half — the two panes no longer reach it through two different\n * handlers, so a change to how a right-click picks its targets cannot land in\n * one pane and miss the other. `node === null` is a right-click on empty\n * space: the selection-less menu (\"New folder\" + \"Paste\").\n */\nasync function onPaneMenu(pane: 'main' | 'split', node: FileNode | null, ev: MouseEvent) {\n  void refreshKept(); // menu labels react if the kept set changed since last look\n  if (pane === 'split') {\n    activePane.value = 'split';\n    const sel = splitSelection.nodes.value;\n    if (node && !splitSelection.has(node.path)) {\n      splitSelection.click(node.path);\n      await nextTick();\n    }\n    const after = splitSelection.nodes.value;\n    paneCtxTargets.value = node ? (after.length > 0 ? after : (sel.length > 0 ? sel : [node])) : [];\n    ctxMode.value = 'pane';\n    ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, paneCtxTargets.value);\n    return;\n  }\n  activePane.value = 'main';\n  ctxMode.value = 'selection';\n  if (!node) {\n    selection.clear();\n    ctxRef.value?.show({ clientX: ev.clientX, clientY: ev.clientY }, []);\n    return;\n  }\n  await onContextTarget(node, ev);\n}\n\nconst contextActions = computed<ContextAction[]>(() => {\n  if (ctxMode.value === 'breadcrumb') {\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'copy-path', label: t('breadcrumb.copy_path') },\n    ];\n  }\n  if (ctxMode.value === 'pane' /* ui-fix — side-pane menu is EXACTLY the main pane's */) {\n    const psel = paneCtxTargets.value;\n    if (psel.length === 0) {\n      // Right-click on empty space: same as the main pane's canvas menu.\n      return [\n        { key: 'new-folder', label: t('toolbar.new_folder') },\n        { key: 'paste', label: t('ctx.paste'), disabled: !clipboard.value.mode },\n      ];\n    }\n    return selectionActionList(psel);\n  }\n\n  // `ctxUnlistedTargets` is non-empty only for a row that exists outside this\n  // pane's listing (Home's Recent / Starred cards) — see `onContextTarget`.\n  const sel = selection.nodes.value.length ? selection.nodes.value : ctxUnlistedTargets.value;\n  const any = sel.length > 0;\n  const single = sel.length === 1;\n\n  if (trashActive.value) {\n    if (!any) return [];\n    return [\n      { key: 'restore', label: t('ctx.restore') },\n      { divider: true, key: 'sep1', label: '' },\n      { key: 'delete', label: t('ctx.delete_perm'), danger: true },\n    ];\n  }\n\n  // Storage roots (the virtual rows shown at the multi-storage \"/\"\n  // overview) aren't real filesystem entries — they're mount points.\n  // Hide every mutation entry (rename/delete/share/cut/copy/new-folder/\n  // paste) and only offer \"Aç\" so the menu doesn't surface actions\n  // that would 4xx on the backend.\n  //\n  // PRIOR BUG: this used `currentPath === '/'` but the load() branch\n  // for the virtual root sets currentPath to EMPTY string, not '/'.\n  // So the guard never fired and every mutation action leaked into\n  // the menu at the storage listing — including new-folder + paste,\n  // which Ada called out in the most direct possible terms. Use\n  // the same empty-after-trim test as `atVirtualRoot` above.\n  const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  const inStorageRoot = multiStorageRoot.value && trimmedPath === '';\n  if (inStorageRoot) {\n    if (!any) return [];\n    if (!single) return [];\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'open-tab', label: t('ctx.open_new_tab') } /* wiring:d1 */,\n      // A whole storage can be kept too — that IS the \"sync everything\"\n      // shape, and it is one pair, not one per subfolder.\n      ...keepActionsFor(sel),\n    ];\n  }\n\n  // Empty background right-click: folder-level actions only. Viewers (no edit\n  // on this dir) get nothing here.\n  if (!any) {\n    // Showing hidden files is a VIEW preference, so it stays available to\n    // viewers too — the edit gate below only covers the mutating actions.\n    const view: ContextAction[] = [\n      {\n        key: 'toggle-hidden',\n        label: showHiddenFiles.value ? t('ctx.hide_hidden') : t('ctx.show_hidden'),\n      },\n    ];\n    if (!permCanEdit(dirPerm.value)) return view;\n    return [\n      { key: 'new-folder', label: t('toolbar.new_folder') },\n      { key: 'paste', label: t('ctx.paste'), disabled: !clipboard.value.mode },\n      ...view,\n    ];\n  }\n\n  return selectionActionList(sel);\n});\n\n// selectionActionList — the SINGLE source of truth for the actions offered on a\n// selection. BOTH the right-click context menu AND the top toolbar render this\n// exact list so they can never drift apart (Ada, translated from Turkish: \"the\n// right-click menu and the top menu don't match\"). The toolbar filters out\n// dividers/hidden; the context menu shows them. Action handling is unified in\n// dispatchItemAction().\nfunction selectionActionList(sel: FileNode[]): ContextAction[] {\n  const any = sel.length > 0;\n  const single = sel.length === 1;\n  /* pane:p1 — a STORAGE row is a mount point, not a file: rename, delete, cut,\n   * copy and share all 4xx on it. The main listing answers this before it ever\n   * gets here (the `inStorageRoot` branch in `contextActions`), but the split\n   * pane lists the same virtual rows through no such branch — so its\n   * right-click menu has been offering \"Sil\" on a whole storage, and with the\n   * selection bar now reaching both panes it would be one click. Measured\n   * 2026-09-13: download/share/cut/copy/delete, all of them, on `depoB`.\n   * Answered HERE because this is the one list both surfaces render. */\n  if (sel.some(isStorageRow)) {\n    if (!single) return [];\n    return [\n      { key: 'open', label: t('ctx.open') },\n      { key: 'open-tab', label: t('ctx.open_new_tab') },\n      ...keepActionsFor(sel),\n    ];\n  }\n  const isFile = single && sel[0]?.type === 'file';\n  const tagsLabel = locale.value === 'en' ? 'Tags…' : 'Etiketler…';\n  const singleHasId = single && typeof sel[0]?.id === 'number';\n  /* yildiz:s1 */\n  const canStar = starableNodes(sel).length > 0;\n  const allStarred = selectionAllStarred(sel);\n  // RBAC: gate mutating actions when the caller lacks edit on the target. The\n  // \"İzinler\" (permissions) action shows only for owners on RBAC-on storages.\n  const p = selPerm(sel);\n  // May write to the selection: the weakest row's level, and no row on a\n  // read-only mount — `selReadOnly` is what `dirReadOnly` cannot answer in a\n  // view whose rows come from several storages (Recent, Starred, a tag, Home).\n  const w = permCanEdit(p) && !selReadOnly(sel);\n  // Unified \"Paylaş / İzinler\" popup: public share link (editor+) + per-user\n  // permissions (owner-only, decided inside the modal).\n  // Unified \"Paylaş / İzinler\" popup carries the public share link, per-user\n  // permissions AND the folder-only \"Dosya İste\" (file-drop) tab — the user\n  // picks the action from inside the modal, so there's no separate button.\n  const accessLabel = locale.value === 'en' ? 'Share / Permissions' : 'Paylaş / İzinler';\n  return [\n    { key: 'open', label: t('ctx.open'), hidden: !single },\n    { key: 'open-tab', label: t('ctx.open_new_tab'), hidden: !single || sel[0]?.type !== 'dir' } /* wiring:d1 — open the folder in a new tab */,\n    { key: 'preview', label: t('ctx.preview'), hidden: !single, disabled: !isFile },\n    /* tasi:m1 — Download works on ANY selection now. It used to disappear the\n       moment a second row was ticked, because the only implementation was one\n       `window.open` per node and the browser blocks the second popup; there is\n       one streaming archive behind it now (lib/downloadSelection), and the\n       server expands a selected folder itself, so a lone folder is a zip too.\n       ⚠ Still single-only inside an encrypted folder: those bytes are\n       decrypted IN THE BROWSER, one file at a time, and the server has no\n       plaintext to zip. */\n    { key: 'download', label: t('ctx.download'), hidden: !any || (e2eActive.value && !single), disabled: !any },\n    { key: 'convert', label: t('ctx.convert'), hidden: !single || !effectiveConvertUrl.value || !w || e2eActive.value /* wiring:e2 — convert is meaningless on ciphertext */, disabled: !isFile },\n    /* tasi:m1 — VISIBLE and grey above a multi-selection, not gone. Sharing\n       really is one item at a time (a share link addresses one node), and the\n       row now says so in its tooltip; vanishing taught the reader that filex\n       cannot share the thing they are looking at. */\n    {\n      key: 'access',\n      label: accessLabel,\n      hidden: !any || !w || e2eActive.value /* wiring:e2 — sharing is off in the MVP (the link would serve ciphertext) */,\n      disabled: !single,\n      title: single ? undefined : t('ctx.access.one_only'),\n    },\n    { key: 'details', label: t('ctx.details'), hidden: !any } /* koru:k1 */,\n    /* ⚠ \"Copy node id\" is NOT here any more (owner's call, 2026-09-13): it is a\n       developer's handle on a support ticket, not an everyday verb, and this\n       list is rendered by BOTH the right-click menu and the selection bar — so\n       one row put it in front of everyone, twice. It lives in the details\n       panel now, beside Path and ETag, which is where the other technical\n       facts about a file already are. The `copy-id` case below stays: the\n       panel dispatches it. */\n    { divider: true, key: 'sep1', label: '', hidden: !w },\n    { key: 'rename', label: t('ctx.rename'), hidden: !single || !w, disabled: !single },\n    { key: 'cut', label: t('ctx.cut'), hidden: !any || !w, disabled: !any },\n    { key: 'copy', label: t('ctx.copy'), hidden: !any, disabled: !any },\n    /* tasi:m1 — \"somewhere else\", without the clipboard. Cut+paste has always\n       been able to do this, but only by navigating away from the rows you had\n       just picked; these two ask WHERE in a dialog and leave the listing where\n       it is.\n       ⚠ `icon:` is not decoration here — `actionIconSvg` answers '' for a key\n       it does not know, and a bar button with no glyph is an empty 28px box.\n       They borrow the clipboard verbs' marks, which is what they are. */\n    { key: 'move-to', label: t('ctx.move_to'), icon: 'cut', hidden: !any || !w, disabled: !any },\n    { key: 'copy-to', label: t('ctx.copy_to'), icon: 'copy', hidden: !any, disabled: !any },\n    /* Paste needs a destination folder; a virtual view (Recent / Starred /\n       Shared / a tag / Home) has none, so it is the one write verb the row\n       menu does not carry there — every per-row verb above and below does. */\n    { key: 'paste', label: t('ctx.paste'), hidden: !w || atVirtualRoot.value, disabled: !clipboard.value.mode },\n    { divider: true, key: 'sep-meta', label: '', hidden: !singleHasId && !canStar },\n    /* yildiz:s1 — \"star must be an action, like a tag\" (owner, v0.30.0).\n       Beside Tags on purpose: they are the same kind of verb, and this is the\n       ONLY star a grid/gallery user reaches with the keyboard. Works on a\n       multi-selection; the label follows the selection's state. */\n    {\n      key: 'star',\n      label: allStarred ? t('ctx.unstar') : t('ctx.star'),\n      icon: allStarred ? 'unstar' : 'star' /* gorunum:v1-icons — names the glyph, not an emoji */,\n      hidden: !canStar,\n    },\n    { key: 'tags', label: tagsLabel, hidden: !singleHasId, disabled: !singleHasId },\n    ...keepActionsFor(sel),\n    { divider: true, key: 'sep2', label: '', hidden: !w },\n    { key: 'delete', label: t('ctx.delete'), danger: true, hidden: !any || !w, disabled: !any },\n  ];\n}\n\n// toolbarActions — what the top toolbar shows. Mirrors the context menu so the\n// two stay identical for a selection; the empty/trash/virtual-root cases match\n// the context menu's special branches.\nconst toolbarActions = computed<ContextAction[]>(() => {\n  const sel = activeTargets();\n  /* pane:p1 — the split pane's bar offers EXACTLY what its own right-click\n   * menu offers (`contextActions`, ctxMode 'pane'). The three special branches\n   * below describe the MAIN listing's state — the trash, the multi-storage\n   * root — and the split pane reaches neither through this computed. */\n  if (paneIsActive.value) return sel.length ? selectionActionList(sel) : [];\n  if (trashActive.value) {\n    if (sel.length === 0) return [];\n    return [\n      { key: 'restore', label: t('ctx.restore') },\n      { key: 'delete', label: t('ctx.delete_perm'), danger: true },\n    ];\n  }\n  const trimmedPath = (currentPath.value ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (multiStorageRoot.value && trimmedPath === '') {\n    return sel.length === 1 ? [{ key: 'open', label: t('ctx.open') }] : [];\n  }\n  if (sel.length === 0) return [];\n  return selectionActionList(sel);\n});\n\nasync function onContextAction(action: ContextAction, targets: FileNode[]) {\n  if (ctxMode.value === 'breadcrumb') {\n    if (action.key === 'open') {\n      void load(stripAdapter(breadcrumbCtxPath.value));\n    } else if (action.key === 'copy-path') {\n      await onCopyPath(breadcrumbCtxPath.value);\n    }\n    return;\n  }\n  if (ctxMode.value === 'pane' /* ui-fix — side pane: same dispatch, pane-routed */) {\n    await dispatchItemAction(action.key, paneCtxTargets.value);\n    return;\n  }\n  await dispatchItemAction(action.key, targets);\n}\n\n// dispatchItemAction — unified handler for an action key on a target set. Both\n// the right-click menu (onContextAction) and the toolbar (onToolbarAction)\n// route here, so the two menus that now render the SAME list also behave the\n// same. (Toolbar \"Aç\" is the one deliberate exception — see onToolbarAction.)\n/**\n * pane:p1 — is this verb mutating the SPLIT pane?\n *\n * Two signals, and they agree in every case a menu produced: the pane menu\n * names itself (`ctxMode === 'pane'`), and every other door — the selection\n * bar, the keyboard — means \"the pane that has the keyboard\".\n *\n * ⚠ Reading only `ctxMode` was safe only while the toolbar acted on\n * `selection` no matter which pane had focus. It does not any more (see\n * `activeTargets`), so a Cut fired from the bar over the right-hand pane would\n * have taken the right pane's ROWS with the left pane's FOLDER as their\n * origin, and the paste would then have moved them out of a directory they\n * were never in.\n */\nfunction actingInPane(): boolean {\n  return ctxMode.value === 'pane' || paneIsActive.value;\n}\n\nasync function dispatchItemAction(key: string, targets: FileNode[]) {\n  switch (key) {\n    /* gorunum:v1 — the selection bar's × . It used to be delivered by\n     * synthesising a click on the listing's background, because nothing here\n     * answered the key; a gesture that works by imitating another gesture\n     * breaks the first time that other one changes. */\n    case 'clear-selection':\n      if (paneIsActive.value) splitSelection.clear();\n      else selection.clear();\n      return;\n    case 'open':\n      // Context-menu \"Aç\" launches the standalone fullscreen route\n      // in a new tab. Double-click (openNode) opens the in-page\n      // modal — two distinct affordances on purpose: quick peek vs\n      // dedicated editing surface.\n      if (targets[0]) openNodeInNewTab(targets[0]);\n      break;\n    case 'preview':\n      if (targets[0]) previewNode(targets[0]);\n      break;\n    case 'download':\n      await downloadSelection(targets);\n      break;\n    /* tasi:m1 — the same dialog, twice; only `mode` differs. */\n    case 'move-to':\n    case 'copy-to':\n      if (targets.length === 0) break;\n      destPickerMode.value = key === 'move-to' ? 'move' : 'copy';\n      destPickerTargets.value = targets;\n      destPickerBusy.value = false;\n      showDestPicker.value = true;\n      break;\n    case 'keep-local': {\n      const ds = desktopSync.value;\n      if (!ds || !targets[0]) break;\n      const remote = keepRemoteOf(targets[0]);\n      try {\n        await ds.keep(remote, targets[0].type === 'file' ? 'file' : 'dir');\n        await refreshKept();\n        // The shell may have shown its root-folder prompt and been cancelled —\n        // only claim success when the pair is really there now.\n        if (keepStateOf(remote) !== 'none') flashToast(t('keep.started'));\n      } catch (e) {\n        await refreshKept();\n        flashToast(`${t('keep.failed')}: ${String((e as Error)?.message ?? e)}`);\n      }\n      break;\n    }\n    case 'keep-online': {\n      const ds = desktopSync.value;\n      if (!ds || !targets[0]) break;\n      try {\n        await ds.unkeep(keepRemoteOf(targets[0]));\n      } catch {\n        // The shell owns the confirm dialog and reports its own failures.\n      }\n      await refreshKept();\n      break;\n    }\n    case 'keep-reveal': {\n      const ds = desktopSync.value;\n      if (ds && targets[0]) void ds.reveal(keepRemoteOf(targets[0]));\n      break;\n    }\n    case 'convert':\n      if (targets[0]) openConvert(targets[0]);\n      break;\n    case 'access':\n      if (targets[0]) {\n        permTarget.value = targets[0];\n        showPerm.value = true;\n      }\n      break;\n    case 'details' /* koru:k1 */:\n      openInspector();\n      break;\n    case 'copy-id':\n      if (targets[0] && typeof targets[0].id === 'number') {\n        const id = targets[0].id;\n        navigator.clipboard?.writeText(String(id)).then(\n          () => flashToast(locale.value === 'en' ? `Node id ${id} copied` : `Node id ${id} kopyalandı`),\n          () => flashToast(`#${id}`),\n        );\n      }\n      break;\n    case 'star':\n      await toggleStar(targets);\n      break;\n    case 'tags':\n      if (targets[0]) openTagPickerFor(targets[0]);\n      break;\n    case 'rename':\n      if (targets[0]) {\n        renameTarget.value = targets[0];\n        mutationInPane.value = actingInPane(); /* ui-fix */\n        showRename.value = true;\n      }\n      break;\n    case 'cut':\n      /* ui-fix — in a pane context the clipboard source must be the pane's dir. */\n      if (actingInPane()) paneCut();\n      else {\n        clipboard.value = { mode: 'cut', items: targets, sourcePath: currentPath.value };\n        flashToast(t('toast.cut_ready'));\n      }\n      break;\n    case 'copy':\n      if (actingInPane()) paneCopy();\n      else {\n        clipboard.value = { mode: 'copy', items: targets, sourcePath: currentPath.value };\n        flashToast(t('toast.copy_ready'));\n      }\n      break;\n    case 'paste':\n      /* ui-fix — pasting from the right-click menu goes to the active pane too\n       * (the keyboard shortcut was already pane-routed; the menu was not). */\n      if (actingInPane()) await panePaste();\n      else await paste();\n      break;\n    case 'delete': {\n      /* ⚠ The confirm dialog reads `paneCtxTargets` in pane mode, and only the\n       * pane MENU used to fill it. Coming from the selection bar there is no\n       * menu, so the rows are handed over here or the dialog would delete\n       * whatever the last right-click left behind. */\n      const inPane = actingInPane(); /* ui-fix */\n      if (inPane) paneCtxTargets.value = targets;\n      mutationInPane.value = inPane;\n      showDelete.value = true;\n      break;\n    }\n    case 'restore':\n      if (targets.length > 0) await restoreSelection(targets);\n      break;\n    case 'toggle-hidden':\n      toggleHiddenFiles();\n      break;\n    case 'new-folder':\n      mutationInPane.value = actingInPane(); /* ui-fix */\n      showNewFolder.value = true;\n      break;\n    case 'duplicate':\n      if (targets[0]) await duplicate(targets[0]);\n      break;\n    /* wiring:d1 — right-click \"Yeni sekmede aç\" (open in new tab) */\n    case 'open-tab':\n      if (targets[0]) openNodeInTab(targets[0]);\n      break;\n    /* /wiring:d1 */\n  }\n}\n\nfunction cut() {\n  if (selection.isEmpty.value) return;\n  clipboard.value = { mode: 'cut', items: selection.nodes.value, sourcePath: currentPath.value };\n  flashToast(t('toast.cut'));\n}\n\nfunction copyToClipboard() {\n  if (selection.isEmpty.value) return;\n  clipboard.value = { mode: 'copy', items: selection.nodes.value, sourcePath: currentPath.value };\n  flashToast(t('toast.copied'));\n}\n\nasync function paste() {\n  const cb = clipboard.value;\n  if (!cb.mode || cb.items.length === 0) return;\n  try {\n    const items = cb.items.map((n) => n.path); // already qualified (adapter://rel)\n    const sourceDir = cb.sourcePath || '';\n    const sameDir = cb.mode === 'cut' && sourceDir === currentPath.value;\n    if (sameDir) {\n      flashToast(t('toast.same_folder_cut'));\n      return;\n    }\n\n    const targetWire = qualify(currentPath.value);\n    // A different storage only changes the message: cut still CUTS\n    // and copy still COPIES, even when the target lives on another storage.\n    // The server does the transfer (the ops queue carries both the source\n    // and the target storage).\n    const plan = resolveTransfer(items, targetWire, cb.mode === 'cut' ? 'move' : 'copy');\n    if (cb.mode === 'cut') {\n      const originWire = qualify(sourceDir) || undefined;\n      const collides = await movedNamesCollide(items, targetWire);\n      const { op } = await api.moveAsync(items, targetWire, originWire);\n      registerMoveUndo(op.id, items, targetWire, originWire, collides);\n      pendingOps.register(op);\n      flashToast(\n        collides\n          ? t('toast.move_kept_both')\n          : plan.cross\n            ? t('split.cross_move')\n            : t('split.move_queued'),\n      );\n    } else {\n      const { op } = await api.copy(items, targetWire);\n      pendingOps.register(op);\n      flashToast(plan.cross ? t('split.cross_copy') : t('split.copy_queued'));\n    }\n    clipboard.value = { mode: null, items: [], sourcePath: null };\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'paste' } });\n  }\n}\n\nasync function duplicate(n: FileNode) {\n  try {\n    const { op } = await api.copy([n.path], qualify(currentPath.value));\n    pendingOps.register(op);\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'duplicate' } });\n  }\n}\n\nfunction downloadFile(n: FileNode) {\n  /* wiring:e2 — downloading inside an encrypted folder: fetch the bytes,\n     decrypt them, save under the original name (handing the user raw\n     ciphertext would be pointless). */\n  if (e2eUnlocked.value) {\n    void e2eDownload(n);\n    return;\n  }\n  /* /wiring:e2 */\n  // Keep `<adapter>://<rel>` so backend resolves the right storage\n  // (stripping it would default to the first storage, which 404s for\n  // any non-default storage like S3/SFTP/WebDAV).\n  const url = api.downloadUrl(n.path);\n  window.open(url, '_blank');\n}\n\n/**\n * tasi:m1 — download WHATEVER is selected, as one thing.\n *\n * One file is still one navigation to its own body: it keeps the range\n * requests, the browser's own resume, and the encrypted-folder path that has\n * to decrypt in this tab. Anything else — several files, or a folder, whose\n * members the server expands itself — is one streaming archive behind a\n * single-use ticket (lib/downloadSelection explains why a POST then a\n * navigation, and why an iframe rather than `window.open`).\n *\n * ⚠ The old behaviour was not \"download each one\": the row HID itself above a\n * single selection, because the only implementation was one `window.open` per\n * node and the browser blocks the second as a popup.\n */\nasync function downloadSelection(targets: FileNode[]): Promise<void> {\n  if (targets.length === 0) return;\n  if (targets.length === 1 && targets[0].type === 'file') {\n    downloadFile(targets[0]);\n    return;\n  }\n  /* ⚠ Not a courtesy: minting asks the server to resolve and authorize every\n   * member, which on a deep folder is not instant, and nothing else on screen\n   * moves until the browser is handed the response. */\n  flashToast(t('toast.archive.preparing'));\n  try {\n    const ticket = await downloadArchive(api, targets.map((n) => n.path));\n    flashToast(t('toast.archive.started', { name: ticket.name, count: String(ticket.files) }));\n  } catch (err) {\n    const e = err as Error & { status?: number };\n    /* 409 is the server saying the selection held nothing this account may\n     * read — a different sentence from \"it failed\", and the only one that\n     * tells the reader what to do next. */\n    flashToast(e.status === 409 ? t('toast.archive.empty') : e.message);\n    emit('error', { message: e.message, context: { op: 'archive-download' } });\n  }\n}\n\n/**\n * tasi:m1 — the destination dialog came back with a folder.\n *\n * Everything the verb needs already exists: `transferItems` is the one gate\n * that moves and copies (cross-storage included) and owns the undo\n * registration, so this only says WHICH rows, WHERE, and WHICH intent.\n *\n * ⚠ `originWire` is the folder the rows came FROM, and it has to follow the\n * pane the selection belongs to — the same rule `actingInPane` states for\n * every other mutation.\n */\nasync function onDestinationPicked(dest: string): Promise<void> {\n  const targets = destPickerTargets.value;\n  if (!dest || targets.length === 0) {\n    showDestPicker.value = false;\n    return;\n  }\n  const move = destPickerMode.value === 'move';\n  const originWire = actingInPane()\n    ? qualify(splitPaneRef.value?.getPath() ?? '')\n    : qualify(currentPath.value);\n  destPickerBusy.value = true;\n  try {\n    await transferItems(targets.map((n) => n.path), dest, originWire || undefined, move ? 'move' : 'copy');\n    /* ⚠ `transferItems` has already flashed \"queued\". This REPLACES it rather\n     * than stacking on it — there is one toast slot (`showToast`), and the\n     * useful half of the sentence is the destination, which \"queued\" does not\n     * carry. Do not add a second call expecting two messages; you would only\n     * be choosing which one nobody reads. */\n    const name = labelOfWire(dest, dest);\n    flashToast(move ? t('toast.moved_to', { name }) : t('toast.copied_to', { name }));\n    if (move) {\n      if (actingInPane()) splitSelection.clear();\n      else selection.clear();\n    }\n  } finally {\n    destPickerBusy.value = false;\n    showDestPicker.value = false;\n  }\n}\n\n// ------- Modals -------\n\n/* belge:n1 — after creating it, OPEN it. Creating a file and leaving the\n * person looking at a listing is half the feature. */\nasync function onDocumentCreated(file: { path: string; name: string; ext: string }) {\n  showNewDocument.value = false;\n  const dir = file.path.slice(0, file.path.lastIndexOf('/'));\n  if (dir && dir !== qualify(currentPath.value)) await load(dir);\n  else await load();\n  const node =\n    files.value.find((n) => n.path === file.path) ??\n    ({ type: 'file', path: file.path, basename: file.name, extension: file.ext } as unknown as FileNode);\n  previewTarget.value = node;\n  // ⚠ NOT previewModeForExt: that sends office types to 'view', which is right\n  // for a peek at somebody else's file and wrong for the one you just made.\n  previewMode.value = nodeCanEdit(node) ? 'edit' : 'view';\n  showPreview.value = true;\n  emit('file-opened', { path: node.path, basename: node.basename });\n  void markRecent(node);\n}\n\nasync function submitNewFolder(name: string) {\n  const inPane = mutationInPane.value; /* ui-fix — new folder in the side pane */\n  try {\n    const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n    await api.newFolder(dirWire, name);\n    showNewFolder.value = false;\n    if (inPane) await splitPaneRef.value?.reload();\n    else await load();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'newfolder' } });\n  }\n}\n\nasync function submitRename(name: string) {\n  const target = renameTarget.value;\n  if (!target) return;\n  const inPane = mutationInPane.value; /* ui-fix — rename from the side pane */\n  try {\n    const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n    const oldPath = target.path; // qualified\n    const oldName = target.basename;\n    await api.rename(dirWire, oldPath, name);\n    showRename.value = false;\n    renameTarget.value = null;\n    if (inPane) await splitPaneRef.value?.reload();\n    else await load();\n    // Clean inverse: rename the new path back to the old basename.\n    if (name && name !== oldName) {\n      const newPath = wireJoin(wireParent(oldPath), name);\n      undoToast(t('toast.renamed'), async () => {\n        await api.rename(dirWire, newPath, oldName);\n      });\n    }\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'rename' } });\n  }\n}\n\nasync function confirmDelete() {\n  // In the trash view, items are already soft-deleted. Permanent removal is\n  // admin-only (and the backend auto-purges after the retention window), so\n  // offer Restore here rather than a delete that would just re-trash a path.\n  if (trashMode.value) {\n    showDelete.value = false;\n    flashToast(t('toast.trash_retention'));\n    return;\n  }\n  /* ui-fix — yan panelden silme: hedefler + dizin + tazeleme pane'e ait. */\n  const inPane = mutationInPane.value;\n  const targets = inPane ? paneCtxTargets.value : selection.nodes.value;\n  const dirWire = inPane ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n  const items = targets.map((n) => n.path);\n  if (items.length === 0) {\n    showDelete.value = false;\n    return;\n  }\n  // Trash-delete is invertible via node-id restore — but only when EVERY\n  // selected node carries a backend id and the restore endpoint exists.\n  // A partial-undo offer would be a lie, so all-or-nothing.\n  const nodeIds = targets\n    .map((n) => (n as { id?: number }).id)\n    .filter((x): x is number => typeof x === 'number');\n  const restoreUndo =\n    api.endpoints.trashRestore && nodeIds.length === targets.length\n      ? async () => {\n          const { restored } = await api.restoreIds(nodeIds);\n          if (restored === 0) throw new Error('restore failed');\n        }\n      : null;\n  try {\n    if (api.endpoints.deleteAsync) {\n      const { op } = await api.deleteAsync(items, dirWire);\n      if (restoreUndo) {\n        opUndo.set(op.id, { message: t('toast.trashed'), fn: restoreUndo });\n      }\n      pendingOps.register(op);\n      flashToast(t('toast.delete_queued'));\n    } else {\n      await api.deleteItems(dirWire, items);\n      if (inPane) await splitPaneRef.value?.reload();\n      else await load();\n      if (restoreUndo) undoToast(t('toast.trashed'), restoreUndo);\n    }\n    showDelete.value = false;\n    if (inPane) void splitPaneRef.value?.reload();\n    else selection.clear();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'delete' } });\n  }\n}\n\nfunction openConvert(n: FileNode) {\n  convertTarget.value = n;\n  showConvert.value = true;\n}\n\nfunction onConvertDone(name: string) {\n  flashToast(locale.value === 'en' ? `Converted → ${name}` : `Dönüştürüldü → ${name}`);\n  void load();\n}\n\n\n// ------- Upload -------\n\nfunction triggerUpload() {\n  if (!canWriteHere.value) {\n    flashToast(locale.value === 'en' ? 'Read-only here' : 'Burada yazma yetkiniz yok');\n    return;\n  }\n  fileInputEl.value?.click();\n}\n\nfunction onFilePicked(ev: Event) {\n  const input = ev.target as HTMLInputElement;\n  const list = input.files ? Array.from(input.files) : [];\n  input.value = '';\n  void uploadFiles(list);\n}\n\nasync function uploadFiles(list: File[]) {\n  if (list.length === 0) return;\n  /* wiring:e2 — uploads into an encrypted folder are encrypted transparently.\n     No upload while locked (that would be a plaintext-leak door); anything\n     over 200MB hits the MVP single-shot limit and is skipped with a warning. */\n  if (e2eLocked.value) {\n    flashToast(t('e2e.upload.locked'));\n    return;\n  }\n  if (e2eUnlocked.value) {\n    list = await e2eEncryptUploads(list);\n    if (list.length === 0) return;\n  }\n  /* /wiring:e2 */\n  for (const f of list) {\n    // Anything above the chunk size goes on the STAGED path: chunked into\n    // filex's own staging area, resumable across a dropped connection and — via\n    // the bookmark in lib/uploadResume — across a reloaded tab. It works on\n    // every driver, unlike the S3-presigned path it replaced. Small files keep\n    // the single-POST fast path, and a server that has no staged path at all\n    // falls back to it too.\n    if (chunked.shouldChunk(f)) {\n      const pending = chunked.resumableFor(qualify(currentPath.value), f);\n      if (pending) {\n        // Say so. An upload that silently starts over looks identical to one\n        // that never happened, which is precisely the complaint.\n        flashToast(\n          t('upload.resuming', {\n            name: f.name,\n            percent: f.size > 0 ? Math.round((pending.offset / f.size) * 100) : 0,\n          }),\n        );\n      }\n      if (await chunkedUpload(f)) continue;\n    }\n    await legacyUpload(f);\n  }\n  await load();\n}\n\nasync function legacyUpload(file: File, dest?: string) {\n  // Register a progress row so the corner badge tracks the upload — large files\n  // fall back here from the chunked path, and previously showed no progress at\n  // all (the chunked placeholder was removed on init failure and the legacy\n  // POST tracked nothing, so the badge vanished mid-upload).\n  const id = crypto.randomUUID();\n  const target = dest ?? qualify(currentPath.value);\n  uploadJobs.value = [\n    ...uploadJobs.value,\n    { id, file, path: target, totalBytes: file.size, uploadedBytes: 0, percent: 0, status: 'uploading', cancel() {} },\n  ];\n  const patch = (p: Partial<UploadJob>) => {\n    const idx = uploadJobs.value.findIndex((j) => j.id === id);\n    if (idx === -1) return;\n    const next = [...uploadJobs.value];\n    next[idx] = { ...next[idx], ...p };\n    uploadJobs.value = next;\n  };\n  try {\n    await api.uploadMultipart(target, [file], (percent) => {\n      patch({ percent, uploadedBytes: Math.round((percent / 100) * file.size) });\n      emit('upload-progress', { uploadId: id, percent, done: percent >= 100 });\n    });\n    patch({ percent: 100, uploadedBytes: file.size, status: 'done' });\n    emit('upload-progress', { uploadId: id, percent: 100, done: true });\n  } catch (err) {\n    // Tell the USER, not just the embedding app. `emit('error')` alone left a\n    // standalone deployment silent: the progress bar ran to 100% (the bytes\n    // do go out — the server rejects them afterwards), the row flipped to an\n    // error state carrying no message, and nothing else appeared. olivov lost\n    // ten days of uploads to that silence (H2, 2026-08-05).\n    const message = (err as Error).message;\n    patch({ status: 'error', error: message });\n    flashToast(t('upload.failed', { name: file.name }));\n    emit('error', {\n      message,\n      context: { op: 'upload', file: file.name },\n    });\n  }\n}\n\n/**\n * Attempt a staged (chunked, resumable) upload. Returns `true` when it was\n * handled — including when it failed — and `false` ONLY when this server has no\n * staged path at all, so the caller may fall back to the single-POST upload.\n *\n * ⚠ The old version fell back on ANY error, which was harmless while the\n * chunked path was S3-only and failed at init. It is not harmless now: a staged\n * upload that dies at 90 % has bytes on the server and a bookmark to resume\n * from, and quietly re-POSTing the whole file would throw both away — the\n * \"starts from zero\" behaviour this change exists to remove. A real failure is\n * shown to the user instead, and picking the same file again continues it.\n */\nasync function chunkedUpload(file: File, dest?: string): Promise<boolean> {\n  // Register the progress row LAZILY — only once `begin` succeeded and bytes are\n  // actually moving. A server with no staged path then shows no badge at all,\n  // so the fallback's own badge is the only one the user sees (no\n  // appear-then-vanish flicker).\n  const id = crypto.randomUUID();\n  let registered = false;\n  const patch = (job: UploadJob) => {\n    if (!registered) {\n      uploadJobs.value = [...uploadJobs.value, { ...job, id } as UploadJob];\n      registered = true;\n      return;\n    }\n    const idx = uploadJobs.value.findIndex((j) => j.id === id);\n    if (idx !== -1) {\n      const next = [...uploadJobs.value];\n      next[idx] = { ...job, id } as UploadJob;\n      uploadJobs.value = next;\n    }\n  };\n  const target = dest ?? qualify(currentPath.value);\n  try {\n    await chunked.uploadFile({\n      path: target,\n      file,\n      onProgress: (job) => {\n        if (!registered && job.status !== 'uploading' && job.uploadedBytes <= 0) return;\n        patch(job);\n        emit('upload-progress', {\n          uploadId: job.uploadId ?? id,\n          percent: job.percent,\n          done: job.status === 'done',\n        });\n      },\n    });\n    return true;\n  } catch (err) {\n    if (isStagedUnsupported(err)) {\n      if (registered) uploadJobs.value = uploadJobs.value.filter((j) => j.id !== id);\n      return false;\n    }\n    const message = (err as Error).message;\n    if (!registered) {\n      uploadJobs.value = [\n        ...uploadJobs.value,\n        {\n          id,\n          file,\n          path: target,\n          totalBytes: file.size,\n          uploadedBytes: 0,\n          percent: 0,\n          status: 'error',\n          error: message,\n          cancel() {},\n        } as UploadJob,\n      ];\n      registered = true;\n    }\n    flashToast(t('upload.failed', { name: file.name }));\n    emit('error', { message, context: { op: 'upload', file: file.name } });\n    return true;\n  }\n}\n\nconst dragCounter = ref(0);\nconst dragOver = ref(false);\n\n/**\n * isExternalFileDrag — `true` only when the user is dragging files\n * INTO the page from the OS (file picker, finder, etc.). Filters out:\n *   - internal row drags (FE_DND_MIME present)\n *   - browser image drags (`<img draggable=true>` on this page or\n *     across pages). HTML5 `Files` type is leaky — it appears when\n *     dragging any image element even though no real file is moving;\n *     `dataTransfer.items[*].kind === 'file'` is the canonical signal\n *     for an actual OS file.\n */\nfunction isExternalFileDrag(ev: DragEvent): boolean {\n  const dt = ev.dataTransfer;\n  if (!dt) return false;\n  if (dt.types && dt.types.includes(FE_DND_MIME)) return false;\n  /* wiring:f1 — an OS drag we started ourselves also carries 'Files', but it\n     is NOT an upload: it would mean downloading the same bytes from the\n     server and posting them straight back (a copy instead of a move, at\n     twice the traffic). */\n  if (activeNativeDrag()) return false;\n  // Some browsers expose `items` early in the drag, others only on\n  // drop. When `items` is available we use it as the authoritative\n  // signal — `kind === 'file'` means a real OS file. When unavailable\n  // (Firefox during dragover sometimes returns 0 items), fall back to\n  // the legacy `Files` type check.\n  if (dt.items && dt.items.length > 0) {\n    let hasFile = false;\n    for (const it of Array.from(dt.items)) {\n      if (it.kind === 'file') {\n        hasFile = true;\n        break;\n      }\n    }\n    return hasFile;\n  }\n  return dt.types ? dt.types.includes('Files') : false;\n}\n\nfunction onDragEnter(ev: DragEvent) {\n  if (!isExternalFileDrag(ev)) return;\n  ev.preventDefault();\n  dragCounter.value++;\n  dragOver.value = true;\n}\nfunction onDragLeave() {\n  dragCounter.value = Math.max(0, dragCounter.value - 1);\n  if (dragCounter.value === 0) dragOver.value = false;\n}\nfunction onDragOver(ev: DragEvent) {\n  /* wiring:d1 — internal drags must be droppable on the root body too, so that\n     dropping from the split pane onto the main pane's EMPTY SPACE works (the\n     origin can't be read during dragover — the decision is made at drop time;\n     a same-folder drop stays a no-op). */\n  if (hasInternalDrag(ev)) {\n    ev.preventDefault();\n    return;\n  }\n  /* /wiring:d1 */\n  if (isExternalFileDrag(ev)) {\n    ev.preventDefault();\n  }\n}\nfunction onDropUpload(ev: DragEvent) {\n  /* wiring:d1 — dropping from the split pane onto the main pane's empty space\n     = transfer into the current folder (items from the same folder stay a\n     no-op, so the old behaviour is preserved). */\n  if (hasInternalDrag(ev)) {\n    const d1Origin = internalDragOrigin(ev) || '';\n    const d1Here = qualify(currentPath.value);\n    const d1Items = internalDragItems(ev);\n    if (d1Items && d1Origin && d1Here && d1Origin !== d1Here && !trashMode.value && canWriteHere.value) {\n      ev.preventDefault();\n      dragCounter.value = 0;\n      dragOver.value = false;\n      endNativeDrag();\n      cancelShellDrag();\n      void transferItems(d1Items.map((i) => i.path), d1Here, d1Origin);\n      return;\n    }\n  }\n  /* /wiring:d1 */\n  // Internal row drag — nothing to do here, the row drop handler\n  // in GridView/ListView already resolved the move.\n  if (hasInternalDrag(ev)) {\n    dragCounter.value = 0;\n    dragOver.value = false;\n    endNativeDrag();\n    cancelShellDrag();\n    return;\n  }\n  // Browser-internal image drag without real files — bail before\n  // we accidentally synthesise an upload from a 0-length file list\n  // (some browsers populate `files` with zero-byte placeholders).\n  if (!isExternalFileDrag(ev)) {\n    dragCounter.value = 0;\n    dragOver.value = false;\n    return;\n  }\n  ev.preventDefault();\n  dragCounter.value = 0;\n  dragOver.value = false;\n  // RBAC: block drag-drop upload where the user can't write.\n  if (!canWriteHere.value) {\n    flashToast(locale.value === 'en' ? 'Read-only here' : 'Burada yazma yetkiniz yok');\n    return;\n  }\n  const list = ev.dataTransfer?.files ? Array.from(ev.dataTransfer.files) : [];\n  if (list.length === 0) return;\n  void uploadFiles(list);\n}\n\nfunction onWindowDragOver(ev: DragEvent) {\n  if (ev.dataTransfer?.types.includes('Files')) ev.preventDefault();\n}\nfunction onWindowDrop(ev: DragEvent) {\n  const root = rootEl.value;\n  const target = ev.target as Node | null;\n  if (root && target && !root.contains(target)) {\n    ev.preventDefault();\n  }\n}\nonMounted(() => {\n  window.addEventListener('dragover', onWindowDragOver);\n  window.addEventListener('drop', onWindowDrop);\n  window.addEventListener('pointerup', onGlobalPointerUp);\n  window.addEventListener('blur', onGlobalPointerUp);\n  /* wiring:f1 — while the shell prepares, say \"preparing\" exactly once; a\n     toast per file would show noise rather than progress. The finish is\n     announced by the 'ready' toast (prepareDragOut). */\n  dragOut.value?.onProgress?.((p) => {\n    // Work that happens AFTER the drop (the placeholder path) is always\n    // announced — the user dropped a file into a folder and has a right to\n    // know what happened there. Silence only applies to the pre-preparation\n    // nobody asked for.\n    const afterDrop = !!p?.dropped;\n    if (p?.error === 'drop_not_found') {\n      flashToast(t('dragout.not_found'));\n      return;\n    }\n    if (p?.error) {\n      if (afterDrop || !dragOutQuiet) flashToast(p.error);\n      return;\n    }\n    if (afterDrop) {\n      flashToast(p?.finished ? t('dragout.done') : t('dragout.downloading'));\n      return;\n    }\n    if (dragOutQuiet) return;\n    if (!p?.finished && p?.done === 0) flashToast(t('dragout.preparing'));\n  });\n});\n/* wiring:f1 — an OS drag never fires 'dragend' for us (the HTML5 drag never\n   started). We drop the record when the mouse is released; otherwise the next\n   ordinary drag would think it was carrying the previous selection. */\nfunction onGlobalPointerUp() {\n  if (activeNativeDrag()) {\n    endNativeDrag();\n    // The drop MAY NOT have landed in our own window; only our own drop paths\n    // cancel the shell's watch (onDropUpload / onItemDropInto).\n  }\n}\n\n/** The drag ended inside the app: the shell should stop waiting for a drop. */\nfunction cancelShellDrag() {\n  if (dragOut.value?.cancel) void Promise.resolve(dragOut.value.cancel()).catch(() => undefined);\n}\n\nonBeforeUnmount(() => {\n  window.removeEventListener('dragover', onWindowDragOver);\n  window.removeEventListener('drop', onWindowDrop);\n  window.removeEventListener('hashchange', onHashChange);\n  window.removeEventListener('pointerup', onGlobalPointerUp);\n  window.removeEventListener('blur', onGlobalPointerUp);\n});\n\nconst clippedPaths = computed<Set<string>>(() => {\n  if (clipboard.value.mode !== 'cut') return new Set();\n  return new Set(clipboard.value.items.map((n) => n.path));\n});\n\n// --------------------------------------------------------------------\n// Item drag&drop move\n// --------------------------------------------------------------------\n\nconst FE_DND_MIME = 'application/x-brf-files';\n\n/**\n * pane:p1 — a drag started in one of the panes.\n *\n * `FilePane` has already written the payload both panes must agree on: the\n * internal MIME, the ORIGIN directory (which is what lets a cross-pane move be\n * undone) and the plain-text fallback. This is the part only the host knows —\n * the desktop shell's OS drag and the browser's own `DownloadURL` hand-off —\n * and wiring it for BOTH panes rather than only the left one is a capability\n * the right-hand pane gains simply by being the same pane.\n *\n * ⚠ `pane` decides two things and nothing else: whose selection is being\n * dragged, and which directory the drag says it came from. Everything below\n * that point is identical, which is the reason there is one function.\n */\n/**\n * pane:p1 — a row was clicked in one of the panes. Both panes reach the SAME\n * Ctrl/Shift semantics (`useSelection.click`), which is the point: the\n * right-hand pane used to keep a plain Set in which Shift behaved as Ctrl, so\n * a range-select worked on one side of the split and not the other.\n */\nfunction onPaneClickRow(\n  pane: 'main' | 'split',\n  n: FileNode,\n  mod: { ctrl: boolean; shift: boolean },\n) {\n  (pane === 'split' ? splitSelection : selection).click(n.path, mod);\n}\n\nfunction onPaneItemDragStart(pane: 'main' | 'split', node: FileNode, ev: DragEvent) {\n  if (!ev.dataTransfer) return;\n  if (node.basename === '.trash') {\n    ev.preventDefault();\n    return;\n  }\n  const sel = pane === 'split' ? splitSelection.nodes.value : selection.nodes.value;\n  const dirWire =\n    pane === 'split' ? qualify(splitPaneRef.value?.getPath() ?? '') : qualify(currentPath.value);\n  const chosen = sel.some((n) => n.path === node.path) ? sel : [node];\n  const items = chosen\n    .filter((n) => !clippedPaths.value.has(n.path))\n    .filter((n) => n.basename !== '.trash')\n    .map((n) => ({ path: n.path, basename: n.basename, type: n.type })); // qualified\n  if (items.length === 0) return;\n\n  /* wiring:f1 — drag-out (to the desktop / another application).\n     When a shell is present the drag is ALWAYS an OS drag: folders and\n     multi-selections land as REAL files, one by one, with NO SIZE LIMIT.\n     If the bytes are ready, real files are handed over; if not, the shell\n     hands over an empty \"placeholder\", finds out where it was dropped and\n     downloads THERE (see desktop/src/dropwatch.ts). If the drop lands INSIDE\n     the app the drag is still a server-side move — the payload stays with us —\n     and the shell is told to \"give up\" so it doesn't watch the drives for\n     nothing. */\n  if (dragOut.value) {\n    ev.preventDefault();\n    beginNativeDrag(items, dirWire);\n    void Promise.resolve(dragOut.value.start(items)).catch((err) => {\n      endNativeDrag();\n      cancelShellDrag();\n      emit('error', { message: (err as Error).message, context: { op: 'drag-out' } });\n    });\n    void prepareDragOut(items);\n    return;\n  }\n\n  /* Single file + a cookie session: the browser's own download path\n     (DownloadURL) fetches the file onto the desktop at drop time; no\n     preparation is needed at all. In a bearer-token setup (the desktop app)\n     that path goes out unauthenticated, which is why the local path above\n     takes over there — see lib/dragOut.ts. */\n  if (items.length === 1 && items[0] && canDownloadUrlDrag(props.config.auth)) {\n    const payload = downloadUrlPayload(items[0], api.downloadUrl(items[0].path), node.mime_type);\n    if (payload) ev.dataTransfer.setData('DownloadURL', payload);\n  }\n}\n\n/* === wiring:f1 — drag-out preparation ===\n *\n * The bytes have to be on disk BEFORE the drag starts (the OS copies from the\n * path at drop time), so preparation is a separate step. When it finishes the\n * user is told \"ready\"; the second drag is now an OS drag and starts\n * instantly. For files kept on this computer (synced) preparation finishes\n * instantly on the first go too — the copy is already local.\n */\nconst dragOut = computed(() => props.config.dragOut ?? null);\nconst dragOutReadyKey = ref('');\nconst dragOutBusy = ref(false);\n/** True while a preparation nobody asked for is running. */\nlet dragOutQuiet = false;\n\n/* Small selections are prepared the moment they are SELECTED, because once\n   preparation is done the next drag is an OS drag: picking a document and\n   dragging it to the desktop therefore works on the FIRST try. The ceiling is\n   deliberately low — someone click-browsing shouldn't download a movie on\n   every row; anything above the limit is prepared on the first drag and the\n   second drag starts instantly. */\nconst DRAGOUT_PREFETCH_MAX_BYTES = 8 * 1024 * 1024;\nconst DRAGOUT_PREFETCH_MAX_ITEMS = 10;\nlet dragOutPrefetchTimer: ReturnType<typeof setTimeout> | undefined;\n\nwatch(\n  () => selection.selected.value,\n  () => {\n    if (!dragOut.value) return;\n    clearTimeout(dragOutPrefetchTimer);\n    const nodes = selection.nodes.value;\n    if (nodes.length === 0 || nodes.length > DRAGOUT_PREFETCH_MAX_ITEMS) return;\n    // A folder's size isn't known from the listing; rather than guess it, we\n    // leave it to the first drag.\n    if (nodes.some((n) => n.type !== 'file')) return;\n    const total = nodes.reduce((sum, n) => sum + (n.size ?? 0), 0);\n    if (total > DRAGOUT_PREFETCH_MAX_BYTES) return;\n    const items = nodes.map((n) => ({ path: n.path, basename: n.basename, type: n.type }));\n    dragOutPrefetchTimer = setTimeout(() => void prepareDragOut(items, true), 400);\n  },\n  { deep: true },\n);\n\nasync function prepareDragOut(items: DragItem[], quiet = false): Promise<void> {\n  const hook = dragOut.value;\n  if (!hook || dragOutBusy.value) return;\n  const key = dragKey(items);\n  if (key === dragOutReadyKey.value) return;\n  dragOutBusy.value = true;\n  dragOutQuiet = quiet;\n  try {\n    const res = await hook.prepare(items);\n    if (res?.ready) {\n      dragOutReadyKey.value = key;\n      // The quiet round is triggered by a selection; the user ASKED for\n      // nothing, so there's nothing to tell them either. A round that starts\n      // from an actual drag does speak up.\n      if (!quiet) flashToast(t('dragout.ready'));\n    } else if (res?.error && !quiet) {\n      flashToast(res.error);\n    }\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'drag-out-prepare' } });\n  } finally {\n    dragOutBusy.value = false;\n    dragOutQuiet = false;\n  }\n}\n\nasync function moveSourcesAsync(sources: string[], targetDir: string, opLabel: string, originOverride?: string): Promise<void> {\n  try {\n    const originWire = originOverride ?? qualify(currentPath.value); /* wiring:d1 — the real source folder for a drag coming from the split pane */\n    const collides = await movedNamesCollide(sources, targetDir);\n    if (api.endpoints.moveAsync) {\n      const { op } = await api.moveAsync(sources, targetDir, originWire);\n      registerMoveUndo(op.id, sources, targetDir, originWire, collides);\n      pendingOps.register(op);\n      flashToast(collides ? t('toast.move_kept_both') : t('split.move_queued'));\n    } else {\n      await api.move(originWire, sources, targetDir);\n      await load();\n      if (collides) {\n        flashToast(t('toast.move_kept_both'));\n      } else {\n        // Sync move (no async endpoint): offer the reverse move right away.\n        const movedPaths = sources.map((p) => wireJoin(targetDir, wireBasename(p)));\n        undoToast(t('toast.moved'), async () => {\n          await api.move(targetDir, movedPaths, originWire);\n        });\n      }\n    }\n    selection.clear();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: opLabel, targetDir } });\n  }\n}\n\nasync function onItemDropInto(target: FileNode, ev: DragEvent) {\n  if (target.type !== 'dir') return;\n  const items = internalDragItems(ev);\n  if (!items || items.length === 0) return;\n  endNativeDrag();\n  cancelShellDrag();\n\n  const targetDir = target.path; // qualified\n  const sources = items\n    .map((i) => i.path)\n    // ui-fix — skip items already inside targetDir (parent===target): an\n    // in-place drop is a no-op and must not trigger the backend's \"copy onto\n    // itself\" 400.\n    .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n  if (sources.length === 0) return; // silent no-op (in-place drop)\n  await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — storage-aware transfer */\n}\n\nasync function onCrumbDropInto(adapterPath: string, ev: DragEvent) {\n  const items = internalDragItems(ev);\n  if (!items || items.length === 0) return;\n  endNativeDrag();\n  cancelShellDrag();\n\n  const targetDir = adapterPath; // already qualified by breadcrumb\n  const sources = items\n    .map((i) => i.path)\n    // ui-fix — an in-place drop onto the breadcrumb (the same folder) is a no-op.\n    .filter((p) => p && p !== targetDir && !targetDir.startsWith(p + '/') && !sameDir(wireParent(p), targetDir));\n  if (sources.length === 0) return;\n  await transferItems(sources, targetDir, dndOrigin(ev)); /* wiring:d1 — storage-aware transfer */\n}\n\nfunction onCancelUpload(job: UploadJob) {\n  job.cancel();\n}\n\nfunction onDismissUpload(job: UploadJob) {\n  uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n}\n\n// ------- Breadcrumb -------\n\nfunction onNavigate(adapterPath: string) {\n  // Multi-storage emits empty string for the global \"/\" crumb. The\n  // load() function recognises that as the storage-list virtual root.\n  if (multiStorageRoot.value && !adapterPath) {\n    void load('');\n    return;\n  }\n  if (multiStorageRoot.value) {\n    void load(wireToVirtual(adapterPath));\n    return;\n  }\n  void load(stripAdapter(adapterPath));\n}\n\nasync function onCopyPath(adapterPath: string) {\n  try {\n    await navigator.clipboard.writeText(adapterPath);\n    flashToast(t('breadcrumb.copy_path'));\n  } catch {\n    /* no-op */\n  }\n}\n\n// Auth-headers builder handed to PreviewModal, QuickLook and every viewer.\n//\n// ⚠⚠ ASYNC on purpose. This used to call `authHeadersSync`, which drops the\n// bearer entirely when the embedder supplies a token FUNCTION rather than a\n// string — the shape the desktop app uses so the credential is fetched per\n// call instead of sitting in the page. The result was an Authorization-less\n// request and a 401 on the OnlyOffice config endpoint, the starred list, the\n// recently-opened POST and every viewer that fetches its own bytes. Consumers\n// must `await` this; the guard test in web/tests/api/authHeaders.test.ts fails\n// the build if one forgets.\nfunction buildAuthHeaders(extra: Record<string, string> = {}) {\n  return api.authHeaders({ ...extra });\n}\n\n/** The standalone viewer/editor route the backend serves next to the API. */\nconst STANDALONE_ROUTE = '/files/edit';\n\n/**\n * Makes a page route absolute against the API host.\n *\n * ⚠ A root-relative route like `/files/edit` is resolved by the browser\n * against the PAGE, not the API — which is right when the explorer is embedded\n * in the same app that serves the route, and wrong for every embed served from\n * a different origin. In the desktop app the page origin is `app://filex`, so\n * \"Open in new tab\" asked the OS to open `app://filex/files/edit?…`: no handler\n * for that scheme exists, so the click did nothing at all, silently. Measured\n * 2026-08-10.\n */\nfunction absolutePageUrl(base: string): string {\n  if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(base)) return base; // already absolute\n  const api = props.config.apiBase;\n  if (!api) return base; // same-origin embed — the browser resolves it correctly\n  try {\n    return new URL(base, api.endsWith('/') ? api : `${api}/`).toString();\n  } catch {\n    return base;\n  }\n}\n\n/** Where the modal's \"Open in new tab\" / \"Edit\" buttons should land. */\nconst effectiveViewerBaseUrl = computed(() =>\n  absolutePageUrl(props.config.viewerBaseUrl || STANDALONE_ROUTE),\n);\n\n/* === wiring:c1 — tema galerisi ===\n * Selected theme (shared module state, localStorage `filex.theme`) is applied\n * as inline `--fe-*` variables on the explorer root, resolved to the active\n * light/dark variant — plus a mirrored injected stylesheet for the surfaces\n * that re-declare tokens (teleported context menu, modal backdrops). Theme\n * selection is independent from the light/dark mode: the mode only picks\n * WHICH variant of the theme paints. */\nconst showThemeGallery = ref(false);\nconst { themeId: activeThemeId, setTheme: setActiveTheme } = useThemeState();\n// The light/dark MODE the person looking at it picked in the gallery. 'host'\n// (the default) defers to whatever the embedder passed, so no existing embed\n// changes appearance until someone actually chooses.\n//\n// ⚠ Everything that used to read `config.theme` reads `themeMode` instead — a\n// choice that only reached the token resolution would leave the root class, the\n// modals and the teleported menus painting the OLD mode, which is exactly the\n// half-dark UI that bug looks like.\nconst { themeMode: themeModePref, setThemeMode: setThemeModePref } = useThemeModeState();\nconst themeMode = computed<ThemeMode>(() =>\n  themeModePref.value === 'host' ? props.config.theme || 'auto' : themeModePref.value,\n);\n// Resolved mode: an explicit choice wins, otherwise the OS preference — the\n// same logic variables.css encodes in CSS. The inline root variables beat every\n// stylesheet rule, so they must track this resolution at runtime.\nconst themeMq =\n  typeof window !== 'undefined' && window.matchMedia\n    ? window.matchMedia('(prefers-color-scheme: dark)')\n    : undefined;\nconst themeOsDark = ref(!!themeMq?.matches);\nfunction onThemeMqChange(e: MediaQueryListEvent) {\n  themeOsDark.value = e.matches;\n}\nonMounted(() => themeMq?.addEventListener?.('change', onThemeMqChange));\nonBeforeUnmount(() => themeMq?.removeEventListener?.('change', onThemeMqChange));\nconst themeResolvedDark = computed(\n  () => themeMode.value === 'dark' || (themeMode.value !== 'light' && themeOsDark.value),\n);\nwatch(\n  [activeThemeId, themeResolvedDark, rootEl],\n  () => {\n    syncThemeStyle(activeThemeId.value);\n    if (rootEl.value) applyThemeToEl(rootEl.value, activeThemeId.value, themeResolvedDark.value);\n  },\n  { immediate: true },\n);\n/* === /wiring:c1 === */\n/* === wiring:c2 — shortcut settings modal + Space quick-look ===\n * quickLookTarget follows the selection while the peek is open: arrow\n * keys emitted by QuickLook move the selection here, and the watcher\n * below syncs the previewed file. Space toggles (registry action\n * `quicklook`); Enter promotes the peek into the normal open flow. */\nconst showShortcutSettings = ref(false);\nconst quickLookOpen = ref(false);\nconst quickLookTarget = ref<FileNode | null>(null);\n\nfunction quickLookToggle() {\n  if (quickLookOpen.value) {\n    quickLookOpen.value = false;\n    return;\n  }\n  const sel = selection.nodes.value;\n  const n = sel.length === 1 ? sel[0] : null;\n  if (!n || n.type !== 'file' || n.basename === '.trash') return;\n  /* wiring:e2 — in an encrypted folder the Space peek decrypts first, then opens */\n  if (e2eActive.value) {\n    if (!e2eUnlocked.value) return;\n    void (async () => {\n      try {\n        await e2eFetchDecrypted(n);\n      } catch {\n        flashToast(t('e2e.decrypt_failed'));\n        return;\n      }\n      quickLookTarget.value = n;\n      quickLookOpen.value = true;\n      void markRecent(n);\n    })();\n    return;\n  }\n  /* /wiring:e2 */\n  quickLookTarget.value = n;\n  quickLookOpen.value = true;\n  void markRecent(n);\n}\n\nfunction quickLookNav(delta: number) {\n  const onlyFiles = files.value.filter((f) => f.type === 'file');\n  if (onlyFiles.length === 0) return;\n  const cur = quickLookTarget.value;\n  let idx = cur ? onlyFiles.findIndex((f) => f.path === cur.path) : -1;\n  idx = idx === -1 ? (delta > 0 ? 0 : onlyFiles.length - 1) : (idx + delta + onlyFiles.length) % onlyFiles.length;\n  const next = onlyFiles[idx];\n  if (!next || next.path === cur?.path) return;\n  selection.click(next.path);\n}\n\nfunction quickLookOpenFull() {\n  const n = quickLookTarget.value;\n  quickLookOpen.value = false;\n  if (n) openNode(n);\n}\n\nwatch(\n  () => selection.nodes.value,\n  (nodes) => {\n    if (!quickLookOpen.value) return;\n    const n = nodes.length === 1 && nodes[0].type === 'file' ? nodes[0] : null;\n    /* wiring:e2 — when arrowing through files, decrypt BEFORE assigning the\n       target as well, otherwise the viewer briefly gets the raw ciphertext URL. */\n    if (n && n.path !== quickLookTarget.value?.path && e2eUnlocked.value) {\n      void (async () => {\n        try {\n          await e2eFetchDecrypted(n);\n        } catch {\n          /* decryption failed — switch the target anyway, the viewer shows the error */\n        }\n        quickLookTarget.value = n;\n        void markRecent(n);\n      })();\n      return;\n    }\n    /* /wiring:e2 */\n    if (n && n.path !== quickLookTarget.value?.path) {\n      quickLookTarget.value = n;\n      void markRecent(n);\n    }\n  },\n);\n/* === /wiring:c2 === */\n/* wiring:c3 — operations center store + failed-upload retry */\nconst opsCenter = useOperations();\n\n/**\n * Retry a failed upload from the operations center. The failed row is already\n * retired by the store; re-run the upload against the job's ORIGINAL target\n * folder (the user may have navigated away since).\n *\n * ⚠ It goes back through the SAME decision a fresh upload makes, rather than\n * straight to the single-POST path as it used to. A retry is the moment resume\n * matters most: the staged session and its bookmark are still there, so this\n * continues from filex's offset instead of pushing the whole file again.\n */\nfunction retryUploadJob(job: UploadJob) {\n  uploadJobs.value = uploadJobs.value.filter((j) => j.id !== job.id);\n  const file = job.file;\n  const target = job.path || qualify(currentPath.value);\n  void (async () => {\n    if (chunked.shouldChunk(file)) {\n      if (await chunkedUpload(file, target)) {\n        await load();\n        return;\n      }\n    }\n    await legacyUpload(file, target);\n    await load();\n  })();\n}\n/* /wiring:c3 */\n/* === wiring:c4 — onboarding coach-mark tour ===\n * First mount with no `filex.tourDone` flag auto-starts the tour (short\n * delay so the listing/toolbar are laid out). Closing it — finished OR\n * skipped — stamps the flag; \"Turu tekrar başlat\" re-opens it any time.\n * Restart arrives as a bubbled `fe:tour-restart` CustomEvent from the\n * Toolbar overflow menu, so no extra prop/emit threading through the\n * shared component tags is needed. */\nconst TOUR_LS_KEY = 'filex.tourDone';\nconst showTour = ref(false);\nlet tourTimer: ReturnType<typeof setTimeout> | undefined;\n\nfunction tourAlreadyDone(): boolean {\n  try {\n    return localStorage.getItem(TOUR_LS_KEY) === '1';\n  } catch {\n    return true; // no storage → never auto-nag\n  }\n}\n\nfunction startTour() {\n  showTour.value = true;\n}\n\nfunction onTourClose() {\n  showTour.value = false;\n  try {\n    localStorage.setItem(TOUR_LS_KEY, '1');\n  } catch {\n    /* private mode / quota */\n  }\n  rootEl.value?.focus();\n}\n\nfunction onTourRestartEvent() {\n  startTour();\n}\n\nonMounted(() => {\n  rootEl.value?.addEventListener('fe:tour-restart', onTourRestartEvent);\n  if (!tourAlreadyDone()) {\n    tourTimer = setTimeout(() => {\n      if (!showTour.value) startTour();\n    }, 900);\n  }\n});\nonBeforeUnmount(() => {\n  if (tourTimer) clearTimeout(tourTimer);\n  rootEl.value?.removeEventListener('fe:tour-restart', onTourRestartEvent);\n});\n/* === /wiring:c4 === */\n\n/* === wiring:d1 — tabs (tab strip) + per-tab split ===\n *\n * useTabs is a layer ON TOP of the existing location state\n * (currentPath/viewMode): the active tab watches navigations and updates its\n * snapshot; switching tabs calls the existing load(path) path — no new fetch\n * logic. The strip is not rendered at all on a single tab (embeds stay\n * pixel-identical).\n *\n * Persist: `filex.tabs` — it follows the pathPersist scope logic: with mode\n * 'none' persistence is off; the rootPath confine is added to the key so that\n * embeds with different confines don't overwrite each other's tabs.\n */\nconst FE_DND_SRC_MIME = 'application/x-brf-files-src';\n\nconst TABS_LS_BASE = 'filex.tabs';\nfunction tabsStorageKey(): string | null {\n  if (persistMode() === 'none') return null;\n  return rootPathProp ? `${TABS_LS_BASE}:${rootPathProp}` : TABS_LS_BASE;\n}\nconst tabsApi = useTabs({ storageKey: tabsStorageKey() });\nconst tabsRestored = tabsApi.restore();\nconst tabsActiveId = tabsApi.activeId;\n\nconst activeSplit = computed(() => tabsApi.activeTab.value?.split ?? null);\n\n// Tab name is AUTOMATIC = the current folder name (root = storage name / root label).\nfunction tabLabel(path: string): string {\n  const p = (path || '').replace(/^\\/+|\\/+$/g, '');\n  // gezinti:g1 — the virtual views park a sentinel in the path. Translate via\n  // the SHARED map: this special-cased only '.trash' when recent/starred/shared\n  // arrived, so the strip read \".shared\" at users (reported 2026-09-04).\n  const virtualLabel = virtualSegmentLabel(p.split('/').pop() || p, t);\n  if (virtualLabel) return virtualLabel;\n  if (!p) return multiStorageRoot.value ? t('breadcrumb.root') : adapter.value || t('breadcrumb.root');\n  return p.split('/').pop() || p;\n}\nconst tabItems = computed(() =>\n  tabsApi.tabs.value.map((tb) => ({ id: tb.id, label: tabLabel(tb.path), split: !!tb.split })),\n);\n\n// The strip is visible by DEFAULT, on every surface (see ExplorerConfig — the\n// default used to differ between the desktop app and the web, which is the one\n// thing a shared package must never do). `tabStrip: 'auto'` is the opt-out.\n// ⚠ Gated on there being a tab at all, not on the flag alone: tabs are seeded\n// in onMounted, so the strip would otherwise paint one frame empty — a lone\n// `+` floating above the toolbar.\nconst tabsVisible = computed(\n  () =>\n    /* gezinti:g1 — the simple profile has no tab strip at all, not even once a\n       second tab exists: tabs were the first thing #14 named as power-user\n       chrome. The tab STATE is untouched, so switching the profile back brings\n       the strip and its tabs straight back. */\n    !simpleUi.value &&\n    (tabsApi.hasMultiple.value ||\n      (props.config.tabStrip !== 'auto' && tabItems.value.length > 0)),\n);\n\n// The active tab follows the user: navigation + view changes go into the snapshot.\nwatch(currentPath, (p) => tabsApi.syncActive({ path: p }));\nwatch(viewMode, (v) => tabsApi.syncActive({ viewMode: v }));\n\n// The first tab is seeded as soon as the first location is known (don't touch\n// it if a restore happened — the active snapshot is already synced by the\n// currentPath watcher after the first load).\nonMounted(() => {\n  if (!tabsRestored) tabsApi.seed(currentPath.value ?? '', viewMode.value);\n});\n\nfunction applyTabLocation(tb: TabState) {\n  /* tablo:t1 — the tab's own remembered view mode is applied only while\n   * per-folder memory is OFF.\n   *\n   * ⚠⚠ Two things remembering the same fact is two things that disagree, and\n   * this pair disagreed in a way nothing would have caught: open one folder in\n   * two tabs, set it to grid in the first, switch to the second, and the second\n   * restores the LIST it happened to be showing — for the same folder, whose\n   * remembered view is grid. Measured, 2026-09-13. The applier below could not\n   * correct it either, because it fires on a change of FOLDER and the folder\n   * did not change; only the tab did.\n   *\n   * With the memory on, the folder is the authority and a tab is just a window\n   * onto one, so the tab's copy is redundant and is ignored. With it off,\n   * nothing here changes at all and tabs keep exactly the behaviour they had.\n   */\n  if (!folderMemoryEnabled() && tb.viewMode && tb.viewMode !== viewMode.value) {\n    viewMode.value = tb.viewMode;\n  }\n  /* ⚠ AFTER the load, not before. `load()` is async, so `currentPath` — and\n   * with it `currentFolderKey` — only moves once it settles; re-asserting here\n   * is also what covers the case above, where the key never changes and the\n   * watcher therefore never runs. */\n  const settle = () => applyFolderView(currentFolderKey.value);\n  if (tb.path === '.trash') {\n    void loadTrash().then(settle, settle);\n    return;\n  }\n  void load(tb.path).then(settle, settle);\n}\nfunction activateTab(id: string) {\n  const tb = tabsApi.activate(id);\n  if (tb) applyTabLocation(tb);\n}\nfunction newTabHere() {\n  // Clones the current location; the view is already there, so no load needed.\n  tabsApi.openTab(currentPath.value ?? '', { viewMode: viewMode.value, background: false });\n}\nfunction closeTabById(id: string) {\n  const next = tabsApi.closeTab(id);\n  if (next) applyTabLocation(next);\n}\nfunction nextTab() {\n  const tb = tabsApi.step(1);\n  if (tb) applyTabLocation(tb);\n}\nfunction prevTab() {\n  const tb = tabsApi.step(-1);\n  if (tb) applyTabLocation(tb);\n}\n\n/** Open a folder in a new tab IN THE BACKGROUND (middle-click / right-click / palette). */\nfunction openNodeInTab(n: FileNode) {\n  if (n.type !== 'dir' || n.basename === '.trash') return;\n  const target = multiStorageRoot.value ? wireToVirtual(n.path) : stripAdapter(n.path);\n  tabsApi.openTab(target, { viewMode: viewMode.value, background: true });\n}\n\n// Middle-click delegation: ListView/GridView rows carry data-fe-path, so a\n// single auxclick listener at the root is enough instead of adding a\n// keydown/emit chain of our own. (SecondaryPane handles its own rows via\n// stopPropagation.)\nfunction onListAuxClick(ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  const host = ev.target as HTMLElement | null;\n  const el = host && typeof host.closest === 'function' ? host.closest('[data-fe-path]') : null;\n  const p = el?.getAttribute('data-fe-path');\n  if (!p) return;\n  const node = files.value.find((f) => f.path === p);\n  if (!node || node.type !== 'dir' || node.basename === '.trash') return;\n  ev.preventDefault();\n  openNodeInTab(node);\n}\n// Cancel the middle-button mousedown over rows: in a scrollable body Chromium's\n// autoscroll kicks in and auxclick is NEVER produced (diagnosed live) —\n// preventDefault suppresses autoscroll and auxclick flows again.\nfunction onListMiddleDown(ev: MouseEvent) {\n  if (ev.button !== 1) return;\n  const host = ev.target as HTMLElement | null;\n  if (host && typeof host.closest === 'function' && host.closest('[data-fe-path]')) {\n    ev.preventDefault();\n  }\n}\nonMounted(() => {\n  rootEl.value?.addEventListener('auxclick', onListAuxClick);\n  rootEl.value?.addEventListener('mousedown', onListMiddleDown);\n});\nonBeforeUnmount(() => {\n  rootEl.value?.removeEventListener('auxclick', onListAuxClick);\n  rootEl.value?.removeEventListener('mousedown', onListMiddleDown);\n});\n\n// ---- split (per-tab secondary pane) --------------------------------\n\nconst mainPaneRef = ref<InstanceType<typeof FilePane> | null>(null);\nconst splitPaneRef = ref<InstanceType<typeof FilePane> | null>(null);\n\n/* pane:p1 — the split pane's half of the state the HOST has to hold.\n *\n * ⚠⚠ Two instances of ONE composable, not two implementations. The explorer\n * routes cut/copy/paste, the context menu, the inspector, the toolbar's count\n * and every keyboard shortcut through \"the active pane's selection\", so it has\n * to hold both — but `useSelection` is written once and this is the second\n * call to it, exactly as `lib/fileFilters` is written once and this is the\n * second filter object. What used to be here instead was a SECOND selection\n * model living inside `SecondaryPane`, in which Shift behaved as Ctrl because\n * it kept a plain Set with no range anchor. */\nconst splitDisplayOrder = ref<FileNode[]>([]);\nconst splitSelection = useSelection(() =>\n  splitDisplayOrder.value.length ? splitDisplayOrder.value : (splitPaneRef.value?.visibleNodes() ?? []),\n);\nconst splitFilters = ref<DriveFilters>({ ...EMPTY_FILTERS });\n\n/** The split pane's folder, in the key `lib/viewPrefs` remembers folders under\n *  — so the column menu's two per-folder rows tell the truth on the right as\n *  well as on the left.\n *\n * ⚠⚠ READ-ONLY on this side, and that is a decision. The memory answers \"how\n * did I leave this folder\", and a folder is left in ONE state; two panes both\n * writing it would be the stale-snapshot race that already bit the tab strip\n * once today, with a second racer. So: BOTH panes read a folder's arrangement\n * when they arrive in it (the split pane's sort store is seeded from the\n * global default and this key is what its column menu operates on), and only\n * the main pane — the one the window's tab is about, the one whose view mode\n * the tab records — writes it back. Nothing re-applies memory to a pane that\n * is sitting still, so a choice made in one pane can never yank the other\n * pane's view out from under it. */\nconst splitFolderKey = computed(() => {\n  if (!folderMemoryOn.value) return '';\n  const path = String(splitPaneRef.value?.getPath() ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!path) return '';\n  const [first, ...rest] = path.split('/');\n  const st = (props.config.storages ?? []).find((sto) => sto.name === first);\n  return makeFolderKey(st?.uid || first, rest.join('/'));\n});\n\n/* pane:p1 — the row above BOTH panes. It survives the tabs being switched off\n * (the `simple` profile) because the split and details toggles live in it too;\n * `hideTabs` empties it without removing it. */\nconst paneRowVisible = computed(\n  () => tabsVisible.value || infoPanelToggle.value || splitOffered.value,\n);\n\n/**\n * pane:p1 — the states the WINDOW draws INSTEAD of a listing.\n *\n * Home, a dead deep link and the encrypted lock screen are not things that can\n * happen to a pane — they are things that have happened to the explorer — so\n * they arrive in `FilePane`'s `body` slot and this says which. Everything else\n * in the old chain (the skeleton, the failed listing, the filtered-empty\n * state, the listing itself) IS pane state and now lives in the pane, once,\n * for both halves.\n *\n * ⚠ The two `return ''`s are load-bearing: they hand the turn back to the\n * pane's own skeleton and error states in exactly the order the chain had, so\n * a folder that is still loading does not flash its lock screen and a failed\n * listing still gets the retry state rather than \"not found\".\n */\nconst hostBodyState = computed<'' | 'home' | 'notfound' | 'locked'>(() => {\n  if (navView.value === 'home') return 'home';\n  if (loading.value && files.value.length === 0) return '';\n  if (notFoundPath.value) return 'notfound';\n  if (loadError.value && files.value.length === 0) return '';\n  if (e2eLocked.value) return 'locked';\n  return '';\n});\n/**\n * Can a second pane be OPENED here at all?\n *\n * ⚠⚠ One answer for every door to the split, and it is not `!isNarrow`. The\n * tab strip's toggle and the command palette's row were both handed\n * `!isNarrow` and nothing else, while the pane below was gated on the\n * `simple` profile as well — so under `ui-profile=\"simple\"` the button was\n * drawn, a click recorded a split on the tab and turned the button PRESSED,\n * and no pane ever appeared (measured 2026-09-14 at 1440: one pane before the\n * click, one after, `aria-pressed=\"true\"`). A control that lies about its own\n * state is worse than a missing one. The state it wrote is kept, so switching\n * the profile back would suddenly split a tab nobody remembers splitting —\n * which is why `toggleSplit` refuses to open one here too, not only the\n * button.\n *\n * Narrow mode keeps the state and brings it back on widen; the simple profile\n * offers no split at all (`lib/uiProfile`).\n */\nconst splitOffered = computed(() => !isNarrow.value && !simpleUi.value);\nconst splitVisible = computed(() => !!activeSplit.value && splitOffered.value /* gezinti:g1 */);\n\nfunction toggleSplit() {\n  if (activeSplit.value) {\n    tabsApi.setSplit(null);\n    activePane.value = 'main';\n    return;\n  }\n  if (!splitOffered.value) return;\n  tabsApi.setSplit({ path: currentPath.value ?? '', viewMode: viewMode.value });\n}\nfunction closeSplit() {\n  tabsApi.setSplit(null);\n  activePane.value = 'main';\n}\nfunction onPaneNavigate(p: string) {\n  tabsApi.setSplit({ ...(activeSplit.value ?? {}), path: p });\n  /* A navigation is a new folder: the chips the person set for the folder they\n     just left must not silently keep narrowing the one they arrived in. Same\n     rule the main pane's own watcher applies. */\n  if (filtersActive(splitFilters.value)) splitFilters.value = { ...EMPTY_FILTERS };\n  splitSelection.clear();\n  splitDisplayOrder.value = [];\n}\n\n/**\n * pane:p1 — a row was opened (double-click, Enter) in one of the panes.\n *\n * A FOLDER opens in the pane it was opened from — that is the whole point of a\n * second pane. Everything else is the window's business (the preview modal,\n * the encrypted-blob path, `markRecent`) and goes to the one `openNode` both\n * panes have always been entitled to. The right-hand pane used to have no path\n * to it at all, so double-clicking a file there did nothing.\n */\nfunction onPaneOpen(pane: 'main' | 'split', n: FileNode) {\n  if (pane === 'split' && n.type === 'dir' && n.basename !== '.trash') {\n    void splitPaneRef.value?.loadFolder(\n      /* A multi-storage drive row's path is already the wire form for that\n         storage's root; a real row needs converting. The predicate comes from\n         `lib/fileIcons`, which is that concept's one home. */\n      iconFamilyFor(n) === 'storage' ? n.path : paneToUser(n.path),\n    );\n    return;\n  }\n  openNode(n);\n}\n\n/* ui-fix — when the trash row is opened from the side pane: the trash view\n * (with its restore actions) belongs to the main pane → activate the main\n * pane and open it there. */\nfunction onPaneOpenTrash() {\n  activePane.value = 'main';\n  void loadTrash();\n}\n/* ui-fix — the pane's OWN view mode: it inherits the main pane's when the\n * split opens, and is independent afterwards. The toolbar's view switcher and\n * the palette toggle write to the ACTIVE pane (Ada, translated from Turkish:\n * \"if I say change the icon while B is focused, B is the one that has to\n * change\"). */\nconst paneViewMode = computed<ViewMode>(() => activeSplit.value?.viewMode ?? viewMode.value);\nfunction setPaneViewMode(v: ViewMode) {\n  if (!activeSplit.value) return;\n  tabsApi.setSplit({ ...activeSplit.value, viewMode: v });\n}\nconst displayedViewMode = computed<ViewMode>(() =>\n  paneIsActive.value ? paneViewMode.value : viewMode.value,\n);\nfunction setDisplayedViewMode(v: ViewMode) {\n  if (paneIsActive.value) setPaneViewMode(v);\n  else viewMode.value = v;\n}\n\n// Active pane: shortcuts go to the active pane; a pane is activated by clicking it.\nconst activePane = ref<'main' | 'split'>('main');\nfunction setPaneMain() {\n  activePane.value = 'main';\n}\nwatch(splitVisible, (v) => {\n  if (!v) activePane.value = 'main';\n});\nconst paneIsActive = computed(() => activePane.value === 'split' && splitVisible.value);\nconst mainPaneFocus = computed(() => splitVisible.value && activePane.value === 'main');\n/** The `data-pane` of the half that owns `activeTargets()`. The selection bar\n *  is teleported into THAT pane, so this is what tells the toolbar where. */\nconst activePaneId = computed(() => (paneIsActive.value ? 'split' : 'main'));\n\n/* === koru:k1 + pane:p1 — THE DETAILS PANEL FOLLOWS THE FOCUSED PANE =======\n *\n * ⚠⚠ It did not, and the owner reported it, 2026-09-13: \"Yanda açılan info\n * panele sadece ana pane üzerinde tıklanmış ya da bulunduğumuz yerin infosu\n * geliyor. Onun dışında öteki pane'de tıkladığımız yerlerin infosu hiç\n * gelmiyor.\" The panel read `selection.nodes` — the MAIN pane's selection —\n * so clicking a row in the right-hand half changed the highlight, changed the\n * selection bar (which had just been taught this rule) and left the panel\n * describing something in the other half entirely.\n *\n * ⚠ The same source as the selection bar, deliberately: `activeTargets()`.\n * That function is already the one answer to \"what is selected right now\", and\n * the whole reason it exists is that the toolbar used to have a second one.\n * A third, here, would be the same bug a month later.\n *\n * ⚠ WITH NO SELECTION the panel describes the focused pane's FOLDER, which is\n * the behaviour it already had for the main pane and the only honest one: the\n * head then reads the place you are standing in. So clicking into the split\n * pane's empty background moves the panel to that pane's folder rather than\n * leaving it on the other half's — which is the complaint, one level up.\n */\n/**\n * ⚠⚠ IT HOLDS THE LAST SELECTED THING. Owner's ruling, 2026-09-13, asked and\n * answered: \"son seçilen şeyi tutsun.\"\n *\n * So moving the keyboard to a pane with nothing ticked does NOT empty the panel\n * and does NOT fall back to that pane's folder — it goes on describing whatever\n * was selected last, until something else is selected. That is the difference\n * between a panel you can read while you work in the other half and a panel\n * that blanks the moment you click away from what you were reading about.\n *\n * ⚠ The two consequences of holding, handled below rather than left implicit:\n *   1. the held item can live in the pane you are NOT looking at, so the panel\n *      is TOLD it is holding and where the item is (`heldIn`), and says so;\n *   2. a held item can stop existing — deleted, moved, or its pane closed — and\n *      a panel describing a file that is gone is worse than an empty one, so\n *      `heldValid` drops it the moment its own pane's listing no longer has it.\n */\nconst heldSelection = ref<{ nodes: FileNode[]; pane: 'main' | 'split'; path: string } | null>(null);\n\n/** The focused pane's location, user-path form. */\nconst activePanePath = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.getPath() ?? '') : (currentPath.value ?? ''),\n);\nfunction panePathOf(pane: 'main' | 'split'): string {\n  return pane === 'split' ? (splitPaneRef.value?.getPath() ?? '') : (currentPath.value ?? '');\n}\n/** The paths a pane's folder HOLDS — before the filter row narrows them. ⚠ The\n *  unfiltered set on both sides: \"is this row still there\" and \"is this row\n *  currently drawn\" are different questions, and answering the first with the\n *  second would make typing in the filter box drop the held item as if the file\n *  had been deleted. */\nfunction panePathsOf(pane: 'main' | 'split'): string[] {\n  return pane === 'split'\n    ? (splitPaneRef.value?.rowPaths() ?? [])\n    : files.value.map((n) => n.path);\n}\n\n/* Capture: any non-empty selection, in either pane, becomes the held one. */\nwatch(\n  () => activeTargets(),\n  (nodes) => {\n    if (nodes.length) {\n      heldSelection.value = {\n        nodes,\n        pane: activePaneId.value as 'main' | 'split',\n        path: activePanePath.value,\n      };\n    }\n  },\n  { deep: false },\n);\n\n/**\n * Is the held item still a real thing?\n *\n * ⚠ Only checked while its own pane is still showing the folder it was held\n * from. Walking away from a folder is not a deletion — \"last selected\" has to\n * survive a navigation or it is not a hold at all — but standing in the same\n * folder with the row gone IS one, and that is the case that must not be\n * described. A closed split pane takes its held item with it.\n */\nconst heldValid = computed<boolean>(() => {\n  const h = heldSelection.value;\n  if (!h || !h.nodes.length) return false;\n  if (h.pane === 'split' && !splitVisible.value) return false;\n  if (panePathOf(h.pane) !== h.path) return true; // navigated away — still held\n  const here = new Set(panePathsOf(h.pane));\n  return h.nodes.some((n) => here.has(n.path));\n});\nwatch(heldValid, (ok) => {\n  if (!ok) heldSelection.value = null;\n});\n\n/** True while the panel is describing the HELD item rather than a live\n *  selection — i.e. the focused pane has nothing ticked. */\nconst inspectorHeld = computed(() => activeTargets().length === 0 && heldValid.value);\nconst inspectorNodes = computed<FileNode[]>(() => {\n  const live = activeTargets();\n  if (live.length) return live;\n  return heldValid.value ? (heldSelection.value?.nodes ?? []) : [];\n});\n/** Where the held item lives — named, so \"this is not what is selected in front\n *  of you\" is never a guess. Empty while a live selection is shown. */\nconst inspectorHeldIn = computed(() =>\n  inspectorHeld.value ? folderLabelOf(heldSelection.value?.path ?? '') : '',\n);\n\n/** Folder summary label for the truly-empty state — of the FOCUSED pane. */\nconst inspectorDirLabel = computed(() => folderLabelOf(activePanePath.value));\n/** How many rows that folder holds. `files` IS the main pane's row array, so\n *  the two branches are the same quantity measured on the two panes. */\nconst inspectorDirCount = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.rowCount() ?? 0) : files.value.length,\n);\n/** RBAC level of that folder. The main pane's comes off the host's own load;\n *  the split pane reads it from the response to its own `index`. */\nconst inspectorDirPerm = computed(() =>\n  paneIsActive.value ? (splitPaneRef.value?.dirPerm() ?? '') : dirPerm.value,\n);\n\n// Pane helpers — always wrap the main pane's existing converters.\nfunction paneToUser(wire: string): string {\n  return multiStorageRoot.value ? wireToVirtual(wire) : stripAdapter(wire);\n}\nfunction paneClamp(p: string): string {\n  const clean = String(p ?? '').replace(/^\\/+|\\/+$/g, '');\n  if (!rootFloor) return clean;\n  if (!clean || !(clean === rootFloor || clean.startsWith(rootFloor + '/'))) return rootFloor;\n  return clean;\n}\n\n// The clipboard follows the active pane: cut/copy is fed from the pane\n// selection and paste lands in the pane's folder. The state is SHARED with the\n// main pane's — so cut-and-paste between panes works for free.\nfunction paneCut() {\n  const nodes = splitSelection.nodes.value;\n  if (nodes.length === 0) return;\n  clipboard.value = { mode: 'cut', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n  flashToast(t('toast.cut'));\n}\nfunction paneCopy() {\n  const nodes = splitSelection.nodes.value;\n  if (nodes.length === 0) return;\n  clipboard.value = { mode: 'copy', items: nodes, sourcePath: splitPaneRef.value?.getPath() ?? '' };\n  flashToast(t('toast.copied'));\n}\nasync function panePaste() {\n  const cb = clipboard.value;\n  const pane = splitPaneRef.value;\n  if (!cb.mode || cb.items.length === 0 || !pane) return;\n  const targetWire = qualify(pane.getPath() ?? '');\n  const originWire = qualify(cb.sourcePath || '') || undefined;\n  if (cb.mode === 'cut' && originWire === targetWire) {\n    flashToast(t('toast.same_folder_cut'));\n    return;\n  }\n  await transferItems(cb.items.map((n) => n.path), targetWire, originWire, cb.mode === 'copy' ? 'copy' : 'move');\n  clipboard.value = { mode: null, items: [], sourcePath: null };\n}\n\n// ---- cross-pane transfer -------------------------------------------\nfunction dndOrigin(ev: DragEvent): string | undefined {\n  return internalDragOrigin(ev);\n}\n\n/**\n * transferItems — the single gate for cross-pane / clipboard transfers.\n *\n * `resolveTransfer` decides what to do (lib/transfer.ts): a drag MOVES within\n * the same storage and COPIES across storages; a cut/copy coming from\n * the clipboard does exactly what it says — cut MOVES even when the target is\n * another storage (the server transfers the bytes and deletes the source).\n * ⚠ Cross-storage transfers used to silently fall back to a copy: the user\n * said \"cut\" and found the file in two places. When it's done the secondary\n * pane is refreshed too (the main pane is already refreshed via\n * moveSourcesAsync / pendingOps onSettled).\n */\nasync function transferItems(\n  sources: string[],\n  targetWire: string,\n  originWire?: string,\n  intent: TransferIntent = 'auto',\n): Promise<void> {\n  // ui-fix — an in-place drop (source parent === target) is a no-op: this\n  // avoids the backend's \"copy onto itself\" 400 (cross-pane + clipboard paths).\n  const list = sources.filter(\n    (p) => p && p !== targetWire && !targetWire.startsWith(p + '/') && !sameDir(wireParent(p), targetWire),\n  );\n  if (list.length === 0 || !targetWire) return;\n  const plan = resolveTransfer(list, targetWire, intent);\n  if (plan.kind === 'copy') {\n    try {\n      const { op } = await api.copy(list, targetWire);\n      pendingOps.register(op);\n      flashToast(plan.cross ? t('split.cross_copy') : t('split.copy_queued'));\n    } catch (err) {\n      // ⚠ Show the server's own message. There used to be a hard-coded\n      // \"cross-storage is not supported\" text here; it IS supported now, so\n      // that text would mask the real cause (permissions, a read-only storage,\n      // a full quota).\n      emit('error', { message: (err as Error).message, context: { op: 'transfer', targetWire } });\n      flashToast((err as Error).message);\n      return;\n    }\n  } else {\n    if (plan.cross) flashToast(t('split.cross_move'));\n    await moveSourcesAsync(list, targetWire, 'move-transfer', originWire);\n  }\n  void splitPaneRef.value?.reload();\n}\n\nfunction onPaneTransfer(p: { sources: string[]; targetWire: string; originWire?: string }) {\n  void transferItems(p.sources, p.targetWire, p.originWire);\n}\n/* === /wiring:d1 === */\n\n/* === wiring:e2 — end-to-end encrypted folders ===\n *\n * Crypto scheme + threat model: docs/E2E-ENCRYPTION.md and lib/e2ecrypto.ts.\n * Only the orchestration lives here: `e2e_root` in the backend listing\n * response drives the lock screen; the password is verified against the\n * marker IN THE BROWSER (nothing goes to the server); the derived folder key\n * (KEK) lives ONLY in memory (`e2eRing`) — it is never written to\n * localStorage/sessionStorage. Uploads are encrypted transparently and\n * previews/downloads decrypted transparently (a blob URL to the existing\n * viewers).\n */\nconst e2eRing = createKeyRing();\n// Maps aren't reactive — a version counter drives the computeds.\nconst e2eRingVer = ref(0);\n// Wire path of the encrypted root we are inside ('' = no encrypted context).\nconst e2eRoot = ref('');\n// path → decrypted blob objectURL (preview). Revoked on lock/unmount.\nconst e2eUrls = new Map<string, string>();\n\nconst e2eActive = computed(() => !!e2eRoot.value && !trashMode.value);\nconst e2eUnlocked = computed(() => {\n  void e2eRingVer.value;\n  return e2eActive.value && e2eRing.has(e2eRoot.value);\n});\nconst e2eLocked = computed(() => {\n  void e2eRingVer.value;\n  return e2eActive.value && !e2eRing.has(e2eRoot.value);\n});\n\n// Lock screen form.\nconst e2ePw = ref('');\nconst e2eUnlockBusy = ref(false);\nconst e2eUnlockErr = ref('');\n// Encrypted-folder creation modal.\nconst showEncFolder = ref(false);\nconst e2eCreateBusy = ref(false);\n\n/* wiring:e2 recovery — recovery key + escrow.\n *\n * The marker of the folder we are looking at is cached here while the lock\n * screen is up: the recovery dialog needs to know which doors this folder\n * actually has (a pre-0.31 folder has none) before offering them. */\nconst e2eMarker = ref<E2eMarker | null>(null);\nconst showRecoveryUnlock = ref(false);\nconst e2eRecoverBusy = ref(false);\nconst e2eRecoverErr = ref<string | null>(null);\n// The shown-once key. Held only while its dialog is open.\nconst showRecoveryKey = ref(false);\nconst recoveryKeyValue = ref('');\nconst recoveryKeyVariant = ref<'created' | 'upgraded'>('created');\nconst recoveryKeyFolder = ref('');\n// A v1 folder that just opened by password: offer to give it recovery now,\n// because this is the only moment filex holds the password.\nconst e2eUpgradeOffer = ref(false);\nconst e2eUpgradePw = ref('');\nconst e2eUpgradeBusy = ref(false);\n\n/* wiring:e2 escrow-offer — offering an EXISTING folder an escrow slot.\n *\n * Adoption covers folders created after it, which on an installation that\n * has been running for a while is nobody's folders: the ones that matter\n * already exist. The server cannot reach them — adding a slot needs the\n * folder master key. Its owner can, from inside, with the password, and the\n * one moment that password exists in the browser is an unlock. So this\n * lives exactly where the v1 recovery offer lives, in the same strip, with\n * the same shape.\n *\n * mode distinguishes the two ways in:\n *   'unlock'  right after a successful password unlock — we still hold the\n *             password, so Accept needs no typing, and Not now RECORDS a\n *             refusal so the question is not asked again.\n *   'manual'  the way back, from the unlocked strip, for somebody who said\n *             no earlier. The password is gone by then, so it is typed, and\n *             Cancel records nothing — they already answered once. */\nconst e2eEscrowOffer = ref(false);\nconst e2eEscrowOfferMode = ref<'unlock' | 'manual'>('unlock');\nconst e2eEscrowPw = ref('');\nconst e2eEscrowBusy = ref(false);\nconst e2eEscrowErr = ref('');\n\n/** The installation's escrow public key, or null when escrow is off.\n *  Published in /api/capabilities on purpose — see docs/E2E-ENCRYPTION.md. */\nconst e2eEscrowPub = computed<string | null>(\n  () => capabilitiesData.value?.e2e_escrow?.public_key || null,\n);\n/** Where the honest version of \"what escrow can and cannot do\" lives.\n *  ⚠ Linked from the offer on purpose: the notice says what accepting means,\n *  and the page says what the use-notification can and cannot promise — that\n *  an operator holding the private key can decrypt offline with no request,\n *  no notification and no audit row. Somebody being asked to hand over a key\n *  is entitled to read that before answering, not after. */\nconst e2eEscrowDocsUrl = 'https://docs.filex.sh/E2E-ENCRYPTION#what-escrow-can-and-cannot-do';\n\nconst e2eEscrowKid = computed<string | null>(\n  () => capabilitiesData.value?.e2e_escrow?.kid || null,\n);\n\nfunction e2eKek(): CryptoKey | null {\n  return e2eRing.get(e2eRoot.value) ?? null;\n}\n\nfunction e2eRevokeAll() {\n  for (const url of e2eUrls.values()) URL.revokeObjectURL(url);\n  e2eUrls.clear();\n}\nonBeforeUnmount(e2eRevokeAll);\n\n/** Unlock: fetch the marker from the root, verify the password LOCALLY, put the KEK in memory. */\nasync function e2eUnlock() {\n  if (!e2ePw.value || e2eUnlockBusy.value || !e2eRoot.value) return;\n  e2eUnlockBusy.value = true;\n  e2eUnlockErr.value = '';\n  try {\n    let markerText = '';\n    try {\n      const { blob, url } = await api.fetchBlob(wireJoin(e2eRoot.value, E2E_MARKER_NAME), { fresh: true });\n      URL.revokeObjectURL(url);\n      markerText = await blob.text();\n    } catch {\n      e2eUnlockErr.value = t('e2e.unlock.marker_missing');\n      return;\n    }\n    const marker = parseMarker(markerText);\n    if (!marker) {\n      e2eUnlockErr.value = t('e2e.unlock.marker_missing');\n      return;\n    }\n    e2eMarker.value = marker;\n    const fmk = await unlockWithPassword(marker, e2ePw.value);\n    if (!fmk) {\n      e2eUnlockErr.value = t('e2e.unlock.wrong');\n      return;\n    }\n    e2eRing.set(e2eRoot.value, fmk);\n    e2eRingVer.value++;\n    /* wiring:e2 recovery — a folder from before recovery existed has no way\n     * back in but its password. This is the ONE moment we hold that password,\n     * so ask now. Asking is all we do: the folder keeps working untouched if\n     * the user says no, and saying yes is the only path that also hands the\n     * operator an escrow key (when the install has one), which is why the\n     * prompt says so rather than doing it quietly. */\n    if (marker.v === 1) {\n      e2eUpgradePw.value = e2ePw.value;\n      e2eUpgradeOffer.value = true;\n    } else if (escrowOfferState(marker, e2eEscrowKid.value) === 'offer') {\n      /* wiring:e2 escrow-offer — a v2 folder that predates escrow here.\n       * ⚠ Only after the unlock SUCCEEDED, and only by password: accepting\n       * gives the operator a key to this folder, so the person asked has to\n       * be the person who can already open it. A v1 folder is handled by the\n       * branch above, which seals an escrow slot as part of the upgrade and\n       * already discloses that — two offers on one unlock would be two\n       * chances to get the disclosure wrong. */\n      e2eEscrowPw.value = e2ePw.value;\n      e2eEscrowOfferMode.value = 'unlock';\n      e2eEscrowErr.value = '';\n      e2eEscrowOffer.value = true;\n    }\n    e2ePw.value = '';\n  } finally {\n    e2eUnlockBusy.value = false;\n  }\n}\n\n/** \"Kilitle\" (Lock): drop the in-memory key and the decrypted blobs. */\nfunction e2eLock() {\n  if (!e2eRoot.value) return;\n  e2eRing.lock(e2eRoot.value);\n  e2eRingVer.value++;\n  e2eRevokeAll();\n  flashToast(t('e2e.locked_toast'));\n}\n\n// Extension → preview MIME: so the decrypted blob renders correctly in\n// <img>/<video>/<object> tags (the server knows the encrypted file as\n// octet-stream, so the type coming from there is useless).\nconst E2E_MIME: Record<string, string> = {\n  txt: 'text/plain', md: 'text/markdown', log: 'text/plain', csv: 'text/csv',\n  json: 'application/json', xml: 'application/xml', html: 'text/html',\n  jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', gif: 'image/gif',\n  webp: 'image/webp', bmp: 'image/bmp', avif: 'image/avif', svg: 'image/svg+xml',\n  pdf: 'application/pdf',\n  mp4: 'video/mp4', webm: 'video/webm', mov: 'video/quicktime', m4v: 'video/mp4',\n  mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n  m4a: 'audio/mp4', aac: 'audio/aac', opus: 'audio/opus',\n};\nfunction e2eMimeFor(n: FileNode): string {\n  const ext = (n.extension || '').toLowerCase();\n  return E2E_MIME[ext] || 'application/octet-stream';\n}\n\n/**\n * Fetch the file + decrypt it + cache its objectURL. Returns null for a file\n * with no magic (e.g. written in the clear over DAV) — the caller then falls\n * back to the normal raw flow. A wrong key / corrupt data throws\n * E2eDecryptError (the caller toasts it).\n */\nasync function e2eFetchDecrypted(n: FileNode): Promise<string | null> {\n  const cached = e2eUrls.get(n.path);\n  if (cached) return cached;\n  const kek = e2eKek();\n  if (!kek) return null;\n  const buf = await api.fetchArrayBuffer(n.path);\n  if (!hasMagic(buf)) return null;\n  const plain = await decryptFile(kek, buf);\n  const url = URL.createObjectURL(new Blob([plain], { type: e2eMimeFor(n) }));\n  e2eUrls.set(n.path, url);\n  return url;\n}\n\n/** URL provider handed to PreviewModal/QuickLook: decrypted blob > raw URL. */\nfunction e2ePreviewSrc(p: string): string {\n  return e2eUrls.get(p) ?? api.previewUrl(p);\n}\n\n/** Decrypt + read-only in-page preview (openNode/previewNode land here). */\nasync function e2eOpenPreview(n: FileNode) {\n  try {\n    await e2eFetchDecrypted(n);\n  } catch {\n    flashToast(t('e2e.decrypt_failed'));\n    return;\n  }\n  previewMode.value = 'view';\n  previewTarget.value = n;\n  showPreview.value = true;\n  emit('file-opened', { path: n.path, basename: n.basename });\n  void markRecent(n);\n}\n\n/** Decrypt + download under the original name. A file with no magic comes down as-is. */\nasync function e2eDownload(n: FileNode) {\n  try {\n    const buf = await api.fetchArrayBuffer(n.path);\n    const kek = e2eKek();\n    let out = buf;\n    if (hasMagic(buf)) {\n      if (!kek) throw new Error('locked');\n      out = await decryptFile(kek, buf);\n    }\n    const url = URL.createObjectURL(new Blob([out], { type: e2eMimeFor(n) }));\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = n.basename;\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    setTimeout(() => URL.revokeObjectURL(url), 30_000);\n  } catch {\n    flashToast(t('e2e.download.failed'));\n  }\n}\n\n/** Upload list → encrypted File list (anything over 200MB + the marker name is skipped). */\nasync function e2eEncryptUploads(list: File[]): Promise<File[]> {\n  const kek = e2eKek();\n  if (!kek) return [];\n  const out: File[] = [];\n  for (const f of list) {\n    if (f.name === E2E_MARKER_NAME) continue;\n    if (f.size > E2E_MAX_FILE_BYTES) {\n      flashToast(t('e2e.upload.too_big'));\n      continue;\n    }\n    try {\n      const ct = await encryptFile(kek, await f.arrayBuffer());\n      out.push(new File([ct], f.name, { type: 'application/octet-stream' }));\n    } catch (err) {\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-encrypt', file: f.name } });\n    }\n  }\n  return out;\n}\n\n/** EncryptedFolderModal submit: create the folder + upload the marker + leave it unlocked. */\nasync function submitEncryptedFolder(payload: { name: string; password: string }) {\n  if (e2eActive.value) {\n    // Nested encrypted folders blur root detection — not in the MVP.\n    flashToast(t('e2e.create.nested'));\n    return;\n  }\n  e2eCreateBusy.value = true;\n  try {\n    const dirWire = qualify(currentPath.value);\n    await api.newFolder(dirWire, payload.name);\n    /* wiring:e2 recovery — the folder gets a recovery key at birth, and an\n     * escrow slot when the installation has one. Both are decided HERE and\n     * never again: the wrapped copies are written into the marker now, so a\n     * folder created without escrow can never be opened by an escrow key. */\n    const { marker, fmk, recoveryKey } = await createEncryptedFolder(payload.password, {\n      escrowPublicKey: e2eEscrowPub.value,\n    });\n    const markerFile = new File([JSON.stringify(marker)], E2E_MARKER_NAME, {\n      type: 'application/json',\n    });\n    const newDirWire = wireJoin(dirWire, payload.name);\n    await api.uploadMultipart(newDirWire, [markerFile]);\n    // It starts unlocked in the creating session (they just typed the password).\n    e2eRing.set(newDirWire, fmk);\n    e2eRingVer.value++;\n    showEncFolder.value = false;\n    // ⚠ Show the key only after the marker is safely uploaded. Showing it\n    // first would promise recovery for a folder that failed to be created.\n    recoveryKeyValue.value = recoveryKey;\n    recoveryKeyFolder.value = payload.name;\n    recoveryKeyVariant.value = 'created';\n    showRecoveryKey.value = true;\n    await load();\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-create' } });\n    flashToast(t('e2e.create.failed'));\n  } finally {\n    e2eCreateBusy.value = false;\n  }\n}\n\n/* --- wiring:e2 recovery ------------------------------------------------\n *\n * Two more ways into a locked folder, and one way to give an old folder\n * those ways. The password path above is untouched, and nothing here runs\n * without an explicit user action.\n */\n\n/** Unlock without the password: user recovery key, or the operator's escrow\n *  key. The escrow branch announces itself to the server first. */\nasync function e2eRecoverUnlock(payload: { mode: 'recovery' | 'escrow'; value: string }) {\n  if (!e2eMarker.value || !e2eRoot.value) return;\n  e2eRecoverBusy.value = true;\n  e2eRecoverErr.value = null;\n  try {\n    let fmk: CryptoKey | null = null;\n    if (payload.mode === 'recovery') {\n      fmk = await unlockWithRecoveryKey(e2eMarker.value, payload.value);\n      if (!fmk) {\n        e2eRecoverErr.value = t('e2e.recover.wrong_recovery');\n        return;\n      }\n    } else {\n      let priv: CryptoKey;\n      try {\n        priv = await importEscrowPrivateKey(payload.value);\n      } catch {\n        e2eRecoverErr.value = t('e2e.recover.bad_escrow_key');\n        return;\n      }\n      fmk = await unlockWithEscrowKey(e2eMarker.value, priv);\n      if (!fmk) {\n        e2eRecoverErr.value = t('e2e.recover.wrong_escrow');\n        return;\n      }\n      /* ⚠ Announce BEFORE unlocking, and treat a failure to announce as a\n       * failure to unlock. The server hands out a nonce sealed to the escrow\n       * public key; returning it proves the key was really here, and that is\n       * what earns the owner their notification.\n       *\n       * ⚠⚠ This is not enforcement and must never be described as such. An\n       * operator holding the escrow private key can decrypt the same folder\n       * offline, with a script, and this code will never run. Refusing to\n       * unlock on a failed announcement only keeps the honest path honest. */\n      try {\n        const ch = await api.e2eEscrowChallenge(e2eRoot.value);\n        const nonce = new Uint8Array(\n          await crypto.subtle.decrypt(\n            { name: 'RSA-OAEP' },\n            priv,\n            b64ToBytes(ch.challenge).buffer as ArrayBuffer,\n          ),\n        );\n        await api.e2eEscrowUsed({\n          path: e2eRoot.value,\n          id: ch.id,\n          nonce: bytesToB64(nonce),\n        });\n      } catch (err) {\n        e2eRecoverErr.value = t('e2e.recover.notify_failed');\n        emit('error', {\n          message: (err as Error).message,\n          context: { op: 'e2e-escrow-notify' },\n        });\n        return;\n      }\n    }\n    e2eRing.set(e2eRoot.value, fmk);\n    e2eRingVer.value++;\n    showRecoveryUnlock.value = false;\n    flashToast(\n      payload.mode === 'escrow' ? t('e2e.recover.escrow_done') : t('e2e.recover.recovery_done'),\n    );\n  } catch (err) {\n    e2eRecoverErr.value = (err as Error).message;\n  } finally {\n    e2eRecoverBusy.value = false;\n  }\n}\n\n/** Open the recovery dialog from the lock screen. The marker was cached by\n *  the last unlock attempt; fetch it if the user came straight here. */\nasync function openRecoveryUnlock() {\n  if (!e2eMarker.value && e2eRoot.value) {\n    try {\n      const { blob, url } = await api.fetchBlob(wireJoin(e2eRoot.value, E2E_MARKER_NAME), { fresh: true });\n      URL.revokeObjectURL(url);\n      e2eMarker.value = parseMarker(await blob.text());\n    } catch {\n      e2eMarker.value = null;\n    }\n  }\n  e2eRecoverErr.value = null;\n  showRecoveryUnlock.value = true;\n}\n\n/** Give a pre-0.31 folder a recovery key, in place, using the password the\n *  user just typed. The files are NOT rewritten — only the marker is. */\nasync function e2eDoUpgrade() {\n  if (!e2eMarker.value || !e2eRoot.value || !e2eUpgradePw.value) return;\n  e2eUpgradeBusy.value = true;\n  try {\n    const up = await upgradeMarkerV1(e2eMarker.value, e2eUpgradePw.value, {\n      escrowPublicKey: e2eEscrowPub.value,\n    });\n    const markerFile = new File([JSON.stringify(up.marker)], E2E_MARKER_NAME, {\n      type: 'application/json',\n    });\n    await api.uploadMultipart(e2eRoot.value, [markerFile]);\n    e2eMarker.value = up.marker;\n    e2eUpgradeOffer.value = false;\n    e2eUpgradePw.value = '';\n    recoveryKeyValue.value = up.recoveryKey;\n    recoveryKeyFolder.value = wireBasename(e2eRoot.value);\n    recoveryKeyVariant.value = 'upgraded';\n    showRecoveryKey.value = true;\n  } catch (err) {\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-upgrade' } });\n    flashToast(t('e2e.upgrade.failed'));\n  } finally {\n    e2eUpgradeBusy.value = false;\n  }\n}\n\n/* wiring:e2 escrow-offer ------------------------------------------- */\n\n/** Whether this folder could be given an escrow slot, and whether its owner\n *  has already answered. Drives the way-back button in the unlocked strip. */\nconst e2eEscrowOfferState = computed(() => escrowOfferState(e2eMarker.value, e2eEscrowKid.value));\n\n/** The way back. Somebody who said no last month can say yes today without\n *  deleting and re-creating the folder — but the password is long gone from\n *  memory, so they type it. That is not friction to be smoothed away: it is\n *  the same proof of ownership the offer at unlock had, and handing the\n *  operator a key deserves it. */\nfunction e2eOpenEscrowOffer() {\n  e2eEscrowOfferMode.value = 'manual';\n  e2eEscrowPw.value = '';\n  e2eEscrowErr.value = '';\n  e2eEscrowOffer.value = true;\n}\n\n/** Write a marker back to the folder and adopt it as the one we are holding.\n *  Both escrow-offer answers change only `.filex-e2e.json`. */\nasync function e2eWriteMarker(next: E2eMarker) {\n  const file = new File([JSON.stringify(next)], E2E_MARKER_NAME, { type: 'application/json' });\n  await api.uploadMultipart(e2eRoot.value, [file]);\n  e2eMarker.value = next;\n}\n\n/** Accept: seal this folder's master key to the installation's escrow key.\n *  No file is re-encrypted or moved — only the marker gains a slot. */\nasync function e2eAcceptEscrow() {\n  const marker = e2eMarker.value;\n  const pub = e2eEscrowPub.value;\n  if (!marker || !pub || !e2eRoot.value || e2eEscrowBusy.value) return;\n  if (!e2eEscrowPw.value) {\n    e2eEscrowErr.value = t('e2e.escrowoffer.password_required');\n    return;\n  }\n  e2eEscrowBusy.value = true;\n  e2eEscrowErr.value = '';\n  try {\n    // ⚠ The kid comes from the installation's CURRENT key, via the marker\n    // addEscrowSlot writes — never from anything the UI is displaying. The\n    // sibling bug went the other way (the dialog labelled a folder's slot\n    // with the installation's kid); writing the installation's kid into a\n    // slot sealed to some other key would be the same lie in reverse.\n    const next = await addEscrowSlot(marker, e2eEscrowPw.value, pub);\n    await e2eWriteMarker(next);\n    e2eEscrowOffer.value = false;\n    e2eEscrowPw.value = '';\n    flashToast(t('e2e.escrowoffer.done'));\n  } catch (err) {\n    // A wrong password is the ordinary case here and reads as a typo, not\n    // as a broken folder; anything else is worth reporting.\n    if ((err as Error)?.name === 'E2eDecryptError') {\n      e2eEscrowErr.value = t('e2e.escrowoffer.wrong_password');\n    } else {\n      e2eEscrowErr.value = t('e2e.escrowoffer.failed');\n      emit('error', { message: (err as Error).message, context: { op: 'e2e-escrow-offer' } });\n    }\n  } finally {\n    e2eEscrowBusy.value = false;\n  }\n}\n\n/** Not now. Recorded IN THE FOLDER, so the same person on another device is\n *  not asked again and the answer survives a cleared browser. A question\n *  that returns every single unlock is how people learn to click past\n *  security dialogs without reading them. */\nasync function e2eDeclineEscrow() {\n  const marker = e2eMarker.value;\n  if (!marker || !e2eRoot.value || e2eEscrowBusy.value) return;\n  e2eEscrowBusy.value = true;\n  try {\n    await e2eWriteMarker(declineEscrowSlot(marker, new Date().toISOString()));\n    e2eEscrowOffer.value = false;\n    e2eEscrowPw.value = '';\n    flashToast(t('e2e.escrowoffer.declined_toast'));\n  } catch (err) {\n    // ⚠ Fail towards asking again rather than towards silence: if the\n    // refusal could not be written, the honest state is \"not answered yet\".\n    e2eEscrowErr.value = t('e2e.escrowoffer.decline_failed');\n    emit('error', { message: (err as Error).message, context: { op: 'e2e-escrow-decline' } });\n  } finally {\n    e2eEscrowBusy.value = false;\n  }\n}\n\n/** Close the way-back panel without answering anything. Distinct from\n *  declining: they answered once already, and re-recording the same refusal\n *  would overwrite the date it was actually made. */\nfunction e2eCloseEscrowOffer() {\n  e2eEscrowOffer.value = false;\n  e2eEscrowPw.value = '';\n  e2eEscrowErr.value = '';\n}\n\n/** Decline the offer. The folder keeps working exactly as it did, and the\n *  prompt returns on the next unlock because the risk has not changed. */\nfunction e2eDeclineUpgrade() {\n  e2eUpgradeOffer.value = false;\n  e2eUpgradePw.value = '';\n}\n\n/** Drop the shown-once key from memory the moment its dialog closes. */\nfunction closeRecoveryKey() {\n  showRecoveryKey.value = false;\n  recoveryKeyValue.value = '';\n  recoveryKeyFolder.value = '';\n}\n/* === /wiring:e2 === */\n</script>\n\n<template>\n  <div\n    ref=\"rootEl\"\n    class=\"fe\"\n    :class=\"{\n      'fe--theme-light': themeMode === 'light',\n      'fe--theme-dark': themeMode === 'dark',\n      'fe--is-dragover': dragOver,\n      'fe--density-compact': density === 'compact' /* cila:a density */,\n      'fe--narrow': isNarrow /* bag:b4 */,\n    }\"\n    tabindex=\"-1\"\n    @dragenter=\"onDragEnter\"\n    @dragover=\"onDragOver\"\n    @dragleave=\"onDragLeave\"\n    @drop=\"onDropUpload\"\n    @contextmenu=\"onContextCanvas\"\n  >\n    <!-- wiring:d1 — the tab strip used to be the explorer's first row, above\n         the header and spanning the sidebar too.\n         gorunum:v2-topbar — it then moved under the breadcrumb, INSIDE the\n         left pane.\n         gorunum:v5-panestack — and it is out again, one level up: a tab is a\n         location the WINDOW is showing and the split happens within it, so the\n         strip spans both panes and each pane carries only its own address.\n         See `.fe__stack` below. -->\n    <Toolbar\n      ref=\"toolbarRef\"\n      :view-mode=\"displayedViewMode /* ui-fix — the active pane's mode */\"\n      :search-query=\"searchQuery\"\n      :trash-active=\"trashActive\"\n      :actions=\"toolbarActions\"\n      :selection-mode=\"selectionMode\"\n      :selection-count=\"activeTargets().length /* gorunum:v1 — the count the\n           selection bar prints. Without it the toolbar counted the ticked rows by\n           watching the DOM, which is a second source of truth for something the\n           parent already knows.\n           pane:p1 — and it is the ACTIVE pane's count, so the number and the\n           bar's position can never describe two different panes. */\"\n      :selection-pane=\"activePaneId /* pane:p1 — which half the bar mounts into */\"\n      :paste-enabled=\"!!clipboard.mode\"\n      :convert-enabled=\"!!effectiveConvertUrl\"\n      :can-go-up=\"canGoUp\"\n      :at-virtual-root=\"atVirtualRoot\"\n      :can-write=\"canWriteHere\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow /* bag:b4 */\"\n      :theme=\"themeMode /* bag:b4 */\"\n      :inspector-open=\"showInspector /* koru:k1 */\"\n      :nav-open=\"navToggleOn /* gezinti:g1 */\"\n      :nav-enabled=\"sideNavEnabled /* gezinti:g1 */\"\n      :view-modes=\"allowedViewModes /* gezinti:g1 */\"\n      :scope-label=\"driveScopeLabel /* surucu:d1 */\"\n      :brand-name=\"config.brand?.name /* gorunum:v3-shell */\"\n      :brand-mark-url=\"config.brand?.markUrl /* gorunum:v3-shell */\"\n      :search-escalates=\"navView === 'home' /* gorunum:v3-shell */\"\n      @open-palette=\"openPaletteWith /* surucu:d1 */\"\n      @toggle-inspector=\"toggleInspector /* koru:k1 */\"\n      @toggle-nav=\"toggleSideNav /* gezinti:g1 */\"\n      @open-theme=\"showThemeGallery = true /* wiring:c1 */\"\n      @update:view-mode=\"setDisplayedViewMode($event) /* ui-fix — to the active pane */\"\n      @update:search-query=\"onToolbarSearch /* gorunum:v1-advsearch */\"\n      @open-advanced-search=\"openAdvancedSearch /* gorunum:v1-advsearch */\"\n      @update:density=\"density = $event\"\n      @open-shortcut-settings=\"showShortcutSettings = true /* wiring:c2 */\"\n      @open-timezone=\"showTimeZone = true /* zaman:z3 */\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @refresh=\"refreshAll /* gorunum:v2-topbar */\"\n      @go-up=\"goUp\"\n      @action=\"onToolbarAction\"\n      @open-recents=\"showRecents = true\"\n    >\n      <!-- gorunum:v3-shell — the host's product mark, at the far left of the\n           top bar beside the panel's collapse control. Passed straight\n           through: this package has no branding of its own and must not grow\n           any.\n           ⚠⚠ `v-if=\"$slots.brand\"` is load-bearing, not tidiness. Declaring\n           this template unconditionally would hand Toolbar a `brand` slot on\n           every mount — an EMPTY one for a host that filled nothing — and a\n           slot that exists always is a slot whose fallback content never\n           renders. That fallback is `config.brand`, and it is the only door a\n           `<filex-explorer>` host has (slots do not reach a Vue custom\n           element at all; see ExplorerConfig.brand for the measurement). So:\n           slot when there is one, config otherwise. -->\n      <template v-if=\"$slots.brand\" #brand><slot name=\"brand\"></slot></template>\n      <!-- gorunum:v2-topbar — the host's account-level doors (admin panel,\n           settings, sign out), passed straight through. The explorer knows\n           nothing about them and must not: they are the EMBEDDER's chrome,\n           and an embed with none renders an empty cluster. -->\n      <template #header-actions><slot name=\"header-actions\"></slot></template>\n    </Toolbar>\n\n    <!-- koru:k1 — fe__main lays the listing body and the inspector panel out\n         as flex siblings (row). Without the inspector open it is visually\n         identical to the previous direct-child fe__body. -->\n    <div class=\"fe__main\" :class=\"{ 'fe__main--split': splitVisible } /* wiring:d1 */\">\n    <!-- gezinti:g1 — navigation panel. First child of fe__main, the mirror of\n         InspectorPanel on the right; .fe__primary already carries\n         `flex: 1 1 auto; min-width: 0` so it absorbs the width with no rule of\n         its own. Wide: a docked column (or a 56px icon rail when collapsed).\n         Narrow: a drawer over the listing, because a column at 390px leaves\n         the files 158px. -->\n    <SideNav\n      v-if=\"navVisible\"\n      :expanded=\"sideNavExpanded\"\n      :narrow=\"isNarrow\"\n      :active-view=\"navView\"\n      :active-tag=\"navTag\"\n      :tags=\"navTags\"\n      :tags-loaded=\"navTagsLoaded\"\n      :active-storage=\"adapter\"\n      :storages=\"config.storages ?? []\"\n      :shared-storages=\"sharedStorageNames\"\n      :trash-visible=\"config.trashVisible !== false\"\n      :show-connections=\"connectionsEnabled\"\n      :show-identity-surfaces=\"identitySurfaces\"\n      :can-write=\"canWriteHere && !atVirtualRoot && !trashActive\"\n      :locale=\"locale\"\n      :can-request-files=\"canWriteHere && !atVirtualRoot && !trashActive && !navView /* surucu:d1 */\"\n      :can-new-document=\"canNewDocument && !trashActive && !navView /* belge:n1 */\"\n      @new-document=\"showNewDocument = true\"\n      :quota=\"quotaSnapshot /* surucu:d1 */\"\n      :theme=\"themeMode /* surucu:d1 — the teleported New menu leaves .fe */\"\n      @request-files=\"openFileRequest /* surucu:d1 */\"\n      @toggle=\"toggleSideNav\"\n      @close=\"closeNavDrawer\"\n      @open-view=\"openNavDest /* gorunum:v3-shell */\"\n      @open-tag=\"loadTagView\"\n      @open-storage=\"openNavStorage\"\n      @upload=\"triggerUpload\"\n      @new-folder=\"showNewFolder = true\"\n      @open-connections=\"openConnections\"\n      @open-tokens=\"openTokens\"\n    />\n    <!-- The drawer's scrim. A button, not a div: dismissing an overlay by\n         clicking beside it has to be reachable from the keyboard too. -->\n    <button\n      v-if=\"isNarrow && navDrawerOpen\"\n      type=\"button\"\n      class=\"fe-sidenav__scrim\"\n      :title=\"t('sidenav.close')\"\n      :aria-label=\"t('sidenav.close')\"\n      @click=\"closeNavDrawer\"\n    ></button>\n    <!-- gorunum:v5-panestack / pane:p1 — THE TAB STRIP BELONGS TO THE WINDOW,\n         and BOTH halves below it are the SAME component.\n\n         Owner's decision, 2026-09-13: *\"tab içinde split yapman lazım, dışında\n         yapıyorsun\"* — a tab is a location the window is showing, and the split\n         happens WITHIN that location. So: top bar, then the strip full width,\n         then the panes. The strip used to render inside the left half, which\n         made the left pane carry the window's chrome and the right one read as\n         an afterthought.\n\n         And the second half of the same ruling: *\"split pane ile gelen yeni\n         pane aslında yandaki pane ile birebir olması lazım\"*. There is now ONE\n         `FilePane`, rendered twice. Everything a listing has — the crumbs, the\n         filter row, the sort control, the view switcher, the selection-bar\n         slot, the states, the column menu — is defined once, in that file, so\n         a feature added to a pane cannot miss the other pane. -->\n    <div class=\"fe__stack\">\n    <TabBar\n      v-if=\"paneRowVisible\"\n      :tabs=\"tabItems\"\n      :active-id=\"tabsActiveId\"\n      :locale=\"locale\"\n      :hide-tabs=\"!tabsVisible /* gorunum:v5-panerow — the row stays for the\n             split and details toggles even where tabs are not offered */\"\n      :split-enabled=\"splitOffered /* the pane's own gate — see splitOffered */\"\n      :split-active=\"!!activeSplit\"\n      :inspector-enabled=\"infoPanelToggle\"\n      :inspector-open=\"showInspector\"\n      @select=\"activateTab\"\n      @close=\"closeTabById\"\n      @new=\"newTabHere\"\n      @reorder=\"(from: number, to: number) => tabsApi.move(from, to)\"\n      @toggle-split=\"toggleSplit\"\n      @toggle-inspector=\"toggleInspector\"\n    />\n    <div class=\"fe__panes\">\n\n    <!-- pane:p1 — the main pane. HOST-DRIVEN (`self-driven` absent): its rows\n         come from `load()`, which also answers a search, the trash, the\n         panel's virtual views and an encrypted folder. Those are states the\n         WINDOW is in, so the three of them that have no listing behind them\n         arrive through the `body` slot and the rest through `empty`. -->\n    <FilePane\n      pane-id=\"main\"\n      ref=\"mainPaneRef\"\n      :api=\"api\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :focused=\"mainPaneFocus\"\n      :path=\"currentPath\"\n      :qualify=\"qualify\"\n      :to-user=\"paneToUser\"\n      :clamp=\"paneClamp\"\n      :root-path=\"rootPathProp\"\n      :floor=\"rootFloor\"\n      :multi-root=\"multiStorageRoot\"\n      :rows=\"files\"\n      :loading=\"loading\"\n      :error=\"loadError\"\n      :order=\"listingOrder\"\n      :view-mode=\"viewMode\"\n      :view-modes=\"allowedViewModes\"\n      :open-trigger=\"props.config.openTrigger\"\n      :show-crumbs=\"navView !== 'home' /* Home has no address: its cards come\n             from every folder in every storage, so a trail would have to name\n             one */\"\n      :filter-mode=\"filterRowMode /* `show-filter-bar` is NOT passed: the row is\n             drawn in every view now, so the default (true) is the answer and a\n             prop repeating it would be a second place to forget. */\"\n      :find-label=\"navView === 'home' ? t('filter.find.home') : ''\"\n      :show-view-switcher=\"navView !== 'home'\"\n      :folder-key=\"currentFolderKey\"\n      :show-parent-path=\"!!searchQuery || crossFolderView\"\n      :clipped=\"clippedPaths\"\n      :extra-filters=\"advFilters\"\n      :can-write=\"canWriteHere && !trashActive\"\n      :can-paste=\"!!clipboard.mode\"\n      :selected=\"selection.selected.value\"\n      :filters=\"driveFilters\"\n      :thumb-src=\"thumbs.src\"\n      :keep-badge-for=\"desktopSync ? keepBadgeFor : undefined\"\n      :starred-ids=\"starredIds\"\n      :star-enabled=\"identitySurfaces\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :e2e-active=\"e2eActive\"\n      :body-override=\"hostBodyState !== ''\"\n      @activate=\"setPaneMain\"\n      @navigate=\"onNavigate\"\n      @open=\"openNode\"\n      @open-trash=\"() => loadTrash()\"\n      @click-row=\"(n, m) => onPaneClickRow('main', n, m)\"\n      @context=\"(n: FileNode | null, ev: MouseEvent) => onPaneMenu('main', n, ev)\"\n      @clear-selection=\"selection.clear()\"\n      @display-order=\"(nodes: FileNode[]) => (displayOrder = nodes)\"\n      @item-drag-start=\"(n: FileNode, ev: DragEvent) => onPaneItemDragStart('main', n, ev)\"\n      @item-drop-into=\"onItemDropInto\"\n      @transfer=\"onPaneTransfer\"\n      @update:view-mode=\"(v: ViewMode) => (viewMode = v)\"\n      @update:filters=\"setDriveFilters\"\n      @crumb-context=\"onCrumbContext\"\n      @copy-path=\"onCopyPath\"\n      @crumb-drop=\"onCrumbDropInto\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @paste=\"onToolbarAction('paste') /* surucu:d1-actions — through the SAME\n             handler the right-click menu and the toolbar use */\"\n      @select-all=\"selection.selectAll()\"\n      @clear-filters=\"clearDriveFilters\"\n      @star-change=\"onStarChange\"\n      @retry=\"retryLoad\"\n    >\n      <!-- ⚠ NO `#heading` for Home, and the empty address row it used to live\n           on is not drawn either (FilePane's own guard). Owner, 2026-09-13:\n           \"ver sayfa içinde salak bir Home yazısı var, onu kaldıralım.\"\n           He is right and it is the same rule the tab strip already follows:\n           the panel's Home row is highlighted, the tab says Home and the\n           address bar says `#.home` — a fourth \"Home\", in 18px type, over\n           three sections that name themselves, was the page introducing itself\n           to somebody who had just clicked its name. The SECTION headings\n           (Storages / Recent / Starred) stay: those name the blocks, not the\n           page. `home.title` is still the tab's and the panel row's word. -->\n\n      <!-- Strips that describe the WINDOW's state rather than the listing. -->\n      <template #banners>\n    <!-- Live presence: who else is viewing this folder (empty → nothing shown).\n         When the live socket is unavailable the same strip carries a small\n         degraded-connection badge instead (presence is empty in fallback);\n         a healthy connection shows nothing extra. -->\n    <div v-if=\"presenceUsers.length || realtimeDegraded\" class=\"fe__presence\">\n      <PresenceBar v-if=\"presenceUsers.length\" :users=\"presenceUsers\" :locale=\"locale\" />\n      <span\n        v-if=\"realtimeDegraded\"\n        class=\"fe-connbadge\"\n        role=\"status\"\n        :title=\"t('conn.tooltip')\"\n      >\n        <span class=\"fe-connbadge__dot\" aria-hidden=\"true\"></span>\n        {{ t('conn.offline') }}\n      </span>\n    </div>\n\n    <!-- wiring:e2 — unlocked strip: visible in an encrypted folder while the\n         key is in memory; \"Kilitle\" (Lock) drops the key and the decrypted\n         blobs. -->\n    <!-- wiring:e2 recovery — a v1 folder just opened by password. Offer it\n         recovery HERE, visibly, rather than doing anything silently: this is\n         the only moment filex holds the password, and (when the install has\n         escrow) accepting also gives the operator a key. -->\n    <div v-if=\"e2eUpgradeOffer\" class=\"fe-e2e-upgrade\" role=\"alert\">\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ t('e2e.upgrade.title') }}</strong>\n        <p>{{ t('e2e.upgrade.body') }}</p>\n        <p v-if=\"e2eEscrowKid\" class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.upgrade.escrow_note') }}\n        </p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button type=\"button\" class=\"fe-btn\" :disabled=\"e2eUpgradeBusy\" @click=\"e2eDeclineUpgrade\">\n          {{ t('e2e.upgrade.decline') }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          :disabled=\"e2eUpgradeBusy\"\n          @click=\"e2eDoUpgrade\"\n        >\n          {{ e2eUpgradeBusy ? t('e2e.upgrade.busy') : t('e2e.upgrade.accept') }}\n        </button>\n      </div>\n    </div>\n<!-- wiring:e2 escrow-offer — an existing folder that predates escrow on\n         this installation. Shown only after an unlock SUCCEEDED, because\n         accepting hands the operator a permanent second key to this folder\n         and the only person entitled to do that is the one who can already\n         open it. Doing nothing leaves the folder exactly as it is. -->\n    <div v-if=\"e2eEscrowOffer\" class=\"fe-e2e-upgrade fe-e2e-upgrade--escrow\" role=\"alert\">\n      <div class=\"fe-e2e-upgrade__text\">\n        <strong>{{ t('e2e.escrowoffer.title') }}</strong>\n        <p>{{ t('e2e.escrowoffer.body') }}</p>\n        <p class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.escrowoffer.consequence') }}\n          <a :href=\"e2eEscrowDocsUrl\" target=\"_blank\" rel=\"noopener noreferrer\">\n            {{ t('e2e.escrowoffer.learn_more') }}\n          </a>\n        </p>\n        <p v-if=\"e2eEscrowKid\" class=\"fe-e2e-upgrade__escrow\">\n          {{ t('e2e.recover.escrow_kid') }}: <code>{{ e2eEscrowKid }}</code>\n        </p>\n        <!-- The way-back path has no password in memory any more, so it is\n             typed. The same proof of ownership the unlock path already had. -->\n        <label v-if=\"e2eEscrowOfferMode === 'manual'\" class=\"fe-e2e-upgrade__pw\">\n          <span>{{ t('e2e.escrowoffer.password_label') }}</span>\n          <input\n            v-model=\"e2eEscrowPw\"\n            type=\"password\"\n            class=\"fe-input\"\n            autocomplete=\"current-password\"\n            :disabled=\"e2eEscrowBusy\"\n            @keyup.enter=\"e2eAcceptEscrow\"\n          />\n        </label>\n        <p v-if=\"e2eEscrowErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eEscrowErr }}</p>\n      </div>\n      <div class=\"fe-e2e-upgrade__actions\">\n        <button\n          type=\"button\"\n          class=\"fe-btn\"\n          :disabled=\"e2eEscrowBusy\"\n          @click=\"e2eEscrowOfferMode === 'manual' ? e2eCloseEscrowOffer() : e2eDeclineEscrow()\"\n        >\n          {{\n            e2eEscrowOfferMode === 'manual'\n              ? t('e2e.escrowoffer.cancel')\n              : t('e2e.escrowoffer.decline')\n          }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--primary\"\n          :disabled=\"e2eEscrowBusy\"\n          @click=\"e2eAcceptEscrow\"\n        >\n          {{ e2eEscrowBusy ? t('e2e.escrowoffer.busy') : t('e2e.escrowoffer.accept') }}\n        </button>\n      </div>\n    </div>\n    <div v-if=\"e2eUnlocked\" class=\"fe-e2e-strip\" role=\"status\">\n      <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n      <span class=\"fe-e2e-strip__icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('lock')\"></span>\n      <span class=\"fe-e2e-strip__label\">{{ t('e2e.strip.label') }}</span>\n      <!-- The way back for somebody who declined. Quiet, but present: a\n           refusal that could not be reversed without deleting the folder\n           would not be a decision, it would be a trap. -->\n      <button\n        v-if=\"e2eEscrowOfferState !== 'n/a' && !e2eEscrowOffer\"\n        type=\"button\"\n        class=\"fe-btn fe-e2e-strip__btn\"\n        @click=\"e2eOpenEscrowOffer\"\n      >\n        {{ t('e2e.escrowoffer.strip_action') }}\n      </button>\n      <button type=\"button\" class=\"fe-btn fe-e2e-strip__btn\" @click=\"e2eLock\">\n        {{ t('e2e.strip.lock') }}\n      </button>\n    </div>\n    <!-- /wiring:e2 -->\n\n    <!-- tablo:t1 — the trash banner: what the trash IS on the left, the one\n         irreversible action on the right. OUTSIDE `fe__body` so it sits above\n         the listing AND above the centred empty state, which is where the\n         reference draws it and the only place it reads as a property of the\n         view rather than of the rows. -->\n    <div v-if=\"trashMode && !loading\" class=\"fe-trashbar\">\n      <p class=\"fe-trashbar__text\">{{ trashBannerText }}</p>\n      <!-- Offered only when the SERVER has said this caller may purge. The\n           backend refuses regardless of what we draw; this is so nobody is\n           handed a button that always fails. -->\n      <button\n        v-if=\"trashCanEmpty\"\n        type=\"button\"\n        class=\"fe-btn fe-btn--danger fe-trashbar__action\"\n        :disabled=\"files.length === 0 || trashEmptying\"\n        data-testid=\"trash-empty\"\n        @click=\"showTrashConfirm = true\"\n      >\n        {{ t('trash.empty_action') }}\n      </button>\n    </div>\n      </template>\n\n      <!-- The three states with no listing behind them. `hostBodyState` keeps\n           them in the order the old chain had — and, crucially, behind the\n           skeleton, so a folder that is still loading does not flash its lock\n           screen. -->\n      <template #body>\n      <!-- gorunum:v3-shell — Home. FIRST in the chain, and it short-circuits\n           every state below it on purpose: those all describe a LISTING (a\n           dead deep link, a failed fetch, a locked folder, an empty folder)\n           and Home has no listing behind it — `files` is deliberately empty\n           while it is open, which every one of them would read as \"nothing\n           here\". Its own three blocks each carry their own empty state. -->\n      <HomeView\n        v-if=\"hostBodyState === 'home'\"\n        :storages=\"homeStorages\"\n        :recent=\"homeRecent\"\n        :starred=\"homeStarred\"\n        :loading=\"homeLoading\"\n        :locale=\"locale\"\n        :name-filter=\"driveFilters.name ?? '' /* surucu:d1-scope — Home's filter\n               row is the name box alone, and this is what it narrows. The same\n               `DriveFilters.name` the listing's own box writes, so the value is\n               reset on navigation by the one watcher that already does that and\n               there is no second piece of filter state to keep in step. */\"\n        :thumb-src=\"thumbs.src\"\n        @open-storage=\"openNavStorage\"\n        @open-node=\"openNode\"\n        @context-node=\"onContextTarget\"\n      />\n      <!-- Dead deep link (404) or RBAC-hidden dir (403, shown identically):\n           a dedicated state instead of a misleading \"this folder is empty\". -->\n      <div v-else-if=\"hostBodyState === 'notfound'\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          <path d=\"M52 55c0-4.6 3.6-8 8-8s8 3.4 8 8c0 5.5-8 4.8-8 11\" />\n          <circle cx=\"60\" cy=\"73\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('notFound.title') }}</p>\n        <p class=\"fe-state__path\">{{ notFoundPath }}</p>\n        <p class=\"fe-state__hint\">{{ t('notFound.desc') }}</p>\n        <div class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn\" @click=\"leaveNotFound\">\n            {{ t('notFound.goRoot') }}\n          </button>\n        </div>\n      </div>\n      <!-- wiring:e2 — encrypted-folder lock screen: the listing is not\n           rendered until the correct password is entered. The password is\n           verified against the marker in the browser; it never reaches the\n           server. -->\n      <div v-else class=\"fe-state fe-e2e-lock\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <rect x=\"38\" y=\"44\" width=\"44\" height=\"34\" rx=\"6\" />\n          <path d=\"M46 44v-8a14 14 0 0 1 28 0v8\" />\n          <circle cx=\"60\" cy=\"59\" r=\"3\" fill=\"currentColor\" stroke=\"none\" />\n          <path d=\"M60 62v7\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('e2e.locked.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('e2e.locked.hint') }}</p>\n        <form class=\"fe-e2e-lock__form\" @submit.prevent=\"e2eUnlock\">\n          <input\n            v-model=\"e2ePw\"\n            type=\"password\"\n            class=\"fe-input fe-e2e-lock__input\"\n            :placeholder=\"t('e2e.locked.pw_placeholder')\"\n            :aria-label=\"t('e2e.locked.pw_placeholder') /* the title and hint above\n              say what this screen is; the field still needs its own name */\"\n            autocomplete=\"current-password\"\n            :disabled=\"e2eUnlockBusy\"\n          />\n          <button\n            type=\"submit\"\n            class=\"fe-btn fe-btn--primary\"\n            :disabled=\"e2eUnlockBusy || !e2ePw\"\n          >\n            {{ e2eUnlockBusy ? t('e2e.locked.busy') : t('e2e.locked.unlock') }}\n          </button>\n        </form>\n        <p v-if=\"e2eUnlockErr\" class=\"fe-form__error\" role=\"alert\">{{ e2eUnlockErr }}</p>\n        <!-- wiring:e2 recovery — the second door. Always offered: whether\n             this folder actually has one is answered inside the dialog,\n             which can say \"this folder predates recovery keys\" instead of\n             leaving the user guessing why there is no link. -->\n        <button type=\"button\" class=\"fe-e2e-optlink\" @click=\"openRecoveryUnlock\">\n          {{ t('e2e.locked.use_recovery') }}\n        </button>\n      </div>\n      <!-- /wiring:e2 -->\n      </template>\n\n      <!-- Loaded and empty: WHICH empty. The pane's own fallback (\"this folder\n           is empty\") is the last branch here, and it is the one the split pane\n           falls back to. -->\n      <template #empty>\n      <!-- Search with zero hits — its own message, not \"folder is empty\". -->\n      <div v-if=\"searchQuery\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <circle cx=\"52\" cy=\"44\" r=\"22\" />\n          <path d=\"M68 61l20 20\" />\n          <path d=\"M46 38l12 12M58 38l-12 12\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.search.title') }}</p>\n        <p class=\"fe-state__hint\">{{ t('empty.search.hint') }}</p>\n      </div>\n      <!-- gezinti:g1 — empty panel views. Each says which list is empty and\n           how it fills up; \"This folder is empty\" would be wrong twice over,\n           because there is no folder and nothing to drop into it. -->\n      <div\n        v-else-if=\"navView && navView !== 'trash'\"\n        class=\"fe-state\"\n        :data-testid=\"`empty-${navView}`\"\n      >\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <template v-if=\"navView === 'recent'\">\n            <circle cx=\"60\" cy=\"50\" r=\"28\" />\n            <path d=\"M60 32v18l12 8\" />\n          </template>\n          <template v-else-if=\"navView === 'starred'\">\n            <path d=\"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\" />\n          </template>\n          <template v-else-if=\"navView === 'tag'\">\n            <path d=\"M30 30h24l32 32-24 24-32-32z\" />\n            <circle cx=\"43\" cy=\"43\" r=\"4.5\" />\n          </template>\n          <template v-else>\n            <circle cx=\"84\" cy=\"34\" r=\"9\" />\n            <circle cx=\"36\" cy=\"52\" r=\"9\" />\n            <circle cx=\"84\" cy=\"70\" r=\"9\" />\n            <path d=\"M44.5 47.5l31-9M44.5 56.5l31 9\" />\n          </template>\n        </svg>\n        <!-- etiket:t1 — the tag view's empty state names the TAG. \"Nothing\n             here\" would be the fourth identical sentence and would not say\n             which of the user's tags is the empty one. -->\n        <p class=\"fe-state__title\">\n          {{ navView === 'tag' ? t('empty.tag.title', { tag: navTag }) : t(`empty.${navView}.title`) }}\n        </p>\n        <p class=\"fe-state__hint\">\n          {{ navView === 'tag' ? t('empty.tag.hint') : t(`empty.${navView}.hint`) }}\n        </p>\n      </div>\n      <!-- Empty trash view. -->\n      <div v-else-if=\"trashMode\" class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M38 34l4 48a6 6 0 0 0 6 5.6h24a6 6 0 0 0 6-5.6l4-48\" />\n          <path d=\"M32 34h56\" />\n          <path d=\"M50 34v-6a6 6 0 0 1 6-6h8a6 6 0 0 1 6 6v6\" />\n          <path d=\"M52 44v32M60 44v32M68 44v32\" opacity=\"0.5\" />\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.trash.title') }}</p>\n        <!-- tablo:t1 — the second line the reference has and we did not. The\n             key did not exist in EITHER catalogue, so there was nothing to\n             show even if something had asked for it. -->\n        <p class=\"fe-state__hint\">{{ t('empty.trash.hint') }}</p>\n      </div>\n      <!-- Loaded, zero files, no search: the real empty-folder state. The\n           upload affordances follow write permission (RBAC viewers only get\n           the title). -->\n      <div v-else class=\"fe-state\">\n        <svg\n          class=\"fe-state__art\"\n          viewBox=\"0 0 120 100\"\n          width=\"110\"\n          height=\"92\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" />\n          <g v-if=\"emptyCanUpload\">\n            <path d=\"M60 50v14\" stroke-dasharray=\"3 4\" />\n            <path d=\"M53 59l7 8 7-8\" />\n          </g>\n        </svg>\n        <p class=\"fe-state__title\">{{ t('empty.folder') }}</p>\n        <p v-if=\"emptyCanUpload\" class=\"fe-state__hint\">{{ t('empty.hint') }}</p>\n        <div v-if=\"emptyCanUpload\" class=\"fe-state__actions\">\n          <button type=\"button\" class=\"fe-btn fe-btn--primary\" @click=\"triggerUpload\">\n            {{ t('empty.upload') }}\n          </button>\n        </div>\n      </div>\n      </template>\n    </FilePane>\n\n    <!-- pane:p1 — the split pane. The SAME component, SELF-DRIVEN: it asks the\n         backend for one folder through the same `api.index` + `lib/listing`\n         helpers. `:key` is bound to the tab id, so a tab switch remounts it\n         with its own location. -->\n    <FilePane\n      v-if=\"splitVisible && activeSplit\"\n      ref=\"splitPaneRef\"\n      :key=\"'split-' + tabsActiveId\"\n      pane-id=\"split\"\n      self-driven\n      closable\n      :api=\"api\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :focused=\"paneIsActive\"\n      :path=\"activeSplit.path\"\n      :qualify=\"qualify\"\n      :to-user=\"paneToUser\"\n      :clamp=\"paneClamp\"\n      :root-path=\"rootPathProp\"\n      :floor=\"rootFloor\"\n      :multi-root=\"multiStorageRoot\"\n      :virtual-rows=\"virtualStorageRows\"\n      :trash-visible=\"config.trashVisible !== false\"\n      :nav-offers-trash=\"navOffersTrash\"\n      :view-mode=\"paneViewMode\"\n      :view-modes=\"allowedViewModes\"\n      :open-trigger=\"props.config.openTrigger\"\n      :clipped=\"clippedPaths\"\n      :can-write=\"canWriteHere\"\n      :can-paste=\"!!clipboard.mode\"\n      :selected=\"splitSelection.selected.value\"\n      :filters=\"splitFilters\"\n      :folder-key=\"splitFolderKey\"\n      :thumb-src=\"thumbs.src\"\n      :keep-badge-for=\"desktopSync ? keepBadgeFor : undefined\"\n      :starred-ids=\"starredIds\"\n      :star-enabled=\"identitySurfaces\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      @activate=\"activePane = 'split'\"\n      @close=\"closeSplit\"\n      @navigate=\"onPaneNavigate\"\n      @open=\"openNode\"\n      @open-trash=\"onPaneOpenTrash\"\n      @click-row=\"(n, m) => onPaneClickRow('split', n, m)\"\n      @context=\"(n: FileNode | null, ev: MouseEvent) => onPaneMenu('split', n, ev)\"\n      @clear-selection=\"splitSelection.clear()\"\n      @display-order=\"(nodes: FileNode[]) => (splitDisplayOrder = nodes)\"\n      @item-drag-start=\"(n: FileNode, ev: DragEvent) => onPaneItemDragStart('split', n, ev)\"\n      @item-drop-into=\"onItemDropInto\"\n      @transfer=\"onPaneTransfer\"\n      @update:view-mode=\"setPaneViewMode\"\n      @update:filters=\"(v: DriveFilters) => (splitFilters = v)\"\n      @copy-path=\"onCopyPath\"\n      @crumb-drop=\"onCrumbDropInto\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @paste=\"onToolbarAction('paste')\"\n      @select-all=\"splitSelection.selectAll()\"\n      @clear-filters=\"splitFilters = { ...EMPTY_FILTERS }\"\n      @star-change=\"onStarChange\"\n    />\n\n    </div><!-- /fe__panes -->\n    </div><!-- /fe__stack pane:p1 -->\n\n\n    <!-- koru:k1 — inspector (details) panel; v-if keeps the closed state\n         free of any DOM. Narrow mode renders it as a full-size overlay. -->\n    <InspectorPanel\n      v-if=\"showInspector\"\n      :api=\"api\"\n      :nodes=\"inspectorNodes /* pane:p1 — the FOCUSED pane's selection, through\n             the same `activeTargets()` the selection bar reads. It was\n             `selection.nodes` (the main pane's, always), which is why clicking\n             in the split pane changed nothing here. */\"\n      :dir-label=\"inspectorDirLabel\"\n      :dir-count=\"inspectorDirCount\"\n      :dir-perm=\"inspectorDirPerm\"\n      :held-in=\"inspectorHeldIn /* non-empty ⇒ this is the LAST selected thing,\n             not what is ticked in front of you, and it lives here. */\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow\"\n      :thumb-src=\"thumbs.src\"\n      :api-base=\"props.config.apiBase ?? '' /* etiket:t1 — the details panel's\n             Tags section mounts the same TagPicker the context menu opens, and\n             that component talks to `/api/files/tags/*` itself. These three are\n             the trio every self-fetching child in this package already takes\n             (StarButton, TagPicker, GridView's star column): the base, the\n             headers, and the credentials mode. ⚠ `authCredentials` is not\n             decoration — a credentialed cross-origin request cannot be answered\n             with `ACAO: *`, so an embed served from a different origin to the\n             API breaks without it. */\"\n      :auth-headers=\"() => buildAuthHeaders()\"\n      :auth-credentials=\"api.credentialsMode()\"\n      @tags-changed=\"onNodeTagsChanged /* etiket:t1 — drop the panel's cached\n             tag list when the details panel edits tags, exactly as the modal\n             does. Harmless until InspectorPanel emits it. */\"\n      @open-tag=\"openTagView /* etiket:t1 — a tag chip in this panel is a door to\n             that tag's view, the same door the navigation panel's Tags section\n             opens. */\"\n      @close=\"closeInspector\"\n      @share-created=\"onInspectorShareCreated /* surucu:d1 */\"\n      @manage-permissions=\"onInspectorManage\"\n      @toast=\"flashToast\"\n      @changed=\"() => (paneIsActive ? void splitPaneRef?.reload() : void load()) /* pane:p1 —\n             the panel now acts on the FOCUSED pane's selection, so the listing\n             it refreshes afterwards has to be that pane's. Reloading the main\n             one would leave a restored version, a deleted comment or a renamed\n             file on screen unchanged in the half it happened in. */\"\n    />\n    </div>\n    <!-- /koru:k1 fe__main -->\n\n    <!-- gezinti:g1 — the Connections / API-keys overlays, opened from the\n         navigation panel. ⚠ z-index 130, measured, not guessed: the explorer's\n         onboarding tour and its context menus are appended to <body> at 96 and\n         90 and are `fixed`, so anything in the normal stacking order is painted\n         over by them — the tour card landed on top of the same panel in the web\n         app and swallowed its clicks, which is why that page uses z-[120]. This\n         one has to clear the host's wrapper too, so it goes above it. -->\n    <div\n      v-if=\"showConnections || showTokens\"\n      class=\"fe-overlay\"\n      data-testid=\"explorer-overlay\"\n      @click.self=\"closeOverlays\"\n    >\n      <div class=\"fe-overlay__card\" @click.stop>\n        <ConnectionsPanel\n          v-if=\"showConnections\"\n          :config=\"config\"\n          initial-tab=\"connect\"\n          closable\n          @close=\"closeOverlays\"\n          @changed=\"() => load()\"\n          @error=\"onConnectionsError\"\n        />\n        <template v-else>\n          <header class=\"fe-overlay__head\">\n            <h2 class=\"fe-overlay__title\">{{ t('sidenav.apikeys') }}</h2>\n            <button\n              type=\"button\"\n              class=\"fe-overlay__close\"\n              :title=\"t('overlay.close')\"\n              :aria-label=\"t('overlay.close')\"\n              @click=\"closeOverlays\"\n            >\n              ×\n            </button>\n          </header>\n          <TokensPanel :config=\"config\" full />\n        </template>\n      </div>\n    </div>\n\n\n    <div v-if=\"dragOver\" class=\"fe__dragover\">\n      <div class=\"fe__dragover-card\">\n        <!-- ⚠ Was the `⬆` emoji: rendered by whatever emoji font the machine\n             has, so the one mark on the drop overlay came out as a blue arrow\n             on Windows, a grey one on Linux and nothing at all on a headless\n             Chromium with no emoji font — on the single screen whose whole job\n             is one glyph and one line. Same `upload` key the \"+ New\" menu and\n             the toolbar draw, so the three now agree. -->\n        <!-- eslint-disable-next-line vue/no-v-html — static markup from lib/actionIcons -->\n        <span class=\"fe-icon\" aria-hidden=\"true\" v-html=\"actionIconSvg('upload')\"></span>\n        <p>{{ t('dropzone.hint') }}</p>\n      </div>\n    </div>\n\n    <!-- wiring:c3 — unified operations center. UploadProgress + PendingOpsTray\n         no longer draw their own corner UIs: they are renderless publishers\n         feeding the opsCenter store; the single visible surface is the\n         OperationsCenter badge + panel below. -->\n    <UploadProgress\n      :jobs=\"uploadJobs\"\n      :locale=\"locale\"\n      :center=\"opsCenter\"\n      @cancel=\"onCancelUpload\"\n      @dismiss=\"onDismissUpload\"\n      @retry=\"retryUploadJob\"\n    />\n\n    <PendingOpsTray\n      :ops=\"pendingOps.ops.value\"\n      :locale=\"locale\"\n      :center=\"opsCenter\"\n      @dismiss=\"(id) => pendingOps.dismiss(id)\"\n    />\n\n    <OperationsCenter\n      :center=\"opsCenter\"\n      :locale=\"locale\"\n      :narrow=\"isNarrow\"\n    />\n    <!-- /wiring:c3 -->\n\n    <!-- bag:b4 — narrow-mode upload FAB (hidden in trash / read-only /\n         virtual root; PendingOpsTray+UploadProgress shift up via CSS). -->\n    <button\n      v-if=\"isNarrow && emptyCanUpload\"\n      type=\"button\"\n      class=\"fe-fab\"\n      :title=\"t('toolbar.upload')\"\n      :aria-label=\"t('toolbar.upload')\"\n      @click=\"triggerUpload\"\n    >\n      <svg\n        class=\"fe-ficon\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2.2\"\n        stroke-linecap=\"round\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        <path d=\"M12 5v14M5 12h14\" />\n      </svg>\n    </button>\n\n    <!-- selective-sync progress: the folder the engine is moving RIGHT NOW.\n         Overlay, pointer-events none — status is never in the way of work. -->\n    <div v-if=\"keepActive\" class=\"fe-keep-strip\" role=\"status\" aria-live=\"polite\">\n      <span class=\"fe-keep-strip__icon\" aria-hidden=\"true\">⟳</span>\n      <span class=\"fe-keep-strip__label\">{{ keepStripLabel }}</span>\n      <div v-if=\"keepStripPercent !== null\" class=\"fe-keep-strip__bar\" aria-hidden=\"true\">\n        <div class=\"fe-keep-strip__fill\" :style=\"{ width: keepStripPercent + '%' }\"></div>\n      </div>\n    </div>\n\n    <ContextMenu\n      ref=\"ctxRef\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :sheet=\"isCoarse /* bag:b4 */\"\n      :actions=\"contextActions\"\n      @select=\"onContextAction\"\n    />\n\n    <!-- belge:n1 — New document: the types this deployment can actually create\n         AND open, then a name, then where it goes. -->\n    <NewDocumentModal\n      :open=\"showNewDocument\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :api=\"api\"\n      :types=\"newDocTypes\"\n      :current-path=\"qualify(currentPath)\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name) /* ⚠ the dialog\n                 takes NAMES; `config.storages` is objects, and passing them\n                 straight through (as the wiring note had it) does not\n                 typecheck. */\"\n      :only-office-ready=\"!!effectiveOnlyOfficeBase\"\n      :drawio-ready=\"!!effectiveDrawioUrl\"\n      @close=\"showNewDocument = false\"\n      @created=\"onDocumentCreated\"\n      @error=\"emit('error', { message: $event.message, context: { op: 'newdoc' } })\"\n    />\n    <NewFolderModal\n      :open=\"showNewFolder\"\n      :locale=\"locale\"\n      :encrypted-option=\"!e2eActive /* wiring:e2 — no nested encrypted folders */\"\n      @close=\"showNewFolder = false\"\n      @submit=\"submitNewFolder\"\n      @encrypted=\"showNewFolder = false; showEncFolder = true /* wiring:e2 */\"\n    />\n    <!-- tasi:m1 — \"Şuraya taşı…\" / \"Şuraya kopyala…\". ONE dialog for both, and\n         the same one anything else that has to ask for a folder mounts (the\n         new-document flow does): a second private folder browser is how two\n         choosers start disagreeing about what a writable folder is. -->\n    <DestinationPickerModal\n      :open=\"showDestPicker\"\n      :api=\"api\"\n      :locale=\"locale\"\n      :mode=\"destPickerMode\"\n      :busy=\"destPickerBusy\"\n      :storages=\"(props.config.storages ?? []).map((st) => st.name) /* NAMES, not\n                 the objects — same shape NewDocumentModal takes */\"\n      :start-at=\"qualify(paneIsActive ? (splitPaneRef?.getPath() ?? '') : currentPath) /* open\n                 where the selection lives, not at the drive list */\"\n      :moving=\"destPickerMode === 'move'\n        ? destPickerTargets.filter((n) => n.type === 'dir').map((n) => n.path)\n        : [] /* only a MOVE can eat itself; a copy into your own subfolder is legal */\"\n      @close=\"showDestPicker = false\"\n      @pick=\"onDestinationPicked\"\n    />\n    <!-- wiring:e2 — encrypted-folder creation modal -->\n    <EncryptedFolderModal\n      :open=\"showEncFolder\"\n      :locale=\"locale\"\n      :busy=\"e2eCreateBusy\"\n      :escrow-kid=\"e2eEscrowKid\"\n      @close=\"showEncFolder = false\"\n      @submit=\"submitEncryptedFolder\"\n    />\n    <!-- wiring:e2 recovery — the key, shown exactly once. -->\n    <RecoveryKeyModal\n      :open=\"showRecoveryKey\"\n      :locale=\"locale\"\n      :recovery-key=\"recoveryKeyValue\"\n      :folder-name=\"recoveryKeyFolder\"\n      :escrow-kid=\"e2eEscrowKid\"\n      :variant=\"recoveryKeyVariant\"\n      @close=\"closeRecoveryKey\"\n    />\n    <!-- wiring:e2 recovery — the way back in without the password. -->\n    <E2eRecoveryUnlockModal\n      :open=\"showRecoveryUnlock\"\n      :locale=\"locale\"\n      :has-recovery=\"markerHasRecovery(e2eMarker)\"\n      :escrow-state=\"escrowAvailability(e2eMarker, e2eEscrowKid)\"\n      :escrow-kid=\"e2eMarker?.esc?.kid || e2eEscrowKid\"\n      :busy=\"e2eRecoverBusy\"\n      :error=\"e2eRecoverErr\"\n      @close=\"showRecoveryUnlock = false\"\n      @submit=\"e2eRecoverUnlock\"\n    />\n    <!-- /wiring:e2 -->\n    <RenameModal\n      :open=\"showRename\"\n      :locale=\"locale\"\n      :current-name=\"renameTarget?.basename || ''\"\n      @close=\"showRename = false\"\n      @submit=\"submitRename\"\n    />\n    <!-- tablo:t1 — emptying the trash is irreversible and it is a BULK\n         delete, so the question names what is about to go: how many things and\n         how much space. \"Empty the trash?\" with no quantity is a question\n         nobody can actually answer, and this is the last screen before the\n         bytes are gone for good. -->\n    <Modal\n      :open=\"showTrashConfirm\"\n      :title=\"t('trash.empty_confirm_title')\"\n      size=\"sm\"\n      @close=\"showTrashConfirm = false\"\n    >\n      <!-- ⚠ A singular form exists (`…_one`) and `t()` picks it from `count`:\n           this is the last screen before an irreversible bulk delete, and\n           \"1 items\" is not a sentence anybody should have to read there. -->\n      <p>{{ t(trashConfirmKey, { count: files.length, size: formatSize(trashTotalBytes) }) }}</p>\n      <template #actions>\n        <button type=\"button\" class=\"fe-btn\" @click=\"showTrashConfirm = false\">\n          {{ t('modal.delete.cancel') }}\n        </button>\n        <button\n          type=\"button\"\n          class=\"fe-btn fe-btn--danger\"\n          data-testid=\"trash-empty-confirm\"\n          @click=\"emptyTrash\"\n        >\n          {{ t('trash.empty_action') }}\n        </button>\n      </template>\n    </Modal>\n    <DeleteConfirmModal\n      :open=\"showDelete\"\n      :locale=\"locale\"\n      :count=\"selection.size.value\"\n      @close=\"showDelete = false\"\n      @confirm=\"confirmDelete\"\n    />\n    <PreviewModal\n      :open=\"showPreview\"\n      :locale=\"locale\"\n      :file=\"previewTarget\"\n      :theme=\"themeMode\"\n      :preview-url=\"(p) => e2ePreviewSrc(p) /* wiring:e2 — decrypted blob > raw URL */\"\n      :download-url=\"(p) => (e2eUnlocked ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 */\"\n      :only-office-base=\"e2eActive ? null : effectiveOnlyOfficeBase /* wiring:e2 — OO cannot open ciphertext */\"\n      :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n      :new-tab-enabled=\"!e2eActive /* wiring:e2 — the standalone route pulls raw bytes */\"\n      :save-text-endpoint=\"e2eActive ? null : api.endpoints.saveText || null /* wiring:e2 — a plaintext save would be a leak */\"\n      :archive-list-endpoint=\"api.endpoints.archiveList || null\"\n      :open-mode=\"previewMode\"\n      :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :drawio-url=\"effectiveDrawioUrl\"\n      :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n      :pdf-save-url=\"props.config.pdfSaveUrl || null\"\n      :viewer-base-url=\"effectiveViewerBaseUrl\"\n      :index=\"previewPosition.index /* gorunum:v1 — the 3-of-9 counter */\"\n      :total=\"previewPosition.total\"\n      :nav-enabled=\"previewPosition.total > 1\"\n      :share-enabled=\"!e2eActive /* gorunum:v2 — the viewer's share icon opens the\n           SAME dialog the menu opens. It shipped disabled because nothing was\n           listening; an icon that does nothing is worse than no icon. Off inside\n           an encrypted folder, where a link would serve ciphertext. */\"\n      @share=\"() => {\n        const n = previewTarget;\n        if (n) { permTarget = n; permInitialTab = undefined; showPerm = true; }\n      }\"\n      :api-base=\"props.config.apiBase ?? ''\"\n      @nav=\"onPreviewNav\"\n      @close=\"showPreview = false\"\n    />\n    <ConvertModal\n      v-if=\"showConvert && convertTarget && effectiveConvertUrl\"\n      :convert-url=\"effectiveConvertUrl\"\n      :file-name=\"convertTarget?.basename || convertTarget?.path || ''\"\n      :fetch-bytes=\"() => api.fetchArrayBuffer(convertTarget?.path ?? '')\"\n      :upload=\"(f) => api.uploadMultipart(qualify(currentPath), [f]).then(() => {})\"\n      :locale=\"locale\"\n      @close=\"showConvert = false\"\n      @done=\"onConvertDone\"\n    />\n    <PermissionsModal\n      v-if=\"showPerm && permTarget\"\n      :api=\"api\"\n      :path=\"permTarget.path\"\n      :is-dir=\"permTarget.type === 'dir'\"\n      :size=\"typeof permTarget.size === 'number' ? permTarget.size : undefined\"\n      :locale=\"locale === 'en' ? 'en' : 'tr'\"\n      :share-max-ttl-days=\"shareMaxTtlDays\"\n      :initial-tab=\"permInitialTab /* surucu:d1 */\"\n      @close=\"showPerm = false; permInitialTab = undefined\"\n    />\n\n    <!-- Recently-opened tray. Anchored to the toolbar trigger via fixed\n         position; click the backdrop or any entry to dismiss.\n         `.fe` + theme class keeps the dark/light cascade matching the\n         host shell — without them the popup floats outside the\n         FileExplorer root and falls back to :root light defaults. -->\n    <transition name=\"fe-modal\">\n      <div\n        v-if=\"showRecents\"\n        class=\"fe fe-modal__backdrop fe-recents__backdrop\"\n        :class=\"{\n          'fe--theme-light': themeMode === 'light',\n          'fe--theme-dark': themeMode === 'dark',\n        }\"\n        @click=\"showRecents = false\"\n      >\n        <div class=\"fe-recents__panel\" @click.stop>\n          <div class=\"fe-recents__header\">\n            <strong>{{ locale === 'en' ? 'Recently opened' : 'Son açılanlar' }}</strong>\n            <button class=\"fe-recents__close\" aria-label=\"Close\" @click=\"showRecents = false\">×</button>\n          </div>\n          <RecentlyOpened\n            :api-base=\"props.config.apiBase ?? ''\"\n            :auth-headers=\"() => buildAuthHeaders()\"\n            :auth-credentials=\"api.credentialsMode()\"\n            :limit=\"20\"\n            :refresh-key=\"recentRefreshKey\"\n            @open=\"onRecentOpen\"\n            @context=\"onRecentContext\"\n            @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'recents' } })\"\n          />\n        </div>\n      </div>\n    </transition>\n\n    <!-- Tag editor — opened from the context menu via Etiketler. -->\n    <transition name=\"fe-modal\">\n      <div\n        v-if=\"showTagPicker && tagPickerNode && typeof tagPickerNode.id === 'number'\"\n        class=\"fe-modal__backdrop\"\n        @click=\"showTagPicker = false\"\n      >\n        <div class=\"fe-modal__card fe-modal__card--md\" @click.stop>\n          <header class=\"fe-modal__head\">\n            <h2 class=\"fe-modal__title\">\n              {{ locale === 'en' ? 'Tags' : 'Etiketler' }} — {{ tagPickerNode.basename }}\n            </h2>\n            <button class=\"fe-modal__close\" aria-label=\"Close\" @click=\"showTagPicker = false\">×</button>\n          </header>\n          <div class=\"fe-modal__body\">\n            <TagPicker\n              :node-id=\"tagPickerNode.id\"\n              :locale=\"locale\"\n              :api-base=\"props.config.apiBase ?? ''\"\n              :auth-headers=\"() => buildAuthHeaders()\"\n              :auth-credentials=\"api.credentialsMode()\"\n              @change=\"onNodeTagsChanged\"\n              @open=\"openTagView /* etiket:t1 — the SAME door as in the details\n                     panel; `openTagView` closes this dialog on the way, because\n                     leaving a modal open over the view it just navigated to is\n                     a dialog nobody asked to keep. */\"\n              @error=\"(msg: string) => emit('error', { message: msg, context: { op: 'tags' } })\"\n            />\n          </div>\n        </div>\n      </div>\n    </transition>\n\n    <!-- gorunum:v1-advsearch — the advanced search dialog. Its result lands in\n         `files` through the same load() a toolbar search lands in, so there is\n         exactly one results surface and one empty state. -->\n    <AdvancedSearch\n      :open=\"showAdvSearch\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :initial-query=\"advSearchSeed\"\n      :folder-label=\"driveScopeLabel\"\n      :path-base=\"advPathBase\"\n      :content-search=\"advContentAvailable\"\n      :count=\"advSearchCount\"\n      @close=\"showAdvSearch = false\"\n      @submit=\"applyAdvancedSearch\"\n    />\n\n    <!-- cila:c wiring — command palette (Ctrl/Cmd+K) + shortcuts help (?) -->\n    <CommandPalette\n      :initial-query=\"paletteSeed /* surucu:d1 */\"\n      :open=\"showPalette\"\n      :locale=\"locale\"\n      :files=\"files\"\n      :view-mode=\"viewMode\"\n      :can-write=\"canWriteHere && !atVirtualRoot && !trashActive\"\n      :can-go-up=\"canGoUp\"\n      :global-search=\"paletteGlobalSearch\"\n      @close=\"showPalette = false\"\n      @open-hit=\"openSearchHit\"\n      @open-node=\"openNode\"\n      @navigate=\"(p: string) => load(p)\"\n      @new-folder=\"showNewFolder = true\"\n      @upload=\"triggerUpload\"\n      @toggle-view=\"setDisplayedViewMode(displayedViewMode === 'list' ? 'grid' : displayedViewMode === 'grid' ? 'gallery' : 'list') /* wiring:d2 + ui-fix — 3-mode cycle, to the active pane */\"\n      @open-trash=\"loadTrash\"\n      @refresh=\"refreshAll /* gorunum:v2-topbar */\"\n      @go-up=\"goUp\"\n      @open-theme=\"showThemeGallery = true /* wiring:int */\"\n      @open-shortcut-settings=\"showShortcutSettings = true /* wiring:int */\"\n      @start-tour=\"startTour() /* wiring:int */\"\n      :split-enabled=\"splitOffered /* wiring:d1 — see splitOffered */\"\n      @tab-new=\"newTabHere() /* wiring:d1 */\"\n      @split-toggle=\"toggleSplit() /* wiring:d1 */\"\n    />\n    <ShortcutsHelp\n      :open=\"showShortcutsHelp\"\n      :locale=\"locale\"\n      @close=\"showShortcutsHelp = false\"\n      @customize=\"showShortcutsHelp = false; showShortcutSettings = true /* wiring:c2 */\"\n    />\n    <!-- /cila:c wiring -->\n\n    <!-- wiring:c1 — tema galerisi -->\n    <ThemeGallery\n      :open=\"showThemeGallery\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      :dark=\"themeResolvedDark\"\n      :current=\"activeThemeId\"\n      :mode=\"themeModePref\"\n      :host-mode=\"config.theme || 'auto'\"\n      @close=\"showThemeGallery = false\"\n      @select=\"setActiveTheme\"\n      @mode=\"(m: ThemeModePref) => setThemeModePref(m)\"\n    />\n    <!-- /wiring:c1 -->\n\n    <input\n      ref=\"fileInputEl\"\n      type=\"file\"\n      multiple\n      class=\"fe__file-input\"\n      @change=\"onFilePicked\"\n    />\n\n    <transition name=\"fe-toast\">\n      <div\n        v-if=\"toast\"\n        class=\"fe-toast\"\n        :class=\"{ 'fe-toast--action': !!toast.actionLabel }\"\n        role=\"status\"\n        @click=\"dismissToast\"\n      >\n        <span class=\"fe-toast__msg\">{{ toast.message }}</span>\n        <button\n          v-if=\"toast.actionLabel && toast.action\"\n          type=\"button\"\n          class=\"fe-toast__action\"\n          @click.stop=\"runToastAction\"\n        >{{ toast.actionLabel }}</button>\n      </div>\n    </transition>\n\n    <!-- zaman:z3 — the embed's own time-zone setting (kept in this browser) -->\n    <TimeZoneDialog\n      :open=\"showTimeZone\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      @close=\"showTimeZone = false\"\n    />\n\n    <!-- wiring:c2 — shortcut settings modal + Space quick-look overlay -->\n    <ShortcutSettings\n      :open=\"showShortcutSettings\"\n      :locale=\"locale\"\n      :theme=\"themeMode\"\n      @close=\"showShortcutSettings = false\"\n    />\n    <QuickLook\n      :open=\"quickLookOpen\"\n      :locale=\"locale\"\n      :file=\"quickLookTarget\"\n      :theme=\"themeMode\"\n      :preview-url=\"(p: string) => e2ePreviewSrc(p) /* wiring:e2 */\"\n      :download-url=\"(p: string) => (e2eUnlocked ? e2ePreviewSrc(p) : api.downloadUrl(p)) /* wiring:e2 */\"\n      :only-office-base=\"e2eActive ? null : effectiveOnlyOfficeBase /* wiring:e2 */\"\n      :only-office-config-endpoint=\"effectiveOnlyOfficeConfigEndpoint\"\n      :auth-headers=\"() => buildAuthHeaders({ 'Content-Type': 'application/json' })\"\n      :auth-credentials=\"api.credentialsMode()\"\n      :drawio-url=\"effectiveDrawioUrl\"\n      :pdf-worker-url=\"props.config.pdfWorkerUrl || null\"\n      :viewer-base-url=\"effectiveViewerBaseUrl\"\n      @close=\"quickLookOpen = false\"\n      @nav=\"quickLookNav\"\n      @open-full=\"quickLookOpenFull\"\n    />\n    <!-- /wiring:c2 -->\n    <!-- wiring:c4 — onboarding coach-mark tour (teleports itself to body) -->\n    <OnboardingTour\n      :open=\"showTour\"\n      :locale=\"locale\"\n      :root=\"rootEl\"\n      :theme=\"themeMode\"\n      @close=\"onTourClose\"\n    />\n    <!-- /wiring:c4 -->\n  </div>\n</template>\n\n<style src=\"./styles/variables.css\"></style>\n<style src=\"./styles/base.css\"></style>\n","var av = Object.defineProperty;\nvar ov = (e, t, n) => t in e ? av(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;\nvar kn = (e, t, n) => ov(e, typeof t != \"symbol\" ? t + \"\" : t, n);\nimport { ref as m, computed as k, onMounted as dt, onBeforeUnmount as it, getCurrentInstance as sv, inject as Ws, defineComponent as qe, openBlock as c, createElementBlock as d, normalizeStyle as Ct, normalizeClass as we, Fragment as ae, createTextVNode as Je, toDisplayString as f, createCommentVNode as g, renderList as Te, createVNode as Ge, createElementVNode as o, createBlock as et, unref as s, Teleport as ja, Transition as Rn, withCtx as st, withModifiers as Re, withKeys as Ut, nextTick as gt, watch as He, shallowRef as wn, renderSlot as _n, withDirectives as Ve, vModelText as rt, vModelCheckbox as An, vModelSelect as on, createStaticVNode as Hu, provide as Fu, resolveDynamicComponent as rv, mergeProps as iv, getCurrentScope as lv, onScopeDispose as cv, customRef as uv, watchEffect as dv, createSlots as fv } from \"vue\";\nfunction Mc(e) {\n  return !!e && e.enabled && e.state === \"ok\";\n}\nconst Nu = [\"en\", \"tr\"], Ec = \"en\";\nfunction cn(e) {\n  return e && Nu.includes(e) ? e : pv();\n}\nfunction pv() {\n  try {\n    const e = typeof navigator > \"u\" ? void 0 : navigator;\n    if (!e) return Ec;\n    const t = e.languages && e.languages.length ? e.languages : [e.language];\n    for (const n of t) {\n      if (!n) continue;\n      const r = String(n).toLowerCase().split(\"-\")[0];\n      if (Nu.includes(r)) return r;\n    }\n  } catch {\n  }\n  return Ec;\n}\nfunction Ku(e) {\n  const t = e.apiBase != null ? e.apiBase.replace(/\\/+$/, \"\") : null;\n  function n(a, u) {\n    return a || (t === null ? null : `${t}${u}`);\n  }\n  const r = e.endpoint ?? (t !== null ? `${t}/api/files/manager` : null);\n  if (!r)\n    throw new Error(\n      \"[@brftech/filex-core] config requires either `apiBase` or `endpoint`\"\n    );\n  return {\n    manager: r,\n    // Staged (chunked + resumable) uploads — what useUploadChunked speaks on\n    // every driver. The {id} routes are derived from this one.\n    uploadBegin: n(e.uploadBegin, \"/api/files/upload/begin\"),\n    uploadInit: n(e.uploadInit, \"/api/files/upload/init\"),\n    uploadFinalize: n(e.uploadFinalize, \"/api/files/upload/finalize\"),\n    uploadAbort: n(e.uploadAbort, \"/api/files/upload/abort\"),\n    shareCreate: n(e.shareCreate, \"/api/files/share\"),\n    shareList: n(e.shareList, \"/api/files/share\"),\n    shareDelete: n(e.shareDelete, \"/api/files/share/{uuid}\"),\n    limits: n(e.limits, \"/api/files/limits\"),\n    capabilities: n(e.capabilities, \"/api/files/capabilities\"),\n    archiveList: n(e.archiveList, \"/api/files/archive/list\"),\n    archiveExtract: n(e.archiveExtract, \"/api/files/archive/extract\"),\n    archiveAdd: n(e.archiveAdd, \"/api/files/archive/add\"),\n    copy: n(e.copy, \"/api/files/copy\"),\n    moveAsync: n(e.moveAsync, \"/api/files/move\"),\n    deleteAsync: n(e.deleteAsync, \"/api/files/delete\"),\n    opsList: n(e.opsList, \"/api/files/ops\"),\n    opsShow: n(e.opsShow, \"/api/files/ops/{id}\"),\n    onlyOfficeConfig: n(e.onlyOfficeConfig, \"/api/files/onlyoffice/config\"),\n    saveText: n(e.saveText, \"/api/files/save-text\"),\n    restore: n(e.restore, \"/api/files/restore\"),\n    // filex trash: list soft-deleted nodes + restore one by node id.\n    trashList: n(e.trashList, \"/api/files/manager/trash\"),\n    trashRestore: n(e.trashRestore, \"/api/files/manager/restore\"),\n    /* wiring:e2 — escrow proof-of-possession, then the owner is told. */\n    e2eEscrowChallenge: n(e.e2eEscrowChallenge, \"/api/files/e2e/escrow/challenge\"),\n    e2eEscrowUsed: n(e.e2eEscrowUsed, \"/api/files/e2e/escrow/used\")\n  };\n}\nasync function vv(e) {\n  if (typeof e == \"function\") {\n    const t = e();\n    return t instanceof Promise ? await t : t;\n  }\n  return e;\n}\nfunction hv(e) {\n  return e ? \"kind\" in e ? e : e.type === \"bearer\" ? { kind: \"bearer\", token: e.token } : e.type === \"csrf\" ? { kind: \"csrf\", csrf: e.csrf } : { kind: \"none\" } : { kind: \"none\" };\n}\nfunction Ya(e) {\n  const t = Ku(e), n = hv(e.auth);\n  let r = null;\n  async function a(V = {}) {\n    const R = { Accept: \"application/json\", ...V };\n    if (n.kind === \"bearer\") {\n      const X = await vv(n.token);\n      X && (R.Authorization = `Bearer ${X}`, r = X);\n    } else if (n.kind === \"csrf\")\n      R[\"X-CSRF-TOKEN\"] = n.csrf, R[\"X-Requested-With\"] = \"XMLHttpRequest\";\n    else if (n.kind === \"basic\") {\n      const X = btoa(`${n.user}:${n.pass}`);\n      R.Authorization = `Basic ${X}`;\n    }\n    return R;\n  }\n  function u(V = {}) {\n    const R = { Accept: \"application/json\", ...V };\n    if (n.kind === \"bearer\") {\n      const X = typeof n.token == \"string\" ? n.token : r;\n      X && (R.Authorization = `Bearer ${X}`);\n    } else if (n.kind === \"csrf\")\n      R[\"X-CSRF-TOKEN\"] = n.csrf, R[\"X-Requested-With\"] = \"XMLHttpRequest\";\n    else if (n.kind === \"basic\") {\n      const X = btoa(`${n.user}:${n.pass}`);\n      R.Authorization = `Basic ${X}`;\n    }\n    return R;\n  }\n  function v() {\n    return n.kind === \"csrf\" ? \"include\" : \"same-origin\";\n  }\n  function p(V) {\n    const R = cn(e.locale) !== \"en\", ye = {\n      400: [\"Geçersiz istek\", \"Bad request\"],\n      401: [\"Oturum gerekli, tekrar giriş yapın\", \"Sign-in required\"],\n      403: [\"Bu işlem için yetkiniz yok\", \"You are not allowed to do this\"],\n      404: [\"Bulunamadı\", \"Not found\"],\n      409: [\"Zaten var / çakışma\", \"Already exists / conflict\"],\n      413: [\"Dosya çok büyük\", \"File too large\"],\n      415: [\"Bu dosya türü desteklenmiyor\", \"Unsupported file type\"],\n      422: [\"Geçersiz veri\", \"Invalid data\"],\n      429: [\"Çok fazla istek, biraz bekleyin\", \"Too many requests\"],\n      500: [\"Sunucu hatası\", \"Server error\"],\n      501: [\"Bu işlem desteklenmiyor\", \"Not supported\"],\n      503: [\"Servis şu an kullanılamıyor\", \"Service unavailable\"]\n    }[V];\n    return ye ? R ? ye[0] : ye[1] : R ? `Hata (${V})` : `Error (${V})`;\n  }\n  async function h(V, R = {}) {\n    const X = {\n      ...await a(),\n      ...R.headers ?? {}\n    }, ye = await fetch(V, {\n      ...R,\n      headers: X,\n      credentials: v()\n    });\n    if (!ye.ok) {\n      const Qe = await ye.text().catch(() => \"\"), at = new Error(p(ye.status));\n      throw at.status = ye.status, at.detail = Qe.slice(0, 300), at;\n    }\n    if (ye.status === 204 || ye.status === 205) return;\n    const je = await ye.text();\n    if (je)\n      return JSON.parse(je);\n  }\n  function b(V = \"\") {\n    return t.manager.replace(/\\/manager(\\?.*)?$/, \"/permissions\") + V;\n  }\n  async function y(V) {\n    return h(b() + \"?path=\" + encodeURIComponent(V));\n  }\n  async function A(V) {\n    return h(b(\"/resolve\") + \"?email=\" + encodeURIComponent(V));\n  }\n  async function D(V) {\n    return h(b(\"/users\") + \"?q=\" + encodeURIComponent(V));\n  }\n  async function C(V) {\n    return h(b(), { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(V) });\n  }\n  async function B(V, R) {\n    return h(b(\"/\" + V), { method: \"PATCH\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ level: R }) });\n  }\n  async function I(V) {\n    return h(b(\"/\" + V), { method: \"DELETE\" });\n  }\n  async function U(V) {\n    return h(b(\"/invite\"), { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(V) });\n  }\n  async function x(V) {\n    return h(b(\"/share-mail\"), { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(V) });\n  }\n  function E(V) {\n    const R = new URLSearchParams();\n    for (const [X, ye] of Object.entries(V))\n      ye != null && R.set(X, String(ye));\n    return R.toString();\n  }\n  function $(V, R = {}) {\n    const X = t.manager.includes(\"?\") ? \"&\" : \"?\";\n    return `${t.manager}${X}${E({ q: V, action: V, ...R })}`;\n  }\n  async function M(V) {\n    return h($(\"index\", { path: V }));\n  }\n  async function z(V, R) {\n    return h($(\"search\", { path: V, filter: R }));\n  }\n  async function T(V, R = {}) {\n    const X = t.manager.replace(/\\/manager(\\?.*)?$/, \"/search\"), ye = X.includes(\"?\") ? \"&\" : \"?\", je = `${X}${ye}${E({ q: V, limit: R.limit, scope: R.scope })}`, Qe = await h(je);\n    return Array.isArray(Qe == null ? void 0 : Qe.results) ? Qe.results : [];\n  }\n  async function Y() {\n    const V = t.manager.replace(/\\/manager(\\?.*)?$/, \"/quota/me\");\n    try {\n      const R = await h(V);\n      return R && typeof R.used_bytes == \"number\" ? R : null;\n    } catch {\n      return null;\n    }\n  }\n  async function O(V) {\n    return h($(\"subfolders\", { path: V }));\n  }\n  async function J(V, R) {\n    return h($(\"newfolder\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, name: R })\n    });\n  }\n  async function G(V, R, X) {\n    return h($(\"newfile\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, name: R, type: X })\n    });\n  }\n  async function N(V, R, X) {\n    return h($(\"rename\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, item: R, name: X })\n    });\n  }\n  async function P(V, R, X) {\n    return h($(\"move\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, item: X, items: R.map((ye) => ({ path: ye })) })\n    });\n  }\n  async function le(V, R) {\n    return h($(\"delete\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, items: R.map((X) => ({ path: X })) })\n    });\n  }\n  async function ve(V, R) {\n    if (!t.copy) throw new Error(\"copy endpoint not configured\");\n    return h(t.copy, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ source: V, target: R })\n    });\n  }\n  async function he(V, R, X) {\n    if (!t.moveAsync) throw new Error(\"moveAsync endpoint not configured\");\n    return h(t.moveAsync, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ source: V, target: R, sourceDir: X })\n    });\n  }\n  async function oe(V, R) {\n    if (!t.deleteAsync) throw new Error(\"deleteAsync endpoint not configured\");\n    return h(t.deleteAsync, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ source: V, sourceDir: R })\n    });\n  }\n  async function ue(V) {\n    if (!t.restore) throw new Error(\"restore endpoint not configured\");\n    return h(t.restore, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ source: V })\n    });\n  }\n  async function Q(V) {\n    if (!t.trashList) throw new Error(\"trashList endpoint not configured\");\n    const R = t.trashList, X = R.includes(\"?\") ? \"&\" : \"?\", ye = V ? `${R}${X}storage=${encodeURIComponent(V)}` : R;\n    return h(ye);\n  }\n  async function pe(V) {\n    const R = t.trashRestore;\n    if (!R) throw new Error(\"trashRestore endpoint not configured\");\n    let X = 0;\n    const ye = [];\n    for (const je of V)\n      try {\n        await h(R, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ node_id: je })\n        }), X++;\n      } catch (Qe) {\n        const at = Qe;\n        if (at.status === 409)\n          try {\n            const Ye = JSON.parse(at.detail ?? \"\");\n            Ye.code === \"EXISTS\" && ye.push(Ye.name || String(je));\n          } catch {\n          }\n      }\n    return { restored: X, taken: ye };\n  }\n  async function re(V, R, X) {\n    const ye = new FormData();\n    ye.append(\"path\", V);\n    for (const Qe of R)\n      ye.append(\"file[]\", Qe, Qe.name);\n    const je = await a();\n    return new Promise((Qe, at) => {\n      const Ye = new XMLHttpRequest();\n      Ye.open(\"POST\", $(\"upload\"));\n      for (const [lt, fe] of Object.entries(je))\n        lt !== \"Content-Type\" && Ye.setRequestHeader(lt, fe);\n      Ye.withCredentials = v() === \"include\", Ye.upload.onprogress = (lt) => {\n        X && lt.lengthComputable && X(Math.round(lt.loaded / lt.total * 100));\n      }, Ye.onload = () => {\n        if (Ye.status >= 200 && Ye.status < 300)\n          try {\n            Qe(JSON.parse(Ye.responseText));\n          } catch (lt) {\n            at(lt);\n          }\n        else\n          at(new Error(`${Ye.status} ${Ye.statusText}: ${Ye.responseText.slice(0, 200)}`));\n      }, Ye.onerror = () => at(new Error(\"Network error\")), Ye.send(ye);\n    });\n  }\n  function S(V) {\n    return $(\"download\", { path: V });\n  }\n  function w(V) {\n    return $(\"preview\", { path: V });\n  }\n  async function j(V, R = {}) {\n    const X = await a(), ye = await fetch(w(V), {\n      headers: X,\n      credentials: v(),\n      // ⚠ The preview endpoint answers `Cache-Control: private, max-age=60`,\n      // which is right for the thing it was built for — a viewer re-opening\n      // an image — and wrong for anything the client treats as CONTROL data.\n      // `.filex-e2e.json` is control data: after the client rewrites it\n      // (recovery upgrade, escrow slot, escrow refusal) the next read inside\n      // that minute came back PRE-write, so the folder looked un-upgraded\n      // and the question filex had just been answered was asked again.\n      // Measured 2026-09-05 in a real browser: decline the escrow offer,\n      // reopen the folder, and the offer was back.\n      cache: R.fresh ? \"no-store\" : \"default\"\n    });\n    if (!ye.ok) {\n      const Ye = await ye.text().catch(() => \"\");\n      throw new Error(\n        `${ye.status} ${ye.statusText}${Ye ? \" — \" + Ye.slice(0, 200) : \"\"}`\n      );\n    }\n    const je = await ye.blob(), Qe = je.type || ye.headers.get(\"content-type\") || \"\";\n    return { url: URL.createObjectURL(je), blob: je, mime: Qe };\n  }\n  async function K(V) {\n    const R = await a(), X = await fetch(w(V), {\n      headers: R,\n      credentials: v()\n    });\n    if (!X.ok) {\n      const ye = await X.text().catch(() => \"\");\n      throw new Error(\n        `${X.status} ${X.statusText}${ye ? \" — \" + ye.slice(0, 200) : \"\"}`\n      );\n    }\n    return X.arrayBuffer();\n  }\n  async function Z() {\n    return t.limits ? h(t.limits) : { max_upload_mb: 1024 };\n  }\n  async function W() {\n    return t.capabilities ? h(t.capabilities) : {\n      ffmpeg: !1,\n      ghostscript: !1,\n      libreoffice: !1,\n      max_chunk_mb: 5,\n      upload_limit_mb: 1024,\n      onlyoffice_url: e.onlyOfficeBase ?? null,\n      drawio_url: e.drawioBase ?? null,\n      convert_url: e.convertBase ?? null\n    };\n  }\n  async function $e(V) {\n    if (!t.e2eEscrowChallenge) throw new Error(\"e2e escrow endpoint not configured\");\n    return h(t.e2eEscrowChallenge, {\n      method: \"POST\",\n      body: JSON.stringify({ path: V })\n    });\n  }\n  async function Se(V) {\n    if (!t.e2eEscrowUsed) throw new Error(\"e2e escrow endpoint not configured\");\n    return h(t.e2eEscrowUsed, {\n      method: \"POST\",\n      body: JSON.stringify(V)\n    });\n  }\n  async function ze(V) {\n    if (!t.shareCreate) throw new Error(\"shareCreate endpoint not configured\");\n    return h(t.shareCreate, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(V)\n    });\n  }\n  async function Ne(V) {\n    if (!t.shareList) return { shares: [] };\n    const R = t.shareList.includes(\"?\") ? \"&\" : \"?\";\n    return h(`${t.shareList}${R}path=${encodeURIComponent(V)}`);\n  }\n  async function be(V) {\n    if (!t.shareDelete) throw new Error(\"shareDelete endpoint not configured\");\n    const R = t.shareDelete.replace(\"{uuid}\", encodeURIComponent(V));\n    return h(R, { method: \"DELETE\" });\n  }\n  async function De(V) {\n    if (!t.archiveList) throw new Error(\"archiveList endpoint not configured\");\n    return {\n      entries: (await h(\n        t.archiveList,\n        {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ path: V })\n        }\n      )).entries.map((X) => ({\n        name: X.name,\n        size: X.size,\n        isDir: X.is_dir,\n        lastModified: X.mtime\n      }))\n    };\n  }\n  async function ie(V, R) {\n    if (!t.archiveExtract) throw new Error(\"archiveExtract endpoint not configured\");\n    return h(t.archiveExtract, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, members: R })\n    });\n  }\n  async function ce(V, R) {\n    if (!t.archiveAdd) throw new Error(\"archiveAdd endpoint not configured\");\n    return h(t.archiveAdd, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ path: V, files: R })\n    });\n  }\n  function L(V = \"\") {\n    return t.manager.replace(/\\/manager(\\?.*)?$/, \"/versions\") + V;\n  }\n  async function se(V) {\n    const R = await h(\n      L() + \"?node_id=\" + encodeURIComponent(String(V))\n    );\n    return Array.isArray(R == null ? void 0 : R.versions) ? R.versions : [];\n  }\n  async function Ce(V, R, X = !0) {\n    await h(L(\"/restore\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({\n        node_id: V,\n        version_id: R,\n        snapshot_current: X\n      })\n    });\n  }\n  async function We(V) {\n    await h(L(\"/snapshot\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ node_id: V })\n    });\n  }\n  function Ie(V = \"\") {\n    return t.manager.replace(/\\/manager(\\?.*)?$/, \"/comments\") + V;\n  }\n  async function Ze(V) {\n    const R = await h(\n      Ie() + \"?node_id=\" + encodeURIComponent(String(V))\n    );\n    return Array.isArray(R == null ? void 0 : R.comments) ? R.comments : [];\n  }\n  async function vt(V, R) {\n    return (await h(Ie(), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ node_id: V, body: R })\n    })).comment;\n  }\n  async function Xe(V) {\n    await h(Ie(\"/\" + encodeURIComponent(String(V))), {\n      method: \"DELETE\"\n    });\n  }\n  async function Ae() {\n    const V = t.manager.replace(/\\/manager(\\?.*)?$/, \"/ws-ticket\");\n    try {\n      return await h(V, { method: \"POST\" });\n    } catch {\n      return null;\n    }\n  }\n  return {\n    // Realtime\n    wsTicket: Ae,\n    // Manager\n    index: M,\n    search: z,\n    globalSearch: T,\n    quotaMe: Y,\n    subfolders: O,\n    newFolder: J,\n    newFile: G,\n    rename: N,\n    move: P,\n    copy: ve,\n    moveAsync: he,\n    deleteAsync: oe,\n    deleteItems: le,\n    restore: ue,\n    listTrash: Q,\n    restoreIds: pe,\n    uploadMultipart: re,\n    downloadUrl: S,\n    previewUrl: w,\n    fetchBlob: j,\n    fetchArrayBuffer: K,\n    // Peripheral\n    limits: Z,\n    capabilities: W,\n    /* wiring:e2 */\n    e2eEscrowChallenge: $e,\n    e2eEscrowUsed: Se,\n    createShare: ze,\n    listShares: Ne,\n    revokeShare: be,\n    archiveList: De,\n    archiveExtract: ie,\n    archiveAdd: ce,\n    // Version history (koru:k1 inspector)\n    listVersions: se,\n    restoreVersion: Ce,\n    snapshotVersion: We,\n    // Node comments (calisma:d3 inspector)\n    listComments: Ze,\n    addComment: vt,\n    deleteComment: Xe,\n    // Permissions (RBAC panel)\n    listPermissions: y,\n    resolveEmail: A,\n    searchUsers: D,\n    addPermission: C,\n    updatePermission: B,\n    deletePermission: I,\n    invitePermission: U,\n    shareMail: x,\n    // Internals (exposed for useUploadChunked + PreviewModal)\n    endpoints: t,\n    authHeaders: a,\n    authHeadersSync: u,\n    credentialsMode: v,\n    jsonFetch: h\n  };\n}\nconst wi = \"filex:uploads:v1\", mv = 24 * 60 * 60 * 1e3;\nfunction jr(e, t) {\n  return [e, t.name, t.size, t.lastModified ?? 0].join(\"\\0\");\n}\nfunction yv() {\n  try {\n    return typeof localStorage > \"u\" ? null : (localStorage.getItem(wi), localStorage);\n  } catch {\n    return null;\n  }\n}\nfunction $i(e) {\n  if (!e) return {};\n  try {\n    const t = e.getItem(wi);\n    if (!t) return {};\n    const n = JSON.parse(t);\n    return n && typeof n == \"object\" ? n : {};\n  } catch {\n    return {};\n  }\n}\nfunction xi(e, t) {\n  if (e)\n    try {\n      e.setItem(wi, JSON.stringify(t));\n    } catch {\n    }\n}\nfunction Ru(e, t = Date.now()) {\n  const n = $i(e);\n  let r = !1;\n  for (const [a, u] of Object.entries(n))\n    (!(u != null && u.uploadId) || t - (u.updatedAt ?? 0) > mv) && (delete n[a], r = !0);\n  return r && xi(e, n), n;\n}\nfunction zc(e, t, n = Date.now()) {\n  return Ru(e, n)[t] ?? null;\n}\nfunction Ac(e, t, n, r = Date.now()) {\n  const a = $i(e);\n  a[t] = { ...n, updatedAt: r }, xi(e, a);\n}\nfunction yo(e, t) {\n  const n = $i(e);\n  t in n && (delete n[t], xi(e, n));\n}\nfunction bv(e, t = Date.now()) {\n  return Object.values(Ru(e, t)).sort((n, r) => r.updatedAt - n.updatedAt);\n}\nfunction gv(e) {\n  return !e || e === \"staging\";\n}\nfunction Pc(e) {\n  return e.stagedUnsupported = !0, e;\n}\nfunction kv(e) {\n  return !!(e != null && e.stagedUnsupported);\n}\nfunction _v(e, t, n = yv()) {\n  const r = e.chunkSize ?? 8388608;\n  function a() {\n    const C = t.endpoints.uploadBegin;\n    return C ? C.replace(/\\/begin$/, \"\") : t.endpoints.manager.replace(/\\/manager(\\?.*)?$/, \"/upload\");\n  }\n  function u() {\n    return !!a();\n  }\n  function v() {\n    return r;\n  }\n  function p(C) {\n    return u() && C.size > v();\n  }\n  function h(C, B) {\n    return zc(n, jr(C, B));\n  }\n  function b() {\n    return bv(n);\n  }\n  async function y(C) {\n    yo(n, jr(C.path, { name: C.name, size: C.size, lastModified: C.lastModified }));\n    try {\n      await t.jsonFetch(`${a()}/${encodeURIComponent(C.uploadId)}`, { method: \"DELETE\" });\n    } catch {\n    }\n  }\n  async function A(C) {\n    return t.jsonFetch(`${a()}/${encodeURIComponent(C)}`);\n  }\n  async function D(C) {\n    var T, Y;\n    const B = jr(C.path, C.file), I = {\n      id: crypto.randomUUID(),\n      file: C.file,\n      path: C.path,\n      totalBytes: C.file.size,\n      uploadedBytes: 0,\n      percent: 0,\n      status: \"initializing\",\n      cancel: () => {\n      }\n    };\n    let U = !1, x = null;\n    I.cancel = () => {\n      U = !0, x == null || x.abort();\n    };\n    let E = 0;\n    function $(O = 0) {\n      var J;\n      I.uploadedBytes = Math.min(I.totalBytes, E + O), I.percent = I.totalBytes > 0 ? Math.min(100, Math.round(I.uploadedBytes / I.totalBytes * 100)) : I.status === \"done\" ? 100 : 0, (J = C.onProgress) == null || J.call(C, I);\n    }\n    try {\n      if (!u())\n        throw Pc(new Error(\"staged upload endpoint not configured\"));\n      const O = a();\n      let J = \"\", G = C.chunkSize ?? r;\n      const N = zc(n, B);\n      if (N)\n        try {\n          const ve = await A(N.uploadId);\n          gv(ve.state) && (ve.total_size ?? 0) === C.file.size ? (J = N.uploadId, G = ve.chunk_size ?? ve.chunkSize ?? N.chunkSize, E = ve.offset ?? 0, I.resumedFrom = E) : yo(n, B);\n        } catch {\n          yo(n, B);\n        }\n      if (!J) {\n        let ve;\n        try {\n          ve = await t.jsonFetch(`${O}/begin`, {\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application/json\" },\n            body: JSON.stringify({\n              path: C.path,\n              name: C.file.name,\n              size: C.file.size,\n              mime: C.file.type || \"application/octet-stream\",\n              // Asked for, not imposed: the server clamps this to its own\n              // limits and its answer is what the loop below uses.\n              chunk_size: C.chunkSize ?? r\n            })\n          });\n        } catch (he) {\n          const oe = he.status;\n          throw (oe === 404 || oe === 501) && Pc(he), he;\n        }\n        if (!(ve != null && ve.id)) throw new Error(\"begin returned no upload id\");\n        J = ve.id, G = ve.chunk_size ?? ve.chunkSize ?? G, E = ve.offset ?? 0;\n      }\n      I.uploadId = J, I.status = \"uploading\", Ac(n, B, {\n        uploadId: J,\n        path: C.path,\n        name: C.file.name,\n        size: C.file.size,\n        lastModified: C.file.lastModified,\n        chunkSize: G,\n        offset: E\n      }), $();\n      const P = 4;\n      for (; E < C.file.size; ) {\n        if (U) throw new DOMException(\"Aborted by user\", \"AbortError\");\n        const ve = Math.min(E + G, C.file.size), he = C.file.slice(E, ve);\n        let oe = -1, ue = null;\n        for (let Q = 0; Q < P; Q++) {\n          if (Q > 0) {\n            if (await Dc(300 * Q + Math.floor(Math.random() * 150)), U) throw new DOMException(\"Aborted by user\", \"AbortError\");\n            try {\n              const pe = await A(J);\n              if ((pe.offset ?? 0) >= ve) {\n                oe = pe.offset ?? ve;\n                break;\n              }\n              if ((pe.offset ?? 0) !== E) {\n                E = pe.offset ?? E, $(), oe = -2;\n                break;\n              }\n            } catch {\n            }\n          }\n          try {\n            oe = await M(J, he, E, ve, C.file.size);\n            break;\n          } catch (pe) {\n            const re = pe instanceof Error ? pe : new Error(String(pe));\n            if (U || re.name === \"AbortError\") throw re;\n            const S = re.status;\n            if (S && S !== 400 && S !== 409 && S < 500) throw re;\n            ue = re;\n          }\n        }\n        if (oe !== -2) {\n          if (oe < 0) throw ue ?? new Error(\"chunk upload failed\");\n          if (oe <= E) throw new Error(`upload stalled at byte ${E}`);\n          E = oe, $(), Ac(n, B, {\n            uploadId: J,\n            path: C.path,\n            name: C.file.name,\n            size: C.file.size,\n            lastModified: C.file.lastModified,\n            chunkSize: G,\n            offset: E\n          });\n        }\n      }\n      if (U) throw new DOMException(\"Aborted by user\", \"AbortError\");\n      I.status = \"committing\", $();\n      const le = await t.jsonFetch(\n        `${O}/${encodeURIComponent(J)}/commit`,\n        { method: \"POST\" }\n      );\n      return yo(n, B), I.opId = le == null ? void 0 : le.op_id, I.nodeId = le == null ? void 0 : le.node_id, C.waitForTransfer !== !1 && (le != null && le.op_id) && t.endpoints.opsShow && (I.status = \"transferring\", $(), await z(le.op_id)), I.status = \"done\", E = I.totalBytes, $(), (T = C.onDone) == null || T.call(C, I, le), le;\n    } catch (O) {\n      const J = O instanceof Error ? O : new Error(String(O));\n      if (I.status = J.name === \"AbortError\" ? \"aborted\" : \"error\", I.error = J.message, $(), I.uploadId && I.status === \"aborted\") {\n        yo(n, B);\n        try {\n          await t.jsonFetch(`${a()}/${encodeURIComponent(I.uploadId)}`, {\n            method: \"DELETE\"\n          });\n        } catch {\n        }\n      }\n      throw (Y = C.onError) == null || Y.call(C, I, J), J;\n    }\n    function M(O, J, G, N, P) {\n      return new Promise((le, ve) => {\n        const he = new XMLHttpRequest();\n        x = he, he.open(\"PUT\", `${a()}/${encodeURIComponent(O)}`);\n        const oe = t.authHeadersSync({\n          \"Content-Type\": \"application/octet-stream\",\n          \"Content-Range\": `bytes ${G}-${N - 1}/${P}`\n        });\n        for (const [ue, Q] of Object.entries(oe)) he.setRequestHeader(ue, Q);\n        he.withCredentials = t.credentialsMode() === \"include\", he.upload.onprogress = (ue) => {\n          ue.lengthComputable && $(ue.loaded);\n        }, he.onload = () => {\n          if (x = null, he.status >= 200 && he.status < 300) {\n            try {\n              const Q = JSON.parse(he.responseText);\n              le(Q.offset ?? N);\n            } catch {\n              le(N);\n            }\n            return;\n          }\n          const ue = new Error(\n            `chunk ${G}-${N - 1} → ${he.status}`\n          );\n          ue.status = he.status, ue.detail = he.responseText.slice(0, 200), ve(ue);\n        }, he.onerror = () => {\n          x = null, ve(new Error(`chunk ${G}-${N - 1}: network error`));\n        }, he.onabort = () => {\n          x = null, ve(new DOMException(\"Aborted\", \"AbortError\"));\n        }, he.send(J);\n      });\n    }\n    async function z(O) {\n      const J = t.endpoints.opsShow;\n      if (!J) return;\n      const G = J.replace(\"{id}\", String(O));\n      let N = 200, P = 0;\n      for (; ; ) {\n        if (U) throw new DOMException(\"Aborted by user\", \"AbortError\");\n        try {\n          const le = await t.jsonFetch(G);\n          if ((le == null ? void 0 : le.status) === \"ok\") return;\n          if ((le == null ? void 0 : le.status) === \"failed\" || (le == null ? void 0 : le.status) === \"partial\")\n            throw new Lc(le.error || \"transfer failed\");\n          P = 0;\n        } catch (le) {\n          if (le instanceof Lc || le.name === \"AbortError\") throw le;\n          if (++P >= wv) return;\n        }\n        await Dc(N), N = Math.min(N * 2, 2e3);\n      }\n    }\n  }\n  return {\n    uploadFile: D,\n    /** True when this file is big enough (and the endpoints exist) to chunk. */\n    shouldChunk: p,\n    /** The size at which chunking kicks in. */\n    threshold: v,\n    resumableFor: h,\n    listResumable: b,\n    discardResumable: y\n  };\n}\nconst wv = 6;\nclass Lc extends Error {\n  constructor(t) {\n    super(t), this.name = \"TransferFailedError\";\n  }\n}\nfunction Dc(e) {\n  return new Promise((t) => setTimeout(t, e));\n}\nfunction Oc(e) {\n  const t = m(/* @__PURE__ */ new Set()), n = m(null);\n  function r(D, C = {}) {\n    if (C.shift && n.value) {\n      const B = e(), I = B.findIndex((M) => M.path === n.value), U = B.findIndex((M) => M.path === D);\n      if (I === -1 || U === -1) {\n        t.value = /* @__PURE__ */ new Set([D]), n.value = D;\n        return;\n      }\n      const [x, E] = I < U ? [I, U] : [U, I], $ = /* @__PURE__ */ new Set();\n      for (let M = x; M <= E; M++) $.add(B[M].path);\n      t.value = $;\n      return;\n    }\n    if (C.ctrl) {\n      const B = new Set(t.value);\n      B.has(D) ? B.delete(D) : B.add(D), t.value = B, n.value = D;\n      return;\n    }\n    t.value = /* @__PURE__ */ new Set([D]), n.value = D;\n  }\n  function a() {\n    t.value = /* @__PURE__ */ new Set(), n.value = null;\n  }\n  function u() {\n    t.value = new Set(e().map((D) => D.path));\n  }\n  function v(D) {\n    return t.value.has(D);\n  }\n  function p(D) {\n    const C = new Set(t.value);\n    C.add(D), t.value = C;\n  }\n  function h(D) {\n    const C = new Set(t.value);\n    C.delete(D), t.value = C;\n  }\n  const b = k(() => t.value.size), y = k(() => t.value.size === 0), A = k(() => e().filter((C) => t.value.has(C.path)));\n  return { selected: t, anchor: n, click: r, clear: a, selectAll: u, has: v, add: p, remove: h, size: b, isEmpty: y, nodes: A };\n}\nconst $v = /* @__PURE__ */ new Set([\n  \"Ctrl+N\",\n  \"Ctrl+Shift+N\",\n  \"Ctrl+T\",\n  \"Ctrl+Shift+T\",\n  \"Ctrl+W\",\n  \"Ctrl+Shift+W\",\n  \"Ctrl+Tab\",\n  \"Ctrl+Shift+Tab\",\n  \"Ctrl+Q\",\n  \"Ctrl+Shift+I\",\n  \"Ctrl+Shift+J\",\n  \"Ctrl+Shift+C\",\n  \"F11\",\n  \"F12\"\n]);\nfunction Bc(e) {\n  return $v.has(e);\n}\nconst oa = [\n  // Navigation\n  { id: \"palette\", defaultCombo: \"Ctrl+K\", labelKey: \"shortcuts.palette\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"search\", defaultCombo: \"/\", labelKey: \"shortcuts.search\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"go-up\", defaultCombo: \"Alt+↑\", fixedCombos: [\"Backspace\"], labelKey: \"shortcuts.go_up\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"open\", defaultCombo: \"Enter\", prevent: !1, labelKey: \"shortcuts.open\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"quicklook\", defaultCombo: \"Space\", labelKey: \"shortcuts.quicklook\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"close\", defaultCombo: \"Esc\", customizable: !1, prevent: !1, inForms: !0, labelKey: \"shortcuts.close\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"inspector\", defaultCombo: \"I\", labelKey: \"shortcuts.inspector\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"help\", defaultCombo: \"?\", labelKey: \"shortcuts.help\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"toggle-hidden\", defaultCombo: \"Ctrl+Shift+.\", labelKey: \"shortcuts.toggle_hidden\", groupKey: \"shortcuts.group.nav\" },\n  /* yildiz:s1 — starring is an action, so it belongs where the other verbs\n   * are. A bare letter like the inspector's `I`; the handler ignores events\n   * from form controls, so it never eats a keystroke meant for a filename. */\n  { id: \"star\", defaultCombo: \"S\", labelKey: \"shortcuts.star\", groupKey: \"shortcuts.group.file\" },\n  // Selection\n  { id: \"select-all\", defaultCombo: \"Ctrl+A\", labelKey: \"shortcuts.select_all\", groupKey: \"shortcuts.group.selection\" },\n  // File operations\n  { id: \"rename\", defaultCombo: \"F2\", labelKey: \"shortcuts.rename\", groupKey: \"shortcuts.group.file\" },\n  { id: \"delete\", defaultCombo: \"Del\", labelKey: \"shortcuts.delete\", groupKey: \"shortcuts.group.file\" },\n  { id: \"cut\", defaultCombo: \"Ctrl+X\", labelKey: \"shortcuts.cut\", groupKey: \"shortcuts.group.file\" },\n  { id: \"copy\", defaultCombo: \"Ctrl+C\", labelKey: \"shortcuts.copy\", groupKey: \"shortcuts.group.file\" },\n  { id: \"paste\", defaultCombo: \"Ctrl+V\", labelKey: \"shortcuts.paste\", groupKey: \"shortcuts.group.file\" },\n  /* wiring:d1 — tabs. Note: browsers reserve Ctrl+T/W/Tab in normal pages\n   * (preventDefault can't stop them there); they work in webcomponent/PWA/\n   * kiosk contexts and stay remappable through the settings modal. */\n  { id: \"tab-new\", defaultCombo: \"Ctrl+T\", labelKey: \"shortcuts.tab_new\", groupKey: \"shortcuts.group.tabs\" },\n  { id: \"tab-close\", defaultCombo: \"Ctrl+W\", labelKey: \"shortcuts.tab_close\", groupKey: \"shortcuts.group.tabs\" },\n  { id: \"tab-next\", defaultCombo: \"Ctrl+Tab\", labelKey: \"shortcuts.tab_next\", groupKey: \"shortcuts.group.tabs\" },\n  { id: \"tab-prev\", defaultCombo: \"Ctrl+Shift+Tab\", labelKey: \"shortcuts.tab_prev\", groupKey: \"shortcuts.group.tabs\" },\n  /* /wiring:d1 */\n  /* tus:t1 — the rest of the menu verbs. Until now these were reachable only\n   * by right-clicking, and the right-click menu named no keys at all, so 16 of\n   * the registry's actions were invisible unless somebody opened the `?` sheet\n   * on their own. The ones with no default are deliberate: they are rare\n   * enough that taking a key from the user by default is the wrong trade, and\n   * they are in the registry so the user can take one. */\n  { id: \"new-folder\", defaultCombo: \"Shift+N\", labelKey: \"shortcuts.new_folder\", groupKey: \"shortcuts.group.file\" },\n  { id: \"upload\", defaultCombo: \"U\", labelKey: \"shortcuts.upload\", groupKey: \"shortcuts.group.file\" },\n  { id: \"refresh\", defaultCombo: \"R\", labelKey: \"shortcuts.refresh\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"download\", defaultCombo: \"D\", labelKey: \"shortcuts.download\", groupKey: \"shortcuts.group.file\" },\n  { id: \"preview\", defaultCombo: \"P\", labelKey: \"shortcuts.preview\", groupKey: \"shortcuts.group.nav\" },\n  { id: \"share\", defaultCombo: \"Shift+S\", labelKey: \"shortcuts.share\", groupKey: \"shortcuts.group.file\" },\n  { id: \"tags\", defaultCombo: \"T\", labelKey: \"shortcuts.tags\", groupKey: \"shortcuts.group.file\" },\n  { id: \"convert\", defaultCombo: \"\", labelKey: \"shortcuts.convert\", groupKey: \"shortcuts.group.file\" },\n  { id: \"open-tab\", defaultCombo: \"\", labelKey: \"shortcuts.open_tab\", groupKey: \"shortcuts.group.tabs\" },\n  { id: \"copy-path\", defaultCombo: \"\", labelKey: \"shortcuts.copy_path\", groupKey: \"shortcuts.group.file\" },\n  { id: \"copy-id\", defaultCombo: \"\", labelKey: \"shortcuts.copy_id\", groupKey: \"shortcuts.group.file\" },\n  { id: \"restore\", defaultCombo: \"\", labelKey: \"shortcuts.restore\", groupKey: \"shortcuts.group.file\" }\n  /* /tus:t1 */\n], xv = {\n  palette: \"onPathJump\",\n  search: \"onFocusSearch\",\n  \"go-up\": \"onGoUp\",\n  open: \"onOpen\",\n  quicklook: \"onQuickLook\",\n  close: \"onClose\",\n  inspector: \"onToggleInspector\",\n  \"toggle-hidden\": \"onToggleHidden\",\n  star: \"onStar\",\n  help: \"onShowHelp\",\n  \"select-all\": \"onSelectAll\",\n  rename: \"onRename\",\n  delete: \"onDelete\",\n  cut: \"onCut\",\n  copy: \"onCopy\",\n  paste: \"onPaste\",\n  /* wiring:d1 */\n  \"tab-new\": \"onTabNew\",\n  \"tab-close\": \"onTabClose\",\n  \"tab-next\": \"onTabNext\",\n  \"tab-prev\": \"onTabPrev\",\n  /* tus:t1 */\n  \"new-folder\": \"onNewFolder\",\n  upload: \"onUpload\",\n  refresh: \"onRefresh\",\n  download: \"onDownload\",\n  preview: \"onPreview\",\n  share: \"onShare\",\n  tags: \"onTags\",\n  convert: \"onConvert\",\n  \"open-tab\": \"onOpenTab\",\n  \"copy-path\": \"onCopyPath\",\n  \"copy-id\": \"onCopyId\",\n  restore: \"onRestore\"\n}, oi = \"filex.shortcuts\";\nfunction Sv() {\n  try {\n    const e = localStorage.getItem(oi);\n    if (!e) return {};\n    const t = JSON.parse(e);\n    if (!t || typeof t != \"object\") return {};\n    const n = {};\n    for (const [r, a] of Object.entries(t))\n      typeof a == \"string\" && oa.some((u) => u.id === r) && (n[r] = a);\n    return n;\n  } catch {\n    return {};\n  }\n}\nconst Pn = m(Sv());\nfunction Si() {\n  try {\n    Object.keys(Pn.value).length === 0 ? localStorage.removeItem(oi) : localStorage.setItem(oi, JSON.stringify(Pn.value));\n  } catch {\n  }\n}\nfunction Ci(e) {\n  return oa.find((t) => t.id === e);\n}\nfunction Wa(e) {\n  var n;\n  const t = Pn.value[e];\n  return t !== void 0 ? t : ((n = Ci(e)) == null ? void 0 : n.defaultCombo) ?? \"\";\n}\nfunction Yr(e, t) {\n  const n = Ci(e);\n  if (!n || n.customizable === !1) return;\n  const r = { ...Pn.value };\n  t === n.defaultCombo ? delete r[e] : r[e] = t, Pn.value = r, Si();\n}\nfunction Cv(e) {\n  if (!(e in Pn.value)) return;\n  const t = { ...Pn.value };\n  delete t[e], Pn.value = t, Si();\n}\nfunction Tv() {\n  Pn.value = {}, Si();\n}\nfunction Mv(e, t) {\n  var n;\n  if (!e) return null;\n  for (const r of oa)\n    if (r.id !== t) {\n      if ((n = r.fixedCombos) != null && n.includes(e)) return { id: r.id, fixed: !0 };\n      if (Wa(r.id) === e) return { id: r.id, fixed: r.customizable === !1 };\n    }\n  return null;\n}\nconst Ev = {\n  \" \": \"Space\",\n  Spacebar: \"Space\",\n  Escape: \"Esc\",\n  Delete: \"Del\",\n  ArrowUp: \"↑\",\n  ArrowDown: \"↓\",\n  ArrowLeft: \"←\",\n  ArrowRight: \"→\",\n  PageUp: \"PgUp\",\n  PageDown: \"PgDn\"\n}, zv = /* @__PURE__ */ new Set([\"Control\", \"Alt\", \"Shift\", \"Meta\", \"AltGraph\", \"CapsLock\", \"NumLock\", \"ScrollLock\", \"Fn\", \"Dead\"]);\nfunction Av(e) {\n  const t = e.key;\n  if (!t || zv.has(t)) return null;\n  const n = Ev[t];\n  return n || (t.length === 1 ? t.toUpperCase() : t);\n}\nfunction Ti(e) {\n  const t = Av(e);\n  if (!t) return null;\n  const n = [];\n  (e.ctrlKey || e.metaKey) && n.push(\"Ctrl\"), e.altKey && n.push(\"Alt\");\n  const r = t.length === 1 && t.toUpperCase() === t.toLowerCase();\n  return e.shiftKey && !r && n.push(\"Shift\"), n.push(t), n.join(\"+\");\n}\nfunction Uu() {\n  return k(\n    () => oa.map((e) => {\n      const t = Wa(e.id), n = e.fixedCombos ?? [];\n      return {\n        id: e.id,\n        combo: t,\n        fixedCombos: n,\n        keys: [t, ...n].filter((r) => !!r),\n        labelKey: e.labelKey,\n        groupKey: e.groupKey,\n        customizable: e.customizable !== !1,\n        overridden: Pn.value[e.id] !== void 0\n      };\n    })\n  );\n}\nfunction Pv() {\n  return typeof navigator < \"u\" && /mac|iphone|ipad|ipod/i.test(navigator.platform || navigator.userAgent || \"\");\n}\nfunction Lv(e) {\n  return e ? Pv() ? e.replace(/\\bCtrl\\b/g, \"⌘\") : e : \"\";\n}\nconst Dv = {\n  open: \"open\",\n  \"open-tab\": \"open-tab\",\n  preview: \"preview\",\n  download: \"download\",\n  convert: \"convert\",\n  access: \"share\",\n  details: \"inspector\",\n  \"copy-id\": \"copy-id\",\n  \"copy-path\": \"copy-path\",\n  rename: \"rename\",\n  cut: \"cut\",\n  copy: \"copy\",\n  paste: \"paste\",\n  star: \"star\",\n  tags: \"tags\",\n  delete: \"delete\",\n  restore: \"restore\",\n  \"new-folder\": \"new-folder\",\n  \"toggle-hidden\": \"toggle-hidden\",\n  upload: \"upload\",\n  refresh: \"refresh\"\n};\nfunction Vu(e) {\n  const t = Dv[e] ?? e;\n  return oa.some((n) => n.id === t) ? Na(t) : \"\";\n}\nfunction Na(e) {\n  return Lv(Wa(e));\n}\nfunction si(e, t) {\n  var a, u;\n  const n = Wa(t);\n  if (!n) return !1;\n  const r = Ti(e);\n  return r === n ? !0 : ((u = (a = Ci(t)) == null ? void 0 : a.fixedCombos) == null ? void 0 : u.includes(r ?? \"\")) ?? !1;\n}\noa.map((e) => ({\n  keys: [e.defaultCombo, ...e.fixedCombos ?? []].filter((t) => !!t),\n  labelKey: e.labelKey,\n  groupKey: e.groupKey\n}));\nfunction Ov(e, t) {\n  const n = k(() => {\n    const a = /* @__PURE__ */ new Map();\n    for (const u of oa) {\n      const v = Wa(u.id);\n      v && a.set(v, u);\n    }\n    return a;\n  });\n  function r(a) {\n    var A;\n    if (!e.value || a.key !== \"Escape\" && document.querySelector(\".fe-ctx-backdrop\")) return;\n    const v = a.target, p = !!(v && (v.tagName === \"INPUT\" || v.tagName === \"TEXTAREA\" || v.tagName === \"SELECT\" || v.isContentEditable)), h = Ti(a);\n    if (!h) return;\n    if (h === \"Backspace\") {\n      if (p) return;\n      (A = t.hasSelection) != null && A.call(t) && t.onDelete ? (a.preventDefault(), t.onDelete()) : t.onGoUp && (a.preventDefault(), t.onGoUp());\n      return;\n    }\n    const b = n.value.get(h);\n    if (!b || p && !b.inForms || h === \"Space\" && v && typeof v.closest == \"function\" && v.closest('button, a, select, summary, [role=\"button\"], [role=\"menuitem\"]'))\n      return;\n    const y = t[xv[b.id]];\n    y && (b.prevent !== !1 && a.preventDefault(), y());\n  }\n  dt(() => window.addEventListener(\"keydown\", r)), it(() => window.removeEventListener(\"keydown\", r));\n}\nconst Bv = {\n  \"toolbar.new_folder\": \"Yeni klasör\",\n  \"toolbar.upload\": \"Yükle\",\n  \"toolbar.search\": \"Ara\",\n  \"toolbar.search.placeholder\": \"Ada ya da tag: ile ara…\",\n  \"toolbar.view.list\": \"Liste\",\n  \"toolbar.view.grid\": \"Izgara\",\n  \"toolbar.refresh\": \"Yenile\",\n  \"toolbar.go_up\": \"Üst Klasör\",\n  \"ctx.open\": \"Aç\",\n  \"ctx.preview\": \"Önizle\",\n  \"ctx.download\": \"İndir\",\n  \"ctx.convert\": \"Dönüştür\",\n  \"ctx.rename\": \"Yeniden adlandır\",\n  \"ctx.delete\": \"Sil\",\n  \"ctx.delete_perm\": \"Kalıcı Olarak Sil\",\n  \"ctx.restore\": \"Geri Getir\",\n  \"ctx.share\": \"Paylaş\",\n  \"ctx.move\": \"Taşı\",\n  \"ctx.copy\": \"Kopyala\",\n  \"ctx.cut\": \"Kes\",\n  \"ctx.show_hidden\": \"Gizli dosyaları göster\",\n  \"ctx.hide_hidden\": \"Gizli dosyaları gizle\",\n  \"ctx.keep_local\": \"Bilgisayarda tut\",\n  \"ctx.keep_online\": \"Yalnızca çevrimiçi tut\",\n  \"ctx.keep_reveal\": \"Yerel klasörü aç\",\n  \"ctx.keep_inherited\": \"Üst klasörle bilgisayarda tutuluyor\",\n  \"keep.started\": \"Bilgisayarda tutulacak — eşitleme başladı\",\n  \"keep.failed\": \"Bilgisayarda tutulamadı\",\n  \"keep.badge_kept\": \"Bilgisayarda\",\n  \"keep.badge_syncing\": \"Eşitleniyor…\",\n  \"keep.badge_cloud\": \"Yalnızca çevrimiçi\",\n  \"keep.badge_partial\": \"İçinde bilgisayarda tutulanlar var\",\n  \"keep.strip_transfer\": \"{name} eşitleniyor — {done}/{total} (%{pct})\",\n  \"keep.strip_inventory\": \"{name} eşitleniyor — sunucu taranıyor…\",\n  \"keep.strip_settling\": \"{name} eşitleniyor — son durum kaydediliyor…\",\n  \"ctx.paste\": \"Yapıştır\",\n  \"ctx.info\": \"Bilgi\",\n  \"ctx.duplicate\": \"Kopyasını Oluştur\",\n  \"ctx.new_file\": \"Yeni dosya\",\n  \"modal.delete.title\": \"Silinsin mi?\",\n  \"modal.delete.message\": \"{count} öğe çöpe atılacak.\",\n  \"modal.delete.message_one\": \"{count} öğe çöpe atılacak.\",\n  \"modal.delete.confirm\": \"Çöpe At\",\n  \"modal.delete.cancel\": \"Vazgeç\",\n  \"modal.rename.title\": \"Yeniden adlandır\",\n  \"modal.rename.save\": \"Kaydet\",\n  \"modal.rename.cancel\": \"Vazgeç\",\n  \"modal.newfolder.title\": \"Yeni klasör\",\n  \"modal.newfolder.placeholder\": \"Klasör adı\",\n  \"modal.newfolder.create\": \"Oluştur\",\n  \"modal.newfolder.cancel\": \"Vazgeç\",\n  \"modal.share.title\": \"Paylaşım Linki\",\n  \"modal.share.pin\": \"PIN koruması\",\n  \"modal.share.expires\": \"Son kullanma\",\n  \"modal.share.max_downloads\": \"İndirme limiti\",\n  \"modal.share.create\": \"Paylaş\",\n  \"modal.share.cancel\": \"Vazgeç\",\n  \"modal.share.close\": \"Kapat\",\n  \"modal.share.limit_applied\": \"(sunucu sınırı uygulandı)\",\n  \"modal.share.copy\": \"Kopyala\",\n  \"modal.share.url_copied\": \"Link kopyalandı\",\n  \"modal.share.pin_copied\": \"PIN kopyalandı\",\n  \"modal.share.cli_copied\": \"CLI komutu kopyalandı\",\n  \"upload.progress\": \"Yükleniyor\",\n  \"upload.done\": \"Tamamlandı\",\n  \"upload.error\": \"Hata\",\n  \"upload.failed\": \"“{name}” yüklenemedi\",\n  \"upload.aborted\": \"İptal edildi\",\n  \"upload.cancel\": \"İptal\",\n  \"upload.resuming\": \"“{name}” %{percent} noktasından devam ediyor\",\n  \"upload.committing\": \"Tamamlanıyor\",\n  \"upload.transferring\": \"Depolamaya aktarılıyor\",\n  \"empty.folder\": \"Bu klasör boş\",\n  \"empty.search\": \"Sonuç bulunamadı\",\n  loading: \"Yükleniyor…\",\n  \"notFound.title\": \"Klasör bulunamadı\",\n  \"notFound.desc\": \"Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.\",\n  \"notFound.goRoot\": \"Kök klasöre dön\",\n  \"col.name\": \"Ad\",\n  \"col.size\": \"Boyut\",\n  \"col.modified\": \"Tarih\",\n  \"col.type\": \"Tür\",\n  \"unit.bytes\": \"B\",\n  \"unit.kb\": \"KB\",\n  \"unit.mb\": \"MB\",\n  \"unit.gb\": \"GB\",\n  \"unit.tb\": \"TB\",\n  \"unit.pb\": \"PB\",\n  \"breadcrumb.root\": \"Kök\",\n  \"breadcrumb.copy_path\": \"Yolu kopyala\",\n  \"breadcrumb.go_to_path\": \"Yola git\",\n  \"breadcrumb.path_placeholder\": \"fileman/foo/bar\",\n  \"ops.copy\": \"Kopyalanıyor\",\n  \"ops.move\": \"Taşınıyor\",\n  \"ops.delete\": \"Siliniyor\",\n  \"ops.queued\": \"sırada\",\n  \"ops.done\": \"tamamlandı\",\n  \"ops.error\": \"hata\",\n  \"node.trash\": \"Çöp Kutusu\",\n  \"node.folder\": \"Klasör\",\n  // ——— Zengin önizleyici chrome ———\n  \"viewer.open_in_new_tab\": \"Yeni sekmede aç\",\n  \"viewer.loading\": \"Yükleniyor…\",\n  \"viewer.failed_to_load\": \"Dosya yüklenemedi\",\n  \"viewer.peer_not_installed\": \"Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.\",\n  \"viewer.format_unsupported_3d\": \"Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.\",\n  \"viewer.zoom_in\": \"Yakınlaştır\",\n  \"viewer.zoom_out\": \"Uzaklaştır\",\n  \"viewer.fit_width\": \"Sayfa genişliğine sığdır\",\n  \"viewer.next_page\": \"Sonraki sayfa\",\n  \"viewer.prev_page\": \"Önceki sayfa\",\n  \"viewer.page_n_of_m\": \"Sayfa {n} / {m}\",\n  \"viewer.tags\": \"Etiketler\",\n  \"viewer.layers\": \"Katmanlar\",\n  \"viewer.toc\": \"İçindekiler\",\n  \"viewer.font_smaller\": \"Yazıyı küçült\",\n  \"viewer.font_larger\": \"Yazıyı büyüt\",\n  \"viewer.search\": \"Ara\",\n  \"viewer.download\": \"İndir\",\n  \"viewer.saving\": \"Kaydediliyor…\",\n  \"viewer.save\": \"Kaydet (Ctrl+S)\",\n  \"viewer.saved\": \"Kaydedildi\",\n  \"viewer.save_error\": \"Hata\",\n  \"viewer.editor_loading\": \"Editör yükleniyor…\",\n  \"viewer.no_preview\": \"Bu dosya tipi için önizleme henüz yok.\",\n  \"viewer.edit\": \"Düzenle\",\n  \"viewer.close\": \"Kapat\",\n  \"presence.expand\": \"İsimleri göster\",\n  \"presence.collapse\": \"Küçült\",\n  \"viewer.save_annotations\": \"Açıklamaları kaydet\",\n  \"viewer.annotations_on\": \"Açıklamalar: açık\",\n  \"viewer.annotations_off\": \"Açıklamalar: kapalı\",\n  \"viewer.read_only\": \"Salt okunur\",\n  \"viewer.csv_first_row_header\": \"İlk satır başlık olsun\",\n  \"viewer.csv_filter\": \"Satır filtrele…\",\n  \"viewer.epub_prev\": \"Önceki\",\n  \"viewer.epub_next\": \"Sonraki\",\n  \"viewer.drawio.disabled\": \"diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL'yi ayarlamalı.\",\n  \"viewer.archive.entries\": \"{n} dosya\",\n  \"viewer.archive.entries_one\": \"{n} dosya\",\n  \"viewer.archive.empty\": \"Arşiv boş.\",\n  \"viewer.archive.error\": \"Arşiv okunamadı.\",\n  \"viewer.name\": \"Ad\",\n  \"viewer.size\": \"Boyut\",\n  // ——— cila:a — sıralama / tarih grupları / yoğunluk ———\n  \"col.sort\": \"Sırala\",\n  \"group.today\": \"Bugün\",\n  \"group.yesterday\": \"Dün\",\n  \"group.this_week\": \"Bu Hafta\",\n  \"group.this_month\": \"Bu Ay\",\n  \"group.no_date\": \"Tarihsiz\",\n  \"toolbar.density.compact\": \"Sıkışık görünüm\",\n  \"toolbar.density.comfortable\": \"Rahat görünüm\",\n  // ——— cila:c — komut paleti + kısayol yardımı + breadcrumb ———\n  \"palette.placeholder\": \"Dosya, klasör veya komut ara…\",\n  \"palette.files\": \"Dosyalar\",\n  \"palette.commands\": \"Komutlar\",\n  \"palette.goto\": \"Yola git\",\n  \"palette.empty\": \"Sonuç bulunamadı\",\n  \"palette.hint\": \"↑↓ gezin · Enter seç · Esc kapat\",\n  \"cmd.view_toggle\": \"Görünümü değiştir (liste ⇄ ızgara)\",\n  \"cmd.trash\": \"Çöp kutusunu aç\",\n  \"shortcuts.title\": \"Klavye Kısayolları\",\n  \"shortcuts.group.nav\": \"Gezinme\",\n  \"shortcuts.group.selection\": \"Seçim\",\n  \"shortcuts.group.file\": \"Dosya işlemleri\",\n  \"shortcuts.palette\": \"Komut paleti\",\n  \"shortcuts.search\": \"Aramaya odaklan\",\n  \"shortcuts.go_up\": \"Üst klasöre çık\",\n  \"shortcuts.open\": \"Seçili öğeyi aç\",\n  \"shortcuts.close\": \"Kapat / vazgeç\",\n  \"shortcuts.toggle_hidden\": \"Gizli dosyaları göster/gizle\",\n  \"shortcuts.help\": \"Bu yardım penceresi\",\n  \"shortcuts.select_all\": \"Tümünü seç\",\n  \"shortcuts.star\": \"Yıldızla / yıldızı kaldır\",\n  \"shortcuts.rename\": \"Yeniden adlandır\",\n  \"shortcuts.delete\": \"Sil\",\n  \"shortcuts.cut\": \"Kes\",\n  \"shortcuts.copy\": \"Kopyala\",\n  \"shortcuts.paste\": \"Yapıştır\",\n  \"breadcrumb.more\": \"Aradaki klasörler\",\n  // ——— State screens + undo snackbar + connection badge (cila:b) ———\n  \"empty.hint\": \"Dosyaları buraya sürükleyip bırakın\",\n  \"empty.upload\": \"Dosya yükle\",\n  \"empty.search.title\": \"Aramanla eşleşen dosya yok\",\n  \"empty.search.hint\": \"Farklı bir arama terimi deneyin\",\n  \"empty.trash.title\": \"Çöp kutusu boş\",\n  \"error.title\": \"Liste yüklenemedi\",\n  \"error.retry\": \"Yeniden dene\",\n  \"toast.undo\": \"Geri Al\",\n  \"toast.undone\": \"Geri alındı\",\n  \"toast.undo_failed\": \"Geri alınamadı\",\n  \"toast.renamed\": \"Yeniden adlandırıldı\",\n  \"toast.moved\": \"Taşındı\",\n  \"toast.trashed\": \"Çöpe taşındı\",\n  /* i18n:hardcoded — FileExplorer.vue'da düz string olarak duran, hiçbir dilin\n     değiştiremediği bildirim metinleri. */\n  \"toast.failed\": \"İşlem başarısız\",\n  \"toast.copied\": \"Kopyalandı\",\n  \"toast.deleted\": \"Silindi\",\n  \"toast.cut\": \"Kesildi\",\n  \"toast.cut_ready\": \"Kes → Yapıştır hazır\",\n  \"toast.copy_ready\": \"Kopyala → Yapıştır hazır\",\n  \"toast.same_folder_cut\": \"Aynı klasöre kesilemez\",\n  \"toast.restored\": \"{n} öğe geri getirildi\",\n  \"toast.restored_one\": \"{n} öğe geri getirildi\",\n  \"toast.restore_taken\": \"{n} öğe geri getirilmedi: aynı adla bir şey zaten var. Oradakinin adını değiştirip yeniden deneyin.\",\n  \"toast.restore_taken_one\": \"“{name}” geri getirilmedi: aynı adla bir şey zaten var. Oradakinin adını değiştirip yeniden deneyin.\",\n  \"toast.delete_queued\": \"Silme kuyruğa alındı\",\n  \"toast.trash_retention\": \"Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.\",\n  \"dropzone.hint\": \"Dosyaları buraya bırak\",\n  \"modal.newfolder.invalid\": \"Geçersiz karakter\",\n  \"viewer.office_unconfigured\": \"OnlyOffice yapılandırması yok\",\n  \"viewer.pdf_inline_failed\": \"Tarayıcı PDF'i inline açamadı.\",\n  \"viewer.too_large\": \"Dosya çok büyük (>1 MB).\",\n  \"viewer.csv_rows\": \"{n} satır\",\n  \"viewer.csv_rows_one\": \"{n} satır\",\n  \"presence.others\": \"{n} kişi\",\n  \"presence.others_one\": \"{n} kişi\",\n  \"conn.offline\": \"Canlı bağlantı yok — değişiklikler gecikebilir\",\n  \"conn.tooltip\": \"Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.\",\n  /* === bul:s3 === */\n  \"palette.everywhere\": \"Her yerde\",\n  \"palette.searching\": \"Aranıyor…\",\n  \"palette.saved\": \"Kayıtlı aramalar\",\n  \"palette.save\": \"Aramayı kaydet\",\n  \"palette.saved.delete\": \"Kayıtlı aramayı sil\",\n  \"search.in_content\": \"İçerikte\",\n  /* === bag:b4 === */\n  \"toolbar.more\": \"Diğer işlemler\",\n  \"toolbar.search.close\": \"Aramayı kapat\",\n  \"sheet.menu\": \"İşlemler\",\n  \"sheet.close\": \"Kapat\",\n  /* === koru:k1 === */\n  \"toolbar.inspector\": \"Ayrıntılar\",\n  \"ctx.details\": \"Ayrıntılar\",\n  /* yildiz:s1 — yıldızlamak bir eylem, menüde de öyle görünür. */\n  \"ctx.star\": \"Yıldızla\",\n  \"ctx.unstar\": \"Yıldızı kaldır\",\n  \"star.failed\": \"Yıldız değiştirilemedi\",\n  \"shortcuts.inspector\": \"Ayrıntılar panelini aç/kapat\",\n  \"inspector.title\": \"Ayrıntılar\",\n  \"inspector.copy_name\": \"Adı kopyala\",\n  \"inspector.items\": \"{n} öğe\",\n  \"inspector.items_one\": \"{n} öğe\",\n  \"inspector.type\": \"Tür\",\n  \"inspector.select_hint\": \"Ayrıntılarını görmek için bir öğe seçin.\",\n  /* pane:p1 — panel SON seçilen şeyi tutar (Burak'ın kararı, 2026-09-13);\n     dolayısıyla bölünmüş pencerenin bakılmayan yarısındaki bir öğeyi\n     anlatıyor olabilir. Bu satır hangisi olduğunu ve nerede durduğunu söyler. */\n  \"inspector.held\": \"Son seçilen — {where} içinde\",\n  \"inspector.close\": \"Kapat\",\n  \"inspector.section.general\": \"Genel\",\n  \"inspector.section.tags\": \"Etiketler\",\n  /* etiket:t1 — TagPicker'ın kendi çerçevesi. 2026-09-13'e kadar bu üçü\n     katalogdan bağımsız olarak İngilizce basılıyordu; `tags.open` ise çipin\n     yeni \"bu etiketi taşıyan her şeyi göster\" kapısı. */\n  \"tags.open\": \"Etiketi aç: {tag}\",\n  \"tags.add\": \"+ Etiket ekle\",\n  \"tags.name\": \"Etiket adı\",\n  \"tags.remove\": \"Etiketi kaldır\",\n  \"inspector.section.versions\": \"Sürümler\",\n  \"inspector.section.permissions\": \"İzinler\",\n  \"inspector.section.shares\": \"Paylaşımlar\",\n  \"inspector.path\": \"Yol\",\n  \"inspector.size\": \"Boyut\",\n  \"inspector.modified\": \"Değiştirilme\",\n  \"inspector.mime\": \"MIME türü\",\n  \"inspector.etag\": \"ETag\",\n  \"inspector.nodeId\": \"Düğüm kimliği\",\n  \"inspector.copy\": \"Kopyala\",\n  \"inspector.copied\": \"Kopyalandı\",\n  \"inspector.error\": \"Yüklenemedi\",\n  \"inspector.items_summary\": \"{n} öğe, toplam {size}\",\n  \"inspector.items_summary_one\": \"{n} öğe, toplam {size}\",\n  \"inspector.folder_items\": \"{n} öğe\",\n  \"inspector.folder_items_one\": \"{n} öğe\",\n  \"inspector.versions.empty\": \"Sürüm geçmişi yok\",\n  \"inspector.versions.v\": \"Sürüm {n}\",\n  \"inspector.versions.restore\": \"Geri yükle\",\n  \"inspector.versions.restore_confirm\": \"Bu sürüm geri yüklensin mi?\",\n  \"inspector.versions.snapshot_current\": \"Önce şimdiki halin sürümünü al\",\n  \"inspector.versions.confirm\": \"Onayla\",\n  \"inspector.versions.cancel\": \"Vazgeç\",\n  \"inspector.versions.take_snapshot\": \"Şimdiki halin sürümünü al\",\n  \"inspector.versions.restored\": \"Sürüm geri yüklendi\",\n  \"inspector.versions.snapshotted\": \"Sürüm alındı\",\n  \"inspector.versions.unsupported\": \"Sunucu bu işlemi desteklemiyor\",\n  \"inspector.perm.none\": \"Erişim yok\",\n  \"inspector.perm.viewer\": \"Görüntüleyen\",\n  \"inspector.perm.editor\": \"Düzenleyen\",\n  \"inspector.perm.owner\": \"Sahip\",\n  \"inspector.perm.manage\": \"İzinleri yönet\",\n  \"inspector.shares.empty\": \"Paylaşım linki yok\",\n  \"inspector.shares.copy\": \"Linki kopyala\",\n  /* wiring:c1 — tema galerisi */\n  \"theme.menu\": \"Tema\",\n  \"theme.title\": \"Tema Galerisi\",\n  \"theme.hint\": \"Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.\",\n  \"theme.mode.label\": \"Görünüm\",\n  \"theme.mode.light\": \"Gündüz\",\n  \"theme.mode.dark\": \"Gece\",\n  \"theme.mode.auto\": \"Otomatik\",\n  \"theme.reset\": \"Varsayılana dön\",\n  \"theme.close\": \"Kapat\",\n  \"theme.selected\": \"Seçili\",\n  \"theme.name.default\": \"Varsayılan\",\n  \"theme.name.night\": \"Gece Mavisi\",\n  \"theme.name.forest\": \"Orman\",\n  \"theme.name.amber\": \"Kehribar\",\n  \"theme.name.lilac\": \"Leylak\",\n  \"theme.name.contrast\": \"Yüksek Kontrast\",\n  \"theme.name.gray\": \"Yumuşak Gri\",\n  \"theme.name.terminal\": \"Terminal Yeşili\",\n  /* === zaman:z3 — saat dilimi seçici (gömme penceresi + web ayarları) === */\n  \"tz.menu\": \"Saat dilimi\",\n  \"tz.title\": \"Saat dilimi\",\n  \"tz.label\": \"Tarihleri şu saatle göster\",\n  \"tz.search\": \"Şehir, ülke ya da saat farkı arayın — “İstanbul” veya “GMT+3” deneyin\",\n  \"tz.default.device\": \"Bu cihazın saat dilimini kullan ({zone})\",\n  \"tz.default.account\": \"Hesabın saat dilimini kullan ({zone})\",\n  \"tz.default.host\": \"Bu sitenin varsayılanını kullan ({zone})\",\n  \"tz.no_match\": \"“{query}” ile eşleşen saat dilimi yok. Bir şehir, bir ülke ya da GMT+3 gibi bir fark deneyin.\",\n  \"tz.more\": \"{n} kayıt daha var — listeyi daraltmak için yazmayı sürdürün.\",\n  \"tz.hint\": \"Yalnızca bu tarayıcıda saklanır. Her tarih tek bir an olarak saklanır ve burada seçtiğiniz saatle gösterilir.\",\n  \"tz.now\": \"{zone} bölgesinde şu an: {time}\",\n  /* === wiring:c2 — özelleştirilebilir kısayollar + hızlı bakış === */\n  \"shortcuts.quicklook\": \"Hızlı bakış\",\n  \"shortcuts.customize\": \"Özelleştir\",\n  \"shortcuts.settings.menu\": \"Kısayollar\",\n  \"shortcuts.settings.title\": \"Kısayol Ayarları\",\n  \"shortcuts.settings.hint\": 'Bir kısayolu değiştirmek için \"Değiştir\"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',\n  \"shortcuts.settings.change\": \"Değiştir\",\n  \"shortcuts.settings.capture\": \"Tuşlara basın… (Esc iptal)\",\n  \"shortcuts.settings.reset\": \"Varsayılana dön\",\n  \"shortcuts.settings.reset_all\": \"Tümünü sıfırla\",\n  \"shortcuts.settings.unbound\": \"Atanmadı\",\n  \"shortcuts.settings.fixed\": \"Sabit\",\n  \"shortcuts.settings.customized\": \"Özelleştirildi\",\n  \"shortcuts.settings.conflict\": 'kombinasyonu \"{name}\" kısayolunda kullanılıyor.',\n  \"shortcuts.settings.conflict_fixed\": 'kombinasyonu \"{name}\" sabit kısayoluna ayrılmış — kullanılamaz.',\n  \"shortcuts.settings.conflict_take\": \"Eskisini boşa çıkar ve ata\",\n  \"shortcuts.settings.conflict_cancel\": \"Vazgeç\",\n  \"quicklook.hint_close\": \"kapat\",\n  \"quicklook.hint_nav\": \"önceki/sonraki\",\n  \"quicklook.hint_open\": \"aç\",\n  /* === /wiring:c2 === */\n  /* === wiring:c3 — işlem merkezi === */\n  \"opc.title\": \"İşlemler\",\n  \"opc.aria_badge\": \"{n} işlem — işlem merkezini aç/kapat\",\n  \"opc.aria_badge_one\": \"{n} işlem — işlem merkezini aç/kapat\",\n  \"opc.close\": \"Kapat\",\n  \"opc.active\": \"Sürüyor\",\n  \"opc.history\": \"Geçmiş\",\n  \"opc.clear\": \"Temizle\",\n  \"opc.empty\": \"İşlem yok\",\n  \"opc.cancel\": \"İptal\",\n  \"opc.retry\": \"Yeniden dene\",\n  \"opc.dismiss\": \"Kapat\",\n  \"opc.queued\": \"Sırada\",\n  \"opc.percent\": \"%{n}\",\n  \"opc.status.running\": \"Sürüyor\",\n  \"opc.status.done\": \"Bitti\",\n  \"opc.status.error\": \"Hata\",\n  \"opc.status.aborted\": \"İptal edildi\",\n  \"opc.kind.upload\": \"Yükleme\",\n  \"opc.kind.copy\": \"Kopyalama\",\n  \"opc.kind.move\": \"Taşıma\",\n  \"opc.kind.delete\": \"Silme\",\n  \"opc.kind.convert\": \"Dönüştürme\",\n  \"opc.kind.archive\": \"Arşiv\",\n  /* === wiring:c4 — onboarding turu + erişilebilirlik + hata kartı === */\n  \"tour.aria\": \"Tanıtım turu\",\n  \"tour.restart\": \"Turu tekrar başlat\",\n  \"tour.skip\": \"Turu atla\",\n  \"tour.back\": \"Geri\",\n  \"tour.next\": \"İleri\",\n  \"tour.done\": \"Bitti\",\n  \"tour.progress\": \"{n} / {m}\",\n  \"tour.step.nav.title\": \"Depolar ve görünümler\",\n  \"tour.step.nav.desc\": \"Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu hep bu panelde durur; altında da depoların ve bağlantıların. Sol üst köşedeki düğme paneli ince bir şeride indirir ve geri açar.\",\n  \"tour.step.nav.desc_closed\": \"Bu düğme gezinti panelini açar: Ana sayfa, Benimle paylaşılanlar, Son kullanılanlar, Yıldızlılar ve Çöp Kutusu; altında da depoların ve bağlantıların.\",\n  \"tour.step.new.title\": \"Yeni bir şey ekle\",\n  \"tour.step.new.desc\": \"Yeni olan her şey buradan başlar: bu cihazdan dosya yükleyebilir, klasör oluşturabilir ya da birinden dosya isteyebilirsin. Dosyaları pencereye sürükleyip bırakmak da yükler.\",\n  \"tour.step.new.desc_fab\": \"Bu düğme bu cihazdan dosya yükler. Dosyaları pencereye sürükleyip bırakmak da çalışır.\",\n  \"tour.step.search.title\": \"Arama\",\n  \"tour.step.search.desc\": 'Bu alan deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani \"fatura 2026\" yazdığında fatura_2026.pdf gelir. tag:fatura yazarak etikete göre süzebilirsin. Yanındaki sürgü düğmesi gelişmiş aramayı, {palette} ise komut paletini açar; palet komut da çalıştırır.',\n  \"tour.step.crumb.title\": \"Bulunduğun yer\",\n  \"tour.step.crumb.desc\": \"Bu iz, ekrandaki klasörün adresidir. Adımlardan birine tıklayarak üste çıkabilir, sonuncusunun yanındaki oktan içindeki klasörleri görebilirsin.\",\n  \"tour.step.filters.title\": \"Listeyi daralt\",\n  \"tour.step.filters.desc\": \"Tür, Kişiler, Değiştirilme ve Boyut bulunduğun klasörü süzer; yanındaki kutu yazdıkça adlara göre eşleşir, satırın sonundaki denetim ise sıralar.\",\n  \"tour.step.view.title\": \"Görünümü değiştir\",\n  \"tour.step.view.desc\": \"Bu klasörün nasıl çizildiğini değiştirir; seçimin hatırlanır.\",\n  \"tour.step.details.title\": \"Ayrıntılar ve paylaşım\",\n  \"tour.step.details.desc\": 'Bir dosyayı seçip bu paneli açtığında ayrıntılarını, hareketlerini ve paylaşım bağlantılarını görürsün. Tam menü için dosyaya sağ tıkla ya da satırının sonundaki düğmeyi kullan: oradaki \"Paylaş / İzinler\" ile PIN ve son kullanma süresi verilebilen bir bağlantı oluşturulur.',\n  \"tour.step.help.title\": \"Kısayollar\",\n  \"tour.step.help.desc\": '{help} tuşu kısayol kartını, {palette} komut paletini açar. Tema ve \"Turu tekrar başlat\" sağ üstteki \"Diğer işlemler\" menüsünde; hesabın ve çıkış ise yanındaki avatarın arkasında.',\n  \"error.hint\": \"Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.\",\n  \"error.details\": \"Teknik ayrıntılar\",\n  \"col.star\": \"Yıldız\",\n  \"toolbar.view_label\": \"Görünüm\",\n  \"list.aria\": \"Dosya listesi\",\n  \"grid.aria\": \"Dosya ızgarası\",\n  /* === wiring:d1 — sekmeler + split panel === */\n  \"tabs.strip\": \"Sekmeler\",\n  \"tabs.new\": \"Yeni sekme\",\n  \"tabs.close\": \"Sekmeyi kapat\",\n  \"tabs.split\": \"Görünümü böl\",\n  \"tabs.split_off\": \"Bölmeyi kapat\",\n  \"ctx.open_new_tab\": \"Yeni sekmede aç\",\n  \"shortcuts.group.tabs\": \"Sekmeler\",\n  \"shortcuts.tab_new\": \"Yeni sekme\",\n  \"shortcuts.tab_close\": \"Sekmeyi kapat\",\n  \"shortcuts.tab_next\": \"Sonraki sekme\",\n  \"shortcuts.tab_prev\": \"Önceki sekme\",\n  /* tus:t1 — menü fiilleri */\n  \"shortcuts.new_folder\": \"Yeni klasör\",\n  \"shortcuts.upload\": \"Dosya yükle\",\n  \"shortcuts.refresh\": \"Listeyi yenile\",\n  \"shortcuts.download\": \"İndir\",\n  \"shortcuts.preview\": \"Önizle\",\n  \"shortcuts.share\": \"Paylaş / izinler\",\n  \"shortcuts.tags\": \"Etiketler\",\n  \"shortcuts.convert\": \"Dönüştür\",\n  \"shortcuts.open_tab\": \"Yeni sekmede aç\",\n  \"shortcuts.copy_path\": \"Yolu kopyala\",\n  \"shortcuts.copy_id\": \"Kimliği kopyala\",\n  \"shortcuts.restore\": \"Çöp kutusundan geri al\",\n  \"shortcuts.settings.reserved\": \"tarayıcı tarafından sayfaya ulaşmadan yakalanıyor, burada hiçbir şey yapmaz. Başka bir tuş seçin.\",\n  \"shortcuts.settings.reserved_badge\": \"Yalnız masaüstü uygulamasında\",\n  \"shortcuts.settings.reserved_title\": \"Bu kombinasyonu tarayıcının kendisi işliyor. Masaüstü uygulamasında ve kurulu PWA’da çalışır, tarayıcı sekmesinde çalışmaz.\",\n  \"cmd.tab_new\": \"Yeni sekme aç\",\n  \"cmd.split_toggle\": \"Görünümü böl / birleştir\",\n  \"split.pane\": \"İkincil panel\",\n  \"split.close\": \"Yan paneli kapat\",\n  \"split.error\": \"Liste yüklenemedi\",\n  \"split.retry\": \"Yeniden dene\",\n  \"split.copy_queued\": \"Kopyalama kuyruğa alındı\",\n  \"split.move_queued\": \"Taşıma kuyruğa alındı\",\n  \"toast.move_kept_both\": \"Taşıma kuyruğa alındı. Hedefte aynı adla bir öğe vardı, taşınan öğe onun yanına “-copy” ekiyle konacak. Bu taşıma geri alınamaz.\",\n  \"split.cross_copy\": \"Depolar farklı — kopyalama kuyruğa alındı\",\n  \"dragout.downloading\": \"Bırakılan klasöre indiriliyor…\",\n  \"dragout.not_found\": \"Bırakılan yer bulunamadı — dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz\",\n  \"dragout.done\": \"İndirme tamamlandı\",\n  \"dragout.ready\": \"Dosyalar hazır — masaüstüne sürükleyebilirsin\",\n  \"dragout.preparing\": \"Sürükleme için hazırlanıyor…\",\n  \"split.cross_move\": \"Depolar farklı — taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)\",\n  /* === /wiring:d1 === */\n  /* wiring:d2 — galeri görünümü */\n  \"toolbar.view.gallery\": \"Galeri\",\n  \"gallery.aria\": \"Dosya galerisi\",\n  /* /wiring:d2 */\n  /* wiring:d3 — Yorumlar (inspector node comments) */\n  \"inspector.section.comments\": \"Yorumlar\",\n  \"inspector.comments.empty\": \"Henüz yorum yok.\",\n  \"inspector.comments.placeholder\": \"Yorum yaz…\",\n  \"inspector.comments.send\": \"Gönder\",\n  \"inspector.comments.delete\": \"Yorumu sil\",\n  /* wiring:e2 — uçtan uca şifreli klasörler */\n  \"e2e.create.title\": \"Şifreli klasör oluştur\",\n  \"e2e.create.option\": \"Şifreli klasör oluştur…\",\n  \"e2e.create.pw_label\": \"Klasör parolası\",\n  \"e2e.create.pw_placeholder\": \"En az 8 karakter\",\n  \"e2e.create.pw2_label\": \"Parolayı tekrar girin\",\n  \"e2e.create.warn_title\": \"GERİ DÖNÜŞÜ YOK\",\n  \"e2e.create.warn_body\": \"Bu klasördeki dosyalar yalnız bu parolayla ya da klasör oluşturulurken bir kez gösterilen kurtarma anahtarıyla açılır. Parola sunucuda TUTULMAZ; kurtarma anahtarının da filex'te kopyası kalmaz. İkisini de kaybederseniz içerik sonsuza dek gider.\",\n  \"e2e.create.ack\": \"Anladım: parolayı da kurtarma anahtarını da kaybedersem verilerim kurtarılamaz.\",\n  \"e2e.create.ack_required\": \"Devam etmek için uyarıyı onaylayın.\",\n  \"e2e.create.pw_short\": \"Parola en az 8 karakter olmalı.\",\n  \"e2e.create.pw_mismatch\": \"Parolalar birbirini tutmuyor.\",\n  \"e2e.create.bad_name\": \"Geçersiz klasör adı.\",\n  \"e2e.create.create\": \"Şifreli klasörü oluştur\",\n  \"e2e.create.busy\": \"Oluşturuluyor…\",\n  \"e2e.create.done\": \"Şifreli klasör oluşturuldu\",\n  \"e2e.create.failed\": \"Şifreli klasör oluşturulamadı\",\n  \"e2e.create.nested\": \"Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.\",\n  \"e2e.locked.title\": \"Bu klasör uçtan uca şifreli\",\n  \"e2e.locked.hint\": \"İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.\",\n  \"e2e.locked.pw_placeholder\": \"Klasör parolası\",\n  \"e2e.locked.unlock\": \"Kilidi aç\",\n  \"e2e.locked.busy\": \"Doğrulanıyor…\",\n  \"e2e.unlock.wrong\": \"Parola yanlış.\",\n  \"e2e.unlock.marker_missing\": \"Şifre dosyası (.filex-e2e.json) okunamadı.\",\n  /* ikon:emoji — listedeki işaretin erişilebilir adı. Satır eskiden yalnız\n     bir 🔒 basıyordu; onun yerini alan asma kilit kutunun içinde\n     aria-hidden, dolayısıyla adı taşıyan yer bu. */\n  \"e2e.badge\": \"Şifreli klasör\",\n  \"e2e.strip.label\": \"Şifreli klasör — kilit açık\",\n  \"e2e.strip.lock\": \"Kilitle\",\n  \"e2e.locked_toast\": \"Klasör kilitlendi\",\n  \"e2e.upload.too_big\": \"200 MB üstü dosyalar şifreli klasöre yüklenemez (MVP sınırı)\",\n  \"e2e.upload.locked\": \"Önce klasörün kilidini açın\",\n  \"e2e.decrypting\": \"Çözülüyor…\",\n  \"e2e.decrypt_failed\": \"Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).\",\n  /* wiring:e2 recovery — kurtarma anahtarı + yönetici escrow'u */\n  \"e2e.create.escrow_title\": \"Bu sunucunun da bir anahtarı var\",\n  \"e2e.create.escrow_body\": \"Bu kurulumda anahtar emaneti (escrow) açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir. Escrow sunucu kurulurken sabitlenir; bir klasör için kapatılamaz.\",\n  \"e2e.locked.use_recovery\": \"Parolayı mı kaybettiniz? Kurtarma anahtarı kullanın\",\n  \"e2e.recovery.title\": \"Kurtarma anahtarınızı saklayın\",\n  \"e2e.recovery.title_upgraded\": \"Kurtarma anahtarınız\",\n  \"e2e.recovery.lead\": \"Bu anahtar klasörü parolasız açar. Yalnız bir kez gösterilir — filex bu anahtarı saklamaz ve bir daha gösteremez.\",\n  \"e2e.recovery.lead_upgraded\": \"Bu klasörün artık bir kurtarma anahtarı var. Klasörü parolasız açar, yalnız bir kez gösterilir ve filex'te kopyası kalmaz.\",\n  \"e2e.recovery.copy\": \"Kopyala\",\n  \"e2e.recovery.copied\": \"Kopyalandı\",\n  \"e2e.recovery.download\": \"Dosya olarak indir\",\n  \"e2e.recovery.warn_title\": \"BUNU PAROLA GİBİ SAKLAYIN\",\n  \"e2e.recovery.warn_body\": \"Bu anahtarı eline geçiren herkes klasörü okuyabilir. Parolanızdan ayrı bir yerde tutun — parolanın yanında duran bir anahtar sizi unutmaya karşı korur, başkasına karşı değil.\",\n  \"e2e.recovery.escrow_title\": \"Bu sunucunun da bir anahtarı var\",\n  \"e2e.recovery.escrow_body\": \"Bu kurulumda anahtar emaneti açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir.\",\n  \"e2e.recovery.escrow_kid\": \"Emanet anahtarı\",\n  \"e2e.recovery.ack\": \"Bu anahtarı güvenli bir yere kaydettim.\",\n  \"e2e.recovery.done\": \"Tamam\",\n  \"e2e.recover.title\": \"Parolasız kilit açma\",\n  \"e2e.recover.none\": \"Bu klasör kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden anahtarı yok. Tek giriş yolu parolası. Bir kez parolayla açın, filex kurtarma anahtarı eklemeyi önerecek.\",\n  \"e2e.recover.tab_recovery\": \"Kurtarma anahtarı\",\n  \"e2e.recover.tab_escrow\": \"Emanet anahtarı\",\n  \"e2e.recover.recovery_hint\": \"Klasör oluşturulurken bir kez gösterilen anahtar.\",\n  \"e2e.recover.recovery_placeholder\": \"XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX\",\n  \"e2e.recover.escrow_warn_title\": \"Klasörün sahibine haber gidecek\",\n  \"e2e.recover.escrow_warn_body\": \"Emanet anahtarıyla açılan klasörün sahibine bildirim gönderilir. Yalnız yetkiniz olduğunda kullanın.\",\n  \"e2e.recover.escrow_kid\": \"Emanet anahtarı\",\n  \"e2e.recover.escrow_predates\": \"Bu kurulumun emanet anahtarı var ama bu klasörün yok. Klasör, emanet burada açılmadan önce oluşturulmuş; ana anahtarı emanet kimliğine hiç sarmalanmadı. Emanet anahtarı bu klasörü açmaz. İşletmecinin yapabileceği hiçbir şey bunu değiştirmez — sarmalama için klasörün parolası gerekir ve sunucu onu hiçbir zaman görmedi. Klasörün sahibi verebilir: parolayla kilidi açıp işletmeciye anahtar vermeyi seçebilir. O yapılana kadar parolayı ya da kurtarma anahtarını kullanın.\",\n  \"e2e.recover.escrow_other_key\": \"Bu klasör BAŞKA bir kurulumun emanet anahtarını taşıyor. Başka yerde oluşturulup buraya geri yüklenmiş, bu yüzden bu kurulumun emanet anahtarı onu açmaz. Yalnızca sarmalandığı emanet anahtarının özel yarısı açabilir.\",\n  \"e2e.recover.escrow_placeholder\": \"Emanet özel anahtarını yapıştırın (PKCS#8, base64 ya da PEM)\",\n  \"e2e.recover.bad_format\": \"Bu bir kurtarma anahtarına benzemiyor. Dörtlü sekiz grup, toplam 32 karakter olmalı.\",\n  \"e2e.recover.escrow_required\": \"Emanet özel anahtarını yapıştırın.\",\n  \"e2e.recover.wrong_recovery\": \"Bu kurtarma anahtarı bu klasörü açmıyor.\",\n  \"e2e.recover.wrong_escrow\": \"Bu emanet anahtarı bu klasörü açmıyor. Escrow açılmadan önce oluşturulmuş klasörlerin emanet anahtarı yoktur ve sonradan da eklenemez.\",\n  \"e2e.recover.bad_escrow_key\": \"Bu okunabilir bir özel anahtar değil (PKCS#8, base64 ya da PEM bekleniyor).\",\n  \"e2e.recover.notify_failed\": \"Klasör sahibine bildirim gönderilemedi, bu yüzden kilit açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.\",\n  \"e2e.recover.recovery_done\": \"Kurtarma anahtarıyla açıldı\",\n  \"e2e.recover.escrow_done\": \"Emanet anahtarıyla açıldı — klasör sahibine bildirildi\",\n  \"e2e.recover.unlock\": \"Kilidi aç\",\n  \"e2e.recover.busy\": \"Açılıyor…\",\n  \"e2e.escrowoffer.title\": \"İşletmeciye bu klasörün anahtarı verilsin mi?\",\n  \"e2e.escrowoffer.body\": \"Bu klasör, burada anahtar emaneti açılmadan önce oluşturulmuş; bu yüzden kurulumun işletmecisi onu açamıyor. Şu anda — parolanız bellekteyken — filex bu klasörü emanet anahtarına sarmalayabilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz; yalnızca anahtar dosyası değişir.\",\n  \"e2e.escrowoffer.consequence\": \"Bunun anlamı: işletmeci, parolanız olmadan bu klasöre giren ikinci ve kalıcı bir yol kazanır. O anahtar kullanıldığında size bildirim gelir, ama bu bildirim bir denetim değil yalnızca bir duyurudur.\",\n  \"e2e.escrowoffer.learn_more\": \"Emanet anahtarı neyi yapar, neyi yapamaz\",\n  \"e2e.escrowoffer.password_label\": \"Klasör parolası\",\n  \"e2e.escrowoffer.password_required\": \"Klasör parolasını girin.\",\n  \"e2e.escrowoffer.wrong_password\": \"Bu, bu klasörün parolası değil.\",\n  \"e2e.escrowoffer.accept\": \"İşletmeciye anahtar ver\",\n  \"e2e.escrowoffer.decline\": \"Hayır, bende kalsın\",\n  \"e2e.escrowoffer.cancel\": \"Vazgeç\",\n  \"e2e.escrowoffer.busy\": \"Sarmalanıyor…\",\n  \"e2e.escrowoffer.done\": \"İşletmeci artık bu klasörü emanet anahtarıyla açabilir\",\n  \"e2e.escrowoffer.declined_toast\": \"Sizde kaldı. filex bu klasör için bir daha sormayacak.\",\n  \"e2e.escrowoffer.decline_failed\": \"Cevabınız kaydedilemedi, bu yüzden filex bir dahakine yine soracak. Klasörde hiçbir şey değişmedi.\",\n  \"e2e.escrowoffer.failed\": \"İşletmeciye bu klasörün anahtarı verilemedi\",\n  \"e2e.escrowoffer.strip_action\": \"Emanet anahtarı…\",\n  \"e2e.upgrade.title\": \"Bu klasörün kurtarma anahtarı yok\",\n  \"e2e.upgrade.body\": \"Kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden tek giriş yolu parolası. Şu anda — ve yalnız şu anda, parola bellekteyken — filex bir tane ekleyebilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz.\",\n  \"e2e.upgrade.escrow_note\": \"Not: bu kurulumda anahtar emaneti açık; kurtarma anahtarı eklemek aynı zamanda işletmecinin bu klasörü parolanız olmadan açabilmesi demektir.\",\n  \"e2e.upgrade.accept\": \"Kurtarma anahtarı oluştur\",\n  \"e2e.upgrade.decline\": \"Şimdi değil\",\n  \"e2e.upgrade.busy\": \"Oluşturuluyor…\",\n  \"e2e.upgrade.failed\": \"Bu klasöre kurtarma anahtarı eklenemedi\",\n  \"e2e.download.failed\": \"Şifreli dosya indirilemedi.\",\n  /* /wiring:e2 */\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  \"conn.title\": \"Depo bağlantıları\",\n  \"conn.subtitle\": \"{host} sunucusunu bir arka uca bağlayın ya da kendi bilgisayarınızı {host} sunucusuna bağlayın.\",\n  \"conn.close\": \"Kapat\",\n  \"conn.tab.storages\": \"Depolar\",\n  \"conn.tab.connect\": \"Nasıl bağlanılır\",\n  \"conn.loading\": \"Yükleniyor…\",\n  \"conn.visibleOnly\": \"bu depoya göz atabilirsiniz\",\n  \"conn.denied.title\": \"Buraya depo ekleyebilen tek kişi yöneticidir\",\n  \"conn.denied.none\": \"Hesabınız dosyalara göz atabilir ama bu sunucunun nereye bağlı olduğunu değiştiremez. Depo eklemek ya da düzenlemek için sunucunun yöneticisine başvurun.\",\n  \"conn.denied.anonymous\": \"Bu sunucuda oturum açmış değilsiniz.\",\n  \"conn.denied.unreachable\": \"Sunucu yanıt vermedi: {error}\",\n  \"conn.denied.guideHint\": \"Zaten görebildiğiniz depolara kendi bilgisayarınızdan bağlanmak için yönetici yetkisi gerekmez.\",\n  \"conn.denied.guideCta\": \"Nasıl bağlanacağımı göster\",\n  \"conn.list.count\": \"{n} depo\",\n  \"conn.list.count_one\": \"{n} depo\",\n  \"conn.list.add\": \"Depo ekle\",\n  \"conn.list.empty\": \"Henüz yapılandırılmış depo yok. Bir tane ekleyin, dosyalar dosya yöneticisinde görünsün.\",\n  \"conn.list.edit\": \"Düzenle\",\n  \"conn.list.remove\": \"Kaldır\",\n  \"conn.list.confirm\": \"Gerçekten kaldırılsın mı?\",\n  \"conn.list.readOnly\": \"salt okunur\",\n  \"conn.list.disabled\": \"kapalı\",\n  \"conn.form.newTitle\": \"Yeni depo\",\n  \"conn.form.editTitle\": \"“{name}” düzenleniyor\",\n  \"conn.form.name\": \"Görünen isim\",\n  \"conn.form.namePlaceholder\": \"fotograflar\",\n  \"conn.form.nameHelp\": \"Bu deponun her yerdeki adı: dosya yöneticisinde, yollarda (isim://klasor) ve WebDAV adreslerinde.\",\n  \"conn.form.driver\": \"Tür\",\n  \"conn.form.driverLocked\": \"Bir deponun türü oluşturulduktan sonra değiştirilemez — yollar zaten ona işaret ediyor.\",\n  \"conn.form.readOnly\": \"Salt okunur (bu depoya hiçbir şey yazılamaz)\",\n  \"conn.form.enabled\": \"Etkin\",\n  \"conn.form.test\": \"Bağlantıyı sına\",\n  \"conn.form.testing\": \"Sınanıyor…\",\n  \"conn.form.testOk\": \"Bağlandı. Kökte {count} öğe var.\",\n  \"conn.form.testOk_one\": \"Bağlandı. Kökte {count} öğe var.\",\n  \"conn.form.testFail\": \"Bağlanılamadı: {error}\",\n  \"conn.form.save\": \"Kaydet\",\n  \"conn.form.saving\": \"Kaydediliyor…\",\n  \"conn.form.cancel\": \"Vazgeç\",\n  \"conn.form.nameRequired\": \"Depoya bir isim verin.\",\n  \"conn.form.fillRequired\": \"* ile işaretli alanları doldurun.\",\n  \"conn.form.required\": \"Zorunlu\",\n  \"conn.form.advanced\": \"Gelişmiş ayarlar\",\n  \"conn.form.noFields\": \"Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.\",\n  \"conn.form.reveal\": \"Göster\",\n  \"conn.form.hide\": \"Gizle\",\n  \"conn.guide.protocol\": \"Protokol\",\n  \"conn.guide.storage\": \"Depo\",\n  \"conn.guide.allStorages\": \"Tüm depolar\",\n  \"conn.guide.copy\": \"Kopyala\",\n  \"conn.guide.copied\": \"Kopyalandı\",\n  \"conn.guide.goodToKnow\": \"Bilmekte fayda var\",\n  \"conn.guide.userPlaceholder\": \"eposta@ornek.com\",\n  \"conn.guide.secretPlaceholder\": \"parolaniz-ya-da-token\",\n  \"conn.guide.fact.url\": \"Adres\",\n  \"conn.guide.fact.urlRootHint\": \"Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.\",\n  \"conn.guide.fact.urlStorageHint\": \"Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.\",\n  \"conn.guide.fact.user\": \"Kullanıcı adı\",\n  \"conn.guide.fact.password\": \"Parola\",\n  \"conn.guide.webdav.summary\": \"WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.\",\n  \"conn.guide.webdav.userHint\": \"filex hesabınızın e-posta adresi — görünen adınız değil.\",\n  \"conn.guide.webdav.passwordHint\": \"Hesap parolanız ya da bir API token (Ayarlar → API token). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak token kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.\",\n  \"conn.guide.webdav.win.s1\": \"Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.\",\n  \"conn.guide.webdav.win.s2\": \"Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.\",\n  \"conn.guide.webdav.win.s3\": \"“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.\",\n  \"conn.guide.webdav.win.cmdCaption\": \"Komut İstemi (sihirbaz olmadan aynı iş)\",\n  \"conn.guide.webdav.win.limits\": \"Windows’un tam olarak filex hatası gibi görünen üç yerleşik sınırı vardır: aktarımlar ~47,7 MB’ta durur, yaklaşık bin dosyalı klasörler açılmaz (“Disk biçimlendirilmemiş”) ve her iki ayarı değiştirdikten sonra WebClient hizmeti yeniden başlatılmalıdır.\",\n  \"conn.guide.webdav.win.regCaption\": \"Yönetici olarak çalıştırın, sonra sürücüyü yeniden bağlayın\",\n  \"conn.guide.webdav.win.https\": \"HTTPS zorunludur. Windows Basic kimlik bilgilerini yalnızca TLS üzerinden gönderir; düz http:// üzerinde hiçbir açıklama vermeden reddeder. BasicAuthLevel değerini 2 yapmayın — TLS kullanın.\",\n  \"conn.guide.webdav.win.persist\": \"Bağlanan sürücü oturum kapatmayı atlatamaz: Windows 7’den beri Basic kimlik bilgileri Kimlik Bilgisi Yöneticisi’nde saklanamaz ve /persistent:yes bunu değiştirmez. Kendiliğinden geri gelsin istiyorsanız komutu bir oturum açma betiğinden yeniden çalıştırın.\",\n  \"conn.guide.webdav.win.service\": \"Hiç bağlanamıyorsa WebClient hizmetinin çalıştığından emin olun: sc config WebClient start= auto && net start WebClient.\",\n  \"conn.guide.webdav.mac.s1\": \"Finder’da Git → Sunucuya Bağlan… (⌘K) yolunu izleyin.\",\n  \"conn.guide.webdav.mac.s2\": \"{url} adresini girip bağlanın.\",\n  \"conn.guide.webdav.mac.s3\": \"Yukarıdaki kullanıcı adı ve parolayla kimliğinizi doğrulayın.\",\n  \"conn.guide.webdav.mac.note\": \"Sürücü Konumlar altında görünür; her depo en üst düzeyde bir klasördür.\",\n  \"conn.guide.webdav.linux.mountCaption\": \"davfs2 ya da masaüstü dosya yöneticisi (GNOME Dosyalar, Dolphin)\",\n  \"conn.guide.webdav.linux.gvfsComment\": \"ya da bu adresi GNOME Dosyalar / Dolphin icine yapistirin\",\n  \"conn.guide.webdav.linux.locks\": \"davfs2 için kilitler kapatılmalıdır. filex WebDAV kilitlerini süreç belleğinde tutar; yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar — davfs2 tersini varsayar ve takılır.\",\n  \"conn.guide.webdav.rclone.obscureCaption\": \"rclone parolayı gizlenmiş biçimde saklar — önce bunu çalıştırıp çıktısını aşağıya yapıştırın\",\n  \"conn.guide.webdav.rclone.passPlaceholder\": \"<rclone obscure çıktısı>\",\n  \"conn.guide.webdav.rclone.useCaption\": \"Kullanımı\",\n  \"conn.guide.webdav.duck.s1\": \"Yeni Yer İmi → WebDAV (HTTPS).\",\n  \"conn.guide.webdav.duck.s2\": \"Sunucu {host}, port 443.\",\n  \"conn.guide.webdav.duck.s3\": \"Yol {path}.\",\n  \"conn.guide.webdav.duck.s4\": \"Kullanıcı adı {user}, parola yukarıdaki gibi.\",\n  \"conn.guide.webdav.note.delete\": \"WebDAV üzerinden silme kalıcıdır. Web arayüzü dosyaları filex çöp kutusuna taşır; istemciden silme ise nesneyi doğrudan arka uçtan kaldırır.\",\n  \"conn.guide.webdav.note.locks\": \"Kilitler sunucu belleğinde durur: yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar. Windows ile Office’i memnun etmek için varlar, eşzamanlı düzenlemeyi hakemlemek için değil.\",\n  \"conn.guide.webdav.note.permissions\": \"Web arayüzünde ne görüyorsanız burada da onu görürsünüz. Kök yalnızca açabildiğiniz depoları listeler; yetkiniz dışındaki bir yol 403 değil 404 döner, böylece ağaç neyin var olduğunu sızdırmaz.\",\n  \"conn.guide.webdav.note.http\": \"Bu sunucuya düz http:// ile erişiliyor. Windows kimlik bilgilerinizi hiç göndermez, diğer tüm istemciler ise parolanızı açık metin olarak yollar. Bağlamadan önce filex’i TLS arkasına alın.\",\n  // ── S3 ucu: anahtarlar ve rehber ─────────────────────────────────\n  \"conn.s3keys.title\": \"S3 erişim anahtarları\",\n  \"conn.s3keys.lead\": \"Bir erişim anahtarı, S3 konuşan her istemcinin — rclone, restic, AWS CLI, mc, s3fs, Cyberduck — filex’e bağlanmasını sağlar. Anahtar sizin yetkinizi taşır, bir fazlasını değil.\",\n  \"conn.s3keys.disabled\": \"Bu sunucuda S3 ucu kapalı (FILEX_S3). Burada üretilen anahtar, yönetici ucu tekrar açana kadar bağlanmaz.\",\n  \"conn.s3keys.cannotMint\": \"Erişim anahtarı üretebilecek bir hesapla oturum açmış değilsiniz. Aşağıdaki talimatlar yine geçerli — bir anahtar isteyip yapıştırmanız yeter.\",\n  \"conn.s3keys.label\": \"Ne için? (dizüstü yedeği, CI, …)\",\n  \"conn.s3keys.defaultLabel\": \"erişim anahtarı\",\n  \"conn.s3keys.everyBucket\": \"Görebildiğim tüm kovalar\",\n  \"conn.s3keys.prefix\": \"Kova içindeki klasör (isteğe bağlı)\",\n  \"conn.s3keys.mint\": \"Anahtar oluştur\",\n  \"conn.s3keys.inheritNote\": \"Bir anahtar sahip olduğunuz yetkiyi yalnızca DARALTABİLİR: yetkileriniz, kiracınız, rolünüz. Anahtarı tek bir kovaya ya da klasöre kısıtlamak, bir dizüstü yedeği ile her şeyi okuyabilen bir kimlik arasındaki farktır.\",\n  \"conn.s3keys.once\": \"Gizli anahtarı şimdi kopyalayın — bir daha gösterilmeyecek.\",\n  \"conn.s3keys.accessKeyID\": \"Erişim anahtarı kimliği\",\n  \"conn.s3keys.secret\": \"Gizli anahtar\",\n  \"conn.s3keys.dismiss\": \"Kopyaladım\",\n  \"conn.s3keys.col.label\": \"Etiket\",\n  \"conn.s3keys.col.key\": \"Erişim anahtarı kimliği\",\n  \"conn.s3keys.col.scope\": \"Kapsam\",\n  \"conn.s3keys.col.lastUsed\": \"Son kullanım\",\n  \"conn.s3keys.scopeAll\": \"görebildiğiniz her şey\",\n  \"conn.s3keys.noLabel\": \"(etiketsiz)\",\n  \"conn.s3keys.neverUsed\": \"hiç\",\n  \"conn.s3keys.enable\": \"Aç\",\n  \"conn.s3keys.disable\": \"Kapat\",\n  \"conn.s3keys.revoke\": \"İptal et\",\n  \"conn.s3keys.confirm\": \"Emin misiniz?\",\n  \"conn.s3keys.empty\": \"Henüz erişim anahtarı yok.\",\n  \"conn.guide.s3.summary\": \"S3 ucu, S3 konuşan her şeyin — yedekleme, senkron araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.\",\n  \"conn.guide.s3.keyPlaceholder\": \"yukarıdan bir anahtar oluşturun\",\n  \"conn.guide.s3.secretPlaceholder\": \"anahtarı oluştururken bir kez gösterilir\",\n  \"conn.guide.s3.fact.endpoint\": \"Uç adresi\",\n  \"conn.guide.s3.fact.endpointHint\": \"İstemciyi buraya yöneltin, filex’in web adresine değil.\",\n  \"conn.guide.s3.fact.bucket\": \"Kova\",\n  \"conn.guide.s3.fact.bucketHint\": \"Kova = filex deposu. Kovaları istemci değil yönetici oluşturur.\",\n  \"conn.guide.s3.fact.key\": \"Erişim anahtarı kimliği\",\n  \"conn.guide.s3.fact.keyHint\": \"Genel yarısı; her istekte gider.\",\n  \"conn.guide.s3.fact.secret\": \"Gizli anahtar\",\n  \"conn.guide.s3.fact.secretHint\": \"Yalnızca anahtar oluşturulurken bir kez gösterilir. filex bir daha gösteremez — kaybolduysa yeni anahtar üretin.\",\n  \"conn.guide.s3.fact.region\": \"Bölge\",\n  \"conn.guide.s3.fact.regionHint\": \"filex’te bölge yok; hangi değeri verirseniz aynen geri döner. Yine de istemciler bir değer ister.\",\n  \"conn.guide.s3.fact.addressing\": \"Adresleme\",\n  \"conn.guide.s3.fact.pathStyle\": \"yol tabanlı (zorunlu)\",\n  \"conn.guide.s3.fact.pathStyleHint\": \"Bu kurulumda S3’e ayrılmış bir alan adı yok, yani kova.host çözülmez.\",\n  \"conn.guide.s3.fact.virtualHosted\": \"sanal-host ya da yol tabanlı\",\n  \"conn.guide.s3.fact.virtualHostedHint\": \"Bu kurulumun kendi S3 alan adı var, iki adresleme de çalışır.\",\n  \"conn.guide.s3.rclone.useCaption\": \"Kullanımı\",\n  \"conn.guide.s3.rclone.mtime\": \"filex dosyanın değişiklik zamanını taşır (x-amz-meta-mtime); böylece rclone sync ilk turdan sonra oturur, her seferinde her şeyi yeniden yüklemez.\",\n  \"conn.guide.s3.aws.configureCaption\": \"Bir kez ayarlayın\",\n  \"conn.guide.s3.aws.useCaption\": \"Kullanımı\",\n  \"conn.guide.s3.aws.pathStyle\": \"AWS yapılandırmanıza yol tabanlı adreslemeyi ekleyin; yoksa her komut DNS aşamasında düşer.\",\n  \"conn.guide.s3.restic.envCaption\": \"Ortam değişkenleri\",\n  \"conn.guide.s3.restic.useCaption\": \"Yedekle, doğrula, buda\",\n  \"conn.guide.s3.restic.verified\": \"Bu uca karşı ölçüldü: restic check --read-data her pack’i bayt bayt okuyor ve hata bulmuyor.\",\n  \"conn.guide.s3.mc.aliasCaption\": \"Takma adı ekleyin\",\n  \"conn.guide.s3.mc.useCaption\": \"Kullanımı\",\n  \"conn.guide.s3.s3fs.credsCaption\": \"Kimlik dosyası\",\n  \"conn.guide.s3.s3fs.mountCaption\": \"Bağlayın\",\n  \"conn.guide.s3.s3fs.note\": \"s3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöpüne gider. Paylaşılan bir klasör için iyi, veritabanı için değil.\",\n  \"conn.guide.s3.duck.s1\": \"Yeni yer imi → Amazon S3.\",\n  \"conn.guide.s3.duck.s2\": \"Sunucu: {host}.\",\n  \"conn.guide.s3.duck.s3\": \"Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.\",\n  \"conn.guide.s3.duck.s4\": \"Yer imini açın; kovalar sizin filex depolarınızdır.\",\n  \"conn.guide.s3.duck.pathStyle\": 'Tercihler → S3 altında \"Use virtual host style\" seçeneğini KAPATIN — bu kurulumda joker S3 alan adı yok.',\n  \"conn.guide.s3.sdk.note\": \"SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.\",\n  \"conn.guide.s3.note.buckets\": \"Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.\",\n  \"conn.guide.s3.note.permissions\": 'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova \"yasak\" değil \"böyle bir kova yok\" der; böylece uç, neyin var olduğunu sızdırmaz.',\n  \"conn.guide.s3.note.trash\": \"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.\",\n  \"conn.guide.s3.note.mtime\": \"Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır — bozulmuş bir yükleme saklanmaz, reddedilir.\",\n  \"conn.guide.s3.note.pathStyle\": \"Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.\",\n  \"conn.guide.s3.note.http\": \"Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.\",\n  // ── SFTP ucu: anahtarlar ve rehber ───────────────────────────────\n  \"conn.sshkeys.title\": \"SSH anahtarları\",\n  \"conn.sshkeys.lead\": \"Bir açık anahtar kaydedin; SSH konuşan her istemci — sftp, scp, WinSCP, FileZilla, rclone, sshfs — parolanızı göndermeden bağlansın.\",\n  \"conn.sshkeys.disabled\": \"Bu sunucuda SFTP ucu kapalı (FILEX_SFTP). Burada kaydedilen anahtar, yönetici ucu açana kadar bağlanmaz.\",\n  \"conn.sshkeys.cannotAdd\": \"Anahtar kaydedebilecek bir hesapla oturum açmış değilsiniz.\",\n  \"conn.sshkeys.paste\": \"~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın\",\n  \"conn.sshkeys.name\": \"Ad (isteğe bağlı — boşsa anahtarın kendi yorumu kullanılır)\",\n  \"conn.sshkeys.add\": \"Anahtar ekle\",\n  \"conn.sshkeys.noCopyId\": \"ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Giriş yolu bu kutudur.\",\n  \"conn.sshkeys.col.name\": \"Ad\",\n  \"conn.sshkeys.col.fingerprint\": \"Parmak izi\",\n  \"conn.sshkeys.col.added\": \"Eklendi\",\n  \"conn.sshkeys.col.lastUsed\": \"Son kullanım\",\n  \"conn.sshkeys.noName\": \"(adsız)\",\n  \"conn.sshkeys.neverUsed\": \"hiç\",\n  \"conn.sshkeys.enable\": \"Aç\",\n  \"conn.sshkeys.disable\": \"Kapat\",\n  \"conn.sshkeys.remove\": \"Sil\",\n  \"conn.sshkeys.confirm\": \"Emin misiniz?\",\n  \"conn.sshkeys.empty\": \"Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla giriş yapar.\",\n  \"conn.guide.sftp.summary\": \"SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.\",\n  \"conn.guide.sftp.fact.host\": \"Sunucu\",\n  \"conn.guide.sftp.fact.hostHint\": \"Web uygulamasıyla aynı makine, kendine ait bir portta.\",\n  \"conn.guide.sftp.fact.port\": \"Port\",\n  \"conn.guide.sftp.fact.portHint\": \"Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.\",\n  \"conn.guide.sftp.fact.userHint\": \"Kısa giriş adınız. Giriş adındaki @ işareti çoğu istemcinin ayar dosyasında tırnaklanmak zorundadır; bu alan tam da onu ortadan kaldırır.\",\n  \"conn.guide.sftp.fact.auth\": \"Giriş yöntemi\",\n  \"conn.guide.sftp.fact.authKey\": \"kayıtlı SSH anahtarınız (ya da parolanız)\",\n  \"conn.guide.sftp.fact.authPassword\": \"hesap parolanız — ya da yukarıdan bir anahtar kaydedin\",\n  \"conn.guide.sftp.fact.authHint\": \"API token da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap anahtar ya da token kullanmalıdır.\",\n  \"conn.guide.sftp.fact.path\": \"Yol\",\n  \"conn.guide.sftp.fact.pathHint\": \"İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.\",\n  \"conn.guide.sftp.openssh.connectCaption\": \"Bağlan, gönder, al\",\n  \"conn.guide.sftp.openssh.noShell\": \"Burada kabuk yok, yalnız SFTP alt sistemi var. `ssh sunucu komut` bilerek reddedilir; scp çalışır çünkü OpenSSH 9 onun için de SFTP konuşur.\",\n  \"conn.guide.sftp.key.tab\": \"Anahtar kurulumu\",\n  \"conn.guide.sftp.key.s1\": \"Bağlanacak makinede bir anahtar çifti üretin (zaten varsa atlayın).\",\n  \"conn.guide.sftp.key.s2\": \"AÇIK yarısını kopyalayın — .pub dosyası, asla diğeri değil.\",\n  \"conn.guide.sftp.key.s3\": \"Yukarıdaki kutuya yapıştırıp bağlanın; o andan sonra parola gönderilmez.\",\n  \"conn.guide.sftp.key.genCaption\": \"Kendi makinenizde\",\n  \"conn.guide.sftp.key.noCopyId\": \"ssh-copy-id filex’e karşı ÇALIŞMAZ: ~/.ssh/authorized_keys dosyasına eklemek için kabuğa ihtiyacı var, filex’te kabuk yok. Anahtarı yukarıdan yapıştırın.\",\n  \"conn.guide.sftp.winscp.s1\": \"Yeni site → Dosya protokolü: SFTP.\",\n  \"conn.guide.sftp.winscp.s2\": \"Sunucu adı: {host}, port: {port}.\",\n  \"conn.guide.sftp.winscp.s3\": \"Kullanıcı adı: {user}. Anahtar için: Gelişmiş → SSH → Kimlik Doğrulama → özel anahtar dosyası.\",\n  \"conn.guide.sftp.winscp.s4\": \"WinSCP .ppk biçiminde özel anahtar ister — OpenSSH anahtarını kendi aracıyla (Araçlar → PuTTYgen) bir kez dönüştürün.\",\n  \"conn.guide.sftp.filezilla.s1\": \"Dosya → Site Yöneticisi → Yeni site, Protokol: SFTP.\",\n  \"conn.guide.sftp.filezilla.s2\": \"Sunucu: {host}, port: {port}.\",\n  \"conn.guide.sftp.filezilla.s3\": \"Kullanıcı: {user}. Giriş türü: parola için Normal, anahtar için Anahtar dosyası.\",\n  \"conn.guide.sftp.rclone.useCaption\": \"Kullanımı\",\n  \"conn.guide.sftp.sshfs.mountCaption\": \"Bağla ve çöz\",\n  \"conn.guide.sftp.sshfs.note\": \"Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.\",\n  \"conn.guide.sftp.note.storages\": \"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.\",\n  \"conn.guide.sftp.note.permissions\": \"İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.\",\n  \"conn.guide.sftp.note.trash\": \"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.\",\n  \"conn.guide.sftp.note.totp\": \"Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir anahtar kaydedin ya da parola yerine API token kullanın.\",\n  \"conn.guide.sftp.note.disabled\": \"Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.\",\n  // ── FTPS ─────────────────────────────────────────────────────────\n  \"conn.guide.ftps.summary\": \"FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.\",\n  \"conn.guide.ftps.fact.host\": \"Sunucu\",\n  \"conn.guide.ftps.fact.hostHint\": \"Web uygulamasıyla aynı makine, kendine ait bir portta.\",\n  \"conn.guide.ftps.fact.port\": \"Port\",\n  \"conn.guide.ftps.fact.portHint\": \"Kontrol kanalı. Veri, aşağıdaki pasif aralıktan ayrı bir porttan akar.\",\n  \"conn.guide.ftps.fact.mode\": \"Şifreleme\",\n  \"conn.guide.ftps.fact.modeValue\": \"FTPS — açık (explicit) TLS, zorunlu\",\n  \"conn.guide.ftps.fact.modeHint\": 'Düz FTP, parola okunmadan reddedilir. \"Require explicit FTP over TLS\" seçin; \"plain FTP\" ya da \"implicit\" asla.',\n  \"conn.guide.ftps.fact.userHint\": \"Kısa giriş adınız ya da e-postanız. Parola yerine API token da geçer ve tek başına iptal edilebilir.\",\n  \"conn.guide.ftps.fact.passwordHint\": \"Hesap parolanız ya da bir API token. İki adımlı doğrulaması açık hesap token kullanmalıdır — FTP'nin kodu soracak bir yolu yok.\",\n  \"conn.guide.ftps.fact.pasv\": \"Pasif portlar\",\n  \"conn.guide.ftps.fact.pasvHint\": \"Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR — FTP'nin klasik arızası budur.\",\n  \"conn.guide.ftps.filezilla.s1\": \"Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.\",\n  \"conn.guide.ftps.filezilla.s2\": \"Sunucu: {host}, port: {port}.\",\n  \"conn.guide.ftps.filezilla.s3\": 'Şifreleme: \"Require explicit FTP over TLS\". Giriş türü: Normal, kullanıcı: {user}.',\n  \"conn.guide.ftps.filezilla.s4\": \"Aktarım ayarları → Pasif. Bu sunucu aktif modu reddeder.\",\n  \"conn.guide.ftps.winscp.s1\": \"Yeni site → Dosya protokolü: FTP, Şifreleme: TLS/SSL Explicit encryption.\",\n  \"conn.guide.ftps.winscp.s2\": \"Sunucu adı: {host}, port: {port}.\",\n  \"conn.guide.ftps.winscp.s3\": \"Kullanıcı adı: {user}, parola yukarıdaki.\",\n  \"conn.guide.ftps.curl.caption\": \"Gönder ve al\",\n  \"conn.guide.ftps.curl.sslReqd\": \"--ssl-reqd isteğe bağlı değil: curl'ün düz metne geri düşmek yerine TLS'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.\",\n  \"conn.guide.ftps.lftp.caption\": \"Bağlan\",\n  \"conn.guide.ftps.lftp.protectData\": \"ssl-protect-data yalnız girişi değil DOSYAYI da şifreler. Olmazsa lftp TLS ile giriş yapar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.\",\n  \"conn.guide.ftps.rclone.useCaption\": \"Kullanımı\",\n  \"conn.guide.ftps.printer.tab\": \"Tarayıcı / yazıcı\",\n  \"conn.guide.ftps.printer.s1\": \"Cihazın tara-ve-FTP'ye-gönder ayarlarında: sunucu {host}, port {port}.\",\n  \"conn.guide.ftps.printer.s2\": \"Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API token üretin — başka hiçbir şeyi değiştirmeden iptal edilebilir.\",\n  \"conn.guide.ftps.printer.s3\": \"Yol: {path} — ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.\",\n  \"conn.guide.ftps.printer.s4\": '\"SSL/TLS\" ya da \"FTPS explicit\" seçeneğini AÇIN ve PASİF modu seçin.',\n  \"conn.guide.ftps.printer.noTLS\": \"Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.\",\n  \"conn.guide.ftps.note.tls\": \"TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.\",\n  \"conn.guide.ftps.note.passive\": \"Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.\",\n  \"conn.guide.ftps.note.storages\": \"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.\",\n  \"conn.guide.ftps.note.trash\": \"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.\",\n  \"conn.guide.ftps.note.prefer\": \"İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.\",\n  \"conn.guide.ftps.note.selfSigned\": \"Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.\",\n  \"conn.guide.ftps.note.disabled\": \"Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.\",\n  // ── NFS ──────────────────────────────────────────────────────────\n  \"conn.nfs.title\": \"NFS export'ları\",\n  \"conn.nfs.lead\": \"Bir export, ağınızdaki bir makinenin filex'i sürücü olarak bağlamasını sağlar — medya oynatıcı, derleme sunucusu, yedek kutusu.\",\n  \"conn.nfs.pathIsSecret\": \"⚠ Export yolu PAROLANIN TA KENDİSİDİR. NFS, Kerberos olmadan istemciye kim olduğunu soramaz; bu yüzden filex yola 32 rastgele bayt koyar: yolu bilen sizin adınıza bağlanır. Bağlama satırını bir kimlik bilgisi gibi saklayın — /etc/fstab çoğu sistemde herkes tarafından okunabilir.\",\n  \"conn.nfs.disabled\": \"Bu sunucuda NFS ucu kapalı (FILEX_NFS). Burada oluşturulan export, yönetici ucu açana kadar bağlanmaz.\",\n  \"conn.nfs.cannotMint\": \"Export oluşturabilecek bir hesapla oturum açmış değilsiniz.\",\n  \"conn.nfs.label\": \"Ne için? (medya oynatıcı, yedek kutusu, …)\",\n  \"conn.nfs.defaultLabel\": \"nfs export\",\n  \"conn.nfs.everyStorage\": \"Görebildiğim tüm depolar\",\n  \"conn.nfs.prefix\": \"Depo içindeki klasör (isteğe bağlı)\",\n  \"conn.nfs.allowCidrs\": \"İzinli adresler, örn. 192.168.1.0/24 (isteğe bağlı)\",\n  \"conn.nfs.readOnly\": \"Salt okunur\",\n  \"conn.nfs.readOnlyHint\": \"Bir makine için güvenli varsayılan salt okunurdur: sizin yetkiniz ne olursa olsun bu bağlantı üzerinden her yazmayı reddeder. Adres listesi daha da daraltır — listenin dışından gelen bağlanamaz.\",\n  \"conn.nfs.mint\": \"Export oluştur\",\n  \"conn.nfs.once\": \"Şimdi kopyalayın — yol yalnızca bir kez gösterilir ve geri alınamaz.\",\n  \"conn.nfs.dismiss\": \"Kopyaladım\",\n  \"conn.nfs.col.label\": \"Etiket\",\n  \"conn.nfs.col.scope\": \"Kapsam\",\n  \"conn.nfs.col.mode\": \"Mod\",\n  \"conn.nfs.col.lastUsed\": \"Son bağlanma\",\n  \"conn.nfs.scopeAll\": \"görebildiğiniz her şey\",\n  \"conn.nfs.modeRead\": \"salt okunur\",\n  \"conn.nfs.modeWrite\": \"okuma/yazma\",\n  \"conn.nfs.noLabel\": \"(etiketsiz)\",\n  \"conn.nfs.neverUsed\": \"hiç\",\n  \"conn.nfs.enable\": \"Aç\",\n  \"conn.nfs.disable\": \"Kapat\",\n  \"conn.nfs.revoke\": \"İptal et\",\n  \"conn.nfs.confirm\": \"Emin misiniz?\",\n  \"conn.nfs.empty\": \"Henüz export yok.\",\n  \"conn.guide.nfs.summary\": \"NFS, filex'i kendi ağınızdaki bir makinede sürücü olarak bağlar — NAS protokolü, onu bekleyen cihazlar için.\",\n  \"conn.guide.nfs.pathPlaceholder\": \"yukarıdan bir export oluşturun\",\n  \"conn.guide.nfs.fact.host\": \"Sunucu\",\n  \"conn.guide.nfs.fact.hostHint\": \"Web uygulamasıyla aynı makine, kendine ait bir portta.\",\n  \"conn.guide.nfs.fact.port\": \"Port\",\n  \"conn.guide.nfs.fact.portHint\": \"Hem port= hem mountport= buna ayarlanmalı; filex mount ve NFS servislerini tek portta veriyor.\",\n  \"conn.guide.nfs.fact.export\": \"Export yolu\",\n  \"conn.guide.nfs.fact.exportHint\": \"Kimlik bilgisi budur. Export oluşturulurken bir kez gösterilir ve hash'li saklanır — filex bir daha gösteremez.\",\n  \"conn.guide.nfs.fact.options\": \"Bağlama seçenekleri\",\n  \"conn.guide.nfs.fact.optionsHint\": \"nolock, çünkü filex NFS kilit yöneticisini çalıştırmıyor; nfsvers=3, çünkü bu sunucunun konuştuğu sürüm bu.\",\n  \"conn.guide.nfs.linux.mountCaption\": \"Bağla\",\n  \"conn.guide.nfs.linux.fstabSecret\": \"Bu yolu içeren bir /etc/fstab satırı, herkesin okuyabildiği bir dosyadaki paroladır. Ortamınızda önemliyse kimlik korumalı automount kullanın ya da bağlamayı yalnız root'un okuyabildiği bir unit dosyasında tutun.\",\n  \"conn.guide.nfs.mac.mountCaption\": \"Bağla\",\n  \"conn.guide.nfs.mac.resvport\": \"macOS resvport ister: istemcisi ayrıcalıklı bir kaynak portta ısrar eder ve olmadan bağlantıyı reddeder.\",\n  \"conn.guide.nfs.win.s1\": `Windows Özellikleri'nden \"Services for NFS\" → \"Client for NFS\" bileşenini açın (yalnız Pro ve Enterprise; Home'da yok).`,\n  \"conn.guide.nfs.win.s2\": \"Komut İstemi'ni yönetici olarak açın.\",\n  \"conn.guide.nfs.win.s3\": \"Aşağıdaki komutla export'u bir sürücü harfine bağlayın.\",\n  \"conn.guide.nfs.win.cmdCaption\": \"Z: sürücüsüne bağla\",\n  \"conn.guide.nfs.win.port\": \"Windows'un mount servisinin portunu söyleme imkânı yok; yalnızca standart 2049 portundaki bir NFS sunucusuna erişebilir. Bu sunucu başka bir porttaysa SFTP'yi ya da filex masaüstü uygulamasını kullanın.\",\n  \"conn.guide.nfs.nas.tab\": \"NAS / medya oynatıcı\",\n  \"conn.guide.nfs.nas.s1\": \"Cihazın NFS ayarlarında: sunucu {host}, port {port} (ayrı ayrı soruyorsa hem NFS hem mount portunu ayarlayın).\",\n  \"conn.guide.nfs.nas.s2\": \"Uzak yol: yukarıdaki export yolu, birebir.\",\n  \"conn.guide.nfs.nas.s3\": \"NFS sürüm 3, kilitleme kapalı. Cihazın gerçekten yazması gerekmiyorsa export'u salt okunur oluşturun.\",\n  \"conn.guide.nfs.note.unencrypted\": \"NFSv3 şifreli değildir. Trafiği okuyabilen dosyalarınızı görür, yolu öğrenen bağlanabilir. Ev/ofis ağında ya da VPN üzerinden kullanın — internet üzerinden asla.\",\n  \"conn.guide.nfs.note.pathIsSecret\": \"Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.\",\n  \"conn.guide.nfs.note.noPortmapper\": \"111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.\",\n  \"conn.guide.nfs.note.uid\": \"İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex'teki erişiminizden gelir.\",\n  \"conn.guide.nfs.note.trash\": \"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.\",\n  \"conn.guide.nfs.note.revoke\": \"İptal anında değil, bir sonraki istekte etkili olur: NFS'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.\",\n  \"conn.guide.nfs.note.disabled\": \"Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.\",\n  \"conn.tokens.title\": \"API jetonları\",\n  \"conn.tokens.lead\": \"FTPS, WebDAV ve filex mount hesap parolanız yerine bir jetonla giriş yapar. Buradan üretin — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.\",\n  \"conn.tokens.mint\": \"Jeton oluştur\",\n  \"conn.tokens.once\": \"Şimdi kopyalayın — yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.\",\n  \"conn.tokens.dismiss\": \"Kopyaladım\",\n  \"conn.tokens.cannotMint\": \"Bu oturum jeton üretemiyor. Kendi hesabınızla giriş yapıp oluşturun.\",\n  \"conn.tokens.empty\": \"Henüz jeton yok.\",\n  \"conn.tokens.neverUsed\": \"hiç\",\n  \"conn.tokens.revoke\": \"İptal et\",\n  \"conn.tokens.confirm\": \"Emin misin?\",\n  \"conn.tokens.col.label\": \"Ad\",\n  \"conn.tokens.col.scopes\": \"Yetkisi\",\n  \"conn.tokens.col.used\": \"Son kullanım\",\n  \"conn.tokens.revokeHint\": \"İptal, yalnız bir sonraki girişi değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.\",\n  \"conn.guide.mount.summary\": \"filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar — tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.\",\n  \"conn.guide.mount.fact.url\": \"Sunucu adresi\",\n  \"conn.guide.mount.fact.urlHint\": \"Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.\",\n  \"conn.guide.mount.fact.token\": \"API jetonu\",\n  \"conn.guide.mount.fact.tokenPlaceholder\": \"Jetonlar bölümünden oluşturun\",\n  \"conn.guide.mount.fact.tokenHint\": \"Parolanız değil, jeton — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.\",\n  \"conn.guide.mount.fact.remote\": \"Neyi bağlayacağınız\",\n  \"conn.guide.mount.fact.remoteHint\": \"--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu — ya da onun içindeki bir klasörü — adlandırırsanız yalnızca o bağlanır.\",\n  \"conn.guide.mount.linux.mountCaption\": \"Bağlayın\",\n  \"conn.guide.mount.linux.umountCaption\": \"Ayırın\",\n  \"conn.guide.mount.linux.umountWarn\": \"Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.\",\n  \"conn.guide.mount.linux.systemdCaption\": \"Girişte otomatik bağlansın (systemd kullanıcı birimi)\",\n  \"conn.guide.mount.win.winfsp\": \"Windows'ta bir kez WinFsp kurulması gerekiyor — ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.\",\n  \"conn.guide.mount.win.mountCaption\": \"Sürücü olarak bağlayın\",\n  \"conn.guide.mount.win.freeLetter\": \"BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.\",\n  \"conn.guide.mount.win.stop\": \"O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.\",\n  \"conn.guide.mount.mac.unsupported\": \"filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.\",\n  \"conn.guide.mount.mac.alternatives\": \"macOS'ta filex masaüstü uygulamasını klasör senkronuyla kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.\",\n  \"conn.guide.mount.note.notASync\": \"Bu bir senkronizasyon değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör senkronunu kullanın.\",\n  \"conn.guide.mount.note.reachable\": \"Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır — çünkü altında aynı API vardır. İzinleriniz, depolarınız ve çok kiracılı bir sunucuda kiracınız da birlikte gelir.\",\n  \"conn.guide.mount.note.wholeFileWrites\": \"Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.\",\n  \"conn.guide.mount.note.trash\": \"Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.\",\n  \"conn.guide.mount.note.revoke\": \"Bir bağlantıyı durdurmak için jetonu iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.\",\n  \"storages.driver.ftp\": \"FTP / FTPS\",\n  \"storages.driver.local\": \"Yerel dosya sistemi\",\n  \"storages.driver.s3\": \"S3 / Hetzner / MinIO\",\n  \"storages.driver.sftp\": \"SFTP\",\n  \"storages.driver.smb\": \"SMB / CIFS (NAS)\",\n  \"storages.driver.webdav\": \"WebDAV\",\n  \"storages.fieldHelp.smbShare\": \"Sunucu adı olmadan yalnızca paylaşım adı: `\\\\\\\\nas\\\\media` değil, `media`.\",\n  \"storages.fieldHelp.smbDomain\": \"Yalnızca Windows etki alanı hesabı için. NAS kullanıyorsanız boş bırakın.\",\n  \"storages.fieldHelp.smbRoot\": \"Paylaşımın içindeki alt klasör. Paylaşımın tamamı için boş bırakın.\",\n  \"storages.fields.share\": \"Paylaşım\",\n  \"storages.fields.domain\": \"Etki alanı / çalışma grubu\",\n  \"storages.fields.dialTimeout\": \"Bağlanma zaman aşımı (saniye)\",\n  \"storages.fieldHelp.disablePresign\": \"Varsayılan olarak açık: yüklemeler ve herkese açık paylaşım bağlantılarındaki indirmeler filex üzerinden akar; kova endpoint'inin tarayıcıdan erişilebilir olması gerekmez (yalnız yerel ağdaki MinIO doğrudan çalışır). Yalnızca endpoint kullanıcıların tarayıcısından erişilebiliyorsa (AWS, herkese açık MinIO) ve tarayıcının kovayla doğrudan konuşmasını istiyorsanız kapatın — çok büyük dosyalarda daha hızlıdır, ama depo SDK'nın imzaladığı URL'leri kabul etmelidir (Ceph RGW / bazı Hetzner kurulumları SignatureDoesNotMatch döner).\",\n  \"storages.fieldHelp.endpoint\": \"AWS S3 için boş bırakın. S3 uyumlu diğer tüm depolar kendi endpoint'ini ister.\",\n  \"storages.fieldHelp.hostKey\": \"authorized_keys / known_hosts satır biçiminde tek bir açık anahtar.\",\n  \"storages.fieldHelp.insecureSkipHostKey\": \"Her sunucu anahtarını kabul eder. Yalnızca geçici sunucular için.\",\n  \"storages.fieldHelp.keyPath\": \"Sunucudaki anahtar dosyasının yolu; depo başlarken okunur. PEM alanı boşken kullanılır.\",\n  \"storages.fieldHelp.knownHosts\": \"Katı sunucu anahtarı denetimi için OpenSSH known_hosts yolu. Varsayılan, ~/.filex/known_hosts içinde ilk bağlantıda güven.\",\n  \"storages.fieldHelp.passive\": \"Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.\",\n  \"storages.fieldHelp.path\": \"Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.\",\n  \"storages.fieldHelp.pathStyle\": \"AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.\",\n  \"storages.fieldHelp.prefix\": \"Bucket içindeki alt klasör. Zorunlu: filex bucket kökünün sahipliğini asla almaz.\",\n  \"storages.fieldHelp.region\": 'Boş bırakılırsa \"auto\" kullanılır.',\n  \"storages.fieldHelp.root\": \"Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.\",\n  \"storages.fieldHelp.sftpAuth\": \"Parola ya da özel anahtardan biri zorunludur.\",\n  \"storages.fieldHelp.tls\": \"Düz FTP kimlik bilgilerini açık metin gönderir — sunucu destekliyorsa açın.\",\n  \"storages.fields.accessKey\": \"Access key\",\n  \"storages.fields.basePath\": \"Temel yol\",\n  \"storages.fields.bucket\": \"Bucket\",\n  \"storages.fields.disablePresign\": \"İmzalı URL'leri kapat\",\n  \"storages.fields.endpoint\": \"Endpoint\",\n  \"storages.fields.host\": \"Sunucu\",\n  \"storages.fields.hostKey\": \"Sabitlenmiş sunucu anahtarı\",\n  \"storages.fields.insecureSkipHostKey\": \"Sunucu anahtarı doğrulamasını atla (güvensiz)\",\n  \"storages.fields.keyPath\": \"Özel anahtar dosyası\",\n  \"storages.fields.knownHosts\": \"known_hosts dosyası\",\n  \"storages.fields.name\": \"Görünen isim\",\n  \"storages.fields.namePlaceholder\": \"Kişisel fotoğraflar\",\n  \"storages.fields.passive\": \"Pasif mod (PASV)\",\n  \"storages.fields.password\": \"Parola\",\n  \"storages.fields.path\": \"Dizin yolu\",\n  \"storages.fields.pathStyle\": \"Path-style URL kullan (Hetzner, MinIO)\",\n  \"storages.fields.port\": \"Port\",\n  \"storages.fields.prefix\": \"Önek (prefix)\",\n  \"storages.fields.privateKey\": \"Özel anahtar (PEM)\",\n  \"storages.fields.rbac\": \"Öğe bazlı erişim denetimi (RBAC)\",\n  \"storages.fields.rbacHint\": \"Açıkken admin olmayanlar yalnızca izin panelinden kendilerine verilen dosya/klasörleri görür. Kapalıyken depo tüm kullanıcılara açıktır (yetki role göre).\",\n  \"storages.fields.readOnly\": \"Salt okunur mount\",\n  \"storages.fields.region\": \"Bölge\",\n  \"storages.fields.root\": \"Temel yol\",\n  \"storages.fields.secretKey\": \"Secret key\",\n  \"storages.fields.tls\": \"FTPS (açık AUTH TLS)\",\n  \"storages.fields.url\": \"Temel URL\",\n  \"storages.fields.user\": \"Kullanıcı\",\n  /* === gezinti:g1 — gezinti paneli (SideNav) === */\n  \"sidenav.title\": \"Gezinti\",\n  \"sidenav.views\": \"Görünümler\",\n  \"sidenav.storages\": \"Depolar\",\n  \"sidenav.home\": \"Ana sayfa\",\n  \"sidenav.myfiles\": \"Dosyalarım\",\n  \"sidenav.recent\": \"Son kullanılanlar\",\n  \"sidenav.starred\": \"Yıldızlılar\",\n  \"sidenav.shared\": \"Benimle paylaşılanlar\",\n  \"sidenav.trash\": \"Çöp Kutusu\",\n  \"sidenav.collapse\": \"Gezintiyi daralt\",\n  \"sidenav.expand\": \"Gezintiyi genişlet\",\n  \"sidenav.close\": \"Gezintiyi kapat\",\n  // ⚠ aç/kapat çifti ÇEKMECENİN, daralt/genişlet çifti yerleşik PANELİN —\n  // ikisi birbirinin yerine kullanılamaz; bkz. en.ts'teki not ve Toolbar.vue\n  // içindeki `navToggleLabel`. 560px altında panel listenin üzerine gelen bir\n  // çekmecedir: raya inmez, hiç ekranda değildir; \"genişlet\" olmayan bir\n  // genişliği büyütmeyi vaat ederdi.\n  \"sidenav.open\": \"Gezintiyi aç\",\n  \"sidenav.storage.shared\": \"Paylaşılan\",\n  \"sidenav.storage.readOnly\": \"Salt okunur\",\n  // ⚠ `toolbar.nav` KALDIRILDI, yerine bir şey konmadı — bkz. en.ts'teki not.\n  // Paneli daraltan tek denetimin etiketiydi; önce \"Gezinti\" (panelin adı,\n  // düğmenin ne yaptığını söylemiyor), sonra \"Gezintiyi göster/gizle\" (sabit\n  // geçici çözüm). Gerçek düzeltme yukarıdaki dört `sidenav.*` fiili:\n  // etiket `navOpen`'a bağlı, daraltacaksa \"daralt\", genişletecekse\n  // \"genişlet\" yazıyor.\n  \"node.home\": \"Ana sayfa\",\n  \"node.recent\": \"Son kullanılanlar\",\n  \"node.starred\": \"Yıldızlılar\",\n  \"node.shared\": \"Benimle paylaşılanlar\",\n  \"empty.recent.title\": \"Henüz hiçbir şey açılmadı\",\n  \"empty.recent.hint\": \"Açtığın dosyalar burada görünür\",\n  \"empty.starred.title\": \"Henüz yıldızlı dosya yok\",\n  \"empty.starred.hint\": \"Bir dosyayı yıldızla, burada bulasın\",\n  \"empty.shared.title\": \"Seninle henüz bir şey paylaşılmadı\",\n  \"empty.shared.hint\": \"Başkalarının paylaştığı klasör ve dosyalar burada görünür\",\n  /* etiket:t1 */\n  \"sidenav.tags\": \"Etiketler\",\n  \"sidenav.tags.empty\": \"Henüz etiket yok — bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsin.\",\n  \"sidenav.tags.more\": \"{count} tane daha göster\",\n  \"sidenav.tags.less\": \"Daha az göster\",\n  \"empty.tag.title\": \"“{tag}” etiketli hiçbir şey yok\",\n  \"empty.tag.hint\": \"Bir dosyaya sağ tıklayıp Etiketler’i seç, burada görünsün\",\n  \"sidenav.connections\": \"Bağlantılar\",\n  \"sidenav.connect\": \"Nasıl bağlanılır\",\n  \"sidenav.apikeys\": \"API anahtarları\",\n  \"overlay.close\": \"Kapat\",\n  \"conn.tokens.scopes\": \"İzinler\",\n  \"conn.tokens.root\": \"Tek bir klasörle sınırla (isteğe bağlı)\",\n  \"conn.tokens.rootPlaceholder\": \"depo://klasör\",\n  \"conn.tokens.expiry\": \"Geçerlilik (gün)\",\n  \"conn.tokens.expiryNever\": \"süresiz\",\n  \"conn.tokens.defaultName\": \"API anahtarı {date}\",\n  \"conn.tokens.namePlaceholder\": \"Ad — ör. yedekleme betiği\",\n  \"conn.tokens.capNote\": \"Tavan hesabın ve yetkilerin — sahip olduğundan fazlasını istemek reddedilir, verilmez.\",\n  /* === /gezinti:g1 === */\n  /* === surucu:d1 — kabuk (GitHub #14); artık `uiProfile: 'drive'` ile\n     gelen bir seçenek değil, her profilde çizilir === */\n  \"drive.new\": \"Yeni\",\n  \"drive.new.upload\": \"Dosya yükle\",\n  \"drive.new.folder\": \"Yeni klasör\",\n  \"drive.new.request\": \"Dosya iste\",\n  \"drive.new.document\": \"Yeni belge\",\n  /* === belge:n1 — \"Yeni belge\": + Yeni altındaki seçici ==================\n     Tür adları BURADA durmuyor. Her kutucuk sözcüklerini lib/fileIcons\n     `typeLabelFor`den okur — listedeki Tür sütununun okuduğu tablonun\n     aynısı — böylece \".docx\" iki yerde de aynı adla anılır ve yeni bir tür\n     için hiç dizge gerekmez. Aşağıda yalnız bu pencerenin kendi metni var. */\n  \"newdoc.title\": \"Yeni belge\",\n  \"newdoc.type.label\": \"Belge türü\",\n  \"newdoc.group.document\": \"Belgeler\",\n  \"newdoc.group.text\": \"Metin ve kod\",\n  \"newdoc.group.diagram\": \"Çizimler\",\n  \"newdoc.withheld.onlyoffice\": \"Ofis belgeleri için bir belge sunucusu (OnlyOffice) gerekir; burada tanımlı değil.\",\n  \"newdoc.withheld.drawio\": \"Çizimler için drawio servisi gerekir; burada tanımlı değil.\",\n  \"newdoc.empty.title\": \"Kullanılabilir belge türü yok\",\n  \"newdoc.empty.body\": \"Bu sunucu, bu uygulamanın oluşturabileceği bir tür sunmadı.\",\n  \"newdoc.empty.blocked\": \"Bu sunucunun oluşturabildiği her tür, burada tanımlı olmayan bir düzenleyici servisine bağlı.\",\n  \"newdoc.name\": \"Ad\",\n  \"newdoc.name.placeholder\": \"Belge adı\",\n  \"newdoc.untitled\": \"Adsız\",\n  \"newdoc.err.slash\": \"Ad eğik çizgi içeremez.\",\n  \"newdoc.err.exists\": \"{name} burada zaten var. Başka bir ad seçin.\",\n  \"newdoc.location\": \"Konum\",\n  \"newdoc.location.none\": \"Bir klasör seçin\",\n  \"newdoc.location.change\": \"Değiştir\",\n  \"newdoc.location.noaccess\": \"Bu klasöre kaydedemezsiniz.\",\n  \"newdoc.create\": \"Oluştur\",\n  \"newdoc.creating\": \"Oluşturuluyor…\",\n  \"newdoc.cancel\": \"Vazgeç\",\n  \"drive.search.placeholder\": \"{scope} deposunda ara\",\n  \"drive.search.placeholder_all\": \"Tüm depolarda ara\",\n  \"drive.search.hint_title\": \"Her yerde ara ve komut çalıştır ({combo})\",\n  \"drive.storage.used\": \"{total} alanın {used} kadarı dolu\",\n  \"drive.storage.used_unlimited\": \"{used} kullanılıyor\",\n  \"drive.storage.label\": \"Depolama\",\n  /* === gorunum:v3-shell — Ana sayfa görünümü (kabuğun içindeki genel bakış)\n   * Bölüm başlıkları `sidenav.storages` / `sidenav.recent` / `sidenav.starred`,\n   * boş durumlar da `empty.recent.*` / `empty.starred.*` — bilerek: Ana\n   * sayfadaki \"Son kullanılanlar\" başlığı ile yanındaki panel satırı aynı\n   * şeydir, ikisine ayrı metin yazmak onları çeviri çeviri birbirinden\n   * ayırmanın yoludur. Aşağıda yalnızca başka hiçbir yerde olmayanlar var. */\n  \"home.title\": \"Ana sayfa\",\n  \"home.storages.empty\": \"Henüz depo yok\",\n  \"home.storages.hint\": \"Depo, filex’in okuyup yazdığı sürücüdür — depoları yönetici ekler.\",\n  \"drive.section.folders\": \"Klasörler\",\n  \"drive.section.files\": \"Dosyalar\",\n  \"filter.aria\": \"Süzgeçler\",\n  \"filter.type\": \"Tür\",\n  \"filter.type.any\": \"Her tür\",\n  \"filter.type.folder\": \"Klasörler\",\n  \"filter.type.document\": \"Belgeler\",\n  \"filter.type.spreadsheet\": \"Hesap tabloları\",\n  \"filter.type.presentation\": \"Sunumlar\",\n  \"filter.type.pdf\": \"PDF’ler\",\n  \"filter.type.image\": \"Görseller\",\n  \"filter.type.video\": \"Videolar\",\n  \"filter.type.audio\": \"Ses dosyaları\",\n  \"filter.type.archive\": \"Arşivler\",\n  \"filter.type.code\": \"Kod\",\n  \"filter.modified\": \"Değiştirilme\",\n  \"filter.modified.any\": \"Her zaman\",\n  \"filter.modified.today\": \"Bugün\",\n  \"filter.modified.7d\": \"Son 7 gün\",\n  \"filter.modified.30d\": \"Son 30 gün\",\n  \"filter.modified.year\": \"Bu yıl\",\n  \"filter.size\": \"Boyut\",\n  \"filter.size.any\": \"Her boyut\",\n  \"filter.size.lt1\": \"1 MB altı\",\n  \"filter.size.1to10\": \"1 - 10 MB\",\n  \"filter.size.10to100\": \"10 - 100 MB\",\n  \"filter.size.gt100\": \"100 MB üstü\",\n  /* surucu:d1-actions — filtre satırının sonundaki ⋮ menüsü. Yalnızca menünün\n     KENDİ adı yeni: içindeki her satır o eylemin zaten sahip olduğu metni\n     kullanır (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`,\n     `shortcuts.select_all`, `selection.clear`) — bir komutu yeniden adlandıran\n     menü, okuyucuya aynı şeyi iki kez öğretir. */\n  \"filter.actions\": \"Liste işlemleri\",\n  \"filter.clear\": \"Süzgeçleri temizle\",\n  \"filter.empty.title\": \"Bu süzgeçlere uyan bir şey yok\",\n  \"filter.empty.hint\": \"Bir süzgeci kaldır ya da yukarıdaki alandan her yerde ara.\",\n  \"filter.count\": \"{total} öğeden {shown} tanesi\",\n  \"inspector.tab.details\": \"Ayrıntılar\",\n  \"inspector.tab.activity\": \"Etkinlik\",\n  \"inspector.people\": \"Erişimi olan kişiler\",\n  \"inspector.people.you\": \"Sen\",\n  \"inspector.people.inherited\": \"üst klasörden\",\n  \"inspector.people.empty\": \"Yalnızca sen ve aşağıdaki bağlantıya sahip olanlar.\",\n  \"inspector.people.manage\": \"Erişimi yönet\",\n  \"inspector.link\": \"Paylaşım bağlantısı\",\n  \"inspector.link.none\": \"Paylaşılmadı\",\n  \"inspector.link.create\": \"Bağlantı oluştur\",\n  \"inspector.link.copy\": \"Bağlantıyı kopyala\",\n  \"inspector.activity.empty\": \"Bu öğe için henüz etkinlik kaydı yok.\",\n  \"inspector.activity.hint\": \"Sürümler dosya değiştikçe, yorumlar ise insanlar yazdıkça birikir.\",\n  \"inspector.activity.version\": \"{n}. sürüm kaydedildi\",\n  \"inspector.activity.comment\": \"{who} yorum yaptı\",\n  \"inspector.activity.select\": \"Etkinliğini görmek için bir dosya ya da klasör seç.\",\n  /* === /surucu:d1 === */\n  /* i18n:hardcoded — dönüştürme kutusunda hiç anahtar yoktu: her etiket,\n     kimsenin geçirmediği isteğe bağlı bir `t` prop'unun arkasındaki düz\n     Türkçe metindi. */\n  \"convert.title\": \"Dönüştür\",\n  \"convert.loading\": \"Dönüştürücü yükleniyor…\",\n  \"convert.done\": \"Dönüştürüldü ve klasöre yüklendi.\",\n  \"convert.close\": \"Kapat\",\n  \"convert.from\": \"Kaynak\",\n  \"convert.search_format\": \"Hedef format ara (pdf, mp4, png…)\",\n  \"convert.no_format\": \"Eşleşen format yok.\",\n  \"convert.unsupported_input\": \"Bu dosya tipi için kaynak format bulunamadı.\",\n  \"convert.converting\": \"Dönüştürülüyor…\",\n  \"convert.convert\": \"Dönüştür\",\n  /* === gorunum:v1-chrome — filtre satırındaki ad kutusu === */\n  \"filter.find\": \"Bu klasörde filtrele…\",\n  /* surucu:d1-scope — satırların bir klasörün içeriği olmadığı yerlerde aynı\n     kutu. Neyi daralttığını söylemek zorunda: depo listesinde \"bu klasör\" hiçbir\n     şeyi adlandırmaz, Ana sayfada ise üç bloğu birden adlandırırdı. */\n  \"filter.find.storages\": \"Depolarda filtrele…\",\n  \"filter.find.home\": \"Ana sayfada filtrele…\",\n  /* === gorunum:v1-viewer — tam ekran görüntüleyicinin kendi çerçevesi === */\n  \"viewer.share\": \"Paylaş\",\n  \"viewer.nav_prev\": \"Önceki dosya\",\n  \"viewer.nav_next\": \"Sonraki dosya\",\n  /* Üst çubuğun künye satırındaki sayaç: \"246,3 KB • 9 Eyl 2026 • 1 / 9\". */\n  \"viewer.counter\": \"{i} / {n}\",\n  \"viewer.zoom_reset\": \"Yakınlaştırmayı sıfırla\",\n  \"viewer.fullscreen\": \"Tam ekran\",\n  \"viewer.exit_fullscreen\": \"Tam ekrandan çık\",\n  \"viewer.md_placeholder\": \"# Markdown buraya…\",\n  /* === gorunum:v1-selbar — filtre satırının yerini alan seçim çubuğu === */\n  \"selection.count\": \"{n} seçildi\",\n  \"selection.clear\": \"Seçimi temizle\",\n  /* === gorunum:v1-preview — türün adı, kelimeyle =======================\n     Tür sütunu eskiden uzantıyı büyük harfle yazıyordu; artık bunları\n     yazıyor. Hangisinin seçileceğine `lib/fileIcons.ts` karar verir\n     (`typeLabelKey`) — bir türü adlandıran yalnız iki yer var: o tablo ve bu\n     liste. Eşleşmeyen her şey yine büyük harfli uzantıya düşer. `Klasör`\n     burada DEĞİL: o `node.folder`, grid kartının alt yazısı zaten onu basar. */\n  \"ftype.typescript\": \"TypeScript\",\n  \"ftype.javascript\": \"JavaScript\",\n  \"ftype.vue\": \"Vue bileşeni\",\n  \"ftype.python\": \"Python\",\n  \"ftype.go\": \"Go\",\n  \"ftype.rust\": \"Rust\",\n  \"ftype.php\": \"PHP\",\n  \"ftype.ruby\": \"Ruby\",\n  \"ftype.java\": \"Java\",\n  \"ftype.kotlin\": \"Kotlin\",\n  \"ftype.swift\": \"Swift\",\n  \"ftype.c\": \"C kaynağı\",\n  \"ftype.cpp\": \"C++ kaynağı\",\n  \"ftype.csharp\": \"C# kaynağı\",\n  \"ftype.stylesheet\": \"Stil dosyası\",\n  \"ftype.html\": \"HTML belgesi\",\n  \"ftype.json\": \"JSON verisi\",\n  \"ftype.yaml\": \"YAML\",\n  \"ftype.xml\": \"XML\",\n  \"ftype.toml\": \"TOML\",\n  \"ftype.sql\": \"SQL\",\n  \"ftype.shell\": \"Kabuk betiği\",\n  \"ftype.powershell\": \"PowerShell betiği\",\n  \"ftype.markdown\": \"Markdown\",\n  \"ftype.plaintext\": \"Düz metin\",\n  \"ftype.log\": \"Günlük dosyası\",\n  \"ftype.config\": \"Ayar dosyası\",\n  \"ftype.sheet\": \"Hesap tablosu\",\n  \"ftype.figma\": \"Figma tasarımı\",\n  \"ftype.design\": \"Tasarım dosyası\",\n  \"ftype.image\": \"Görsel\",\n  \"ftype.video\": \"Video\",\n  \"ftype.audio\": \"Ses\",\n  \"ftype.pdf\": \"PDF belgesi\",\n  \"ftype.document\": \"Belge\",\n  \"ftype.slides\": \"Sunum\",\n  \"ftype.archive\": \"Arşiv\",\n  \"ftype.code\": \"Kod\",\n  /* === gorunum:v1-advsearch — Gelişmiş arama penceresi ===================\n   * İki `filter.*` anahtarı kardeşlerinin yanında değil burada: paylaşılan\n   * birleşimlere pencerenin eklediği yeni üyeler (`modified: 'around'`,\n   * `size: 'range'`). Filtre satırı bunları hiç seçmez ama biri oraya\n   * ulaşırsa `chipLabel` ham anahtarı yazardı. */\n  \"filter.modified.around\": \"Bir tarihin çevresinde\",\n  \"filter.size.range\": \"Özel aralık\",\n  \"advsearch.open\": \"Gelişmiş arama\",\n  \"advsearch.title\": \"Gelişmiş arama\",\n  \"advsearch.subtitle\": \"Dosyaları ada, içeriğe, yola ya da etikete göre bulun.\",\n  \"advsearch.close\": \"Kapat\",\n  \"advsearch.content.heading\": \"İçerik araması\",\n  \"advsearch.viewall\": \"Tüm sonuçları gör\",\n  \"advsearch.where.any_short\": \"Her yerde\",\n  \"advsearch.where.here_short\": \"Yalnız burada\",\n  \"advsearch.where.skip_short\": \"Burayı atla\",\n  \"advsearch.server.legend\": \"Sunucunun aradığı\",\n  \"advsearch.client.legend\": \"Gelen sonuçları daralt\",\n  \"advsearch.query.label\": \"Kelimeler\",\n  \"advsearch.query.placeholder\": \"Adın bir parçası ya da dosyanın içindeki kelimeler\",\n  \"advsearch.scope.label\": \"Nerede arasın\",\n  \"advsearch.scope.name\": \"Ad ve yol\",\n  \"advsearch.scope.content\": \"Dosya içeriği\",\n  \"advsearch.scope.all\": \"İkisi de\",\n  \"advsearch.scope.hint\": \"İçerik, dizinden aranır; dizin metin türü dosyaların ilk 200 KB’ını kapsar.\",\n  \"advsearch.people.name_only\": \"Sahip, gelen satırlardan okunur; sahip bilgisi taşıyan satırları da yalnız ad araması döndürür.\",\n  \"advsearch.scope.name_only\": \"Burada yalnız ad ve yol: içerik sonucu gezgine hangi depodan geldiği bilgisi olmadan ulaşır, bu yüzden içerik araması yalnız tek depolu kurulumlarda sunulur.\",\n  \"advsearch.tags.label\": \"Etiketler\",\n  \"advsearch.tags.placeholder\": \"fatura, üç aylık rapor\",\n  \"advsearch.tags.exclude\": \"Şu etiketler hariç\",\n  \"advsearch.tags.exclude_placeholder\": \"arşiv\",\n  \"advsearch.tags.hint\": \"Virgülle ayırın. Etiket daraltır: birden çok etiket hepsini birden taşıyan dosyalar demektir, hiç kullanılmamış bir etiket ise hiçbir şey döndürmez.\",\n  \"advsearch.where.label\": \"Klasör\",\n  \"advsearch.where.any\": \"Bu deponun her yerinde\",\n  \"advsearch.where.here\": \"Yalnız {folder} içinde\",\n  \"advsearch.where.skip\": \"{folder} dışındaki her yerde\",\n  \"advsearch.around.label\": \"Şu kadar içinde\",\n  \"advsearch.around.date\": \"Tarih ve saat\",\n  \"advsearch.around.h1\": \"1 saat\",\n  \"advsearch.around.d1\": \"1 gün\",\n  \"advsearch.around.w1\": \"1 hafta\",\n  \"advsearch.size.range_label\": \"Şunun arasında\",\n  \"advsearch.size.from\": \"En az\",\n  \"advsearch.size.to\": \"En çok\",\n  \"advsearch.count.idle\": \"Bir şeyler yazın ya da etiket seçin.\",\n  \"advsearch.count.counting\": \"Sayılıyor…\",\n  \"advsearch.count.result\": \"{n} eşleşen öğe\",\n  \"advsearch.count.capped\": \"Sonuçların ilk sayfasında {n} eşleşen öğe\",\n  \"advsearch.count.result_one\": \"1 eşleşen öğe\",\n  \"advsearch.count.capped_one\": \"Sonuçların ilk sayfasında 1 eşleşen öğe\",\n  \"advsearch.count.error\": \"Sayım çalıştırılamadı.\",\n  \"advsearch.count.cost\": \"Sayım bu aramayı çalıştırır. Tür, sahip, tarih, boyut ve klasör sunucuda değil, gelen satırlar üzerinde uygulanır.\",\n  \"advsearch.wire\": \"Gönderilen\",\n  \"advsearch.reset\": \"Sıfırla\",\n  \"advsearch.cancel\": \"Vazgeç\",\n  \"advsearch.submit\": \"Ara\",\n  /* === gorunum:v2-topbar — sayfanın üst barı kalktı; onun taşıdıklarını\n     artık gezginin kendi başlığı ve kırıntı satırı taşıyor. === */\n  \"breadcrumb.subfolders\": \"Alt klasörler\",\n  \"breadcrumb.subfolders.empty\": \"Burada alt klasör yok\",\n  \"header.admin\": \"Yönetim paneli\",\n  \"header.settings\": \"Ayarlar\",\n  \"header.signout\": \"Çıkış yap\",\n  \"ai.assistant\": \"AI asistanı\",\n  \"ai.soon\": \"Yakında\",\n  \"ai.assistant.soon\": \"AI asistanı — yakında\",\n  /* gorunum:v2-share — Paylaş / İzinler penceresinin kendi çerçevesi. İçindeki\n     denetimler eski metinlerini koruyor; buradakiler yeni kabuk: başlık, tek\n     anahtar, \"şu anda kim açabilir\" cümlesi ve her şeyin katlandığı üç adlı\n     bölüm. */\n  \"access.title\": '\"{name}\" paylaşımı',\n  \"access.close\": \"Kapat\",\n  \"access.done\": \"Bitti\",\n  \"access.copy\": \"Kopyala\",\n  \"access.copied\": \"Kopyalandı\",\n  \"access.link.switch\": \"Bağlantı paylaşımı\",\n  \"access.who.private\": \"Yalnızca erişimi olan kişiler açabilir.\",\n  \"access.who.link\": \"Bağlantıyı bilen herkes açabilir.\",\n  \"access.who.pin\": \"Bağlantıyı ve PIN'i bilen herkes açabilir.\",\n  \"access.who.existing\": \"Bağlantı paylaşımı açık — {n} bağlantı var.\",\n  \"access.who.existing_one\": \"Bağlantı paylaşımı açık — {n} bağlantı var.\",\n  \"access.section.link\": \"Bağlantı seçenekleri\",\n  \"access.section.people\": \"Erişimi olanlar\",\n  \"access.section.drop\": \"Dosya iste\",\n  \"access.sum.pin_on\": \"PIN var\",\n  \"access.sum.pin_off\": \"PIN yok\",\n  \"access.sum.people\": \"{n} kişi\",\n  \"access.sum.people_one\": \"{n} kişi\",\n  \"access.sum.people_none\": \"Henüz kimse yok\",\n  \"access.sum.drop\": \"{n} yükleme bağlantısı\",\n  \"access.sum.drop_one\": \"{n} yükleme bağlantısı\",\n  \"access.sum.drop_none\": \"Yükleme bağlantısı yok\",\n  /* Sahiplik — Sahibi sütunu ve Kişiler çipi. \"Sistem\", filex üzerinden kimsenin\n     koymadığı satırın dürüst karşılığıdır (tarayıcı buldu ya da doğrudan kovaya\n     yazıldı); boşluk değil, gerçek bir cevaptır. */\n  \"col.owner\": \"Sahibi\",\n  \"owner.you\": \"Siz\",\n  \"owner.system\": \"Sistem\",\n  \"owner.unknown\": \"Bilinmiyor\",\n  \"owner.external\": \"Yükleme bağlantısıyla geldi\",\n  \"owner.last_actor\": \"Son değiştiren: {who}\",\n  \"filter.people\": \"Kişiler\",\n  \"filter.people.any\": \"Herkes\",\n  \"filter.people.me\": \"Siz\",\n  \"filter.people.system\": \"Sistem\",\n  \"filter.people.someone\": \"Başka biri\",\n  /* surucu:d1-sort — filtre satırının sağ ucundaki sıralama denetimi. Dört\n     ölçütün adı `col.*`: menü, liste görünümünün sütun başlıklarındaki\n     sözcüklerin aynısını sunar — tek bir sıralamayı süren iki denetim onu\n     farklı adlarla anamaz. */\n  \"sort.by\": \"Sıralama ölçütü\",\n  \"sort.asc\": \"Artan\",\n  \"sort.desc\": \"Azalan\",\n  /* Bir ARAMA SONUCUNUN sırası. Beşinci bir sıralama ölçütü değildir —\n     ekrandaki satırları sunucu sıraladığında denetim, ölçüt adı yerine bunu\n     yazar; böylece yapmadığı bir sıralamayı üstlenmez. `_why` denetimin neden\n     kapalı olduğudur: Burak, denetimin sessizce işlevsizleşmesini değil\n     nedeninin yazılmasını istedi. */\n  \"sort.relevance\": \"Alaka\",\n  \"sort.relevance_why\": \"Arama sonuçları eşleşme yakınlığına göre listelenir. Seçtiğiniz sıralama, aramadan çıkınca geri gelir.\",\n  /* === tablo:t1 — tablonun kendi yapılandırması ==========================\n     Sütun genişlikleri ve görünürlüğü EKRANINIZA dair bir tercihtir; bir\n     klasörün hangi görünümle açılacağı ise KLASÖRE dair bir olgudur. İkisi de\n     buradan ayarlanır; `folder_hint` kuralı tek cümlede, tam da ona şaşıracak\n     kişinin okuyabileceği yerde söyler. */\n  \"col.location\": \"Konum\",\n  \"cols.menu\": \"Sütun seçenekleri\",\n  \"cols.title\": \"Sütunlar\",\n  \"cols.resize\": \"{col} sütununu yeniden boyutlandır\",\n  \"cols.move_left\": \"{col} sütununu sola taşı\",\n  \"cols.move_right\": \"{col} sütununu sağa taşı\",\n  \"cols.reset\": \"Sütunları sıfırla\",\n  \"cols.folder_title\": \"Klasör görünümü\",\n  \"cols.folder_hint\": \"Ayarladığınız klasörler kendi görünümünü korur. Son seçiminiz diğer her yerde varsayılan olur.\",\n  \"cols.forget_folder\": \"Bu klasörün görünümünü unut\",\n  \"cols.apply_all\": \"Tüm klasörlere uygula ({count} klasör hatırlanıyor)\",\n  /* === tablo:t1 — çöp kutusu bilgi şeridi ================================\n     ⚠ `retention` yalnızca kurulum bize sayıyı SÖYLEDİĞİNDE kullanılır\n     (GET /api/admin/protection). Diğer her durumda `retention_unknown` aynı\n     şeyi, doğrulayamadığımız bir süreyi taahhüt etmeden söyler: yanlış saklama\n     süresi yazan bir şerit, hiç şerit olmamasından kötüdür — insanlar ona\n     bakıp karar verir. */\n  \"trash.retention\": \"Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.\",\n  \"trash.retention_one\": \"Çöp kutusundaki öğeler {days} gün sonra kalıcı olarak silinir.\",\n  \"trash.retention_unknown\": \"Çöp kutusundaki öğeler, yöneticinizin belirlediği saklama süresi dolunca kalıcı olarak silinir.\",\n  \"trash.empty_action\": \"Çöp kutusunu boşalt\",\n  \"trash.empty_confirm_title\": \"Çöp kutusu boşaltılsın mı?\",\n  \"trash.empty_confirm_body_one\": \"Bu işlem 1 öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.\",\n  \"trash.empty_confirm_body\": \"Bu işlem {count} öğeyi ({size}) kalıcı olarak siler. Geri alınamaz.\",\n  \"trash.empty_confirm_body_nosize_one\": \"Bu işlem 1 öğeyi kalıcı olarak siler. Geri alınamaz.\",\n  \"trash.empty_confirm_body_nosize\": \"Bu işlem {count} öğeyi kalıcı olarak siler. Geri alınamaz.\",\n  \"trash.emptied\": \"Çöp kutusu boşaltıldı\",\n  \"empty.trash.hint\": \"Sildiğiniz dosyalar önce buraya düşer, böylece geri alabilirsiniz.\",\n  /* tasi:m1 — hedef klasör seçici (modals/DestinationPickerModal.vue) ve\n     üzerine kurulan iki seçim eylemi. */\n  \"destpicker.title.move\": \"Şuraya taşı\",\n  \"destpicker.title.copy\": \"Şuraya kopyala\",\n  \"destpicker.title.choose\": \"Klasör seç\",\n  \"destpicker.confirm.move\": \"Buraya taşı\",\n  \"destpicker.confirm.copy\": \"Buraya kopyala\",\n  \"destpicker.confirm.choose\": \"Bu klasörü seç\",\n  \"destpicker.cancel\": \"Vazgeç\",\n  \"destpicker.up\": \"Bir üst klasör\",\n  \"destpicker.crumbs\": \"Konum\",\n  \"destpicker.drives\": \"Sürücüler\",\n  \"destpicker.loading\": \"Yükleniyor…\",\n  \"destpicker.empty\": \"Burada alt klasör yok\",\n  \"destpicker.unreadable\": \"Bu klasör açılamıyor.\",\n  \"destpicker.readonly\": \"Salt okunur\",\n  \"destpicker.readonly_here\": \"Bu klasöre yazamazsınız.\",\n  \"destpicker.pick_a_drive\": \"Bir klasör seçmek için önce bir depo açın.\",\n  \"destpicker.target\": \"Hedef: {name}\",\n  \"destpicker.tag.blocked\": \"Uygun değil\",\n  \"destpicker.blocked.self\": \"Bir klasör kendi içine taşınamaz.\",\n  \"destpicker.blocked.descendant\": \"Bir klasör kendi alt klasörlerinden birine taşınamaz.\",\n  \"ctx.move_to\": \"Şuraya taşı…\",\n  \"ctx.copy_to\": \"Şuraya kopyala…\",\n  \"ctx.access.one_only\": \"Paylaşım aynı anda tek öğe için çalışır.\",\n  \"toast.archive.preparing\": \"Arşiv hazırlanıyor…\",\n  \"toast.archive.started\": \"{name} indiriliyor ({count} dosya)\",\n  \"toast.archive.started_one\": \"{name} indiriliyor ({count} dosya)\",\n  \"toast.archive.empty\": \"İndirilecek bir şey yok — seçimde okunabilir dosya bulunmuyor.\",\n  \"toast.moved_to\": \"{name} klasörüne taşındı\",\n  \"toast.copied_to\": \"{name} klasörüne kopyalama kuyruğa alındı\"\n}, Iv = {\n  \"toolbar.new_folder\": \"New folder\",\n  \"toolbar.upload\": \"Upload\",\n  \"toolbar.search\": \"Search\",\n  \"toolbar.search.placeholder\": \"Search by name or tag:…\",\n  \"toolbar.view.list\": \"List\",\n  \"toolbar.view.grid\": \"Grid\",\n  \"toolbar.refresh\": \"Refresh\",\n  \"toolbar.go_up\": \"Up one level\",\n  \"ctx.open\": \"Open\",\n  \"ctx.preview\": \"Preview\",\n  \"ctx.download\": \"Download\",\n  \"ctx.convert\": \"Convert\",\n  \"ctx.rename\": \"Rename\",\n  \"ctx.delete\": \"Delete\",\n  \"ctx.delete_perm\": \"Delete Permanently\",\n  \"ctx.restore\": \"Restore\",\n  \"ctx.share\": \"Share\",\n  \"ctx.move\": \"Move\",\n  \"ctx.copy\": \"Copy\",\n  \"ctx.cut\": \"Cut\",\n  \"ctx.show_hidden\": \"Show hidden files\",\n  \"ctx.hide_hidden\": \"Hide hidden files\",\n  \"ctx.keep_local\": \"Keep on this computer\",\n  \"ctx.keep_online\": \"Keep online only\",\n  \"ctx.keep_reveal\": \"Open local folder\",\n  \"ctx.keep_inherited\": \"Kept on this computer with its parent\",\n  \"keep.started\": \"Will be kept on this computer — sync started\",\n  \"keep.failed\": \"Could not keep on this computer\",\n  \"keep.badge_kept\": \"On this computer\",\n  \"keep.badge_syncing\": \"Syncing…\",\n  \"keep.badge_cloud\": \"Online only\",\n  \"keep.badge_partial\": \"Contains items kept on this computer\",\n  \"keep.strip_transfer\": \"Syncing {name} — {done}/{total} ({pct}%)\",\n  \"keep.strip_inventory\": \"Syncing {name} — scanning the server…\",\n  \"keep.strip_settling\": \"Syncing {name} — settling…\",\n  \"ctx.paste\": \"Paste\",\n  \"ctx.info\": \"Info\",\n  \"ctx.duplicate\": \"Duplicate\",\n  \"ctx.new_file\": \"New file\",\n  \"modal.delete.title\": \"Delete?\",\n  \"modal.delete.message\": \"{count} items will be moved to trash.\",\n  \"modal.delete.message_one\": \"1 item will be moved to trash.\",\n  \"modal.delete.confirm\": \"Move to Trash\",\n  \"modal.delete.cancel\": \"Cancel\",\n  \"modal.rename.title\": \"Rename\",\n  \"modal.rename.save\": \"Save\",\n  \"modal.rename.cancel\": \"Cancel\",\n  \"modal.newfolder.title\": \"New folder\",\n  \"modal.newfolder.placeholder\": \"Folder name\",\n  \"modal.newfolder.create\": \"Create\",\n  \"modal.newfolder.cancel\": \"Cancel\",\n  \"modal.share.title\": \"Share Link\",\n  \"modal.share.pin\": \"PIN protected\",\n  \"modal.share.expires\": \"Expires at\",\n  \"modal.share.max_downloads\": \"Download limit\",\n  \"modal.share.create\": \"Share\",\n  \"modal.share.cancel\": \"Cancel\",\n  \"modal.share.close\": \"Close\",\n  \"modal.share.limit_applied\": \"(server limit applied)\",\n  \"modal.share.copy\": \"Copy\",\n  \"modal.share.url_copied\": \"Link copied\",\n  \"modal.share.pin_copied\": \"PIN copied\",\n  \"modal.share.cli_copied\": \"CLI command copied\",\n  \"upload.progress\": \"Uploading\",\n  \"upload.done\": \"Done\",\n  \"upload.error\": \"Error\",\n  \"upload.failed\": \"Could not upload “{name}”\",\n  \"upload.aborted\": \"Aborted\",\n  \"upload.cancel\": \"Cancel\",\n  \"upload.resuming\": \"Resuming “{name}” from {percent}%\",\n  \"upload.committing\": \"Finishing\",\n  \"upload.transferring\": \"Moving to storage\",\n  \"empty.folder\": \"This folder is empty\",\n  \"empty.search\": \"No results\",\n  loading: \"Loading…\",\n  \"notFound.title\": \"Folder not found\",\n  \"notFound.desc\": \"This folder does not exist, was moved, or you do not have access to it.\",\n  \"notFound.goRoot\": \"Go to root folder\",\n  \"col.name\": \"Name\",\n  \"col.size\": \"Size\",\n  \"col.modified\": \"Modified\",\n  \"col.type\": \"Type\",\n  \"unit.bytes\": \"B\",\n  \"unit.kb\": \"KB\",\n  \"unit.mb\": \"MB\",\n  \"unit.gb\": \"GB\",\n  \"unit.tb\": \"TB\",\n  \"unit.pb\": \"PB\",\n  \"breadcrumb.root\": \"Root\",\n  \"breadcrumb.copy_path\": \"Copy path\",\n  \"breadcrumb.go_to_path\": \"Go to path\",\n  \"breadcrumb.path_placeholder\": \"fileman/foo/bar\",\n  \"ops.copy\": \"Copying\",\n  \"ops.move\": \"Moving\",\n  \"ops.delete\": \"Deleting\",\n  \"ops.queued\": \"queued\",\n  \"ops.done\": \"done\",\n  \"ops.error\": \"error\",\n  \"node.trash\": \"Trash\",\n  /* gorunum:v1 — the singular kind, printed under a folder's name on a card\n   * and beside it in the list. The plural section heading is a different\n   * string on purpose. */\n  \"node.folder\": \"Folder\",\n  // ——— Rich viewer chrome ———\n  \"viewer.open_in_new_tab\": \"Open in new tab\",\n  \"viewer.loading\": \"Loading…\",\n  \"viewer.failed_to_load\": \"Failed to load file\",\n  \"viewer.peer_not_installed\": \"Optional viewer library is not installed. Install the peer dependency or use the download button.\",\n  \"viewer.format_unsupported_3d\": \"This 3D format is not supported in the browser preview (model-viewer only reads .glb / .gltf / .usdz). Please download and open with a local tool.\",\n  \"viewer.zoom_in\": \"Zoom in\",\n  \"viewer.zoom_out\": \"Zoom out\",\n  \"viewer.fit_width\": \"Fit width\",\n  \"viewer.next_page\": \"Next page\",\n  \"viewer.prev_page\": \"Previous page\",\n  \"viewer.page_n_of_m\": \"Page {n} of {m}\",\n  \"viewer.tags\": \"Tags\",\n  \"viewer.layers\": \"Layers\",\n  \"viewer.toc\": \"Contents\",\n  \"viewer.font_smaller\": \"Smaller text\",\n  \"viewer.font_larger\": \"Larger text\",\n  \"viewer.search\": \"Search\",\n  \"viewer.download\": \"Download\",\n  \"viewer.saving\": \"Saving…\",\n  \"viewer.save\": \"Save (Ctrl+S)\",\n  \"viewer.saved\": \"Saved\",\n  \"viewer.save_error\": \"Error\",\n  \"viewer.editor_loading\": \"Loading editor…\",\n  \"viewer.no_preview\": \"No preview for this file type yet.\",\n  \"viewer.edit\": \"Edit\",\n  \"viewer.close\": \"Close\",\n  \"presence.expand\": \"Show names\",\n  \"presence.collapse\": \"Collapse\",\n  \"viewer.save_annotations\": \"Save annotations\",\n  \"viewer.annotations_on\": \"Annotations: on\",\n  \"viewer.annotations_off\": \"Annotations: off\",\n  \"viewer.read_only\": \"Read only\",\n  \"viewer.csv_first_row_header\": \"First row as header\",\n  \"viewer.csv_filter\": \"Filter rows…\",\n  \"viewer.epub_prev\": \"Previous\",\n  \"viewer.epub_next\": \"Next\",\n  \"viewer.drawio.disabled\": \"diagrams.net embed is not configured for this filex instance — operator must wire FILEX_DRAWIO_URL to enable the editor.\",\n  \"viewer.archive.entries\": \"{n} files\",\n  \"viewer.archive.entries_one\": \"1 file\",\n  \"viewer.archive.empty\": \"Archive is empty.\",\n  \"viewer.archive.error\": \"Could not read archive contents.\",\n  \"viewer.name\": \"Name\",\n  \"viewer.size\": \"Size\",\n  // ——— cila:a — sorting / date groups / density ———\n  \"col.sort\": \"Sort\",\n  \"group.today\": \"Today\",\n  \"group.yesterday\": \"Yesterday\",\n  \"group.this_week\": \"This Week\",\n  \"group.this_month\": \"This Month\",\n  \"group.no_date\": \"No date\",\n  \"toolbar.density.compact\": \"Compact view\",\n  \"toolbar.density.comfortable\": \"Comfortable view\",\n  // ——— cila:c — command palette + shortcuts help + breadcrumb ———\n  \"palette.placeholder\": \"Search files, folders or commands…\",\n  \"palette.files\": \"Files\",\n  \"palette.commands\": \"Commands\",\n  \"palette.goto\": \"Go to path\",\n  \"palette.empty\": \"No results\",\n  \"palette.hint\": \"↑↓ navigate · Enter select · Esc close\",\n  \"cmd.view_toggle\": \"Toggle view (list ⇄ grid)\",\n  \"cmd.trash\": \"Open trash\",\n  \"shortcuts.title\": \"Keyboard Shortcuts\",\n  \"shortcuts.group.nav\": \"Navigation\",\n  \"shortcuts.group.selection\": \"Selection\",\n  \"shortcuts.group.file\": \"File operations\",\n  \"shortcuts.palette\": \"Command palette\",\n  \"shortcuts.search\": \"Focus search\",\n  \"shortcuts.go_up\": \"Go up one level\",\n  \"shortcuts.open\": \"Open selected item\",\n  \"shortcuts.close\": \"Close / cancel\",\n  \"shortcuts.toggle_hidden\": \"Show/hide hidden files\",\n  \"shortcuts.help\": \"This help dialog\",\n  \"shortcuts.select_all\": \"Select all\",\n  \"shortcuts.star\": \"Star / unstar\",\n  \"shortcuts.rename\": \"Rename\",\n  \"shortcuts.delete\": \"Delete\",\n  \"shortcuts.cut\": \"Cut\",\n  \"shortcuts.copy\": \"Copy\",\n  \"shortcuts.paste\": \"Paste\",\n  \"breadcrumb.more\": \"Hidden folders\",\n  // ——— State screens + undo snackbar + connection badge (cila:b) ———\n  \"empty.hint\": \"Drag and drop files here\",\n  \"empty.upload\": \"Upload files\",\n  \"empty.search.title\": \"No files match your search\",\n  \"empty.search.hint\": \"Try a different search term\",\n  \"empty.trash.title\": \"Trash is empty\",\n  \"error.title\": \"Could not load this folder\",\n  \"error.retry\": \"Try again\",\n  \"toast.undo\": \"Undo\",\n  \"toast.undone\": \"Undone\",\n  \"toast.undo_failed\": \"Could not undo\",\n  \"toast.renamed\": \"Renamed\",\n  \"toast.moved\": \"Moved\",\n  \"toast.trashed\": \"Moved to trash\",\n  /* i18n:hardcoded — toast copy that used to be Turkish string literals in\n     FileExplorer.vue, unreachable by any locale. */\n  \"toast.failed\": \"Operation failed\",\n  \"toast.copied\": \"Copied\",\n  \"toast.deleted\": \"Deleted\",\n  \"toast.cut\": \"Cut\",\n  \"toast.cut_ready\": \"Cut — ready to paste\",\n  \"toast.copy_ready\": \"Copied — ready to paste\",\n  \"toast.same_folder_cut\": \"Cannot cut into the same folder\",\n  \"toast.restored\": \"{n} items restored\",\n  \"toast.restored_one\": \"1 item restored\",\n  \"toast.restore_taken\": \"{n} items were not restored: something already has their names. Rename what is there, then restore again.\",\n  \"toast.restore_taken_one\": \"“{name}” was not restored: something already has that name. Rename what is there, then restore again.\",\n  \"toast.delete_queued\": \"Delete queued\",\n  \"toast.trash_retention\": \"Items in the trash are removed automatically once the retention window ends. Permanent deletion is done from the admin panel.\",\n  \"dropzone.hint\": \"Drop files here\",\n  \"modal.newfolder.invalid\": \"Invalid character\",\n  \"viewer.office_unconfigured\": \"OnlyOffice is not configured\",\n  \"viewer.pdf_inline_failed\": \"Your browser could not display this PDF inline.\",\n  \"viewer.too_large\": \"File is too large (>1 MB).\",\n  \"viewer.csv_rows\": \"{n} rows\",\n  \"viewer.csv_rows_one\": \"1 row\",\n  \"presence.others\": \"{n} people\",\n  \"presence.others_one\": \"1 person\",\n  \"conn.offline\": \"No live connection — changes may be delayed\",\n  \"conn.tooltip\": \"Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.\",\n  /* === bul:s3 === */\n  \"palette.everywhere\": \"Everywhere\",\n  \"palette.searching\": \"Searching…\",\n  \"palette.saved\": \"Saved searches\",\n  \"palette.save\": \"Save search\",\n  \"palette.saved.delete\": \"Delete saved search\",\n  \"search.in_content\": \"In content\",\n  /* === bag:b4 === */\n  \"toolbar.more\": \"More actions\",\n  \"toolbar.search.close\": \"Close search\",\n  \"sheet.menu\": \"Actions\",\n  \"sheet.close\": \"Close\",\n  /* === koru:k1 === */\n  \"toolbar.inspector\": \"Details\",\n  \"ctx.details\": \"Details\",\n  /* yildiz:s1 — starring is an action, so it has a verb in the menu. */\n  \"ctx.star\": \"Star\",\n  \"ctx.unstar\": \"Unstar\",\n  \"star.failed\": \"Could not change the star\",\n  \"shortcuts.inspector\": \"Toggle details panel\",\n  \"inspector.title\": \"Details\",\n  \"inspector.copy_name\": \"Copy name\",\n  \"inspector.items\": \"{n} items\",\n  \"inspector.items_one\": \"1 item\",\n  \"inspector.type\": \"Type\",\n  \"inspector.select_hint\": \"Select an item to see its details.\",\n  /* pane:p1 — the panel HOLDS the last selected thing (owner's ruling,\n     2026-09-13), so it can be describing an item in the half of a split\n     window nobody is looking at. This line says which one and where. */\n  \"inspector.held\": \"Last selected — in {where}\",\n  \"inspector.close\": \"Close\",\n  \"inspector.section.general\": \"General\",\n  \"inspector.section.tags\": \"Tags\",\n  /* etiket:t1 — TagPicker's own chrome. It printed these three in English\n     regardless of the catalogue until 2026-09-13; `tags.open` is the chip's new\n     \"show me everything with this tag\". */\n  \"tags.open\": \"Open tag: {tag}\",\n  \"tags.add\": \"+ Add tag\",\n  \"tags.name\": \"Tag name\",\n  \"tags.remove\": \"Remove tag\",\n  \"inspector.section.versions\": \"Versions\",\n  \"inspector.section.permissions\": \"Permissions\",\n  \"inspector.section.shares\": \"Shares\",\n  \"inspector.path\": \"Path\",\n  \"inspector.size\": \"Size\",\n  \"inspector.modified\": \"Modified\",\n  \"inspector.mime\": \"MIME type\",\n  \"inspector.etag\": \"ETag\",\n  \"inspector.nodeId\": \"Node ID\",\n  \"inspector.copy\": \"Copy\",\n  \"inspector.copied\": \"Copied\",\n  \"inspector.error\": \"Could not load\",\n  \"inspector.items_summary\": \"{n} items, {size} total\",\n  \"inspector.items_summary_one\": \"1 item, {size} total\",\n  \"inspector.folder_items\": \"{n} items\",\n  \"inspector.folder_items_one\": \"1 item\",\n  \"inspector.versions.empty\": \"No version history\",\n  \"inspector.versions.v\": \"Version {n}\",\n  \"inspector.versions.restore\": \"Restore\",\n  \"inspector.versions.restore_confirm\": \"Restore this version?\",\n  \"inspector.versions.snapshot_current\": \"Snapshot the current state first\",\n  \"inspector.versions.confirm\": \"Confirm\",\n  \"inspector.versions.cancel\": \"Cancel\",\n  \"inspector.versions.take_snapshot\": \"Snapshot current state\",\n  \"inspector.versions.restored\": \"Version restored\",\n  \"inspector.versions.snapshotted\": \"Snapshot taken\",\n  \"inspector.versions.unsupported\": \"The server does not support this operation\",\n  \"inspector.perm.none\": \"No access\",\n  \"inspector.perm.viewer\": \"Viewer\",\n  \"inspector.perm.editor\": \"Editor\",\n  \"inspector.perm.owner\": \"Owner\",\n  \"inspector.perm.manage\": \"Manage permissions\",\n  \"inspector.shares.empty\": \"No share links\",\n  \"inspector.shares.copy\": \"Copy link\",\n  /* wiring:c1 — theme gallery */\n  \"theme.menu\": \"Theme\",\n  \"theme.title\": \"Theme Gallery\",\n  \"theme.hint\": \"A theme only changes the colour palette — day or night is the choice above.\",\n  \"theme.mode.label\": \"Appearance\",\n  \"theme.mode.light\": \"Day\",\n  \"theme.mode.dark\": \"Night\",\n  \"theme.mode.auto\": \"Automatic\",\n  \"theme.reset\": \"Reset to default\",\n  \"theme.close\": \"Close\",\n  \"theme.selected\": \"Selected\",\n  \"theme.name.default\": \"Default\",\n  \"theme.name.night\": \"Night Blue\",\n  \"theme.name.forest\": \"Forest\",\n  \"theme.name.amber\": \"Amber\",\n  \"theme.name.lilac\": \"Lilac\",\n  \"theme.name.contrast\": \"High Contrast\",\n  \"theme.name.gray\": \"Soft Gray\",\n  \"theme.name.terminal\": \"Terminal Green\",\n  /* === zaman:z3 — the time-zone picker (embed dialog + web settings) === */\n  \"tz.menu\": \"Time zone\",\n  \"tz.title\": \"Time zone\",\n  \"tz.label\": \"Show dates in\",\n  \"tz.search\": 'Search a city, country or offset — try \"Istanbul\" or \"GMT+3\"',\n  \"tz.default.device\": \"Use this device's zone ({zone})\",\n  \"tz.default.account\": \"Use the account's zone ({zone})\",\n  \"tz.default.host\": \"Use this site's default ({zone})\",\n  \"tz.no_match\": \"No zone matches “{query}”. Try a city, a country, or an offset like GMT+3.\",\n  \"tz.more\": \"{n} more — keep typing to narrow the list.\",\n  \"tz.hint\": \"Saved in this browser only. Every date is stored as one moment in time and shown on the clock you pick here.\",\n  \"tz.now\": \"Right now in {zone}: {time}\",\n  /* === wiring:c2 — customizable shortcuts + quick look === */\n  \"shortcuts.quicklook\": \"Quick look\",\n  \"shortcuts.customize\": \"Customize\",\n  \"shortcuts.settings.menu\": \"Shortcuts\",\n  \"shortcuts.settings.title\": \"Shortcut Settings\",\n  \"shortcuts.settings.hint\": 'To remap a shortcut, press \"Change\" and then the new key combination. Changes are stored in this browser only.',\n  \"shortcuts.settings.change\": \"Change\",\n  \"shortcuts.settings.capture\": \"Press keys… (Esc cancels)\",\n  \"shortcuts.settings.reset\": \"Reset to default\",\n  \"shortcuts.settings.reset_all\": \"Reset all\",\n  \"shortcuts.settings.unbound\": \"Not set\",\n  \"shortcuts.settings.fixed\": \"Fixed\",\n  \"shortcuts.settings.customized\": \"Customized\",\n  \"shortcuts.settings.conflict\": 'is already used by \"{name}\".',\n  \"shortcuts.settings.conflict_fixed\": 'is reserved by the fixed shortcut \"{name}\" — it cannot be used.',\n  \"shortcuts.settings.conflict_take\": \"Unassign old and use here\",\n  \"shortcuts.settings.conflict_cancel\": \"Cancel\",\n  \"quicklook.hint_close\": \"close\",\n  \"quicklook.hint_nav\": \"previous/next\",\n  \"quicklook.hint_open\": \"open\",\n  /* === /wiring:c2 === */\n  /* === wiring:c3 — operations center === */\n  \"opc.title\": \"Operations\",\n  \"opc.aria_badge\": \"{n} operations — toggle operations center\",\n  \"opc.aria_badge_one\": \"1 operation — toggle operations center\",\n  \"opc.close\": \"Close\",\n  \"opc.active\": \"In progress\",\n  \"opc.history\": \"History\",\n  \"opc.clear\": \"Clear\",\n  \"opc.empty\": \"No operations\",\n  \"opc.cancel\": \"Cancel\",\n  \"opc.retry\": \"Retry\",\n  \"opc.dismiss\": \"Dismiss\",\n  \"opc.queued\": \"Queued\",\n  \"opc.percent\": \"{n}%\",\n  \"opc.status.running\": \"In progress\",\n  \"opc.status.done\": \"Done\",\n  \"opc.status.error\": \"Failed\",\n  \"opc.status.aborted\": \"Cancelled\",\n  \"opc.kind.upload\": \"Upload\",\n  \"opc.kind.copy\": \"Copy\",\n  \"opc.kind.move\": \"Move\",\n  \"opc.kind.delete\": \"Delete\",\n  \"opc.kind.convert\": \"Convert\",\n  \"opc.kind.archive\": \"Archive\",\n  /* === wiring:c4 — onboarding tour + accessibility + error card === */\n  \"tour.aria\": \"Onboarding tour\",\n  \"tour.restart\": \"Restart the tour\",\n  \"tour.skip\": \"Skip tour\",\n  \"tour.back\": \"Back\",\n  \"tour.next\": \"Next\",\n  \"tour.done\": \"Done\",\n  \"tour.progress\": \"{n} / {m}\",\n  \"tour.step.nav.title\": \"Storages & views\",\n  \"tour.step.nav.desc\": \"Home, Shared with me, Recent, Starred and Trash are always in this panel, with your storages and connections underneath. The button in the top-left corner collapses it to a rail and brings it back.\",\n  \"tour.step.nav.desc_closed\": \"This button opens the navigation panel: Home, Shared with me, Recent, Starred and Trash, with your storages and connections underneath.\",\n  \"tour.step.new.title\": \"Add something\",\n  \"tour.step.new.desc\": \"Everything new starts here — upload from this device, create a folder, or ask somebody else for a file. Dropping files onto the window uploads them as well.\",\n  \"tour.step.new.desc_fab\": \"This button uploads files from this device. Dropping files onto the window works as well.\",\n  \"tour.step.search.title\": \"Search\",\n  \"tour.step.search.desc\": 'This field searches the whole storage by name — separators and one typo are forgiven, so \"invoice 2026\" finds invoice_2026.pdf. Add tag:invoice to filter by tag. The sliders button opens advanced search, and {palette} opens the command palette, which runs commands too.',\n  \"tour.step.crumb.title\": \"Where you are\",\n  \"tour.step.crumb.desc\": \"This trail is the address of the folder on screen. Click any step to go back up, and the chevron beside the last one lists the folders inside it.\",\n  \"tour.step.filters.title\": \"Narrow the list\",\n  \"tour.step.filters.desc\": \"Type, People, Modified and Size filter the folder you are in, the box beside them matches names as you type, and the control at the end of the row sorts.\",\n  \"tour.step.view.title\": \"Switch views\",\n  \"tour.step.view.desc\": \"Change how this folder is drawn; your choice is remembered.\",\n  \"tour.step.details.title\": \"Details & sharing\",\n  \"tour.step.details.desc\": 'Select a file and open this panel for its details, its activity and its share links. For the full menu, right-click the file or use the button at the end of its row — \"Share / Permissions\" there creates a link with an optional PIN and expiry.',\n  \"tour.step.help.title\": \"Shortcuts\",\n  \"tour.step.help.desc\": 'Press {help} for the shortcut cheat-sheet and {palette} for the command palette. Theme and \"Restart the tour\" are in the \"More actions\" menu at the top right; your account and sign-out are behind the avatar beside it.',\n  \"error.hint\": \"This may be a temporary network or server problem. Please try again.\",\n  \"error.details\": \"Technical details\",\n  \"col.star\": \"Star\",\n  \"toolbar.view_label\": \"View\",\n  \"list.aria\": \"File list\",\n  \"grid.aria\": \"File grid\",\n  /* === wiring:d1 — tabs + split pane === */\n  \"tabs.strip\": \"Tabs\",\n  \"tabs.new\": \"New tab\",\n  \"tabs.close\": \"Close tab\",\n  \"tabs.split\": \"Split view\",\n  \"tabs.split_off\": \"Close split\",\n  \"ctx.open_new_tab\": \"Open in new tab\",\n  \"shortcuts.group.tabs\": \"Tabs\",\n  \"shortcuts.tab_new\": \"New tab\",\n  \"shortcuts.tab_close\": \"Close tab\",\n  \"shortcuts.tab_next\": \"Next tab\",\n  \"shortcuts.tab_prev\": \"Previous tab\",\n  /* tus:t1 — the menu verbs */\n  \"shortcuts.new_folder\": \"New folder\",\n  \"shortcuts.upload\": \"Upload files\",\n  \"shortcuts.refresh\": \"Refresh the listing\",\n  \"shortcuts.download\": \"Download\",\n  \"shortcuts.preview\": \"Preview\",\n  \"shortcuts.share\": \"Share / permissions\",\n  \"shortcuts.tags\": \"Tags\",\n  \"shortcuts.convert\": \"Convert\",\n  \"shortcuts.open_tab\": \"Open in a new tab\",\n  \"shortcuts.copy_path\": \"Copy path\",\n  \"shortcuts.copy_id\": \"Copy id\",\n  \"shortcuts.restore\": \"Restore from trash\",\n  \"shortcuts.settings.reserved\": \"is taken by the browser before the page sees it, so it would do nothing here. Pick another key.\",\n  \"shortcuts.settings.reserved_badge\": \"Desktop app only\",\n  \"shortcuts.settings.reserved_title\": \"The browser handles this combination itself. It fires in the desktop app and in an installed PWA, not in a browser tab.\",\n  \"cmd.tab_new\": \"Open a new tab\",\n  \"cmd.split_toggle\": \"Toggle split view\",\n  \"split.pane\": \"Secondary pane\",\n  \"split.close\": \"Close the side pane\",\n  \"split.error\": \"Could not load the listing\",\n  \"split.retry\": \"Retry\",\n  \"split.copy_queued\": \"Copy queued\",\n  \"split.move_queued\": \"Move queued\",\n  \"toast.move_kept_both\": \"Move queued. A name was already taken there, so that item will be kept beside the existing one with “-copy” added. This move cannot be undone.\",\n  \"split.cross_copy\": \"Different storages — copy queued instead\",\n  \"dragout.downloading\": \"Downloading into the folder you dropped on…\",\n  \"dragout.not_found\": \"Could not find where it was dropped — a drop onto an application (rather than a folder) cannot be filled in\",\n  \"dragout.done\": \"Download finished\",\n  \"dragout.ready\": \"Files are ready — drag them to your desktop\",\n  \"dragout.preparing\": \"Getting them ready to drag…\",\n  \"split.cross_move\": \"Different storages — move queued (bytes travel, then the original is removed)\",\n  /* === /wiring:d1 === */\n  /* wiring:d2 — gallery view */\n  \"toolbar.view.gallery\": \"Gallery\",\n  \"gallery.aria\": \"File gallery\",\n  /* /wiring:d2 */\n  /* wiring:d3 — inspector node comments */\n  \"inspector.section.comments\": \"Comments\",\n  \"inspector.comments.empty\": \"No comments yet.\",\n  \"inspector.comments.placeholder\": \"Write a comment…\",\n  \"inspector.comments.send\": \"Send\",\n  \"inspector.comments.delete\": \"Delete comment\",\n  /* wiring:e2 — end-to-end encrypted folders */\n  \"e2e.create.title\": \"Create encrypted folder\",\n  \"e2e.create.option\": \"Create encrypted folder…\",\n  \"e2e.create.pw_label\": \"Folder password\",\n  \"e2e.create.pw_placeholder\": \"At least 8 characters\",\n  \"e2e.create.pw2_label\": \"Repeat the password\",\n  \"e2e.create.warn_title\": \"NO WAY BACK\",\n  \"e2e.create.warn_body\": \"Files in this folder can only be opened with this password or the recovery key shown once when the folder is created. The password is NEVER stored on the server, and filex keeps no copy of the recovery key either. Lose both and the contents are gone for good.\",\n  \"e2e.create.ack\": \"I understand: if I lose both the password and the recovery key, my data cannot be recovered.\",\n  \"e2e.create.ack_required\": \"Please confirm the warning to continue.\",\n  \"e2e.create.pw_short\": \"Password must be at least 8 characters.\",\n  \"e2e.create.pw_mismatch\": \"Passwords do not match.\",\n  \"e2e.create.bad_name\": \"Invalid folder name.\",\n  \"e2e.create.create\": \"Create encrypted folder\",\n  \"e2e.create.busy\": \"Creating…\",\n  \"e2e.create.done\": \"Encrypted folder created\",\n  \"e2e.create.failed\": \"Could not create the encrypted folder\",\n  \"e2e.create.nested\": \"You cannot create an encrypted folder inside another one.\",\n  \"e2e.locked.title\": \"This folder is end-to-end encrypted\",\n  \"e2e.locked.hint\": \"Enter the folder password to see its contents. The password stays in this tab’s memory only.\",\n  \"e2e.locked.pw_placeholder\": \"Folder password\",\n  \"e2e.locked.unlock\": \"Unlock\",\n  \"e2e.locked.busy\": \"Verifying…\",\n  \"e2e.unlock.wrong\": \"Wrong password.\",\n  \"e2e.unlock.marker_missing\": \"Could not read the key file (.filex-e2e.json).\",\n  /* ikon:emoji — the listing marker's accessible name. The row used to print\n     a 🔒 and nothing else; the padlock that replaced it is aria-hidden inside\n     the tile, so the span that carries it says this instead. */\n  \"e2e.badge\": \"Encrypted folder\",\n  \"e2e.strip.label\": \"Encrypted folder — unlocked\",\n  \"e2e.strip.lock\": \"Lock\",\n  \"e2e.locked_toast\": \"Folder locked\",\n  \"e2e.upload.too_big\": \"Files over 200 MB cannot be uploaded to an encrypted folder (MVP limit)\",\n  \"e2e.upload.locked\": \"Unlock the folder first\",\n  \"e2e.decrypting\": \"Decrypting…\",\n  \"e2e.decrypt_failed\": \"Could not decrypt the file (password changed or file corrupted).\",\n  /* wiring:e2 recovery — recovery keys + operator escrow */\n  \"e2e.create.escrow_title\": \"This server holds a second key\",\n  \"e2e.create.escrow_body\": \"Key escrow is enabled on this installation, so its operator can open this folder without your password. Using that key notifies you. Escrow is fixed when the server is installed and cannot be turned off for a folder.\",\n  \"e2e.locked.use_recovery\": \"Lost the password? Use a recovery key\",\n  \"e2e.recovery.title\": \"Save your recovery key\",\n  \"e2e.recovery.title_upgraded\": \"Your recovery key\",\n  \"e2e.recovery.lead\": \"This key opens the folder without its password. It is shown once — filex does not store it and cannot show it again.\",\n  \"e2e.recovery.lead_upgraded\": \"This folder now has a recovery key. It opens the folder without its password, is shown once, and is not stored by filex.\",\n  \"e2e.recovery.copy\": \"Copy\",\n  \"e2e.recovery.copied\": \"Copied\",\n  \"e2e.recovery.download\": \"Download as a file\",\n  \"e2e.recovery.warn_title\": \"TREAT THIS LIKE A PASSWORD\",\n  \"e2e.recovery.warn_body\": \"Anyone holding this key can read the folder. Keep it somewhere separate from the password — a key stored next to the password protects you from forgetting, not from anyone else.\",\n  \"e2e.recovery.escrow_title\": \"This server also holds a key\",\n  \"e2e.recovery.escrow_body\": \"Key escrow is enabled here, so the operator of this installation can open this folder without your password. You are notified when that key is used.\",\n  \"e2e.recovery.escrow_kid\": \"Escrow key\",\n  \"e2e.recovery.ack\": \"I have saved this key somewhere safe.\",\n  \"e2e.recovery.done\": \"Done\",\n  \"e2e.recover.title\": \"Unlock without the password\",\n  \"e2e.recover.none\": \"This folder was created before recovery keys existed, so it has none. Its password is the only way in. Unlock it with the password once and filex will offer to add a recovery key.\",\n  \"e2e.recover.tab_recovery\": \"Recovery key\",\n  \"e2e.recover.tab_escrow\": \"Escrow key\",\n  \"e2e.recover.recovery_hint\": \"The key shown once when this folder was created.\",\n  \"e2e.recover.recovery_placeholder\": \"XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX\",\n  \"e2e.recover.escrow_warn_title\": \"The owner will be told\",\n  \"e2e.recover.escrow_warn_body\": \"Opening a folder with the escrow key notifies its owner. Use it only when you are entitled to.\",\n  \"e2e.recover.escrow_kid\": \"Escrow key\",\n  \"e2e.recover.escrow_predates\": \"This installation has an escrow key, but this folder does not. It was created before escrow was turned on here, so its master key was never wrapped to the escrow identity. The escrow key will not open it. Nothing the operator can do changes that — adding a slot needs this folder’s password, which the server has never had. The folder’s owner can grant it: unlock with the password, then choose to give the operator a key. Until they do, use the password or the recovery key.\",\n  \"e2e.recover.escrow_other_key\": \"This folder carries an escrow key from a DIFFERENT installation. It was created elsewhere and restored here, so this installation’s escrow key does not open it. Only the private key belonging to the escrow key it was sealed to can.\",\n  \"e2e.recover.escrow_placeholder\": \"Paste the escrow private key (PKCS#8, base64 or PEM)\",\n  \"e2e.recover.bad_format\": \"That does not look like a recovery key. It is 32 characters in eight groups of four.\",\n  \"e2e.recover.escrow_required\": \"Paste the escrow private key.\",\n  \"e2e.recover.wrong_recovery\": \"That recovery key does not open this folder.\",\n  \"e2e.recover.wrong_escrow\": \"That escrow key does not open this folder. Folders created before escrow was enabled have no escrow key, and cannot be given one.\",\n  \"e2e.recover.bad_escrow_key\": \"That is not a readable private key (expected PKCS#8, base64 or PEM).\",\n  \"e2e.recover.notify_failed\": \"Could not notify the folder owner, so the folder was not unlocked. Escrow use is always announced.\",\n  \"e2e.recover.recovery_done\": \"Unlocked with the recovery key\",\n  \"e2e.recover.escrow_done\": \"Unlocked with the escrow key — the owner has been notified\",\n  \"e2e.recover.unlock\": \"Unlock\",\n  \"e2e.recover.busy\": \"Unlocking…\",\n  \"e2e.escrowoffer.title\": \"Give the operator a key to this folder?\",\n  \"e2e.escrowoffer.body\": \"This folder was created before key escrow was turned on here, so the operator of this installation cannot open it. Right now — while your password is in memory — filex can seal this folder to the escrow key. Your files are not re-encrypted or moved; only the key file changes.\",\n  \"e2e.escrowoffer.consequence\": \"What this means: the operator gains a second, permanent way into this folder, without your password. You are notified when that key is used, but that notification is an announcement rather than a control.\",\n  \"e2e.escrowoffer.learn_more\": \"What escrow can and cannot do\",\n  \"e2e.escrowoffer.password_label\": \"Folder password\",\n  \"e2e.escrowoffer.password_required\": \"Enter the folder password.\",\n  \"e2e.escrowoffer.wrong_password\": \"That is not this folder’s password.\",\n  \"e2e.escrowoffer.accept\": \"Give the operator a key\",\n  \"e2e.escrowoffer.decline\": \"No, keep it to myself\",\n  \"e2e.escrowoffer.cancel\": \"Cancel\",\n  \"e2e.escrowoffer.busy\": \"Sealing…\",\n  \"e2e.escrowoffer.done\": \"The operator can now open this folder with the escrow key\",\n  \"e2e.escrowoffer.declined_toast\": \"Kept to yourself. filex will not ask again for this folder.\",\n  \"e2e.escrowoffer.decline_failed\": \"Could not record your answer, so filex will ask again next time. Nothing about the folder changed.\",\n  \"e2e.escrowoffer.failed\": \"Could not give the operator a key to this folder\",\n  \"e2e.escrowoffer.strip_action\": \"Escrow key…\",\n  \"e2e.upgrade.title\": \"This folder has no recovery key\",\n  \"e2e.upgrade.body\": \"It was created before recovery keys existed, so its password is the only way in. Right now — and only right now, while the password is in memory — filex can add one. Your files are not re-encrypted or moved.\",\n  \"e2e.upgrade.escrow_note\": \"Note: this installation has key escrow enabled, so adding a recovery key also lets its operator open this folder without your password.\",\n  \"e2e.upgrade.accept\": \"Create a recovery key\",\n  \"e2e.upgrade.decline\": \"Not now\",\n  \"e2e.upgrade.busy\": \"Creating…\",\n  \"e2e.upgrade.failed\": \"Could not add a recovery key to this folder\",\n  \"e2e.download.failed\": \"Could not download the encrypted file.\",\n  /* /wiring:e2 */\n  /* ── connections: storage config + \"how to connect\" ──────────────\n     `storages.*` keys are the ones the BACKEND's driver descriptors\n     name (each driver package declares one next to its Init). They are\n     kept identical to web/src/locales/*.json on purpose: the same\n     descriptor is rendered on both surfaces, so a field that reads\n     \"Base path\" in the admin panel and something else in the desktop\n     app would be the same drift this whole mechanism exists to stop. */\n  \"conn.title\": \"Storage connections\",\n  \"conn.subtitle\": \"Connect {host} to a backend, or connect your computer to {host}.\",\n  \"conn.close\": \"Close\",\n  \"conn.tab.storages\": \"Storages\",\n  \"conn.tab.connect\": \"How to connect\",\n  \"conn.loading\": \"Loading…\",\n  \"conn.visibleOnly\": \"you can browse this one\",\n  \"conn.denied.title\": \"Only an administrator can add storages here\",\n  \"conn.denied.none\": \"Your account may browse files but not change what this server is connected to. Ask an administrator of this server to add or edit a storage.\",\n  \"conn.denied.anonymous\": \"You are not signed in on this server.\",\n  \"conn.denied.unreachable\": \"The server did not answer: {error}\",\n  \"conn.denied.guideHint\": \"You do not need administrator rights to connect your own computer to the storages you can already see.\",\n  \"conn.denied.guideCta\": \"Show me how to connect\",\n  \"conn.list.count\": \"{n} storages\",\n  \"conn.list.count_one\": \"1 storage\",\n  \"conn.list.add\": \"Add a storage\",\n  \"conn.list.empty\": \"No storage is configured yet. Add one and the files show up in the explorer.\",\n  \"conn.list.edit\": \"Edit\",\n  \"conn.list.remove\": \"Remove\",\n  \"conn.list.confirm\": \"Really remove?\",\n  \"conn.list.readOnly\": \"read-only\",\n  \"conn.list.disabled\": \"disabled\",\n  \"conn.form.newTitle\": \"New storage\",\n  \"conn.form.editTitle\": \"Edit “{name}”\",\n  \"conn.form.name\": \"Display name\",\n  \"conn.form.namePlaceholder\": \"photos\",\n  \"conn.form.nameHelp\": \"What this storage is called everywhere: in the explorer, in paths (name://folder) and in WebDAV URLs.\",\n  \"conn.form.driver\": \"Type\",\n  \"conn.form.driverLocked\": \"A storage's type cannot change after it is created — the paths already point at it.\",\n  \"conn.form.readOnly\": \"Read-only (nothing may be written to this storage)\",\n  \"conn.form.enabled\": \"Enabled\",\n  \"conn.form.test\": \"Test connection\",\n  \"conn.form.testing\": \"Testing…\",\n  \"conn.form.testOk\": \"Connected. {count} items at the root.\",\n  \"conn.form.testOk_one\": \"Connected. 1 item at the root.\",\n  \"conn.form.testFail\": \"Could not connect: {error}\",\n  \"conn.form.save\": \"Save\",\n  \"conn.form.saving\": \"Saving…\",\n  \"conn.form.cancel\": \"Cancel\",\n  \"conn.form.nameRequired\": \"Give the storage a name.\",\n  \"conn.form.fillRequired\": \"Fill in the fields marked with *.\",\n  \"conn.form.required\": \"Required\",\n  \"conn.form.advanced\": \"Advanced settings\",\n  \"conn.form.noFields\": \"This server did not describe any settings for this driver.\",\n  \"conn.form.reveal\": \"Show\",\n  \"conn.form.hide\": \"Hide\",\n  \"conn.guide.protocol\": \"Protocol\",\n  \"conn.guide.storage\": \"Storage\",\n  \"conn.guide.allStorages\": \"All storages\",\n  \"conn.guide.copy\": \"Copy\",\n  \"conn.guide.copied\": \"Copied\",\n  \"conn.guide.goodToKnow\": \"Good to know\",\n  \"conn.guide.userPlaceholder\": \"your-email@example.com\",\n  \"conn.guide.secretPlaceholder\": \"your-password-or-token\",\n  \"conn.guide.fact.url\": \"Address\",\n  \"conn.guide.fact.urlRootHint\": \"Every storage you can see appears as a folder under this address.\",\n  \"conn.guide.fact.urlStorageHint\": \"Mounts “{storage}” directly. Drop the last segment to see every storage.\",\n  \"conn.guide.fact.user\": \"Username\",\n  \"conn.guide.fact.password\": \"Password\",\n  \"conn.guide.webdav.summary\": \"WebDAV mounts filex as a drive: Windows Explorer, macOS Finder, Linux, rclone and Cyberduck all speak it, and every change is mirrored back into filex.\",\n  \"conn.guide.webdav.userHint\": \"Your filex account e-mail — not a display name.\",\n  \"conn.guide.webdav.passwordHint\": \"Your account password, or an API token (Settings → API tokens). An account with two-factor authentication MUST use a token: Basic auth has no second-factor slot.\",\n  \"conn.guide.webdav.win.s1\": \"Open File Explorer, right-click This PC and choose “Map network drive…”.\",\n  \"conn.guide.webdav.win.s2\": \"Pick a drive letter and enter {url} as the folder.\",\n  \"conn.guide.webdav.win.s3\": \"Tick “Connect using different credentials” and sign in with the username and password above.\",\n  \"conn.guide.webdav.win.cmdCaption\": \"Command Prompt (same thing, without the wizard)\",\n  \"conn.guide.webdav.win.limits\": \"Windows has three built-in limits that look exactly like filex bugs: transfers stop at ~47.7 MB, folders with about a thousand files refuse to open (“Disk is not formatted”), and the WebClient service must be restarted after changing either.\",\n  \"conn.guide.webdav.win.regCaption\": \"Run as administrator, then reconnect the drive\",\n  \"conn.guide.webdav.win.https\": \"HTTPS is mandatory. Windows sends Basic credentials over TLS only, and over plain http:// it silently refuses with no useful message. Do not set BasicAuthLevel to 2 — use TLS.\",\n  \"conn.guide.webdav.win.persist\": \"The mapped drive does not survive a sign-out: since Windows 7 Basic credentials cannot be stored in Credential Manager, and /persistent:yes does not change that. Re-run the command from a logon script if you need it back automatically.\",\n  \"conn.guide.webdav.win.service\": \"If nothing mounts at all, make sure the WebClient service is running: sc config WebClient start= auto && net start WebClient.\",\n  \"conn.guide.webdav.mac.s1\": \"In Finder choose Go → Connect to Server… (⌘K).\",\n  \"conn.guide.webdav.mac.s2\": \"Enter {url} and connect.\",\n  \"conn.guide.webdav.mac.s3\": \"Authenticate with the username and password above.\",\n  \"conn.guide.webdav.mac.note\": \"The drive appears under Locations; each storage is a top-level folder.\",\n  \"conn.guide.webdav.linux.mountCaption\": \"davfs2, or the desktop file manager (GNOME Files, Dolphin)\",\n  \"conn.guide.webdav.linux.gvfsComment\": \"or paste this address into GNOME Files / Dolphin\",\n  \"conn.guide.webdav.linux.locks\": \"davfs2 needs locking turned off. filex keeps WebDAV locks in process memory, so they do not survive a restart and are not shared between replicas — davfs2 assumes otherwise and hangs.\",\n  \"conn.guide.webdav.rclone.obscureCaption\": \"rclone stores an obscured password — run this first and paste the output below\",\n  \"conn.guide.webdav.rclone.passPlaceholder\": \"<output of rclone obscure>\",\n  \"conn.guide.webdav.rclone.useCaption\": \"Using it\",\n  \"conn.guide.webdav.duck.s1\": \"New Bookmark → WebDAV (HTTPS).\",\n  \"conn.guide.webdav.duck.s2\": \"Server {host}, port 443.\",\n  \"conn.guide.webdav.duck.s3\": \"Path {path}.\",\n  \"conn.guide.webdav.duck.s4\": \"Username {user}, password as above.\",\n  \"conn.guide.webdav.note.delete\": \"A WebDAV delete is permanent. The web UI moves files to the filex trash; a client delete removes the object from the backing storage directly.\",\n  \"conn.guide.webdav.note.locks\": \"Locks live in server memory: they do not survive a restart and are not shared between replicas. They exist to satisfy Windows and Office, not to arbitrate concurrent edits.\",\n  \"conn.guide.webdav.note.permissions\": \"You see exactly what you see in the web UI. The root lists only the storages you may open, and a path outside your grants answers 404 rather than 403, so the tree never leaks what exists.\",\n  \"conn.guide.webdav.note.http\": \"This server is reachable over plain http://. Windows will refuse to send your credentials at all, and every other client sends your password in the clear. Put filex behind TLS before mounting it.\",\n  // ── S3 endpoint: keys and the guide ──────────────────────────────\n  \"conn.s3keys.title\": \"S3 access keys\",\n  \"conn.s3keys.lead\": \"An access key lets any S3 client — rclone, restic, the AWS CLI, mc, s3fs, Cyberduck — connect to filex. It carries your own permissions and nothing more.\",\n  \"conn.s3keys.disabled\": \"The S3 endpoint is switched off on this server (FILEX_S3). A key minted here will not connect until an operator turns it back on.\",\n  \"conn.s3keys.cannotMint\": \"You are not signed in with an account that can mint access keys. The instructions below still apply — ask for a key and paste it in.\",\n  \"conn.s3keys.label\": \"What is it for? (laptop backup, CI, …)\",\n  \"conn.s3keys.defaultLabel\": \"access key\",\n  \"conn.s3keys.everyBucket\": \"Every bucket I can see\",\n  \"conn.s3keys.prefix\": \"Folder inside the bucket (optional)\",\n  \"conn.s3keys.mint\": \"Create key\",\n  \"conn.s3keys.inheritNote\": \"A key can only ever narrow what you already have: your grants, your tenant, your role. Confining it to one bucket or folder is the difference between a laptop backup and a credential that can read everything.\",\n  \"conn.s3keys.once\": \"Copy the secret now — this is the only time it is shown.\",\n  \"conn.s3keys.accessKeyID\": \"Access key ID\",\n  \"conn.s3keys.secret\": \"Secret key\",\n  \"conn.s3keys.dismiss\": \"I have copied it\",\n  \"conn.s3keys.col.label\": \"Label\",\n  \"conn.s3keys.col.key\": \"Access key ID\",\n  \"conn.s3keys.col.scope\": \"Limited to\",\n  \"conn.s3keys.col.lastUsed\": \"Last used\",\n  \"conn.s3keys.scopeAll\": \"everything you can see\",\n  \"conn.s3keys.noLabel\": \"(no label)\",\n  \"conn.s3keys.neverUsed\": \"never\",\n  \"conn.s3keys.enable\": \"Enable\",\n  \"conn.s3keys.disable\": \"Disable\",\n  \"conn.s3keys.revoke\": \"Revoke\",\n  \"conn.s3keys.confirm\": \"Sure?\",\n  \"conn.s3keys.empty\": \"No access keys yet.\",\n  \"conn.guide.s3.summary\": \"The S3 endpoint makes filex the destination for anything that speaks S3 — backups, sync tools, SDKs — using the storages you already have.\",\n  \"conn.guide.s3.keyPlaceholder\": \"create a key above\",\n  \"conn.guide.s3.secretPlaceholder\": \"shown once, when you create the key\",\n  \"conn.guide.s3.fact.endpoint\": \"Endpoint\",\n  \"conn.guide.s3.fact.endpointHint\": \"Point the client here, not at the web address of filex.\",\n  \"conn.guide.s3.fact.bucket\": \"Bucket\",\n  \"conn.guide.s3.fact.bucketHint\": \"A bucket is a filex storage. Buckets are created by an administrator, not by the client.\",\n  \"conn.guide.s3.fact.key\": \"Access key ID\",\n  \"conn.guide.s3.fact.keyHint\": \"The public half. It travels in every request.\",\n  \"conn.guide.s3.fact.secret\": \"Secret key\",\n  \"conn.guide.s3.fact.secretHint\": \"Shown once, when the key is created. filex cannot show it again — create a new key if it is lost.\",\n  \"conn.guide.s3.fact.region\": \"Region\",\n  \"conn.guide.s3.fact.regionHint\": \"filex has no regions; any value works and is echoed back. Clients still insist on one.\",\n  \"conn.guide.s3.fact.addressing\": \"Addressing\",\n  \"conn.guide.s3.fact.pathStyle\": \"path-style (required)\",\n  \"conn.guide.s3.fact.pathStyleHint\": \"There is no dedicated S3 host on this install, so bucket.host does not resolve.\",\n  \"conn.guide.s3.fact.virtualHosted\": \"virtual-hosted or path-style\",\n  \"conn.guide.s3.fact.virtualHostedHint\": \"This install has its own S3 host, so both styles work.\",\n  \"conn.guide.s3.rclone.useCaption\": \"Use it\",\n  \"conn.guide.s3.rclone.mtime\": \"filex carries the file modification time (x-amz-meta-mtime), so rclone sync settles after the first run instead of re-uploading everything.\",\n  \"conn.guide.s3.aws.configureCaption\": \"Configure once\",\n  \"conn.guide.s3.aws.useCaption\": \"Use it\",\n  \"conn.guide.s3.aws.pathStyle\": \"Add path addressing to your AWS config, or every command fails at DNS.\",\n  \"conn.guide.s3.restic.envCaption\": \"Environment\",\n  \"conn.guide.s3.restic.useCaption\": \"Back up, verify, prune\",\n  \"conn.guide.s3.restic.verified\": \"Verified against this endpoint: restic check --read-data reads every pack byte for byte and reports no errors.\",\n  \"conn.guide.s3.mc.aliasCaption\": \"Add the alias\",\n  \"conn.guide.s3.mc.useCaption\": \"Use it\",\n  \"conn.guide.s3.s3fs.credsCaption\": \"Credentials file\",\n  \"conn.guide.s3.s3fs.mountCaption\": \"Mount it\",\n  \"conn.guide.s3.s3fs.note\": \"Editing a file over s3fs rewrites the whole object, and a delete goes to the filex trash. Good for a shared folder, not for a database.\",\n  \"conn.guide.s3.duck.s1\": \"New bookmark → Amazon S3.\",\n  \"conn.guide.s3.duck.s2\": \"Server: {host}.\",\n  \"conn.guide.s3.duck.s3\": \"Access key ID: {key}, secret as above.\",\n  \"conn.guide.s3.duck.s4\": \"Open the bookmark; the buckets are your filex storages.\",\n  \"conn.guide.s3.duck.pathStyle\": 'In Preferences → S3, turn OFF \"Use virtual host style\" — this install has no wildcard S3 host.',\n  \"conn.guide.s3.sdk.note\": \"Any SigV4 client works the same way: endpoint, key, secret, and path addressing when this install has no S3 host of its own.\",\n  \"conn.guide.s3.note.buckets\": \"A bucket is a filex storage. A client can create folders and objects inside one, but not the bucket itself — that needs a driver and a path, which an S3 request cannot express.\",\n  \"conn.guide.s3.note.permissions\": 'The key sees exactly what you see. A bucket you may not open answers \"no such bucket\" rather than \"forbidden\", so the endpoint never reveals what exists.',\n  \"conn.guide.s3.note.trash\": \"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.\",\n  \"conn.guide.s3.note.mtime\": \"Uploads carry their modification time, and the checksums clients send (Content-MD5, x-amz-checksum-*) are verified — a corrupted upload is refused rather than stored.\",\n  \"conn.guide.s3.note.pathStyle\": \"This install has no dedicated S3 host, so clients must be told to use path-style addressing. Without it a current SDK fails at DNS with an error that names neither filex nor the cause.\",\n  \"conn.guide.s3.note.http\": \"This endpoint is plain http://. Signatures still protect the request, but the objects travel in the clear. Put filex behind TLS before pointing a backup at it.\",\n  // ── SFTP endpoint: keys and the guide ────────────────────────────\n  \"conn.sshkeys.title\": \"SSH keys\",\n  \"conn.sshkeys.lead\": \"Register a public key and every SSH client — sftp, scp, WinSCP, FileZilla, rclone, sshfs — can connect without sending your password.\",\n  \"conn.sshkeys.disabled\": \"The SFTP endpoint is switched off on this server (FILEX_SFTP). A key registered here will not connect until an operator turns it back on.\",\n  \"conn.sshkeys.cannotAdd\": \"You are not signed in with an account that can register keys.\",\n  \"conn.sshkeys.paste\": \"Paste the contents of ~/.ssh/id_ed25519.pub\",\n  \"conn.sshkeys.name\": \"Name (optional — the key comment is used otherwise)\",\n  \"conn.sshkeys.add\": \"Add key\",\n  \"conn.sshkeys.noCopyId\": \"ssh-copy-id cannot work here: it appends to ~/.ssh/authorized_keys over a shell, and filex has none. This box is the way in.\",\n  \"conn.sshkeys.col.name\": \"Name\",\n  \"conn.sshkeys.col.fingerprint\": \"Fingerprint\",\n  \"conn.sshkeys.col.added\": \"Added\",\n  \"conn.sshkeys.col.lastUsed\": \"Last used\",\n  \"conn.sshkeys.noName\": \"(no name)\",\n  \"conn.sshkeys.neverUsed\": \"never\",\n  \"conn.sshkeys.enable\": \"Enable\",\n  \"conn.sshkeys.disable\": \"Disable\",\n  \"conn.sshkeys.remove\": \"Remove\",\n  \"conn.sshkeys.confirm\": \"Sure?\",\n  \"conn.sshkeys.empty\": \"No keys yet. Without one, clients sign in with your account password.\",\n  \"conn.guide.sftp.summary\": \"SFTP makes filex reachable by anything that already speaks SSH — a backup job, a scanner, WinSCP, rclone, or a mounted folder.\",\n  \"conn.guide.sftp.fact.host\": \"Host\",\n  \"conn.guide.sftp.fact.hostHint\": \"The same machine as the web app, on a port of its own.\",\n  \"conn.guide.sftp.fact.port\": \"Port\",\n  \"conn.guide.sftp.fact.portHint\": \"Not 22 and not 443: SFTP is raw TCP and cannot go through the web proxy.\",\n  \"conn.guide.sftp.fact.userHint\": \"Your short login name. An @ in a login has to be quoted in most client config files, which is what this avoids.\",\n  \"conn.guide.sftp.fact.auth\": \"Sign in with\",\n  \"conn.guide.sftp.fact.authKey\": \"your registered SSH key (or your password)\",\n  \"conn.guide.sftp.fact.authPassword\": \"your account password — or register a key above\",\n  \"conn.guide.sftp.fact.authHint\": \"An API token works as a password too, and is revocable on its own. An account with two-factor sign-in must use a key or a token.\",\n  \"conn.guide.sftp.fact.path\": \"Path\",\n  \"conn.guide.sftp.fact.pathHint\": \"The first folder is a storage; the root lists the ones you may open.\",\n  \"conn.guide.sftp.openssh.connectCaption\": \"Connect, put, get\",\n  \"conn.guide.sftp.openssh.noShell\": \"There is no shell here — only the SFTP subsystem. `ssh host command` is refused on purpose, and scp works because OpenSSH 9 speaks SFTP for it.\",\n  \"conn.guide.sftp.key.tab\": \"Set up a key\",\n  \"conn.guide.sftp.key.s1\": \"Generate a key pair on the machine that will connect (skip if you already have one).\",\n  \"conn.guide.sftp.key.s2\": \"Copy the PUBLIC half — the .pub file, never the other one.\",\n  \"conn.guide.sftp.key.s3\": \"Paste it into the box above and connect; no password is sent from then on.\",\n  \"conn.guide.sftp.key.genCaption\": \"On your own machine\",\n  \"conn.guide.sftp.key.noCopyId\": \"ssh-copy-id will NOT work against filex: it needs a shell to append to ~/.ssh/authorized_keys, and there is none. Paste the key above instead.\",\n  \"conn.guide.sftp.winscp.s1\": \"New site → File protocol: SFTP.\",\n  \"conn.guide.sftp.winscp.s2\": \"Host name: {host}, port: {port}.\",\n  \"conn.guide.sftp.winscp.s3\": \"User name: {user}. For a key: Advanced → SSH → Authentication → private key file.\",\n  \"conn.guide.sftp.winscp.s4\": \"WinSCP needs a .ppk private key — use its own tool (Tools → PuTTYgen) to convert an OpenSSH key once.\",\n  \"conn.guide.sftp.filezilla.s1\": \"File → Site Manager → New site, Protocol: SFTP.\",\n  \"conn.guide.sftp.filezilla.s2\": \"Host: {host}, port: {port}.\",\n  \"conn.guide.sftp.filezilla.s3\": \"User: {user}. Logon type: Normal for a password, or Key file for a key.\",\n  \"conn.guide.sftp.rclone.useCaption\": \"Use it\",\n  \"conn.guide.sftp.sshfs.mountCaption\": \"Mount and unmount\",\n  \"conn.guide.sftp.sshfs.note\": \"A mounted folder rewrites the whole file on every save. Good for documents, not for a database or a video you are editing in place.\",\n  \"conn.guide.sftp.note.storages\": \"The root is not a home directory: it lists the storages you may open, and the first path segment names one.\",\n  \"conn.guide.sftp.note.permissions\": \"The permission bits your client draws come from your access level here, so a file shown as read-only really is one for you.\",\n  \"conn.guide.sftp.note.trash\": \"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.\",\n  \"conn.guide.sftp.note.totp\": \"If your account has two-factor sign-in, the password will not work here — SSH has no way to ask for the code. Register a key, or use an API token as the password.\",\n  \"conn.guide.sftp.note.disabled\": \"The SFTP endpoint is switched off on this server. These instructions will work once an operator enables it.\",\n  // ── FTPS ─────────────────────────────────────────────────────────\n  \"conn.guide.ftps.summary\": \"FTPS is here for the equipment that only ever learned FTP — scan-to-folder printers, EDI counterparties, older lab and industrial software. Always over TLS.\",\n  \"conn.guide.ftps.fact.host\": \"Host\",\n  \"conn.guide.ftps.fact.hostHint\": \"The same machine as the web app, on a port of its own.\",\n  \"conn.guide.ftps.fact.port\": \"Port\",\n  \"conn.guide.ftps.fact.portHint\": \"The control channel. Data moves on a separate port from the passive range below.\",\n  \"conn.guide.ftps.fact.mode\": \"Encryption\",\n  \"conn.guide.ftps.fact.modeValue\": \"FTPS — explicit TLS (AUTH TLS), required\",\n  \"conn.guide.ftps.fact.modeHint\": 'Plain FTP is refused before the password is read. Choose \"Require explicit FTP over TLS\", never \"plain FTP\" and never \"implicit\".',\n  \"conn.guide.ftps.fact.userHint\": \"Your short login name, or your e-mail. An API token works as the password too and can be revoked on its own.\",\n  \"conn.guide.ftps.fact.passwordHint\": \"Your account password, or an API token. An account with two-factor sign-in must use a token — FTP has no way to ask for the code.\",\n  \"conn.guide.ftps.fact.pasv\": \"Passive ports\",\n  \"conn.guide.ftps.fact.pasvHint\": \"Data connections land here. If your firewall blocks this range the transfer HANGS with no error on either side — that is the classic FTP failure.\",\n  \"conn.guide.ftps.filezilla.s1\": \"File → Site Manager → New site, Protocol: FTP.\",\n  \"conn.guide.ftps.filezilla.s2\": \"Host: {host}, port: {port}.\",\n  \"conn.guide.ftps.filezilla.s3\": 'Encryption: \"Require explicit FTP over TLS\". Logon type: Normal, user: {user}.',\n  \"conn.guide.ftps.filezilla.s4\": \"Transfer settings → Passive. Active mode is refused by this server.\",\n  \"conn.guide.ftps.winscp.s1\": \"New site → File protocol: FTP, Encryption: TLS/SSL Explicit encryption.\",\n  \"conn.guide.ftps.winscp.s2\": \"Host name: {host}, port: {port}.\",\n  \"conn.guide.ftps.winscp.s3\": \"User name: {user}, password as above.\",\n  \"conn.guide.ftps.curl.caption\": \"Upload and download\",\n  \"conn.guide.ftps.curl.sslReqd\": \"--ssl-reqd is not optional: it makes curl REQUIRE TLS instead of falling back to plaintext. This server refuses plaintext anyway, but the habit protects you against the servers that do not.\",\n  \"conn.guide.ftps.lftp.caption\": \"Connect\",\n  \"conn.guide.ftps.lftp.protectData\": \"ssl-protect-data encrypts the FILE as well as the login. Without it lftp logs in over TLS and then sends your file in the clear — which is the FTPS misconfiguration people actually ship.\",\n  \"conn.guide.ftps.rclone.useCaption\": \"Use it\",\n  \"conn.guide.ftps.printer.tab\": \"Scanner / printer\",\n  \"conn.guide.ftps.printer.s1\": \"In the device's scan-to-FTP settings: server {host}, port {port}.\",\n  \"conn.guide.ftps.printer.s2\": \"User: {user}, password as above. Create an API token for the device rather than using your own password — it can be revoked without changing anything else.\",\n  \"conn.guide.ftps.printer.s3\": \"Path: {path} — or a folder inside it that you created first. The device cannot create a storage.\",\n  \"conn.guide.ftps.printer.s4\": 'Turn ON \"SSL/TLS\" or \"FTPS explicit\", and PASSIVE mode.',\n  \"conn.guide.ftps.printer.noTLS\": \"Plenty of scan-to-FTP firmware cannot do TLS at all. This server will not talk to such a device, and that is deliberate — the alternative is your documents and your password crossing the office network in the clear.\",\n  \"conn.guide.ftps.note.tls\": \"TLS is mandatory and there is no switch to turn it off. Plain FTP sends your password in the clear and your file after it.\",\n  \"conn.guide.ftps.note.passive\": \"Passive mode only. Active mode has the server dial back to the client, which does not survive NAT and is blocked by most firewalls.\",\n  \"conn.guide.ftps.note.storages\": \"The root is not a home directory: it lists the storages you may open, and the first path segment names one.\",\n  \"conn.guide.ftps.note.trash\": \"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.\",\n  \"conn.guide.ftps.note.prefer\": \"If the client can speak SFTP, prefer it: one connection, one port, no passive-mode surprises.\",\n  \"conn.guide.ftps.note.selfSigned\": \"This server is using a self-signed certificate. It encrypts the channel but proves nothing about who is on the other end — most clients will ask you to accept it once. Supply a real certificate for anything that matters.\",\n  \"conn.guide.ftps.note.disabled\": \"The FTPS endpoint is switched off on this server. These instructions will work once an operator enables it.\",\n  // ── NFS ──────────────────────────────────────────────────────────\n  \"conn.nfs.title\": \"NFS exports\",\n  \"conn.nfs.lead\": \"An export lets a machine on your network mount filex as a drive — a media player, a build server, a backup box.\",\n  \"conn.nfs.pathIsSecret\": \"⚠ The export path IS the password. NFS cannot ask a client who it is without Kerberos, so filex puts 32 random bytes in the path instead: whoever knows it can mount as you. Treat the mount line like a credential — /etc/fstab is world-readable on most systems.\",\n  \"conn.nfs.disabled\": \"The NFS endpoint is switched off on this server (FILEX_NFS). An export created here will not mount until an operator turns it back on.\",\n  \"conn.nfs.cannotMint\": \"You are not signed in with an account that can create exports.\",\n  \"conn.nfs.label\": \"What is it for? (media player, backup box, …)\",\n  \"conn.nfs.defaultLabel\": \"nfs export\",\n  \"conn.nfs.everyStorage\": \"Every storage I can see\",\n  \"conn.nfs.prefix\": \"Folder inside the storage (optional)\",\n  \"conn.nfs.allowCidrs\": \"Allowed addresses, e.g. 192.168.1.0/24 (optional)\",\n  \"conn.nfs.readOnly\": \"Read-only\",\n  \"conn.nfs.readOnlyHint\": \"Read-only is the safer default for a machine: it refuses every write through this mount whatever your own permissions are. An address list narrows it further — outside it, the mount is refused.\",\n  \"conn.nfs.mint\": \"Create export\",\n  \"conn.nfs.once\": \"Copy this now — the path is shown only once and cannot be recovered.\",\n  \"conn.nfs.dismiss\": \"I have copied it\",\n  \"conn.nfs.col.label\": \"Label\",\n  \"conn.nfs.col.scope\": \"Limited to\",\n  \"conn.nfs.col.mode\": \"Mode\",\n  \"conn.nfs.col.lastUsed\": \"Last mounted\",\n  \"conn.nfs.scopeAll\": \"everything you can see\",\n  \"conn.nfs.modeRead\": \"read-only\",\n  \"conn.nfs.modeWrite\": \"read/write\",\n  \"conn.nfs.noLabel\": \"(no label)\",\n  \"conn.nfs.neverUsed\": \"never\",\n  \"conn.nfs.enable\": \"Enable\",\n  \"conn.nfs.disable\": \"Disable\",\n  \"conn.nfs.revoke\": \"Revoke\",\n  \"conn.nfs.confirm\": \"Sure?\",\n  \"conn.nfs.empty\": \"No exports yet.\",\n  \"conn.guide.nfs.summary\": \"NFS mounts filex as a drive on a machine in your own network — the NAS protocol, for the devices that expect one.\",\n  \"conn.guide.nfs.pathPlaceholder\": \"create an export above\",\n  \"conn.guide.nfs.fact.host\": \"Host\",\n  \"conn.guide.nfs.fact.hostHint\": \"The same machine as the web app, on a port of its own.\",\n  \"conn.guide.nfs.fact.port\": \"Port\",\n  \"conn.guide.nfs.fact.portHint\": \"Both port= and mountport= must be set to this; filex serves the mount and NFS services on one port.\",\n  \"conn.guide.nfs.fact.export\": \"Export path\",\n  \"conn.guide.nfs.fact.exportHint\": \"This is the credential. It is shown once, when you create the export, and is stored hashed — filex cannot show it again.\",\n  \"conn.guide.nfs.fact.options\": \"Mount options\",\n  \"conn.guide.nfs.fact.optionsHint\": \"nolock because filex does not run the NFS lock manager; nfsvers=3 because that is what this server speaks.\",\n  \"conn.guide.nfs.linux.mountCaption\": \"Mount it\",\n  \"conn.guide.nfs.linux.fstabSecret\": \"An /etc/fstab line containing this path is a password in a world-readable file. Use a credentials-protected automount, or keep the mount in a root-only unit, if that matters where you are.\",\n  \"conn.guide.nfs.mac.mountCaption\": \"Mount it\",\n  \"conn.guide.nfs.mac.resvport\": \"macOS needs resvport: its client insists on a privileged source port and refuses the mount without it.\",\n  \"conn.guide.nfs.win.s1\": 'Turn on \"Services for NFS\" → \"Client for NFS\" in Windows Features (Pro and Enterprise only; Home does not have it).',\n  \"conn.guide.nfs.win.s2\": \"Open a Command Prompt as administrator.\",\n  \"conn.guide.nfs.win.s3\": \"Map the export to a drive letter with the command below.\",\n  \"conn.guide.nfs.win.cmdCaption\": \"Map it to Z:\",\n  \"conn.guide.nfs.win.port\": \"Windows has no way to say which port the mount service is on, so it can only reach an NFS server on the standard port 2049. If this server is on another port, use SFTP or the filex desktop app instead.\",\n  \"conn.guide.nfs.nas.tab\": \"NAS / media player\",\n  \"conn.guide.nfs.nas.s1\": \"In the device's NFS settings: server {host}, port {port} (set both the NFS and the mount port if it asks for them separately).\",\n  \"conn.guide.nfs.nas.s2\": \"Remote path: the export path above, exactly as shown.\",\n  \"conn.guide.nfs.nas.s3\": \"NFS version 3, no locking. Create the export read-only unless the device genuinely needs to write.\",\n  \"conn.guide.nfs.note.unencrypted\": \"NFSv3 is not encrypted. Anyone who can read the traffic sees your files, and anyone who learns the path can mount them. Use it on a home or office network, or over a VPN — never across the internet.\",\n  \"conn.guide.nfs.note.pathIsSecret\": \"The export path is the whole credential. Revoke it from the list above if it leaks; there is nothing else to change.\",\n  \"conn.guide.nfs.note.noPortmapper\": \"There is no portmapper on port 111, so a client that is not told the port cannot find the server. That is why every command here carries port= and mountport=.\",\n  \"conn.guide.nfs.note.uid\": \"The user and group ids your client sends are ignored: the mount already knows whose it is. The permissions you see come from your access in filex.\",\n  \"conn.guide.nfs.note.trash\": \"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.\",\n  \"conn.guide.nfs.note.revoke\": \"Revoking takes effect on the next request, not instantly: NFS has no session to end, so a client with the mount open sees its next operation fail.\",\n  \"conn.guide.nfs.note.disabled\": \"The NFS endpoint is switched off on this server. These instructions will work once an operator enables it.\",\n  \"conn.tokens.title\": \"API tokens\",\n  \"conn.tokens.lead\": \"FTPS, WebDAV and filex mount all sign in with a token instead of your account password. Mint one here — it can be revoked on its own, and an account with two-factor sign-in cannot use its password on these at all.\",\n  \"conn.tokens.mint\": \"Create token\",\n  \"conn.tokens.once\": \"Copy it now — this is the only time it is shown. Only a hash is stored, so it cannot be shown again.\",\n  \"conn.tokens.dismiss\": \"I have copied it\",\n  \"conn.tokens.cannotMint\": \"This session cannot create tokens. Sign in with your own account to make one.\",\n  \"conn.tokens.empty\": \"No tokens yet.\",\n  \"conn.tokens.neverUsed\": \"never\",\n  \"conn.tokens.revoke\": \"Revoke\",\n  \"conn.tokens.confirm\": \"Sure?\",\n  \"conn.tokens.col.label\": \"Name\",\n  \"conn.tokens.col.scopes\": \"Can do\",\n  \"conn.tokens.col.used\": \"Last used\",\n  \"conn.tokens.revokeHint\": \"Revoking stops a connection that is already open, not just the next sign-in: an SFTP or FTPS session is cut and a mount stops working within about half a minute.\",\n  \"conn.guide.mount.summary\": \"filex mount attaches a remote filex server to a folder on this machine, over the same HTTPS the browser uses. It is the only one of these that works from anywhere — no LAN, no extra server, no third-party client.\",\n  \"conn.guide.mount.fact.url\": \"Server URL\",\n  \"conn.guide.mount.fact.urlHint\": \"The same address you use in the browser. Nothing else has to be reachable.\",\n  \"conn.guide.mount.fact.token\": \"API token\",\n  \"conn.guide.mount.fact.tokenPlaceholder\": \"create one under Tokens\",\n  \"conn.guide.mount.fact.tokenHint\": \"A token, not your password — it can be revoked on its own, and an account with 2FA cannot use its password here at all.\",\n  \"conn.guide.mount.fact.remote\": \"What to mount\",\n  \"conn.guide.mount.fact.remoteHint\": \"Leave --remote off to see every storage as a folder, or name one storage — or a folder inside it — to mount just that.\",\n  \"conn.guide.mount.linux.mountCaption\": \"Mount it\",\n  \"conn.guide.mount.linux.umountCaption\": \"Unmount it\",\n  \"conn.guide.mount.linux.umountWarn\": \"Unmount with fusermount, not by killing the process. A mount whose process died without detaching leaves a folder where every ls hangs until somebody runs fusermount by hand.\",\n  \"conn.guide.mount.linux.systemdCaption\": \"Mount it at login (systemd user unit)\",\n  \"conn.guide.mount.win.winfsp\": \"Windows needs WinFsp installed once — it is free and open source: https://winfsp.dev. Nothing else, and no administrator rights after that.\",\n  \"conn.guide.mount.win.mountCaption\": \"Mount it as a drive\",\n  \"conn.guide.mount.win.freeLetter\": \"Pick a drive letter that is FREE. The letter is created by the mount, not attached to something that already exists, and pointing it at one that is in use fails with a message that does not say so.\",\n  \"conn.guide.mount.win.stop\": \"Stop it with Ctrl-C in that window. The drive disappears and nothing is left behind on this machine.\",\n  \"conn.guide.mount.mac.unsupported\": \"filex mount does not work on macOS. It needs macFUSE, whose licence does not allow a program like filex to install it for you, and whose Go binding needs a C compiler filex deliberately does not require. The command refuses here rather than appearing to work and doing nothing.\",\n  \"conn.guide.mount.mac.alternatives\": \"On macOS, use the filex desktop app with folder sync (keeps the files on disk), or SFTP with a client that mounts drives.\",\n  \"conn.guide.mount.note.notASync\": \"This is not a sync. Nothing is copied to this machine except a small read cache, so a mount opens one file out of a hundred thousand without downloading the rest. If you want the files when you are offline, use folder sync instead.\",\n  \"conn.guide.mount.note.reachable\": \"It reaches the server through whatever proxy or tunnel the browser goes through, because underneath it is the same API. Your permissions, your storages and — on a multi-tenant server — your tenant come with it.\",\n  \"conn.guide.mount.note.wholeFileWrites\": \"A file you write through the mount is uploaded when the program closes it, not while it is being written. Editing a very large file in place is slower here than a local disk; copying it in and out is not.\",\n  \"conn.guide.mount.note.trash\": \"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.\",\n  \"conn.guide.mount.note.revoke\": \"Revoke the token to stop a mount. It stops serving within half a minute, even if the mount is still attached.\",\n  \"storages.driver.ftp\": \"FTP / FTPS\",\n  \"storages.driver.local\": \"Local filesystem\",\n  \"storages.driver.s3\": \"S3 / Hetzner / MinIO\",\n  \"storages.driver.sftp\": \"SFTP\",\n  \"storages.driver.smb\": \"SMB / CIFS (NAS)\",\n  \"storages.driver.webdav\": \"WebDAV\",\n  \"storages.fieldHelp.smbShare\": \"The share name alone, without the server: `media`, not `\\\\\\\\nas\\\\media`.\",\n  \"storages.fieldHelp.smbDomain\": \"Only for a Windows domain account. Leave empty for a NAS.\",\n  \"storages.fieldHelp.smbRoot\": \"Sub-folder inside the share. Leave empty for the whole share.\",\n  \"storages.fields.share\": \"Share\",\n  \"storages.fields.domain\": \"Domain / workgroup\",\n  \"storages.fields.dialTimeout\": \"Connect timeout (seconds)\",\n  \"storages.fieldHelp.disablePresign\": \"On by default: uploads and the downloads behind public share links stream through filex, so the bucket endpoint never has to be reachable from a browser (a LAN-only MinIO just works). Turn it off only when the endpoint is reachable from your users' browsers (AWS, a public MinIO) and you want them to talk to the bucket directly — faster for very large files, and the store must accept SDK-signed URLs (Ceph RGW / some Hetzner setups answer SignatureDoesNotMatch).\",\n  \"storages.fieldHelp.endpoint\": \"Leave empty for AWS S3. Any S3-compatible store needs its endpoint.\",\n  \"storages.fieldHelp.hostKey\": \"A single public key in authorized_keys / known_hosts line form.\",\n  \"storages.fieldHelp.insecureSkipHostKey\": \"Accepts any host key. Only for throwaway hosts.\",\n  \"storages.fieldHelp.keyPath\": \"Path to a key file on the server, read when the storage starts. Used when the PEM field is empty.\",\n  \"storages.fieldHelp.knownHosts\": \"OpenSSH known_hosts path for strict host-key checking. Default is trust-on-first-use in ~/.filex/known_hosts.\",\n  \"storages.fieldHelp.passive\": \"Off switches to active mode, which needs the server to dial back into this host.\",\n  \"storages.fieldHelp.path\": \"Directory on the server. It is created if missing; filex never mounts /.\",\n  \"storages.fieldHelp.pathStyle\": \"On for every non-AWS store. It is turned on automatically when an endpoint is set and this was never touched.\",\n  \"storages.fieldHelp.prefix\": \"Sub-folder inside the bucket. Required: filex never takes ownership of the bucket root.\",\n  \"storages.fieldHelp.region\": 'Defaults to \"auto\" when left empty.',\n  \"storages.fieldHelp.root\": \"Sub-folder on the backend. Required: filex never mounts the account root.\",\n  \"storages.fieldHelp.sftpAuth\": \"Either a password or a private key is required.\",\n  \"storages.fieldHelp.tls\": \"Plain FTP sends credentials in the clear — turn this on whenever the server supports it.\",\n  \"storages.fields.accessKey\": \"Access key\",\n  \"storages.fields.basePath\": \"Base path\",\n  \"storages.fields.bucket\": \"Bucket\",\n  \"storages.fields.disablePresign\": \"Disable presigned URLs\",\n  \"storages.fields.endpoint\": \"Endpoint\",\n  \"storages.fields.host\": \"Host\",\n  \"storages.fields.hostKey\": \"Pinned host key\",\n  \"storages.fields.insecureSkipHostKey\": \"Skip host-key verification (insecure)\",\n  \"storages.fields.keyPath\": \"Private key file\",\n  \"storages.fields.knownHosts\": \"known_hosts file\",\n  \"storages.fields.name\": \"Display name\",\n  \"storages.fields.namePlaceholder\": \"Personal photos\",\n  \"storages.fields.passive\": \"Passive mode (PASV)\",\n  \"storages.fields.password\": \"Password\",\n  \"storages.fields.path\": \"Filesystem path\",\n  \"storages.fields.pathStyle\": \"Use path-style URLs (Hetzner, MinIO)\",\n  \"storages.fields.port\": \"Port\",\n  \"storages.fields.prefix\": \"Prefix\",\n  \"storages.fields.privateKey\": \"Private key (PEM)\",\n  \"storages.fields.rbac\": \"Per-item access control (RBAC)\",\n  \"storages.fields.rbacHint\": \"When on, non-admins see only files/folders explicitly granted to them via the permissions panel. When off, the storage is open to all users (capability by role).\",\n  \"storages.fields.readOnly\": \"Read-only mount\",\n  \"storages.fields.region\": \"Region\",\n  \"storages.fields.root\": \"Base path\",\n  \"storages.fields.secretKey\": \"Secret key\",\n  \"storages.fields.tls\": \"FTPS (explicit AUTH TLS)\",\n  \"storages.fields.url\": \"Base URL\",\n  \"storages.fields.user\": \"User\",\n  /* === gezinti:g1 — navigation panel (SideNav) === */\n  \"sidenav.title\": \"Navigation\",\n  \"sidenav.views\": \"Views\",\n  \"sidenav.storages\": \"Storages\",\n  \"sidenav.home\": \"Home\",\n  \"sidenav.myfiles\": \"My files\",\n  \"sidenav.recent\": \"Recent\",\n  \"sidenav.starred\": \"Starred\",\n  \"sidenav.shared\": \"Shared with me\",\n  \"sidenav.trash\": \"Trash\",\n  \"sidenav.collapse\": \"Collapse navigation\",\n  \"sidenav.expand\": \"Expand navigation\",\n  \"sidenav.close\": \"Close navigation\",\n  // ⚠ `open`/`close` are the DRAWER's pair, `expand`/`collapse` the docked\n  // panel's, and they are not interchangeable — see the note on\n  // `navToggleLabel` in Toolbar.vue. Below 560px the panel is a drawer over\n  // the listing: it is not narrowed to a rail, it is not on screen at all, so\n  // \"expand\" would promise a width change to something that has no width.\n  \"sidenav.open\": \"Open navigation\",\n  \"sidenav.storage.shared\": \"Shared\",\n  \"sidenav.storage.readOnly\": \"Read-only\",\n  // ⚠ `toolbar.nav` is GONE, and nothing replaced it. It was the one label on\n  // the panel's collapse control, first as the noun \"Navigation\" — which names\n  // the panel and never says the button does anything to it, so the owner\n  // could not find how to collapse the panel (2026-09-13: \"yan menüyü kısıp\n  // açabilir olalım ya bence\") — and then as the static stopgap \"Show or hide\n  // navigation\". The four `sidenav.*` verbs above are the real fix: the label\n  // is bound to `navOpen`, so it says *collapse* when it will collapse and\n  // *expand* when it will expand.\n  \"node.home\": \"Home\",\n  \"node.recent\": \"Recent\",\n  \"node.starred\": \"Starred\",\n  \"node.shared\": \"Shared with me\",\n  \"empty.recent.title\": \"Nothing opened yet\",\n  \"empty.recent.hint\": \"Files you open show up here\",\n  \"empty.starred.title\": \"Nothing starred yet\",\n  \"empty.starred.hint\": \"Star a file to find it here\",\n  \"empty.shared.title\": \"Nothing has been shared with you\",\n  \"empty.shared.hint\": \"Folders and files other people share appear here\",\n  /* etiket:t1 */\n  \"sidenav.tags\": \"Tags\",\n  \"sidenav.tags.empty\": \"No tags yet — add one from a file’s right-click menu.\",\n  \"sidenav.tags.more\": \"Show {count} more\",\n  \"sidenav.tags.less\": \"Show fewer\",\n  \"empty.tag.title\": \"Nothing is tagged “{tag}”\",\n  \"empty.tag.hint\": \"Right-click a file and choose Tags to put it here\",\n  \"sidenav.connections\": \"Connections\",\n  \"sidenav.connect\": \"How to connect\",\n  \"sidenav.apikeys\": \"API keys\",\n  \"overlay.close\": \"Close\",\n  \"conn.tokens.scopes\": \"Permissions\",\n  \"conn.tokens.root\": \"Limit to one folder (optional)\",\n  \"conn.tokens.rootPlaceholder\": \"storage://folder\",\n  \"conn.tokens.expiry\": \"Expires in (days)\",\n  \"conn.tokens.expiryNever\": \"never\",\n  \"conn.tokens.defaultName\": \"API key {date}\",\n  \"conn.tokens.namePlaceholder\": \"Name — e.g. backup script\",\n  \"conn.tokens.capNote\": \"Your account and its permissions are the ceiling — asking for more than you have is refused, not granted.\",\n  /* === /gezinti:g1 === */\n  /* === surucu:d1 — the shell (GitHub #14); every profile, no longer a\n     `uiProfile: 'drive'` opt-in === */\n  \"drive.new\": \"New\",\n  \"drive.new.upload\": \"Upload files\",\n  \"drive.new.folder\": \"New folder\",\n  \"drive.new.request\": \"Request files\",\n  \"drive.new.document\": \"New document\",\n  /* === belge:n1 — \"New document\": the picker under + New =================\n     Type names are NOT listed here. A tile reads its words from\n     lib/fileIcons `typeLabelFor`, the same table the listing's Type column\n     uses, so \".docx\" is called the same thing in both places and a new type\n     needs no string at all. Only this dialog's own chrome lives below. */\n  \"newdoc.title\": \"New document\",\n  \"newdoc.type.label\": \"Document type\",\n  \"newdoc.group.document\": \"Documents\",\n  \"newdoc.group.text\": \"Text and code\",\n  \"newdoc.group.diagram\": \"Diagrams\",\n  \"newdoc.withheld.onlyoffice\": \"Office documents need a document server (OnlyOffice), which is not configured here.\",\n  \"newdoc.withheld.drawio\": \"Diagrams need a drawio service, which is not configured here.\",\n  \"newdoc.empty.title\": \"No document types are available\",\n  \"newdoc.empty.body\": \"This server did not offer any type this app can create.\",\n  \"newdoc.empty.blocked\": \"Every type this server can create needs an editor service that is not configured here.\",\n  \"newdoc.name\": \"Name\",\n  \"newdoc.name.placeholder\": \"Document name\",\n  \"newdoc.untitled\": \"Untitled\",\n  \"newdoc.err.slash\": \"A name cannot contain a slash.\",\n  \"newdoc.err.exists\": \"{name} is already here. Choose another name.\",\n  \"newdoc.location\": \"Location\",\n  \"newdoc.location.none\": \"Choose a folder\",\n  \"newdoc.location.change\": \"Change\",\n  \"newdoc.location.noaccess\": \"You cannot save into this folder.\",\n  \"newdoc.create\": \"Create\",\n  \"newdoc.creating\": \"Creating…\",\n  \"newdoc.cancel\": \"Cancel\",\n  // ⚠ The top search field searches the WHOLE storage (and every storage at\n  // the root) — never only the open folder. The scope named here is therefore\n  // the storage, not the folder; \"Filter in this folder…\" (FilterBar) is the\n  // folder-scoped one. It used to say \"Search in Photos\" for a folder called\n  // Photos, which was a lie (2026-09-19).\n  \"drive.search.placeholder\": \"Search in {scope}\",\n  \"drive.search.placeholder_all\": \"Search all storages\",\n  \"drive.search.hint_title\": \"Search everywhere and run commands ({combo})\",\n  \"drive.storage.used\": \"{used} of {total} used\",\n  \"drive.storage.used_unlimited\": \"{used} used\",\n  \"drive.storage.label\": \"Storage\",\n  /* === gorunum:v3-shell — the Home view (the overview, inside the shell) ==\n   * The section headings are `sidenav.storages` / `sidenav.recent` /\n   * `sidenav.starred` and the two empty states are `empty.recent.*` /\n   * `empty.starred.*`, on purpose: the block headed \"Recent\" on Home and the\n   * panel row labelled \"Recent\" beside it are the same thing, and a second\n   * string for it is how the two drift apart one translation at a time. Only\n   * what exists nowhere else is below. */\n  \"home.title\": \"Home\",\n  \"home.storages.empty\": \"No storages yet\",\n  \"home.storages.hint\": \"A storage is a drive filex reads and writes — an administrator adds them.\",\n  \"drive.section.folders\": \"Folders\",\n  \"drive.section.files\": \"Files\",\n  \"filter.aria\": \"Filters\",\n  \"filter.type\": \"Type\",\n  \"filter.type.any\": \"Any type\",\n  \"filter.type.folder\": \"Folders\",\n  \"filter.type.document\": \"Documents\",\n  \"filter.type.spreadsheet\": \"Spreadsheets\",\n  \"filter.type.presentation\": \"Presentations\",\n  \"filter.type.pdf\": \"PDFs\",\n  \"filter.type.image\": \"Images\",\n  \"filter.type.video\": \"Videos\",\n  \"filter.type.audio\": \"Audio\",\n  \"filter.type.archive\": \"Archives\",\n  \"filter.type.code\": \"Code\",\n  \"filter.modified\": \"Modified\",\n  \"filter.modified.any\": \"Any time\",\n  \"filter.modified.today\": \"Today\",\n  \"filter.modified.7d\": \"Last 7 days\",\n  \"filter.modified.30d\": \"Last 30 days\",\n  \"filter.modified.year\": \"This year\",\n  \"filter.size\": \"Size\",\n  \"filter.size.any\": \"Any size\",\n  \"filter.size.lt1\": \"Under 1 MB\",\n  \"filter.size.1to10\": \"1 - 10 MB\",\n  \"filter.size.10to100\": \"10 - 100 MB\",\n  \"filter.size.gt100\": \"Over 100 MB\",\n  /* surucu:d1-actions — the ⋮ menu at the end of the filter row. Only its own\n     NAME is new: every row inside it reuses the string that verb already has\n     (`toolbar.new_folder`, `toolbar.upload`, `ctx.paste`, `shortcuts.select_all`,\n     `selection.clear`), because a menu that renames a command is a menu the\n     reader has to learn twice. */\n  \"filter.actions\": \"Listing actions\",\n  \"filter.clear\": \"Clear filters\",\n  \"filter.empty.title\": \"Nothing here matches those filters\",\n  \"filter.empty.hint\": \"Clear a filter, or search everywhere with the field above.\",\n  \"filter.count\": \"{shown} of {total}\",\n  \"inspector.tab.details\": \"Details\",\n  \"inspector.tab.activity\": \"Activity\",\n  \"inspector.people\": \"People with access\",\n  \"inspector.people.you\": \"You\",\n  \"inspector.people.inherited\": \"from a parent folder\",\n  \"inspector.people.empty\": \"Only you, and anyone with a link below.\",\n  \"inspector.people.manage\": \"Manage access\",\n  \"inspector.link\": \"Shared link\",\n  \"inspector.link.none\": \"Not shared\",\n  \"inspector.link.create\": \"Create link\",\n  \"inspector.link.copy\": \"Copy link\",\n  \"inspector.activity.empty\": \"No activity recorded for this item yet.\",\n  \"inspector.activity.hint\": \"Versions are written when a file changes; comments are written by people.\",\n  \"inspector.activity.version\": \"Version {n} saved\",\n  \"inspector.activity.comment\": \"Comment by {who}\",\n  \"inspector.activity.select\": \"Select a file or folder to see its activity.\",\n  /* === /surucu:d1 === */\n  /* i18n:hardcoded — the convert modal shipped with no keys at all: every\n     label was a Turkish literal behind an optional `t` prop nobody passed. */\n  \"convert.title\": \"Convert\",\n  \"convert.loading\": \"Loading the converter…\",\n  \"convert.done\": \"Converted and uploaded to this folder.\",\n  \"convert.close\": \"Close\",\n  \"convert.from\": \"Source\",\n  \"convert.search_format\": \"Search a target format (pdf, mp4, png…)\",\n  \"convert.no_format\": \"No matching format.\",\n  \"convert.unsupported_input\": \"This file type has no source format the converter can read.\",\n  \"convert.converting\": \"Converting…\",\n  \"convert.convert\": \"Convert\",\n  /* === gorunum:v1-chrome — the filter row's name box === */\n  \"filter.find\": \"Filter in this folder…\",\n  /* surucu:d1-scope — the same box where the rows are not a folder's contents.\n     It has to say what it narrows: at the drive list \"this folder\" names\n     nothing, and on Home it would name three blocks at once. */\n  \"filter.find.storages\": \"Filter storages…\",\n  \"filter.find.home\": \"Filter Home…\",\n  /* === gorunum:v1-viewer — the full-bleed overlay's own chrome === */\n  \"viewer.share\": \"Share\",\n  \"viewer.nav_prev\": \"Previous file\",\n  \"viewer.nav_next\": \"Next file\",\n  /* The counter in the top bar's meta line: \"246.3 KB • Sep 9, 2026 • 1 of 9\". */\n  \"viewer.counter\": \"{i} of {n}\",\n  \"viewer.zoom_reset\": \"Reset zoom\",\n  \"viewer.fullscreen\": \"Full screen\",\n  \"viewer.exit_fullscreen\": \"Exit full screen\",\n  \"viewer.md_placeholder\": \"# Markdown here…\",\n  /* === gorunum:v1-selbar — the selection bar that replaces the filter row === */\n  \"selection.count\": \"{n} selected\",\n  \"selection.clear\": \"Clear selection\",\n  /* === gorunum:v1-preview — the kind, said in words ======================\n     The Type column used to print the extension in caps. These are what it\n     prints instead; the table that picks one is in `lib/fileIcons.ts`\n     (`typeLabelKey`), so this list and that one are the only two places a\n     kind is named. Anything unmapped still falls back to the uppercased\n     extension — these names improve on that fallback, they do not replace\n     it. `Folder` is NOT here: it is `node.folder`, which the grid card's\n     caption already prints. */\n  \"ftype.typescript\": \"TypeScript\",\n  \"ftype.javascript\": \"JavaScript\",\n  \"ftype.vue\": \"Vue component\",\n  \"ftype.python\": \"Python\",\n  \"ftype.go\": \"Go\",\n  \"ftype.rust\": \"Rust\",\n  \"ftype.php\": \"PHP\",\n  \"ftype.ruby\": \"Ruby\",\n  \"ftype.java\": \"Java\",\n  \"ftype.kotlin\": \"Kotlin\",\n  \"ftype.swift\": \"Swift\",\n  \"ftype.c\": \"C source\",\n  \"ftype.cpp\": \"C++ source\",\n  \"ftype.csharp\": \"C# source\",\n  \"ftype.stylesheet\": \"Stylesheet\",\n  \"ftype.html\": \"HTML document\",\n  \"ftype.json\": \"JSON data\",\n  \"ftype.yaml\": \"YAML\",\n  \"ftype.xml\": \"XML\",\n  \"ftype.toml\": \"TOML\",\n  \"ftype.sql\": \"SQL\",\n  \"ftype.shell\": \"Shell script\",\n  \"ftype.powershell\": \"PowerShell script\",\n  \"ftype.markdown\": \"Markdown\",\n  \"ftype.plaintext\": \"Plain text\",\n  \"ftype.log\": \"Log file\",\n  \"ftype.config\": \"Configuration\",\n  \"ftype.sheet\": \"Spreadsheet\",\n  \"ftype.figma\": \"Figma design\",\n  \"ftype.design\": \"Design file\",\n  \"ftype.image\": \"Image\",\n  \"ftype.video\": \"Video\",\n  \"ftype.audio\": \"Audio\",\n  \"ftype.pdf\": \"PDF document\",\n  \"ftype.document\": \"Document\",\n  \"ftype.slides\": \"Presentation\",\n  \"ftype.archive\": \"Archive\",\n  \"ftype.code\": \"Code\",\n  /* === gorunum:v1-advsearch — the Advanced search dialog ==================\n   * Two `filter.*` keys are added here rather than beside their siblings\n   * because they are new members of shared unions the dialog introduced\n   * (`modified: 'around'`, `size: 'range'`); the filter row never selects\n   * them, but `chipLabel` would print the raw key if one ever reached it. */\n  \"filter.modified.around\": \"Around a date\",\n  \"filter.size.range\": \"Custom range\",\n  \"advsearch.open\": \"Advanced search\",\n  \"advsearch.title\": \"Advanced search\",\n  \"advsearch.subtitle\": \"Find files by name, content, path, or tags.\",\n  \"advsearch.close\": \"Close\",\n  \"advsearch.content.heading\": \"Content search\",\n  \"advsearch.viewall\": \"View all results\",\n  \"advsearch.where.any_short\": \"Anywhere\",\n  \"advsearch.where.here_short\": \"Only here\",\n  \"advsearch.where.skip_short\": \"Skip this\",\n  \"advsearch.server.legend\": \"What the server searches\",\n  \"advsearch.client.legend\": \"Narrow the results that come back\",\n  \"advsearch.query.label\": \"Words\",\n  \"advsearch.query.placeholder\": \"Part of a name, or words inside a file\",\n  \"advsearch.scope.label\": \"Look in\",\n  \"advsearch.scope.name\": \"Names and paths\",\n  \"advsearch.scope.content\": \"File contents\",\n  \"advsearch.scope.all\": \"Both\",\n  \"advsearch.scope.hint\": \"Contents are searched from the index, which covers text-like files up to 200 KB.\",\n  \"advsearch.people.name_only\": \"Owner is read off the rows that come back, and only a name search returns rows that carry one.\",\n  \"advsearch.scope.name_only\": \"Only names and paths here: a content hit reaches the explorer without the drive it came from, so content search is offered on single-storage deployments only.\",\n  \"advsearch.tags.label\": \"Tags\",\n  \"advsearch.tags.placeholder\": \"invoice, quarterly report\",\n  \"advsearch.tags.exclude\": \"Without tags\",\n  \"advsearch.tags.exclude_placeholder\": \"archive\",\n  \"advsearch.tags.hint\": \"Separate with commas. Tags narrow: several tags means files carrying all of them, and a tag nobody has applied returns nothing.\",\n  \"advsearch.where.label\": \"Folder\",\n  \"advsearch.where.any\": \"Anywhere in this storage\",\n  \"advsearch.where.here\": \"Only in {folder}\",\n  \"advsearch.where.skip\": \"Everywhere except {folder}\",\n  \"advsearch.around.label\": \"Within\",\n  \"advsearch.around.date\": \"Date and time\",\n  \"advsearch.around.h1\": \"1 hour\",\n  \"advsearch.around.d1\": \"1 day\",\n  \"advsearch.around.w1\": \"1 week\",\n  \"advsearch.size.range_label\": \"Between\",\n  \"advsearch.size.from\": \"From\",\n  \"advsearch.size.to\": \"To\",\n  \"advsearch.count.idle\": \"Type something, or pick a tag.\",\n  \"advsearch.count.counting\": \"Counting…\",\n  \"advsearch.count.result\": \"{n} matching items\",\n  \"advsearch.count.capped\": \"{n} matching items in the first page of hits\",\n  \"advsearch.count.result_one\": \"1 matching item\",\n  \"advsearch.count.capped_one\": \"1 matching item in the first page of hits\",\n  \"advsearch.count.error\": \"The count could not be run.\",\n  \"advsearch.count.cost\": \"The count runs this search. Type, owner, date, size and folder are applied to the rows that come back, not by the server.\",\n  \"advsearch.wire\": \"Sent as\",\n  \"advsearch.reset\": \"Reset\",\n  \"advsearch.cancel\": \"Cancel\",\n  \"advsearch.submit\": \"Search\",\n  /* === gorunum:v2-topbar — the page bar is gone; the explorer's own header\n     and breadcrumb row carry what it used to. === */\n  \"breadcrumb.subfolders\": \"Subfolders\",\n  \"breadcrumb.subfolders.empty\": \"No subfolders here\",\n  \"header.admin\": \"Admin panel\",\n  \"header.settings\": \"Settings\",\n  \"header.signout\": \"Sign out\",\n  \"ai.assistant\": \"AI assistant\",\n  \"ai.soon\": \"Coming soon\",\n  \"ai.assistant.soon\": \"AI assistant — coming soon\",\n  /* gorunum:v2-share — the Share / Permissions dialog's own chrome. The\n     controls inside it keep the strings they already had; these are the new\n     shell: the title, the one switch, the sentence that says who can open the\n     item right now, and the three named sections it all folds into. */\n  \"access.title\": 'Share \"{name}\"',\n  \"access.close\": \"Close\",\n  \"access.done\": \"Done\",\n  \"access.copy\": \"Copy\",\n  \"access.copied\": \"Copied\",\n  \"access.link.switch\": \"Link sharing\",\n  \"access.who.private\": \"Only people with access can open it.\",\n  \"access.who.link\": \"Anyone with the link can open it.\",\n  \"access.who.pin\": \"Anyone with the link and the PIN can open it.\",\n  \"access.who.existing\": \"Link sharing is on — {n} links already exist.\",\n  \"access.who.existing_one\": \"Link sharing is on — 1 link already exists.\",\n  \"access.section.link\": \"Link options\",\n  \"access.section.people\": \"People with access\",\n  \"access.section.drop\": \"Request files\",\n  \"access.sum.pin_on\": \"PIN on\",\n  \"access.sum.pin_off\": \"No PIN\",\n  \"access.sum.people\": \"{n} people\",\n  \"access.sum.people_one\": \"1 person\",\n  \"access.sum.people_none\": \"No one yet\",\n  \"access.sum.drop\": \"{n} upload links\",\n  \"access.sum.drop_one\": \"1 upload link\",\n  \"access.sum.drop_none\": \"No upload link\",\n  /* Ownership — the Owner column and the People chip. \"System\" is the honest\n     word for a row nobody put here through filex (the scanner found it, or it\n     was written straight into the bucket); it is a real answer, not a blank. */\n  \"col.owner\": \"Owner\",\n  \"owner.you\": \"You\",\n  \"owner.system\": \"System\",\n  \"owner.unknown\": \"Unknown\",\n  \"owner.external\": \"Uploaded through an upload link\",\n  \"owner.last_actor\": \"Last changed by {who}\",\n  \"filter.people\": \"People\",\n  \"filter.people.any\": \"Anyone\",\n  \"filter.people.me\": \"You\",\n  \"filter.people.system\": \"System\",\n  \"filter.people.someone\": \"Someone else\",\n  /* surucu:d1-sort — the listing sort control at the trailing edge of the\n     filter row. The four key names are `col.*`: the menu offers exactly the\n     words the list view's own column headers carry, so the two controls that\n     drive one sort cannot name it differently. */\n  \"sort.by\": \"Sort by\",\n  \"sort.asc\": \"Ascending\",\n  \"sort.desc\": \"Descending\",\n  /* The order a SEARCH RESULT is in. It is not a fifth sort key — it is what\n     the control prints instead of a key while the rows on screen were ranked\n     by the server, so the button stops claiming a sort it is not performing.\n     `_why` is the reason the control is closed, and the owner asked for the\n     reason to be written rather than for the control to go quietly inert. */\n  \"sort.relevance\": \"Relevance\",\n  \"sort.relevance_why\": \"Search results are listed by how well they match. Your sort comes back when you leave the search.\",\n  /* === tablo:t1 — the table's own configuration ==========================\n     Column widths and visibility are a preference about YOUR SCREEN; the view\n     a folder opens in is a fact about the FOLDER. Both are set from here, and\n     `folder_hint` is the rule in one sentence, written where the person who is\n     about to be surprised by it can read it. */\n  \"col.location\": \"Location\",\n  \"cols.menu\": \"Column options\",\n  \"cols.title\": \"Columns\",\n  \"cols.resize\": \"Resize {col}\",\n  \"cols.move_left\": \"Move {col} left\",\n  \"cols.move_right\": \"Move {col} right\",\n  \"cols.reset\": \"Reset columns\",\n  \"cols.folder_title\": \"Folder view\",\n  \"cols.folder_hint\": \"Folders you set up keep their own view. Your last choice is the default everywhere else.\",\n  \"cols.forget_folder\": \"Forget this folder's view\",\n  \"cols.apply_all\": \"Apply to all folders ({count} remembered)\",\n  /* === tablo:t1 — the trash banner ======================================\n     ⚠ `retention` is only used when the deployment has TOLD us the number\n     (GET /api/admin/protection). Everywhere else `retention_unknown` says the\n     same thing without naming a period we cannot verify: a banner that states\n     the wrong retention is worse than no banner, because people act on it. */\n  \"trash.retention\": \"Items in the trash are permanently deleted after {days} days.\",\n  \"trash.retention_one\": \"Items in the trash are permanently deleted after 1 day.\",\n  \"trash.retention_unknown\": \"Items in the trash are permanently deleted after a retention period set by your administrator.\",\n  \"trash.empty_action\": \"Empty trash\",\n  \"trash.empty_confirm_title\": \"Empty the trash?\",\n  \"trash.empty_confirm_body_one\": \"This permanently deletes 1 item ({size}). It cannot be undone.\",\n  \"trash.empty_confirm_body\": \"This permanently deletes {count} items ({size}). It cannot be undone.\",\n  \"trash.empty_confirm_body_nosize_one\": \"This permanently deletes 1 item. It cannot be undone.\",\n  \"trash.empty_confirm_body_nosize\": \"This permanently deletes {count} items. It cannot be undone.\",\n  \"trash.emptied\": \"Trash emptied\",\n  \"empty.trash.hint\": \"Files you delete land here first, so you can put them back.\",\n  /* tasi:m1 — the destination picker (modals/DestinationPickerModal.vue) and\n     the two selection verbs built on it. */\n  \"destpicker.title.move\": \"Move to\",\n  \"destpicker.title.copy\": \"Copy to\",\n  \"destpicker.title.choose\": \"Choose a folder\",\n  \"destpicker.confirm.move\": \"Move here\",\n  \"destpicker.confirm.copy\": \"Copy here\",\n  \"destpicker.confirm.choose\": \"Choose this folder\",\n  \"destpicker.cancel\": \"Cancel\",\n  \"destpicker.up\": \"Up one level\",\n  \"destpicker.crumbs\": \"Location\",\n  \"destpicker.drives\": \"Drives\",\n  \"destpicker.loading\": \"Loading…\",\n  \"destpicker.empty\": \"No subfolders here\",\n  \"destpicker.unreadable\": \"This folder cannot be opened.\",\n  \"destpicker.readonly\": \"Read-only\",\n  \"destpicker.readonly_here\": \"You cannot write into this folder.\",\n  \"destpicker.pick_a_drive\": \"Open a storage to choose a folder inside it.\",\n  \"destpicker.target\": \"Destination: {name}\",\n  \"destpicker.tag.blocked\": \"Not allowed\",\n  \"destpicker.blocked.self\": \"A folder cannot be moved into itself.\",\n  \"destpicker.blocked.descendant\": \"A folder cannot be moved into one of its own subfolders.\",\n  \"ctx.move_to\": \"Move to…\",\n  \"ctx.copy_to\": \"Copy to…\",\n  \"ctx.access.one_only\": \"Sharing works on one item at a time.\",\n  \"toast.archive.preparing\": \"Preparing the archive…\",\n  \"toast.archive.started\": \"Downloading {name} ({count} files)\",\n  \"toast.archive.started_one\": \"Downloading {name} (1 file)\",\n  \"toast.archive.empty\": \"Nothing to download — the selection contains no readable file.\",\n  \"toast.moved_to\": \"Moved to {name}\",\n  \"toast.copied_to\": \"Copy to {name} queued\"\n}, Ms = { tr: Bv, en: Iv }, Hv = Object.freeze([\n  \"viewer\",\n  \"host\",\n  \"account\",\n  \"device\"\n]);\nfunction Mi(e) {\n  for (const t of Hv) {\n    if (t === \"device\") break;\n    const n = e[t];\n    if (typeof n == \"string\" && n && qa(n)) return { zone: n, tier: t };\n  }\n  return { zone: void 0, tier: \"device\" };\n}\nconst ko = \"filex.timezone.viewer\", Es = \"filex.timezone\", Fv = [\n  \"UTC\",\n  \"Europe/Istanbul\",\n  \"Europe/London\",\n  \"Europe/Berlin\",\n  \"Europe/Paris\",\n  \"Europe/Madrid\",\n  \"Europe/Moscow\",\n  \"America/New_York\",\n  \"America/Chicago\",\n  \"America/Denver\",\n  \"America/Los_Angeles\",\n  \"America/Sao_Paulo\",\n  \"Africa/Cairo\",\n  \"Africa/Lagos\",\n  \"Asia/Dubai\",\n  \"Asia/Karachi\",\n  \"Asia/Kolkata\",\n  \"Asia/Shanghai\",\n  \"Asia/Tokyo\",\n  \"Asia/Seoul\",\n  \"Asia/Singapore\",\n  \"Australia/Sydney\",\n  \"Pacific/Auckland\"\n];\nfunction qs() {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n  } catch {\n    return \"UTC\";\n  }\n}\nfunction qa(e) {\n  if (!e) return !1;\n  try {\n    return new Intl.DateTimeFormat(\"en-US\", { timeZone: e }), !0;\n  } catch {\n    return !1;\n  }\n}\nfunction Nv() {\n  try {\n    const e = Intl.supportedValuesOf;\n    if (typeof e == \"function\") {\n      const t = e(\"timeZone\");\n      if (Array.isArray(t) && t.length)\n        return t.includes(\"UTC\") ? [...t] : [\"UTC\", ...t];\n    }\n  } catch {\n  }\n  return [...Fv];\n}\nfunction Ic(e, t) {\n  const n = t ?? Kv();\n  try {\n    const r = new Intl.DateTimeFormat(\"en-CA\", {\n      timeZone: n,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\"\n    }).formatToParts(e), a = (h) => {\n      var b;\n      return Number((b = r.find((y) => y.type === h)) == null ? void 0 : b.value);\n    }, u = a(\"year\"), v = a(\"month\"), p = a(\"day\");\n    if (!Number.isFinite(u) || !Number.isFinite(v) || !Number.isFinite(p))\n      throw new Error(\"unparsable\");\n    return Math.floor(Date.UTC(u, v - 1, p) / 864e5);\n  } catch {\n    return Math.floor(\n      Date.UTC(e.getFullYear(), e.getMonth(), e.getDate()) / 864e5\n    );\n  }\n}\nfunction _o(e) {\n  try {\n    const t = localStorage.getItem(e);\n    return t && qa(t) ? t : \"\";\n  } catch {\n    return \"\";\n  }\n}\nfunction ju(e, t) {\n  try {\n    t ? localStorage.setItem(e, t) : localStorage.removeItem(e);\n  } catch {\n  }\n}\nconst Ei = typeof window < \"u\", ba = m(Ei ? _o(ko) : \"\");\nfunction Yu() {\n  const e = m([]);\n  return {\n    set(t, n) {\n      const r = e.value.find((a) => a.owner === t);\n      if (n === null) {\n        r && (e.value = e.value.filter((a) => a !== r));\n        return;\n      }\n      r && r.zone === n || (e.value = [...e.value.filter((a) => a.owner !== t), { owner: t, zone: n }]);\n    },\n    of(t) {\n      var n;\n      return ((n = e.value.find((r) => r.owner === t)) == null ? void 0 : n.zone) ?? null;\n    },\n    current() {\n      const t = e.value;\n      return t.length ? t[t.length - 1].zone : \"\";\n    },\n    /** The newest answer among the owners `pick` accepts. */\n    currentWhere(t) {\n      const n = e.value.filter((r) => t(r.owner));\n      return n.length ? n[n.length - 1].zone : \"\";\n    }\n  };\n}\nconst Mo = Yu(), Vn = Yu(), Gs = /* @__PURE__ */ new Set(), zi = k(\n  () => Mi({\n    viewer: ba.value,\n    host: Mo.current(),\n    account: Vn.current()\n  })\n);\nfunction Kv() {\n  return zi.value.zone;\n}\nfunction LD() {\n  return zi.value;\n}\nconst Xs = Symbol(\"filex-explorer-clock\");\nfunction Wu(e) {\n  return e ? {\n    viewer: ba.value,\n    host: Mo.of(e) ?? \"\",\n    account: Vn.of(e) ?? Vn.currentWhere((t) => Gs.has(t))\n  } : Rv();\n}\nfunction qu(e) {\n  return e ? Mi(Wu(e)) : zi.value;\n}\nfunction Gu(e) {\n  return qu(e).zone;\n}\nfunction Rv() {\n  return {\n    viewer: ba.value,\n    host: Mo.current(),\n    account: Vn.current()\n  };\n}\nfunction Uv() {\n  return ba.value;\n}\nfunction Vv(e) {\n  const t = e && qa(e) ? e : \"\";\n  ba.value = t, ju(ko, t);\n  try {\n    window.dispatchEvent(new CustomEvent(\"filex:timezone\", { detail: t }));\n  } catch {\n  }\n}\nfunction jv(e, t) {\n  Mo.set(e, t && qa(t) ? t : null);\n}\nfunction Wr(e, t, n = {}) {\n  if (t == null) {\n    Vn.set(e, null);\n    return;\n  }\n  const r = t && qa(t) ? t : \"\";\n  Vn.set(e, r), n.remember && (Gs.add(e), ju(Es, r));\n}\nfunction DD(e) {\n  return Vn.of(e);\n}\nfunction OD() {\n  return Ei ? _o(Es) : \"\";\n}\nfunction Yv(e) {\n  Mo.set(e, null), Vn.set(e, null), Gs.delete(e);\n}\nif (Ei)\n  try {\n    window.addEventListener(\"storage\", (e) => {\n      if ((e.key === null || e.key === ko) && (ba.value = _o(ko)), e.key === null || e.key === Es) {\n        const t = _o(Es);\n        for (const n of Gs) Vn.set(n, t);\n      }\n    }), window.addEventListener(\"filex:timezone\", (e) => {\n      const t = e.detail;\n      ba.value = typeof t == \"string\" ? t && qa(t) ? t : \"\" : _o(ko);\n    });\n  } catch {\n  }\nfunction Ai(e) {\n  return e === \"tr\" ? \"tr-TR\" : \"en-US\";\n}\nconst Hc = [\n  \"unit.bytes\",\n  \"unit.kb\",\n  \"unit.mb\",\n  \"unit.gb\",\n  \"unit.tb\",\n  \"unit.pb\"\n], Wv = {\n  \"unit.bytes\": \"B\",\n  \"unit.kb\": \"KB\",\n  \"unit.mb\": \"MB\",\n  \"unit.gb\": \"GB\",\n  \"unit.tb\": \"TB\",\n  \"unit.pb\": \"PB\"\n};\nfunction Xu(e, t = {}) {\n  const n = t.empty ?? \"—\";\n  if (e == null || !Number.isFinite(e) || e < 0) return n;\n  const r = t.base ?? 1e3, a = t.unit ?? ((b) => Wv[b]);\n  let u = 0, v = e;\n  for (; v >= r && u < Hc.length - 1; )\n    v /= r, u += 1;\n  const p = u === 0 ? 0 : t.digits === \"fixed1\" ? 1 : v < 10 ? 2 : 1;\n  let h;\n  if (t.numberLocale == null)\n    h = v.toFixed(p);\n  else {\n    const b = qv(t.numberLocale, p, t.digits === \"fixed1\" ? p : 0);\n    h = b ? b.format(v) : v.toFixed(p);\n  }\n  return `${h} ${a(Hc[u])}`;\n}\nconst ms = /* @__PURE__ */ new Map();\nfunction qv(e, t, n) {\n  const r = `${e}|${t}|${n}`;\n  if (!ms.has(r))\n    try {\n      ms.set(r, new Intl.NumberFormat(e, {\n        maximumFractionDigits: t,\n        minimumFractionDigits: n\n      }));\n    } catch {\n      ms.set(r, null);\n    }\n  return ms.get(r) ?? null;\n}\nconst Fc = /* @__PURE__ */ new Map();\nfunction Ju(e, t, n) {\n  const r = Gu(n), a = `${e}|${r ?? `device:${qs()}`}|${JSON.stringify(t)}`;\n  let u = Fc.get(a);\n  return u || (u = new Intl.DateTimeFormat(e, { ...t, timeZone: r }), Fc.set(a, u)), u;\n}\nfunction Ha(e, t, n, r) {\n  try {\n    return Ju(Ai(t), n, r).format(e);\n  } catch {\n    return e.toISOString();\n  }\n}\nfunction bo(e) {\n  if (!e) return null;\n  const t = new Date(e * (e < 1e12 ? 1e3 : 1));\n  return Number.isNaN(t.getTime()) ? null : t;\n}\nconst Gv = [\"count\", \"n\", \"days\"];\nfunction Xv(e, t, n) {\n  const r = Gv.find((u) => u in t);\n  if (r === void 0 || Number(t[r]) !== 1) return e;\n  const a = `${e}_one`;\n  return n(a) ? a : e;\n}\nfunction tt(e) {\n  const t = () => typeof e == \"function\" ? e() : e.value, n = k(() => Ms[t()] ?? Ms.en), r = sv() ? Ws(Xs, void 0) : void 0;\n  function a(A, D = {}) {\n    const C = n.value, B = C[Xv(A, D, (I) => I in C)] ?? A;\n    return Object.entries(D).reduce(\n      (I, [U, x]) => I.replaceAll(`{${U}}`, String(x)),\n      B\n    );\n  }\n  function u(A) {\n    return Xu(A, {\n      unit: (D) => a(D),\n      numberLocale: Ai(t())\n    });\n  }\n  function v(A) {\n    if (A.basename === \".trash\") return a(\"node.trash\");\n    const D = A.basename.match(/^\\d{8}-\\d{6}-[A-Za-z0-9]+__(.+)$/);\n    return D ? D[1] : A.basename;\n  }\n  function p(A, D = {}) {\n    const C = bo(A);\n    if (!C) return \"\";\n    const B = Ha(\n      C,\n      t(),\n      {\n        month: \"short\",\n        day: \"numeric\",\n        year: \"numeric\"\n      },\n      r\n    );\n    return D.time ? `${B}, ${Ha(C, t(), { hour: \"numeric\", minute: \"2-digit\" }, r)}` : B;\n  }\n  function h(A) {\n    const D = bo(A);\n    if (!D) return \"\";\n    const C = Gu(r) ?? qs();\n    return `${Ha(D, t(), { dateStyle: \"full\", timeStyle: \"long\" }, r)} (${C})`;\n  }\n  function b(A) {\n    const D = A instanceof Date ? A : bo(A);\n    return D ? Ha(D, t(), { month: \"long\", year: \"numeric\" }, r) : \"\";\n  }\n  function y(A) {\n    const D = A instanceof Date ? A : bo(A);\n    if (!D) return \"\";\n    try {\n      return Ju(\"en-CA\", { year: \"numeric\", month: \"2-digit\" }, r).format(D);\n    } catch {\n      return `${D.getFullYear()}-${String(D.getMonth() + 1).padStart(2, \"0\")}`;\n    }\n  }\n  return {\n    t: a,\n    formatSize: u,\n    formatDate: p,\n    formatDateFull: h,\n    formatMonthYear: b,\n    zonedYearMonth: y,\n    /**\n     * zaman:z1 — the wire's `last_modified` as a `Date`, or null.\n     *\n     * Handed out because \"seconds or milliseconds\" is a fact about the WIRE,\n     * not about formatting, and every caller that needs the instant itself\n     * (rather than a string) was otherwise re-typing `v * (v < 1e12 ? 1000 :\n     * 1)`. ListView had the third copy and used it to group rows by day — so\n     * the grouping and the cell four pixels away were reading the same number\n     * through two different converters.\n     */\n    toDate: bo,\n    nodeDisplayName: v\n  };\n}\nconst Jv = 2e3, Zv = 8e3;\nfunction Nc(e) {\n  const t = (...p) => {\n    for (const h of p) if (typeof h == \"number\") return h;\n    return 0;\n  }, n = (...p) => {\n    for (const h of p) if (typeof h == \"string\" && h !== \"\") return h;\n    return null;\n  }, r = String(e.status ?? \"pending\"), a = r === \"ok\" || r === \"done\" ? \"done\" : r === \"failed\" || r === \"partial\" || r === \"error\" ? \"error\" : r === \"running\" ? \"running\" : \"pending\", u = Array.isArray(e.sources) ? e.sources : [], v = n(e.op_type, e.kind) ?? \"delete\";\n  return {\n    id: t(e.id),\n    op_type: v === \"copy\" || v === \"move\" ? v : \"delete\",\n    status: a,\n    progress_total: t(e.progress_total, e.total, u.length),\n    progress_done: t(e.progress_done, e.done),\n    bytes_total: t(e.bytes_total),\n    bytes_done: t(e.bytes_done),\n    target_path: n(e.target_path, e.dest),\n    source_dir: n(e.source_dir),\n    source_count: t(e.source_count, u.length),\n    error_message: n(e.error_message, e.error),\n    started_at: n(e.started_at),\n    finished_at: n(e.finished_at),\n    created_at: n(e.created_at)\n  };\n}\nfunction Qv(e, t, n = {}) {\n  const r = m([]), a = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();\n  let v = !1;\n  const p = k(\n    () => r.value.some((B) => B.status === \"pending\" || B.status === \"running\")\n  );\n  let h;\n  function b() {\n    h || t.endpoints.opsList && (h = setInterval(() => {\n      A();\n    }, Jv), A());\n  }\n  function y() {\n    h && (clearInterval(h), h = void 0);\n  }\n  async function A() {\n    var B;\n    if (t.endpoints.opsList)\n      try {\n        const U = ((await t.jsonFetch(t.endpoints.opsList)).ops || []).map(Nc);\n        for (const O of U)\n          (O.status === \"done\" || O.status === \"error\") && !a.has(O.id) && (a.add(O.id), u.set(O.id, Date.now()), v && ((B = n.onSettled) == null || B.call(n, O)));\n        const x = new Set(r.value.map((O) => O.id)), E = U.filter((O) => O.status === \"pending\" || O.status === \"running\" ? !0 : v ? x.has(O.id) : !1), $ = new Set(E.map((O) => O.id)), M = r.value.filter((O) => !$.has(O.id)), z = [...E, ...M];\n        v = !0;\n        const T = Date.now(), Y = z.filter((O) => {\n          if (O.status === \"pending\" || O.status === \"running\") return !0;\n          const J = u.get(O.id);\n          return J !== void 0 && T - J < Zv;\n        });\n        r.value = Y, !p.value && Y.length === 0 && y();\n      } catch (I) {\n        console.warn(\"[usePendingOps] poll failed:\", I);\n      }\n  }\n  function D(B) {\n    const I = Nc(B);\n    r.value.some((x) => x.id === I.id) || (r.value = [I, ...r.value]), b();\n  }\n  function C(B) {\n    r.value = r.value.filter((I) => I.id !== B), u.delete(B);\n  }\n  return it(() => {\n    y();\n  }), {\n    ops: r,\n    hasActive: p,\n    register: D,\n    dismiss: C,\n    poll: A,\n    startPolling: b,\n    stopPolling: y\n  };\n}\nconst eh = 25e3, th = 15e3, nh = 6;\nclass ah {\n  constructor(t) {\n    kn(this, \"ws\", null);\n    kn(this, \"opts\");\n    kn(this, \"closed\", !1);\n    kn(this, \"connecting\", !1);\n    kn(this, \"retries\", 0);\n    kn(this, \"fallback\", !1);\n    kn(this, \"pingTimer\", null);\n    kn(this, \"reconnectTimer\", null);\n    // Last-known intent, replayed on (re)connect.\n    kn(this, \"currentPath\", null);\n    kn(this, \"currentFocus\", null);\n    this.opts = t, this.connect();\n  }\n  /** Subscribe to a folder (\"<adapter>://<dir>\"). Swaps the active room and\n   *  resets focus. Passing null unsubscribes (drive list / trash have no room). */\n  subscribe(t) {\n    this.currentPath = t, this.currentFocus = null, t && this.send({ type: \"subscribe\", path: t });\n  }\n  /** Report the file the user is focused on (or null to clear). */\n  setFocus(t) {\n    this.currentFocus = t, this.send({ type: \"focus\", file: t });\n  }\n  /** Tear down permanently — call on unmount. */\n  close() {\n    this.closed = !0, this.clearTimers(), this.dropSocket();\n  }\n  async connect() {\n    if (this.closed || this.connecting || this.ws) return;\n    this.connecting = !0;\n    let t = null;\n    try {\n      t = await this.opts.getTicket();\n    } catch {\n      t = null;\n    }\n    if (this.connecting = !1, this.closed) return;\n    if (!t || !t.ticket || !t.ws_url) {\n      this.fail();\n      return;\n    }\n    const n = t.ws_url.includes(\"?\") ? \"&\" : \"?\";\n    let r;\n    try {\n      r = new WebSocket(`${t.ws_url}${n}ticket=${encodeURIComponent(t.ticket)}`);\n    } catch {\n      this.fail();\n      return;\n    }\n    this.ws = r, r.onopen = () => {\n      var a, u;\n      this.retries = 0, this.setFallback(!1), (u = (a = this.opts.handlers).onStatus) == null || u.call(a, !0), this.currentPath && this.send({ type: \"subscribe\", path: this.currentPath }), this.currentFocus !== null && this.send({ type: \"focus\", file: this.currentFocus }), this.startPing();\n    }, r.onmessage = (a) => {\n      var p, h, b, y;\n      let u;\n      try {\n        u = JSON.parse(typeof a.data == \"string\" ? a.data : \"\");\n      } catch {\n        return;\n      }\n      const v = u;\n      (v == null ? void 0 : v.type) === \"change\" ? (h = (p = this.opts.handlers).onChange) == null || h.call(p, u) : (v == null ? void 0 : v.type) === \"presence\" && ((y = (b = this.opts.handlers).onPresence) == null || y.call(b, u));\n    }, r.onerror = () => {\n    }, r.onclose = () => {\n      var a, u;\n      this.stopPing(), this.ws = null, (u = (a = this.opts.handlers).onStatus) == null || u.call(a, !1), this.fail();\n    };\n  }\n  // fail schedules a capped reconnect; after MAX_RETRIES it gives up on the live\n  // socket and flips to fallback (polling) mode.\n  fail() {\n    if (this.closed || this.reconnectTimer) return;\n    if (this.retries >= nh) {\n      this.setFallback(!0);\n      return;\n    }\n    const t = Math.min(1e3 * 2 ** this.retries, th);\n    this.retries += 1, this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = null, this.connect();\n    }, t);\n  }\n  setFallback(t) {\n    var n, r;\n    this.fallback !== t && (this.fallback = t, (r = (n = this.opts.handlers).onFallback) == null || r.call(n, t));\n  }\n  send(t) {\n    const n = this.ws;\n    if (!(!n || n.readyState !== WebSocket.OPEN))\n      try {\n        n.send(JSON.stringify(t));\n      } catch {\n      }\n  }\n  startPing() {\n    this.stopPing(), this.pingTimer = setInterval(() => this.send({ type: \"ping\" }), eh);\n  }\n  stopPing() {\n    this.pingTimer && (clearInterval(this.pingTimer), this.pingTimer = null);\n  }\n  dropSocket() {\n    if (this.ws) {\n      try {\n        this.ws.onclose = null, this.ws.close();\n      } catch {\n      }\n      this.ws = null;\n    }\n  }\n  clearTimers() {\n    this.stopPing(), this.reconnectTimer && (clearTimeout(this.reconnectTimer), this.reconnectTimer = null);\n  }\n}\nfunction oh(e, t) {\n  const n = t.now ?? (() => Date.now());\n  let r = null, a = null;\n  const u = () => {\n    const v = n();\n    a === null && (a = v);\n    const p = a + t.maxWait - v, h = Math.max(0, Math.min(t.wait, p));\n    r && clearTimeout(r), r = setTimeout(() => {\n      r = null, a = null, e();\n    }, h);\n  };\n  return u.cancel = () => {\n    r && clearTimeout(r), r = null, a = null;\n  }, u;\n}\nconst sh = 200, rh = 2e3, ih = 12e3;\nfunction lh(e, t) {\n  const n = m([]), r = m(!1), a = m(!1);\n  let u = null, v = null;\n  const p = oh(() => t.reload(), {\n    wait: sh,\n    maxWait: rh\n  });\n  let h = null;\n  function b(I) {\n    v && I.path && I.path !== v || (n.value = Array.isArray(I.users) ? I.users : []);\n  }\n  function y(I) {\n    a.value = I, I ? (n.value = [], h || (h = setInterval(() => t.reload(), ih))) : h && (clearInterval(h), h = null);\n  }\n  function A() {\n    u || (u = new ah({\n      getTicket: () => e.wsTicket(),\n      handlers: {\n        onChange: p,\n        onPresence: b,\n        onFallback: y,\n        onStatus: (I) => {\n          r.value = I;\n        }\n      }\n    }));\n  }\n  function D(I) {\n    n.value = [], v = I, u == null || u.subscribe(I);\n  }\n  function C(I) {\n    u == null || u.setFocus(I);\n  }\n  function B() {\n    p.cancel(), h && (clearInterval(h), h = null), u == null || u.close(), u = null, a.value = !1;\n  }\n  return { presenceUsers: n, connected: r, degraded: a, start: A, subscribe: D, setFocus: C, stop: B };\n}\nconst ch = 500;\nfunction uh(e, t) {\n  const n = m({}), r = [], a = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set();\n  function v(b) {\n    if (/^https?:\\/\\//i.test(b)) return b;\n    const y = (e || \"\").replace(/\\/+$/, \"\");\n    return y && b.startsWith(\"/\") ? y + b : b;\n  }\n  function p(b) {\n    const y = b.thumb_url;\n    if (!y) return null;\n    const A = n.value[y];\n    return A || (!a.has(y) && !u.has(y) && h(y), null);\n  }\n  async function h(b) {\n    u.add(b);\n    try {\n      const y = await fetch(v(b), {\n        headers: await t.authHeaders({ Accept: \"*/*\" }),\n        credentials: t.credentialsMode()\n      });\n      if (!y.ok) throw new Error(String(y.status));\n      const A = await y.blob();\n      if (r.length >= ch) {\n        const D = r.shift();\n        if (D && n.value[D]) {\n          URL.revokeObjectURL(n.value[D]);\n          const C = { ...n.value };\n          delete C[D], n.value = C;\n        }\n      }\n      r.push(b), n.value = { ...n.value, [b]: URL.createObjectURL(A) };\n    } catch {\n      a.add(b);\n    } finally {\n      u.delete(b);\n    }\n  }\n  return { src: p };\n}\nlet zs = null, As = null, gs = null, ks = null;\nfunction Js() {\n  zs || (zs = import(\n    /* @vite-ignore */\n    \"monaco-editor\"\n  ).then((e) => (gs = e.default ?? e, gs)).catch(() => (gs = null, null))), As || (As = import(\n    /* @vite-ignore */\n    \"./common-xdTjul80.js\"\n  ).then((e) => (ks = e.default ?? e, ks)).catch(() => (ks = null, null)));\n}\nasync function ri() {\n  return zs || Js(), zs;\n}\nasync function Zu() {\n  return As || Js(), As;\n}\nfunction Qu() {\n  return gs;\n}\nfunction dh() {\n  return ks;\n}\nfunction BD() {\n  return Js(), {\n    ensureMonaco: ri,\n    ensureHighlight: Zu,\n    getMonaco: Qu,\n    getHighlight: dh\n  };\n}\nconst fh = [\"title\"], ph = [\"src\", \"alt\"], vh = {\n  key: 2,\n  class: \"fx-presence-dot\",\n  \"aria-hidden\": \"true\"\n}, Kc = /* @__PURE__ */ qe({\n  __name: \"PresenceAvatar\",\n  props: {\n    user: {},\n    title: {}\n  },\n  setup(e) {\n    const t = e, n = k(() => {\n      const p = (t.user.avatar ?? \"\").trim();\n      return /^(data:image\\/|https?:\\/\\/|\\/)/.test(p) ? p : \"\";\n    }), r = m(!1), a = k(() => !!n.value && !r.value), u = k(() => {\n      const p = t.user.name.trim().split(/\\s+/).filter(Boolean);\n      return p.length === 0 ? \"?\" : p.length === 1 ? p[0].slice(0, 2).toUpperCase() : (p[0][0] + p[p.length - 1][0]).toUpperCase();\n    }), v = k(() => {\n      const p = t.user.uid ?? String(t.user.id);\n      let h = 0;\n      for (let b = 0; b < p.length; b++) h = h * 31 + p.charCodeAt(b) >>> 0;\n      return h % 360;\n    });\n    return (p, h) => (c(), d(\"span\", {\n      class: we([\"fx-presence-avatar\", { \"fx-presence-avatar--photo\": a.value }]),\n      style: Ct({ backgroundColor: `hsl(${v.value} 60% 45%)` }),\n      title: e.title\n    }, [\n      a.value ? (c(), d(\"img\", {\n        key: 0,\n        class: \"fx-presence-photo\",\n        src: n.value,\n        alt: e.user.name,\n        onError: h[0] || (h[0] = (b) => r.value = !0)\n      }, null, 40, ph)) : (c(), d(ae, { key: 1 }, [\n        Je(f(u.value), 1)\n      ], 64)),\n      e.user.file ? (c(), d(\"span\", vh)) : g(\"\", !0)\n    ], 14, fh));\n  }\n}), hh = {\n  key: 0,\n  class: \"fx-presence-chips\"\n}, mh = [\"title\"], yh = { class: \"fx-presence-chip-name\" }, bh = {\n  key: 0,\n  class: \"fx-presence-chip-file\"\n}, gh = [\"title\"], kh = {\n  key: 0,\n  class: \"fx-presence-more\"\n}, _h = [\"title\"], wh = { class: \"fx-presence-file\" }, $h = [\"title\", \"aria-expanded\"], Rc = \"filex.presence.expanded\", xh = /* @__PURE__ */ qe({\n  __name: \"PresenceBar\",\n  props: {\n    users: {},\n    selfId: {},\n    locale: {}\n  },\n  setup(e) {\n    const t = e, { t: n } = tt(() => cn(t.locale)), r = k(\n      () => (t.users ?? []).filter((h) => t.selfId == null || h.id !== t.selfId)\n    ), a = m((() => {\n      try {\n        return localStorage.getItem(Rc) === \"1\";\n      } catch {\n        return !1;\n      }\n    })());\n    function u() {\n      a.value = !a.value;\n      try {\n        localStorage.setItem(Rc, a.value ? \"1\" : \"0\");\n      } catch {\n      }\n    }\n    function v(h) {\n      return h.uid ?? String(h.id);\n    }\n    function p(h) {\n      return h.file ? `${h.name} · ${h.file}` : h.name;\n    }\n    return (h, b) => r.value.length ? (c(), d(\"div\", {\n      key: 0,\n      class: we([\"fx-presence\", { \"fx-presence--wide\": a.value }])\n    }, [\n      a.value ? (c(), d(\"div\", hh, [\n        (c(!0), d(ae, null, Te(r.value, (y) => (c(), d(\"span\", {\n          key: v(y),\n          class: \"fx-presence-chip\",\n          title: p(y)\n        }, [\n          Ge(Kc, { user: y }, null, 8, [\"user\"]),\n          o(\"span\", yh, f(y.name), 1),\n          y.file ? (c(), d(\"span\", bh, \"· \" + f(y.file), 1)) : g(\"\", !0)\n        ], 8, mh))), 128))\n      ])) : (c(), d(ae, { key: 1 }, [\n        o(\"div\", {\n          class: \"fx-presence-avatars\",\n          title: r.value.map(p).join(\", \")\n        }, [\n          (c(!0), d(ae, null, Te(r.value.slice(0, 5), (y) => (c(), et(Kc, {\n            key: v(y),\n            user: y,\n            title: p(y)\n          }, null, 8, [\"user\", \"title\"]))), 128)),\n          r.value.length > 5 ? (c(), d(\"span\", kh, \"+\" + f(r.value.length - 5), 1)) : g(\"\", !0)\n        ], 8, gh),\n        o(\"span\", {\n          class: \"fx-presence-text\",\n          title: r.value.map(p).join(\", \")\n        }, [\n          Je(f(r.value.length === 1 ? r.value[0].name : s(n)(\"presence.others\", { n: r.value.length })) + \" \", 1),\n          r.value.length === 1 && r.value[0].file ? (c(), d(ae, { key: 0 }, [\n            b[0] || (b[0] = Je(\" · \", -1)),\n            o(\"span\", wh, f(r.value[0].file), 1)\n          ], 64)) : g(\"\", !0)\n        ], 8, _h)\n      ], 64)),\n      o(\"button\", {\n        type: \"button\",\n        class: \"fx-presence-toggle\",\n        title: a.value ? s(n)(\"presence.collapse\") : s(n)(\"presence.expand\"),\n        \"aria-expanded\": a.value,\n        onClick: u\n      }, f(a.value ? \"‹\" : \"›\"), 9, $h)\n    ], 2)) : g(\"\", !0);\n  }\n}), Sh = '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/>', Ch = '<path d=\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>', Uc = \"M12 3.6l2.6 5.3 5.85.85-4.23 4.12 1 5.83L12 16.97l-5.22 2.73 1-5.83L3.55 9.75l5.85-.85z\", Vc = '<path d=\"M8 3.5h8\"/><path d=\"M9.6 3.5v6.1L7.2 12.3v1.7h9.6v-1.7L14.4 9.6V3.5\"/><path d=\"M12 14v6.5\"/>', qr = '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/>', jc = '<path d=\"M4 6.5h16\"/><path d=\"M9.5 6.5V4.9a1.4 1.4 0 0 1 1.4-1.4h2.2a1.4 1.4 0 0 1 1.4 1.4v1.6\"/><path d=\"M6.6 6.5l.85 12.1a2 2 0 0 0 2 1.9h5.1a2 2 0 0 0 2-1.9l.85-12.1\"/><path d=\"M10.3 10.3v6.4\"/><path d=\"M13.7 10.3v6.4\"/>', Yc = '<path d=\"M6.8 3.5h10.4a1.6 1.6 0 0 1 1.6 1.6v15.4l-6.8-3.9-6.8 3.9V5.1A1.6 1.6 0 0 1 6.8 3.5z\"/>', ed = {\n  /* ── opening ─────────────────────────────────────────────────────────── */\n  open: '<path d=\"M14 3.5h6.5V10\"/><path d=\"M20.5 3.5L12 12\"/><path d=\"M18 13.5v5a2 2 0 0 1-2 2H5.5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h5\"/>',\n  \"open-tab\": '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/><path d=\"M3 9.5h18\"/><path d=\"M9.5 4.5v5\"/>',\n  preview: Ch,\n  download: Sh + '<path d=\"M12 4v11.5\"/><path d=\"M7.5 11L12 15.5 16.5 11\"/>',\n  upload: '<path d=\"M4.5 15.5v3A2 2 0 0 0 6.5 20.5h11a2 2 0 0 0 2-2v-3\"/><path d=\"M12 15.5V4\"/><path d=\"M7.5 8.5L12 4l4.5 4.5\"/>',\n  convert: '<path d=\"M4 8.5h13\"/><path d=\"M13.5 5L17 8.5 13.5 12\"/><path d=\"M20 15.5H7\"/><path d=\"M10.5 12L7 15.5 10.5 19\"/>',\n  /* \"Paylaş / İzinler\" — the three-node share, not a chain link: this row\n     opens permissions as well as a link, and people are the subject. */\n  access: '<circle cx=\"17.5\" cy=\"6\" r=\"2.5\"/><circle cx=\"6.5\" cy=\"12\" r=\"2.5\"/><circle cx=\"17.5\" cy=\"18\" r=\"2.5\"/><path d=\"M8.75 10.8l6.5-3.6\"/><path d=\"M8.75 13.2l6.5 3.6\"/>',\n  details: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11.2v5.6\"/><circle cx=\"12\" cy=\"7.7\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* ── identity / clipboard ────────────────────────────────────────────── */\n  \"copy-id\": '<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2.5\"/><circle cx=\"8.5\" cy=\"10.8\" r=\"2\"/><path d=\"M5.3 16.2c.5-1.5 1.75-2.4 3.2-2.4s2.7.9 3.2 2.4\"/><path d=\"M14.8 10h4.2\"/><path d=\"M14.8 13.6h4.2\"/>',\n  /* A clipboard carrying a path separator — this copies the location, not the\n     thing that lives at it. */\n  \"copy-path\": '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/><rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/><path d=\"M10 11.2l2.4 2.4-2.4 2.4\"/>',\n  rename: '<path d=\"M4 20l.9-4.1 11-11a2.05 2.05 0 0 1 2.9 2.9l-11 11z\"/><path d=\"M14 7l3 3\"/>',\n  cut: '<circle cx=\"6.5\" cy=\"17.5\" r=\"2.5\"/><circle cx=\"6.5\" cy=\"6.5\" r=\"2.5\"/><path d=\"M8.6 8.3L19 19\"/><path d=\"M8.6 15.7L19 5\"/>',\n  copy: '<rect x=\"9\" y=\"9\" width=\"11.5\" height=\"11.5\" rx=\"2\"/><path d=\"M15 6v-.5a2 2 0 0 0-2-2H5.5a2 2 0 0 0-2 2V13a2 2 0 0 0 2 2H6\"/>',\n  paste: '<path d=\"M9 4.5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-12a2 2 0 0 0-2-2h-2\"/><rect x=\"9\" y=\"2.8\" width=\"6\" height=\"3.6\" rx=\"1.2\"/>',\n  /* ── metadata ────────────────────────────────────────────────────────── */\n  /* star = \"not starred yet, do it\" (outline); unstar = the state you are in\n     (filled). The renderer picks between them by name, see FileExplorer. */\n  star: `<path d=\"${Uc}\"/>`,\n  unstar: `<path d=\"${Uc}\" fill=\"currentColor\"/>`,\n  tags: '<path d=\"M3.5 11.4V5.2a1.7 1.7 0 0 1 1.7-1.7h6.2a1.7 1.7 0 0 1 1.2.5l7.2 7.2a1.7 1.7 0 0 1 0 2.4l-6.2 6.2a1.7 1.7 0 0 1-2.4 0L4 12.6a1.7 1.7 0 0 1-.5-1.2z\"/><circle cx=\"8\" cy=\"8\" r=\"1.3\"/>',\n  /* ── destructive / recovery ──────────────────────────────────────────── */\n  delete: jc,\n  \"open-trash\": jc,\n  /* The undo arrow, not a rotating one: \"Geri Yükle\" puts a thing back where\n     it was, and that is the gesture people already read as undo. */\n  restore: '<path d=\"M9 6L5 10l4 4\"/><path d=\"M5 10h9a5 5 0 0 1 0 10h-3.5\"/>',\n  /* ── folder-level ────────────────────────────────────────────────────── */\n  \"new-folder\": '<path d=\"M3 7.5a2 2 0 0 1 2-2h4.2a2 2 0 0 1 1.4.6l1.4 1.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><path d=\"M12 11.3v5\"/><path d=\"M9.5 13.8h5\"/>',\n  /* belge:n1 — a page with a plus: \"make me a new document of some type\".\n     Keyed by the action's own key, so the menu row carries no icon of its\n     own and no emoji enters the markup. */\n  \"new-document\": '<path d=\"M13.5 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\"/><path d=\"M13.5 3l5 5\"/><path d=\"M13.5 3v5h5\"/><path d=\"M17.5 14.5v6\"/><path d=\"M14.5 17.5h6\"/>',\n  refresh: '<path d=\"M20.5 12a8.5 8.5 0 1 1-2.49-6.01\"/><path d=\"M18 1.5V6h-4.5\"/>',\n  /* ── desktop sync (\"keep on this device\") ────────────────────────────── */\n  \"keep-local\": Vc,\n  \"keep-online\": '<path d=\"M7 18.5h10a3.5 3.5 0 0 0 0-7 5 5 0 0 0-9.6-1.2A4.2 4.2 0 0 0 7 18.5z\"/>',\n  /* Kept because a parent folder is kept — the pin, with the branch it came\n     down. The row is disabled; the glyph says why. */\n  \"keep-inherited\": Vc + '<path d=\"M2.5 20.5h3.6a1.6 1.6 0 0 0 1.6-1.6V17\"/>',\n  \"keep-reveal\": '<path d=\"M2.5 17.5V6.5a2 2 0 0 1 2-2h3.8a2 2 0 0 1 1.4.6l1.4 1.4h4.4a2 2 0 0 1 2 2v1.8\"/><path d=\"M4 19.5h13.4a2 2 0 0 0 1.9-1.37l2-6A1.4 1.4 0 0 0 20 10.3H9.4a2 2 0 0 0-1.9 1.37L5.5 18\"/>',\n  /* ── view preferences ────────────────────────────────────────────────── */\n  \"toggle-hidden\": '<path d=\"M3.5 3.5l17 17\"/><path d=\"M9.9 6A9.6 9.6 0 0 1 12 5.5c6 0 9.5 6.5 9.5 6.5a17.3 17.3 0 0 1-3.35 4.15\"/><path d=\"M6.55 7.7A17.4 17.4 0 0 0 2.5 12S6 18.5 12 18.5a9.7 9.7 0 0 0 3.95-.85\"/><path d=\"M10.2 10.3a2.9 2.9 0 0 0 3.9 4.1\"/>',\n  density: '<path d=\"M8.5 8L12 4.5 15.5 8\"/><path d=\"M8.5 16L12 19.5 15.5 16\"/><path d=\"M12 4.5v15\"/>',\n  \"view-list\": '<path d=\"M8.5 6.5h12\"/><path d=\"M8.5 12h12\"/><path d=\"M8.5 17.5h12\"/><path d=\"M4 6.5h.01\"/><path d=\"M4 12h.01\"/><path d=\"M4 17.5h.01\"/>',\n  \"view-grid\": '<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\"/>',\n  \"view-gallery\": '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/><circle cx=\"8.3\" cy=\"9.6\" r=\"1.5\"/><path d=\"M4.3 17l4.7-4.7 3 3 3-3 5 4.7\"/>',\n  nav: qr + '<path d=\"M9.5 4.5v15\"/>',\n  inspector: qr + '<path d=\"M14.5 4.5v15\"/>',\n  /* ── explorer settings ───────────────────────────────────────────────── */\n  \"shortcut-settings\": '<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2.5\"/><path d=\"M6.5 9.8h.01\"/><path d=\"M10 9.8h.01\"/><path d=\"M13.5 9.8h.01\"/><path d=\"M17 9.8h.01\"/><path d=\"M6.5 12.9h.01\"/><path d=\"M10 12.9h.01\"/><path d=\"M13.5 12.9h.01\"/><path d=\"M17 12.9h.01\"/><path d=\"M8.6 15.6h6.8\"/>',\n  /* Light/dark as the thing it actually switches: one disc, half of it inked. */\n  theme: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>',\n  /* zaman:z3 — a clock face, for the Time zone row. */\n  timezone: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.2V12l3.2 2\"/>',\n  tour: '<path d=\"M2.5 9L12 4.5 21.5 9 12 13.5z\"/><path d=\"M6.6 11.1v4.4c0 1.6 2.4 2.9 5.4 2.9s5.4-1.3 5.4-2.9v-4.4\"/>',\n  /* \"Dosya İste\" — the public drop link. A chain, because what this makes is\n     a URL to hand somebody. */\n  \"request-files\": '<path d=\"M10.2 13.8a4.2 4.2 0 0 0 6.1 0l2.3-2.3a4.3 4.3 0 0 0-6.1-6.1l-1.35 1.35\"/><path d=\"M13.8 10.2a4.2 4.2 0 0 0-6.1 0l-2.3 2.3a4.3 4.3 0 0 0 6.1 6.1l1.35-1.35\"/>',\n  /* ── toolbar chrome that is not a ContextAction ──────────────────────── */\n  \"go-up\": '<path d=\"M12 20V5\"/><path d=\"M5.5 11.5L12 5l6.5 6.5\"/>',\n  /* === gorunum:v2-topbar — the breadcrumb row's own controls ============\n     The crumb trail gained the reference shell's three affordances: a home\n     crumb in place of the bare \"/\" root, a chevron on the last crumb that\n     lists what is inside it, and the path editor we already had (its glyph\n     moves here from Breadcrumb.vue so every mark in the row comes from one\n     file). */\n  home: '<path d=\"M3.5 10.6L12 3.5l8.5 7.1\"/><path d=\"M5.6 9.4V19a1.5 1.5 0 0 0 1.5 1.5h9.8a1.5 1.5 0 0 0 1.5-1.5V9.4\"/><path d=\"M9.9 20.5v-5.2h4.2v5.2\"/>',\n  subfolders: '<path d=\"M6.8 9.8L12 15l5.2-5.2\"/>',\n  \"edit-path\": '<path d=\"M4 20h4l10-10a2.1 2.1 0 0 0-3-3L5 17z\"/><path d=\"M14.5 6.5l3 3\"/>',\n  /* === gorunum:v2-topbar — the header's trailing cluster ================\n     The page chrome around the explorer is gone, so the account-level doors\n     are drawn by the header itself (the host fills them through the\n     `header-actions` slot). The glyphs live here so an embedder's cluster\n     comes out the same weight and colour as everything beside it. */\n  admin: '<rect x=\"3\" y=\"3.5\" width=\"7.4\" height=\"7.4\" rx=\"1.6\"/><rect x=\"13.6\" y=\"3.5\" width=\"7.4\" height=\"4.6\" rx=\"1.6\"/><rect x=\"13.6\" y=\"10.7\" width=\"7.4\" height=\"9.8\" rx=\"1.6\"/><rect x=\"3\" y=\"13.6\" width=\"7.4\" height=\"6.9\" rx=\"1.6\"/>',\n  /* ⚠ A PERSON, not a cog. The first draft drew the gear as a ringed disc with\n     eight spokes and at 16px it came out as a SUN — sitting in the very row\n     the light/dark toggle had just been removed from, which is the one thing\n     the mark must not be mistaken for (measured at 1440 and 390: it read as a\n     theme switch in both). The account bust is what the reference hangs this\n     menu on, and the tooltip says which settings. */\n  account: '<circle cx=\"12\" cy=\"8.2\" r=\"3.6\"/><path d=\"M4.9 20.3a7.35 7.35 0 0 1 14.2 0\"/>',\n  \"sign-out\": '<path d=\"M9.5 20.5H6a2 2 0 0 1-2-2v-13a2 2 0 0 1 2-2h3.5\"/><path d=\"M15.5 16.5L20 12l-4.5-4.5\"/><path d=\"M20 12H9\"/>',\n  /* The AI assistant, drawn but not yet wired — a spark, the mark every\n     assistant in this class of product wears, so the day it does something\n     the icon does not have to change under people's fingers. */\n  ai: '<path d=\"M12 3.2l1.75 4.3 4.3 1.75-4.3 1.75L12 15.3l-1.75-4.3L5.95 9.25l4.3-1.75z\"/><path d=\"M18.2 15.1l.8 1.95 1.95.8-1.95.8-.8 1.95-.8-1.95-1.95-.8 1.95-.8z\"/>',\n  /* The notification bell, for the host's header cluster (web/src\n     NotificationBell.vue). ⚠ Drawn HERE, not taken from the app's icon\n     library: it sits in the same row as refresh, the spark and the avatar,\n     and a glyph at a foreign stroke weight in that row is the exact mismatch\n     this set exists to prevent. A dome on a flared rim, the clapper below. */\n  bell: '<path d=\"M6.2 16.6V11a5.8 5.8 0 0 1 11.6 0v5.6l1.7 1.9H4.5z\"/><path d=\"M10.1 21a2.1 2.1 0 0 0 3.8 0\"/>',\n  /* === /gorunum:v2-topbar === */\n  search: '<circle cx=\"10.8\" cy=\"10.8\" r=\"6.3\"/><path d=\"M15.4 15.4l5.1 5.1\"/>',\n  /* gorunum:v1-advsearch — sliders, not a funnel. A funnel says \"throw rows\n     away\"; this control opens a dialog where you SET things, and two of its\n     three rows are exactly a slider's job (a size range, a time window). */\n  filter: '<path d=\"M4 7.5h4\"/><path d=\"M13 7.5h7\"/><circle cx=\"10.5\" cy=\"7.5\" r=\"2.4\"/><path d=\"M4 16.5h7\"/><path d=\"M16 16.5h4\"/><circle cx=\"13.5\" cy=\"16.5\" r=\"2.4\"/>',\n  more: '<circle cx=\"5.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"18.5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\"/>',\n  close: '<path d=\"M5.5 5.5l13 13\"/><path d=\"M18.5 5.5l-13 13\"/>',\n  /* A share link. Two half-chains, which is what a link IS. The details\n     panel's \"Not shared / Create link\" row used to draw a chain EMOJI\n     there, i.e. whatever glyph the OS happened to ship, full-colour,\n     beside a column of stroked grey ones. */\n  link: '<path d=\"M10 13.5a4.5 4.5 0 0 0 6.8.5l2.7-2.7a4.5 4.5 0 0 0-6.36-6.36L11.6 6.5\"/><path d=\"M14 10.5a4.5 4.5 0 0 0-6.8-.5l-2.7 2.7a4.5 4.5 0 0 0 6.36 6.36l1.53-1.53\"/>',\n  /* === ikon:emoji — the command palette's own rows =======================\n   * The palette printed `{{ it.icon }}` as TEXT: `➜ 📁 ⬆ ▦ 🗑 ⟳ ↑ 🎨 ⌨ 🎓 ⧉ ◫\n   * 💾 🔖`. Thirteen marks from four different type families, in a list whose\n   * neighbours — the context menu it duplicates and the toolbar it launches —\n   * had already moved here. Most of the keys it needed were drawn already\n   * (`tour` is the mortarboard, `shortcut-settings` the keyboard, the three\n   * `view-*` the mode chips); these six are what was genuinely missing. */\n  /* \"Go to path\" — the arrow goes INTO the box, the mirror of `sign-out`.\n     A bare arrow would have said \"next\", which this row is not. */\n  goto: '<path d=\"M13.5 4.5h4a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4\"/><path d=\"M10 8.2L13.8 12 10 15.8\"/><path d=\"M4.5 12h9.3\"/>',\n  /* A second pane opened beside the first — `nav`/`inspector`'s panel with the\n     divider down the middle, because that is literally what split view is. */\n  split: qr + '<path d=\"M12 4.5v15\"/>',\n  /* A new tab: `open-tab`'s window, with the plus in the body rather than on\n     the tab strip (at 16px a plus up there merges into the tab). */\n  \"tab-new\": '<rect x=\"3\" y=\"4.5\" width=\"18\" height=\"15\" rx=\"2\"/><path d=\"M3 9.5h18\"/><path d=\"M9.5 4.5v5\"/><path d=\"M12 12.1v5\"/><path d=\"M9.5 14.6h5\"/>',\n  bookmark: Yc,\n  \"save-search\": Yc + '<path d=\"M12 7.2v5.2\"/><path d=\"M9.4 9.8h5.2\"/>',\n  /* The padlock, for the rows and strips that talk ABOUT encryption (\"create\n     an encrypted folder\", \"this one is unlocked\"). The listing marker is a\n     different drawing on purpose — there the lock is cut out of the folder,\n     because the row still has to read as a folder. */\n  lock: '<rect x=\"4.5\" y=\"10.3\" width=\"15\" height=\"10.2\" rx=\"2.2\"/><path d=\"M7.9 10.3V7.6a4.1 4.1 0 0 1 8.2 0v2.7\"/><circle cx=\"12\" cy=\"15.4\" r=\"1.5\"/>',\n  /* === ikon:emoji — states the viewers and modals report ================\n   * `✓ ✗ ⚠️ ⏳` in the viewer chrome. The first two are typographic and came\n   * out at whatever weight the UI font had; the last two are colour emoji, so\n   * a fallback screen's 48px mark was the only full-colour thing on a grey\n   * page. `progress` is drawn as an open ring because it is SPUN by CSS\n   * (`@keyframes fe-spin`) — an hourglass cannot say \"still going\". */\n  check: '<path d=\"M4.8 12.6l4.7 4.7L19.2 6.9\"/>',\n  alert: '<path d=\"M10.7 4.6L2.9 18.2a1.5 1.5 0 0 0 1.3 2.25h15.6a1.5 1.5 0 0 0 1.3-2.25L13.3 4.6a1.5 1.5 0 0 0-2.6 0z\"/><path d=\"M12 9.9v4.3\"/><circle cx=\"12\" cy=\"17.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>',\n  progress: '<path d=\"M20.5 12a8.5 8.5 0 1 1-8.5-8.5\"/>'\n}, Wc = /* @__PURE__ */ new Map();\nfunction Ue(e) {\n  if (!e) return \"\";\n  const t = Wc.get(e);\n  if (t !== void 0) return t;\n  const n = ed[e], r = n ? `<svg class=\"fe-aicon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${n}</svg>` : \"\";\n  return Wc.set(e, r), r;\n}\nfunction ID() {\n  return Object.keys(ed);\n}\nconst Th = [\"data-prefers-dark\"], Mh = [\"aria-label\"], Eh = [\"aria-label\", \"onKeydown\"], zh = { class: \"fe-sheet__items\" }, Ah = {\n  key: 0,\n  class: \"fe-ctx__sep\",\n  role: \"separator\"\n}, Ph = [\"disabled\", \"title\", \"onClick\"], Lh = [\"innerHTML\"], Dh = {\n  key: 1,\n  class: \"fe-ctx__icon\",\n  \"aria-hidden\": \"true\"\n}, Oh = { class: \"fe-ctx__label\" }, Bh = {\n  key: 2,\n  class: \"fe-ctx__key\",\n  \"aria-hidden\": \"true\"\n}, Ih = [\"aria-label\"], Hh = {\n  key: 0,\n  class: \"fe-ctx__sep\",\n  role: \"separator\"\n}, Fh = [\"disabled\", \"title\", \"onClick\"], Nh = [\"innerHTML\"], Kh = {\n  key: 1,\n  class: \"fe-ctx__icon\",\n  \"aria-hidden\": \"true\"\n}, Rh = { class: \"fe-ctx__label\" }, Uh = {\n  key: 2,\n  class: \"fe-ctx__key\",\n  \"aria-hidden\": \"true\"\n}, Ps = /* @__PURE__ */ qe({\n  __name: \"ContextMenu\",\n  props: {\n    locale: {},\n    actions: {},\n    theme: {},\n    sheet: { type: Boolean }\n  },\n  emits: [\"select\"],\n  setup(e, { expose: t, emit: n }) {\n    const r = e, a = n, { t: u } = tt(() => r.locale);\n    function v(S) {\n      return Vu(S.shortcutId ?? S.key);\n    }\n    function p(S) {\n      return Ue(S.icon || S.key);\n    }\n    const h = m(!1), b = m(0), y = m(0), A = m([]), D = m(null);\n    let C = 0, B = 0, I = null;\n    async function U(S, w) {\n      var j;\n      if (I = document.activeElement ?? null, h.value = !0, b.value = S.clientX, y.value = S.clientY, C = S.clientX, B = S.clientY, A.value = w, await gt(), r.sheet) {\n        (j = T.value) == null || j.focus();\n        return;\n      }\n      x(), M(0);\n    }\n    function x() {\n      const S = D.value;\n      if (!S || typeof window > \"u\") return;\n      const w = S.getBoundingClientRect(), j = 8, K = window.innerWidth, Z = window.innerHeight;\n      if (B + w.height > Z - j) {\n        const W = B - w.height;\n        y.value = W >= j ? W : Math.max(j, Z - w.height - j);\n      }\n      if (C + w.width > K - j) {\n        const W = C - w.width;\n        b.value = W >= j ? W : Math.max(j, K - w.width - j);\n      }\n    }\n    function E() {\n      var S;\n      h.value = !1, Y.value = !1, O.value = 0, (S = I == null ? void 0 : I.focus) == null || S.call(I), I = null;\n    }\n    function $() {\n      const S = r.sheet ? T.value : D.value;\n      return S ? Array.from(\n        S.querySelectorAll(\".fe-ctx__item:not(:disabled)\")\n      ) : [];\n    }\n    function M(S) {\n      var K;\n      const w = $();\n      if (w.length === 0) return;\n      const j = (S % w.length + w.length) % w.length;\n      (K = w[j]) == null || K.focus();\n    }\n    function z(S) {\n      const w = $();\n      if (w.length === 0) return;\n      const j = document.activeElement, K = j ? w.indexOf(j) : -1;\n      if (K === -1) {\n        M(S > 0 ? 0 : w.length - 1);\n        return;\n      }\n      M(K + S);\n    }\n    const T = m(null), Y = m(!1), O = m(0);\n    let J = 0;\n    function G(S) {\n      const w = S.touches[0];\n      w && (Y.value = !0, J = w.clientY, O.value = 0);\n    }\n    function N(S) {\n      if (!Y.value) return;\n      const w = S.touches[0];\n      w && (O.value = Math.max(0, w.clientY - J));\n    }\n    function P() {\n      if (!Y.value) return;\n      const S = O.value > 72;\n      Y.value = !1, S ? E() : O.value = 0;\n    }\n    const le = k(\n      () => O.value > 0 ? { transform: `translateY(${O.value}px)`, transition: \"none\" } : void 0\n    );\n    function ve(S) {\n      S.disabled || (a(\"select\", S, A.value), E());\n    }\n    function he(S) {\n      if (S.key === \"Escape\") {\n        S.stopPropagation(), E();\n        return;\n      }\n      if (S.key === \"Enter\" || S.key === \" \") {\n        S.stopPropagation();\n        return;\n      }\n      S.key === \"ArrowDown\" ? (S.preventDefault(), S.stopPropagation(), z(1)) : S.key === \"ArrowUp\" ? (S.preventDefault(), S.stopPropagation(), z(-1)) : S.key === \"Home\" ? (S.preventDefault(), M(0)) : S.key === \"End\" ? (S.preventDefault(), M(-1)) : S.key === \"Tab\" && (S.preventDefault(), E());\n    }\n    const oe = k(() => {\n      const S = r.actions.filter((j) => !j.hidden), w = [];\n      for (const j of S)\n        j.divider && (w.length === 0 || w[w.length - 1].divider) || w.push(j);\n      for (; w.length > 0 && w[w.length - 1].divider; ) w.pop();\n      return w;\n    }), ue = m(!1);\n    let Q;\n    function pe(S) {\n      ue.value = !!(S && \"matches\" in S && S.matches);\n    }\n    dt(() => {\n      var S;\n      typeof window > \"u\" || (Q = window.matchMedia(\"(prefers-color-scheme: dark)\"), pe(Q), (S = Q.addEventListener) == null || S.call(Q, \"change\", pe));\n    }), it(() => {\n      var S;\n      (S = Q == null ? void 0 : Q.removeEventListener) == null || S.call(Q, \"change\", pe);\n    });\n    const re = k(() => `fe-ctx-backdrop--theme-${r.theme || \"auto\"}`);\n    return t({ show: U, hide: E }), (S, w) => (c(), et(ja, { to: \"body\" }, [\n      Ge(Rn, {\n        name: e.sheet ? \"fe-sheet\" : \"fe-ctx\"\n      }, {\n        default: st(() => [\n          h.value ? (c(), d(\"div\", {\n            key: 0,\n            class: we([\"fe-ctx-backdrop\", [re.value, { \"fe-ctx-backdrop--sheet\": e.sheet }]]),\n            \"data-prefers-dark\": ue.value ? \"1\" : \"0\",\n            onClick: E,\n            onContextmenu: Re(E, [\"prevent\"]),\n            onKeydown: he\n          }, [\n            e.sheet ? (c(), d(\"div\", {\n              key: 0,\n              ref_key: \"sheetEl\",\n              ref: T,\n              class: \"fe-sheet\",\n              role: \"menu\",\n              \"aria-label\": s(u)(\"sheet.menu\"),\n              tabindex: \"-1\",\n              style: Ct(le.value),\n              onClick: w[0] || (w[0] = Re(() => {\n              }, [\"stop\"]))\n            }, [\n              o(\"div\", {\n                class: \"fe-sheet__handle\",\n                role: \"button\",\n                tabindex: \"0\",\n                \"aria-label\": s(u)(\"sheet.close\"),\n                onClick: E,\n                onKeydown: Ut(Re(E, [\"prevent\"]), [\"enter\"]),\n                onTouchstartPassive: G,\n                onTouchmovePassive: N,\n                onTouchend: P,\n                onTouchcancel: P\n              }, null, 40, Eh),\n              o(\"div\", zh, [\n                (c(!0), d(ae, null, Te(oe.value, (j, K) => (c(), d(ae, {\n                  key: j.key || K\n                }, [\n                  j.divider ? (c(), d(\"div\", Ah)) : (c(), d(\"button\", {\n                    key: 1,\n                    type: \"button\",\n                    class: we([\"fe-ctx__item fe-sheet__item\", { \"is-danger\": j.danger, \"is-disabled\": j.disabled }]),\n                    disabled: j.disabled,\n                    title: j.title,\n                    role: \"menuitem\",\n                    onClick: (Z) => ve(j)\n                  }, [\n                    p(j) ? (c(), d(\"span\", {\n                      key: 0,\n                      class: \"fe-ctx__icon\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: p(j)\n                    }, null, 8, Lh)) : j.icon ? (c(), d(\"span\", Dh, f(j.icon), 1)) : g(\"\", !0),\n                    o(\"span\", Oh, f(j.label), 1),\n                    v(j) ? (c(), d(\"span\", Bh, f(v(j)), 1)) : g(\"\", !0)\n                  ], 10, Ph))\n                ], 64))), 128))\n              ])\n            ], 12, Mh)) : (c(), d(\"div\", {\n              key: 1,\n              ref_key: \"menuEl\",\n              ref: D,\n              class: \"fe-ctx\",\n              role: \"menu\",\n              \"aria-orientation\": \"vertical\",\n              \"aria-label\": s(u)(\"sheet.menu\"),\n              style: Ct({ top: y.value + \"px\", left: b.value + \"px\" }),\n              onClick: w[1] || (w[1] = Re(() => {\n              }, [\"stop\"]))\n            }, [\n              (c(!0), d(ae, null, Te(oe.value, (j, K) => (c(), d(ae, {\n                key: j.key || K\n              }, [\n                j.divider ? (c(), d(\"div\", Hh)) : (c(), d(\"button\", {\n                  key: 1,\n                  type: \"button\",\n                  class: we([\"fe-ctx__item\", { \"is-danger\": j.danger, \"is-disabled\": j.disabled }]),\n                  disabled: j.disabled,\n                  title: j.title,\n                  role: \"menuitem\",\n                  onClick: (Z) => ve(j)\n                }, [\n                  p(j) ? (c(), d(\"span\", {\n                    key: 0,\n                    class: \"fe-ctx__icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: p(j)\n                  }, null, 8, Nh)) : j.icon ? (c(), d(\"span\", Kh, f(j.icon), 1)) : g(\"\", !0),\n                  o(\"span\", Rh, f(j.label), 1),\n                  v(j) ? (c(), d(\"span\", Uh, f(v(j)), 1)) : g(\"\", !0)\n                ], 10, Fh))\n              ], 64))), 128))\n            ], 12, Ih))\n          ], 42, Th)) : g(\"\", !0)\n        ]),\n        _: 1\n      }, 8, [\"name\"])\n    ]));\n  }\n}), Vh = [\"aria-pressed\", \"title\", \"aria-label\"], jh = {\n  key: 1,\n  class: \"fe-toolbar__mark\"\n}, Yh = [\"src\"], Wh = { key: 1 }, qh = { class: \"fe-toolbar__primary\" }, Gh = [\"title\"], Xh = [\"innerHTML\"], Jh = { class: \"fe-btn__label\" }, Zh = [\"title\", \"aria-label\"], Qh = [\"innerHTML\"], em = [\"title\"], tm = [\"innerHTML\"], nm = { class: \"fe-btn__label\" }, am = { class: \"fe-toolbar__search-group fe-toolbar__search-group--drive\" }, om = {\n  class: \"fe-search fe-drivesearch\",\n  \"data-testid\": \"drive-search\"\n}, sm = [\"placeholder\", \"value\", \"aria-label\"], rm = [\"title\", \"aria-label\"], im = [\"innerHTML\"], lm = [\"title\", \"aria-label\"], cm = { class: \"fe-toolbar__tail\" }, um = [\"title\", \"aria-label\"], dm = [\"innerHTML\"], fm = { class: \"fe-toolbar__soon-wrap\" }, pm = [\"aria-label\"], vm = [\"innerHTML\"], hm = {\n  class: \"fe-toolbar__soon-tip\",\n  \"aria-hidden\": \"true\",\n  \"data-testid\": \"header-ai-tip\"\n}, mm = [\"title\", \"aria-label\"], ym = [\"innerHTML\"], bm = {\n  class: \"fe-drivesearch\",\n  \"data-testid\": \"drive-search\"\n}, gm = [\"placeholder\", \"value\", \"aria-label\"], km = [\"title\", \"aria-label\"], _m = [\"innerHTML\"], wm = [\"title\", \"aria-label\"], $m = { class: \"fe-toolbar__tail\" }, xm = { class: \"fe-toolbar__soon-wrap\" }, Sm = [\"aria-label\"], Cm = [\"innerHTML\"], Tm = {\n  class: \"fe-toolbar__soon-tip\",\n  \"aria-hidden\": \"true\",\n  \"data-testid\": \"header-ai-tip\"\n}, Mm = [\"title\", \"aria-label\"], Em = [\"innerHTML\"], zm = [\"aria-label\"], Am = {\n  class: \"fe-selbar__count\",\n  role: \"status\",\n  \"data-testid\": \"selection-count\"\n}, Pm = [\"disabled\", \"title\", \"aria-label\", \"data-key\", \"data-testid\", \"onClick\"], Lm = [\"innerHTML\"], Dm = [\"title\", \"aria-label\"], Om = [\"innerHTML\"], Bm = [\"data-key\"], Im = [\"innerHTML\"], Hm = [\"title\", \"aria-label\"], Fm = [\"innerHTML\"], ys = \"filex.density\", Nm = 32, qc = \"fe:header-menu\", Km = /* @__PURE__ */ qe({\n  __name: \"Toolbar\",\n  props: {\n    viewMode: {},\n    searchQuery: {},\n    trashActive: { type: Boolean },\n    actions: {},\n    selectionMode: {},\n    selectionCount: {},\n    selectionPane: {},\n    pasteEnabled: { type: Boolean },\n    convertEnabled: { type: Boolean },\n    canGoUp: { type: Boolean },\n    atVirtualRoot: { type: Boolean },\n    canWrite: { type: Boolean },\n    locale: {},\n    narrow: { type: Boolean },\n    theme: {},\n    inspectorOpen: { type: Boolean },\n    navOpen: { type: Boolean },\n    navEnabled: { type: Boolean },\n    viewModes: {},\n    scopeLabel: {},\n    brandName: {},\n    brandMarkUrl: {},\n    searchEscalates: { type: Boolean }\n  },\n  emits: [\"update:viewMode\", \"update:searchQuery\", \"open-advanced-search\", \"new-folder\", \"upload\", \"refresh\", \"go-up\", \"action\", \"open-recents\", \"update:density\", \"toggle-inspector\", \"toggle-nav\", \"open-theme\", \"open-shortcut-settings\", \"open-timezone\", \"open-palette\"],\n  setup(e, { expose: t, emit: n }) {\n    function r(fe) {\n      return Ue(fe.icon || fe.key);\n    }\n    const a = e, u = n, v = m(\n      (() => {\n        try {\n          return localStorage.getItem(ys) === \"compact\" ? \"compact\" : \"comfortable\";\n        } catch {\n          return \"comfortable\";\n        }\n      })()\n    );\n    function p() {\n      try {\n        const fe = localStorage.getItem(ys) === \"compact\" ? \"compact\" : \"comfortable\";\n        fe !== v.value && (v.value = fe, u(\"update:density\", fe));\n      } catch {\n      }\n    }\n    function h(fe) {\n      (fe.key === null || fe.key === ys) && p();\n    }\n    dt(() => {\n      u(\"update:density\", v.value), window.addEventListener(\"storage\", h), window.addEventListener(\"filex:density\", p);\n    }), it(() => {\n      window.removeEventListener(\"storage\", h), window.removeEventListener(\"filex:density\", p);\n    });\n    function b() {\n      v.value = v.value === \"compact\" ? \"comfortable\" : \"compact\";\n      try {\n        localStorage.setItem(ys, v.value);\n      } catch {\n      }\n      u(\"update:density\", v.value);\n    }\n    const { t: y } = tt(() => a.locale), A = m(null), D = m(a.searchQuery);\n    He(() => a.searchQuery, (fe) => {\n      D.value = fe;\n    });\n    let C;\n    function B(fe) {\n      const Pe = fe.target.value;\n      D.value = Pe, C && clearTimeout(C), C = setTimeout(() => u(\"update:searchQuery\", Pe), 200);\n    }\n    async function I() {\n      var fe, Pe;\n      await gt(), (fe = A.value) == null || fe.focus(), (Pe = A.value) == null || Pe.select();\n    }\n    t({ focusSearch: I });\n    const U = k(() => a.selectionMode ?? \"none\"), x = k(() => a.actions.filter((fe) => !fe.divider && !fe.hidden)), E = /* @__PURE__ */ new Set([\"download\", \"access\", \"cut\", \"copy\", \"star\", \"restore\", \"delete\"]), $ = k(() => U.value !== \"none\"), M = k(() => {\n      const fe = [], Pe = [];\n      for (const Be of x.value)\n        E.has(Be.key) && r(Be) ? fe.push(Be) : Pe.push(Be);\n      return { icons: fe, rest: Pe };\n    }), z = m(null), T = m(null), Y = m(null), O = m(null), J = m(Number.MAX_SAFE_INTEGER), G = k(() => M.value.icons.slice(0, J.value)), N = k(() => M.value.icons.slice(J.value)), P = k(() => {\n      const fe = N.value, Pe = M.value.rest;\n      return fe.length && Pe.length ? [...fe, { divider: !0, key: \"selbar-sep\", label: \"\" }, ...Pe] : [...fe, ...Pe];\n    });\n    function le() {\n      var $t;\n      const fe = z.value, Pe = T.value, Be = M.value.icons.length;\n      if (!fe || !Pe) {\n        J.value = Be;\n        return;\n      }\n      const ht = parseFloat(getComputedStyle(fe).gap) || 4, Ft = Array.from(Pe.children).map((kt) => kt.offsetWidth + ht), ft = Ft.reduce((kt, Dt) => kt + Dt, 0), qt = fe.clientWidth, Gt = ((($t = Y.value) == null ? void 0 : $t.offsetWidth) || Nm) + ht;\n      if (ft <= qt - (M.value.rest.length ? Gt : 0)) {\n        J.value = Ft.length;\n        return;\n      }\n      let wt = Gt, en = 0;\n      for (const kt of Ft) {\n        if (wt + kt > qt) break;\n        wt += kt, en += 1;\n      }\n      J.value = en;\n    }\n    let ve;\n    He(z, (fe) => {\n      ve == null || ve.disconnect(), ve = void 0, fe && typeof ResizeObserver < \"u\" && (ve = new ResizeObserver(() => le()), ve.observe(fe)), gt(le);\n    }), it(() => ve == null ? void 0 : ve.disconnect()), He(\n      () => [x.value, a.narrow, a.trashActive, U.value],\n      () => void gt(le),\n      { deep: !1 }\n    );\n    function he() {\n      var Pe, Be;\n      const fe = (Pe = Y.value) == null ? void 0 : Pe.getBoundingClientRect();\n      (Be = O.value) == null || Be.show({ clientX: fe ? fe.right : 0, clientY: fe ? fe.bottom + 4 : 0 }, []);\n    }\n    const oe = m(null), ue = wn(null), Q = m(!1), pe = wn(null), re = wn(null);\n    function S() {\n      var Be;\n      const fe = (Be = oe.value) == null ? void 0 : Be.closest(\".fe\");\n      if (!fe) return null;\n      const Pe = a.selectionPane;\n      if (Pe && /^[A-Za-z][\\w-]*$/.test(Pe)) {\n        const ht = fe.querySelector(`.fe__primary[data-pane=\"${Pe}\"]`);\n        if (ht) return ht;\n      }\n      return fe.querySelector(\".fe__primary\");\n    }\n    function w() {\n      const fe = ue.value;\n      fe && (fe.classList.remove(\"is-active\"), Q.value && fe.remove()), ue.value = null, Q.value = !1;\n    }\n    function j() {\n      var Be;\n      const fe = S();\n      if (!fe) {\n        w(), re.value = null, pe.value = null;\n        return;\n      }\n      if (re.value === fe && ((Be = ue.value) != null && Be.isConnected)) return;\n      w(), re.value = fe, pe.value = fe.querySelector(\":scope > .fe__body\");\n      const Pe = fe.querySelector(\":scope > .fe-selbar-slot\");\n      if (Pe)\n        ue.value = Pe, Q.value = !1;\n      else {\n        const ht = document.createElement(\"div\");\n        ht.className = \"fe-selbar-slot\";\n        const Ft = fe.querySelector(\":scope > .fe-tabs\") ?? fe.querySelector(\":scope > .fe-subhead, :scope > .fe-subhead--plain\");\n        Ft ? Ft.insertAdjacentElement(\"afterend\", ht) : fe.prepend(ht), ue.value = ht, Q.value = !0;\n      }\n      K(), Ne();\n    }\n    dt(j), it(w);\n    function K() {\n      var fe;\n      (fe = ue.value) == null || fe.classList.toggle(\"is-active\", $.value);\n    }\n    He($, K, { immediate: !0 }), He([() => a.selectionPane, $], () => j());\n    const Z = m(0);\n    let W, $e = !1;\n    function Se() {\n      const fe = re.value;\n      fe && (Z.value = fe.querySelectorAll('[data-fe-path][aria-selected=\"true\"]').length);\n    }\n    function ze() {\n      if ($e) return;\n      $e = !0, ((Pe) => typeof requestAnimationFrame == \"function\" ? requestAnimationFrame(Pe) : setTimeout(Pe, 16))(() => {\n        $e = !1, Se();\n      });\n    }\n    function Ne() {\n      if (W == null || W.disconnect(), W = void 0, !$.value) {\n        Z.value = 0;\n        return;\n      }\n      Se(), !(typeof MutationObserver > \"u\" || !re.value) && (W = new MutationObserver(ze), W.observe(re.value, {\n        subtree: !0,\n        childList: !0,\n        attributes: !0,\n        attributeFilter: [\"aria-selected\"]\n      }));\n    }\n    He($, Ne), it(() => W == null ? void 0 : W.disconnect());\n    const be = k(() => typeof a.selectionCount == \"number\" ? a.selectionCount : U.value === \"none\" ? 0 : Math.max(Z.value, U.value === \"multi\" ? 2 : 1)), De = k(() => y(\"selection.count\", { n: String(be.value) }));\n    function ie() {\n      var fe;\n      u(\"action\", \"clear-selection\"), (fe = pe.value) == null || fe.dispatchEvent(new MouseEvent(\"click\", { bubbles: !0 }));\n    }\n    function ce(fe) {\n      u(\"action\", fe);\n    }\n    const L = m(!1);\n    let se;\n    function Ce(fe) {\n      L.value = !!(fe && \"matches\" in fe && fe.matches);\n    }\n    dt(() => {\n      var fe;\n      typeof window > \"u\" || !window.matchMedia || (se = window.matchMedia(\"(pointer: coarse)\"), Ce(se), (fe = se.addEventListener) == null || fe.call(se, \"change\", Ce));\n    }), it(() => {\n      var fe;\n      (fe = se == null ? void 0 : se.removeEventListener) == null || fe.call(se, \"change\", Ce);\n    });\n    const We = m(null), Ie = m(null);\n    function Ze(fe) {\n      return !a.viewModes || a.viewModes.includes(fe);\n    }\n    const vt = k(() => {\n      const fe = [];\n      return a.narrow && fe.push({ key: \"refresh\", label: y(\"toolbar.refresh\") }), fe.push({\n        key: \"density\",\n        label: v.value === \"compact\" ? y(\"toolbar.density.comfortable\") : y(\"toolbar.density.compact\")\n      }), a.viewMode !== \"list\" && Ze(\"list\") && fe.push({ key: \"view-list\", label: y(\"toolbar.view.list\") }), a.viewMode !== \"grid\" && Ze(\"grid\") && fe.push({ key: \"view-grid\", label: y(\"toolbar.view.grid\") }), a.viewMode !== \"gallery\" && Ze(\"gallery\") && fe.push({ key: \"view-gallery\", label: y(\"toolbar.view.gallery\") }), fe.push({ key: \"inspector\", label: y(\"toolbar.inspector\") }), fe.push({ key: \"theme\", label: y(\"theme.menu\") }), fe.push({ key: \"timezone\", label: y(\"tz.menu\") }), fe.push({ key: \"shortcut-settings\", label: y(\"shortcuts.settings.menu\") }), fe.push({ key: \"tour\", label: y(\"tour.restart\") }), fe;\n    });\n    function Xe(fe) {\n      const Pe = [], Be = !a.trashActive && !a.atVirtualRoot && a.canWrite !== !1;\n      return U.value === \"none\" && Be && (Pe.push({ key: \"new-folder\", label: y(\"toolbar.new_folder\") }), a.pasteEnabled && Pe.push({ key: \"paste\", label: y(\"ctx.paste\") })), $.value || Pe.push(...x.value), fe.length && (Pe.length && Pe.push({ divider: !0, key: \"bag-sep\", label: \"\" }), Pe.push(...fe)), Pe;\n    }\n    const Ae = k(() => Na(\"palette\"));\n    function V(fe, Pe) {\n      const Be = Vu(Pe);\n      return Be ? `${fe} (${Be})` : fe;\n    }\n    const R = k(() => a.narrow ? a.navOpen ? y(\"sidenav.close\") : y(\"sidenav.open\") : a.navOpen ? y(\"sidenav.collapse\") : y(\"sidenav.expand\")), X = k(\n      () => a.scopeLabel ? y(\"drive.search.placeholder\", { scope: a.scopeLabel }) : y(\"drive.search.placeholder_all\")\n    );\n    function ye(fe) {\n      if (si(fe, \"palette\")) {\n        fe.preventDefault(), fe.stopPropagation(), u(\"open-palette\", D.value);\n        return;\n      }\n      a.searchEscalates && fe.key === \"Enter\" && D.value && (fe.preventDefault(), fe.stopPropagation(), u(\"open-palette\", D.value));\n    }\n    const je = m(!1);\n    function Qe() {\n      const fe = oe.value;\n      if (!fe) return;\n      const Pe = {\n        items: vt.value.map((Be) => ({ ...Be })),\n        run: (Be) => lt({ key: Be }),\n        claimed: !1\n      };\n      fe.dispatchEvent(\n        new CustomEvent(qc, { detail: Pe, bubbles: !0, composed: !0 })\n      ), je.value = !!Pe.claimed;\n    }\n    dt(() => void gt(Qe)), He(vt, () => void gt(Qe), { deep: !1 }), it(() => {\n      typeof document > \"u\" || document.dispatchEvent(\n        new CustomEvent(qc, {\n          detail: { items: [], run: () => {\n          }, claimed: !1 }\n        })\n      );\n    });\n    const at = k(() => {\n      const fe = je.value ? [] : vt.value;\n      return a.narrow ? Xe(fe) : fe;\n    });\n    function Ye() {\n      var Pe, Be;\n      const fe = (Pe = We.value) == null ? void 0 : Pe.getBoundingClientRect();\n      (Be = Ie.value) == null || Be.show({ clientX: fe ? fe.right : 0, clientY: fe ? fe.bottom + 4 : 0 }, []);\n    }\n    function lt(fe) {\n      var Pe;\n      switch (fe.key) {\n        case \"new-folder\":\n          u(\"new-folder\");\n          break;\n        case \"refresh\":\n          u(\"refresh\");\n          break;\n        case \"density\":\n          b();\n          break;\n        case \"view-list\":\n          u(\"update:viewMode\", \"list\");\n          break;\n        case \"view-grid\":\n          u(\"update:viewMode\", \"grid\");\n          break;\n        case \"view-gallery\":\n          u(\"update:viewMode\", \"gallery\");\n          break;\n        case \"inspector\":\n          u(\"toggle-inspector\");\n          break;\n        case \"nav\":\n          u(\"toggle-nav\");\n          break;\n        case \"theme\":\n          u(\"open-theme\");\n          break;\n        case \"shortcut-settings\":\n          u(\"open-shortcut-settings\");\n          break;\n        case \"timezone\":\n          u(\"open-timezone\");\n          break;\n        case \"tour\":\n          (Pe = oe.value) == null || Pe.dispatchEvent(new CustomEvent(\"fe:tour-restart\", { bubbles: !0 }));\n          break;\n        default:\n          ce(fe.key);\n      }\n    }\n    return (fe, Pe) => (c(), d(\"div\", {\n      ref_key: \"rootEl\",\n      ref: oe,\n      class: we([\"fe-toolbar\", {\n        \"fe-toolbar--narrow\": e.narrow,\n        /* surucu:d1 — ALWAYS on. It is no longer a variant: this is the only\n           header filex has, and the modifier survives as the hook the one\n           visual definition in styles/base.css was written against. Dropping it\n           would mean moving those rules, not deleting a state. */\n        \"fe-toolbar--drive\": !0\n      }])\n    }, [\n      e.navEnabled !== !1 || fe.$slots.brand || e.brandName || e.brandMarkUrl ? (c(), d(\"div\", {\n        key: 0,\n        class: we([\"fe-toolbar__brand\", {\n          \"fe-toolbar__brand--gutter\": e.navEnabled !== !1,\n          /* gezinti:g3 — the panel collapsed to its rail, so this gutter has to\n             collapse with it. `navOpen === false`, never `!navOpen`: the prop is\n             optional, and an embedder that does not pass it must keep the\n             expanded layout rather than lose its wordmark to a `undefined`. */\n          \"fe-toolbar__brand--rail\": !e.narrow && e.navEnabled !== !1 && e.navOpen === !1\n        }])\n      }, [\n        e.navEnabled !== !1 ? (c(), d(\"button\", {\n          key: 0,\n          type: \"button\",\n          class: \"fe-btn fe-btn--icon-only fe-toolbar__nav\",\n          \"aria-pressed\": !!e.navOpen,\n          title: R.value,\n          \"aria-label\": R.value,\n          \"data-testid\": \"toolbar-nav\",\n          onClick: Pe[0] || (Pe[0] = (Be) => u(\"toggle-nav\"))\n        }, [...Pe[12] || (Pe[12] = [\n          o(\"svg\", {\n            class: \"fe-ficon\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"1.8\",\n            \"stroke-linecap\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"path\", { d: \"M4 7h16M4 12h16M4 17h16\" })\n          ], -1)\n        ])], 8, Vh)) : g(\"\", !0),\n        !e.narrow && e.navOpen !== !1 ? (c(), d(\"div\", jh, [\n          _n(fe.$slots, \"brand\", {}, () => [\n            e.brandMarkUrl ? (c(), d(\"img\", {\n              key: 0,\n              class: \"fe-toolbar__markimg\",\n              src: e.brandMarkUrl,\n              alt: \"\"\n            }, null, 8, Yh)) : g(\"\", !0),\n            e.brandName ? (c(), d(\"span\", Wh, f(e.brandName), 1)) : g(\"\", !0)\n          ])\n        ])) : g(\"\", !0)\n      ], 2)) : g(\"\", !0),\n      e.narrow ? (c(), d(ae, { key: 2 }, [\n        o(\"div\", bm, [\n          Pe[14] || (Pe[14] = o(\"svg\", {\n            class: \"fe-ficon fe-drivesearch__glass\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"1.9\",\n            \"stroke-linecap\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"circle\", {\n              cx: \"11\",\n              cy: \"11\",\n              r: \"6.5\"\n            }),\n            o(\"path\", { d: \"M16 16l4.5 4.5\" })\n          ], -1)),\n          o(\"input\", {\n            ref_key: \"searchEl\",\n            ref: A,\n            type: \"search\",\n            class: \"fe-drivesearch__input\",\n            placeholder: X.value,\n            value: D.value,\n            \"aria-label\": s(y)(\"toolbar.search\"),\n            onInput: B,\n            onKeydown: ye\n          }, null, 40, gm),\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-drivesearch__tune\",\n            title: s(y)(\"advsearch.open\"),\n            \"aria-label\": s(y)(\"advsearch.open\"),\n            \"data-testid\": \"drive-search-advanced\",\n            onClick: Pe[8] || (Pe[8] = (Be) => u(\"open-advanced-search\", D.value))\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"filter\")\n            }, null, 8, _m)\n          ], 8, km),\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-drivesearch__kbd\",\n            title: s(y)(\"drive.search.hint_title\", { combo: Ae.value }),\n            \"aria-label\": s(y)(\"drive.search.hint_title\", { combo: Ae.value }),\n            \"data-testid\": \"drive-search-palette\",\n            onClick: Pe[9] || (Pe[9] = (Be) => u(\"open-palette\", D.value))\n          }, f(Ae.value), 9, wm)\n        ]),\n        o(\"div\", $m, [\n          o(\"span\", xm, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--icon-only fe-toolbar__soon\",\n              disabled: \"\",\n              \"aria-label\": s(y)(\"ai.assistant.soon\"),\n              \"aria-disabled\": \"true\",\n              \"data-testid\": \"header-ai\",\n              onClick: Pe[10] || (Pe[10] = Re(() => {\n              }, [\"prevent\"]))\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"ai\")\n              }, null, 8, Cm)\n            ], 8, Sm),\n            o(\"span\", Tm, f(s(y)(\"ai.assistant.soon\")), 1)\n          ]),\n          at.value.length > 0 ? (c(), d(\"button\", {\n            key: 0,\n            ref_key: \"moreBtnEl\",\n            ref: We,\n            type: \"button\",\n            class: \"fe-btn fe-btn--icon-only\",\n            title: s(y)(\"toolbar.more\"),\n            \"aria-label\": s(y)(\"toolbar.more\"),\n            \"aria-haspopup\": \"menu\",\n            \"data-testid\": \"drive-more\",\n            onClick: Ye\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"more\")\n            }, null, 8, Em)\n          ], 8, Mm)) : g(\"\", !0),\n          _n(fe.$slots, \"header-actions\")\n        ])\n      ], 64)) : (c(), d(ae, { key: 1 }, [\n        o(\"div\", qh, [\n          e.navEnabled === !1 && U.value === \"none\" && !e.trashActive && !e.atVirtualRoot && e.canWrite !== !1 ? (c(), d(\"button\", {\n            key: 0,\n            type: \"button\",\n            class: \"fe-btn fe-btn--primary\",\n            title: V(s(y)(\"toolbar.new_folder\"), \"new-folder\"),\n            onClick: Pe[1] || (Pe[1] = (Be) => u(\"new-folder\"))\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"new-folder\")\n            }, null, 8, Xh),\n            o(\"span\", Jh, f(s(y)(\"toolbar.new_folder\")), 1)\n          ], 8, Gh)) : g(\"\", !0),\n          e.navEnabled === !1 && !e.atVirtualRoot && e.canWrite !== !1 ? (c(), d(\"button\", {\n            key: 1,\n            type: \"button\",\n            class: \"fe-btn fe-btn--icon-only\",\n            title: V(s(y)(\"toolbar.upload\"), \"upload\"),\n            \"aria-label\": s(y)(\"toolbar.upload\"),\n            onClick: Pe[2] || (Pe[2] = (Be) => u(\"upload\"))\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"upload\")\n            }, null, 8, Qh)\n          ], 8, Zh)) : g(\"\", !0),\n          e.pasteEnabled && U.value === \"none\" && !e.trashActive && !e.atVirtualRoot && e.canWrite !== !1 ? (c(), d(\"button\", {\n            key: 2,\n            type: \"button\",\n            class: \"fe-btn\",\n            title: V(s(y)(\"ctx.paste\"), \"paste\"),\n            onClick: Pe[3] || (Pe[3] = (Be) => ce(\"paste\"))\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"paste\")\n            }, null, 8, tm),\n            o(\"span\", nm, f(s(y)(\"ctx.paste\")), 1)\n          ], 8, em)) : g(\"\", !0)\n        ]),\n        o(\"div\", am, [\n          o(\"div\", om, [\n            Pe[13] || (Pe[13] = o(\"svg\", {\n              class: \"fe-ficon fe-drivesearch__glass\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"1.9\",\n              \"stroke-linecap\": \"round\",\n              \"aria-hidden\": \"true\",\n              focusable: \"false\"\n            }, [\n              o(\"circle\", {\n                cx: \"11\",\n                cy: \"11\",\n                r: \"6.5\"\n              }),\n              o(\"path\", { d: \"M16 16l4.5 4.5\" })\n            ], -1)),\n            o(\"input\", {\n              ref_key: \"searchEl\",\n              ref: A,\n              type: \"search\",\n              class: \"fe-search__input fe-drivesearch__input\",\n              placeholder: X.value,\n              value: D.value,\n              \"aria-label\": s(y)(\"toolbar.search\"),\n              onInput: B,\n              onKeydown: ye\n            }, null, 40, sm),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-drivesearch__tune\",\n              title: s(y)(\"advsearch.open\"),\n              \"aria-label\": s(y)(\"advsearch.open\"),\n              \"data-testid\": \"drive-search-advanced\",\n              onClick: Pe[4] || (Pe[4] = (Be) => u(\"open-advanced-search\", D.value))\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"filter\")\n              }, null, 8, im)\n            ], 8, rm),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-drivesearch__kbd\",\n              title: s(y)(\"drive.search.hint_title\", { combo: Ae.value }),\n              \"aria-label\": s(y)(\"drive.search.hint_title\", { combo: Ae.value }),\n              \"data-testid\": \"drive-search-palette\",\n              onClick: Pe[5] || (Pe[5] = (Be) => u(\"open-palette\", D.value))\n            }, f(Ae.value), 9, lm)\n          ])\n        ]),\n        o(\"div\", cm, [\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-btn fe-btn--icon-only\",\n            title: V(s(y)(\"toolbar.refresh\"), \"refresh\"),\n            \"aria-label\": s(y)(\"toolbar.refresh\"),\n            onClick: Pe[6] || (Pe[6] = (Be) => u(\"refresh\"))\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"refresh\")\n            }, null, 8, dm)\n          ], 8, um),\n          o(\"span\", fm, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--icon-only fe-toolbar__soon\",\n              disabled: \"\",\n              \"aria-label\": s(y)(\"ai.assistant.soon\"),\n              \"aria-disabled\": \"true\",\n              \"data-testid\": \"header-ai\",\n              onClick: Pe[7] || (Pe[7] = Re(() => {\n              }, [\"prevent\"]))\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"ai\")\n              }, null, 8, vm)\n            ], 8, pm),\n            o(\"span\", hm, f(s(y)(\"ai.assistant.soon\")), 1)\n          ]),\n          at.value.length > 0 ? (c(), d(\"button\", {\n            key: 0,\n            ref_key: \"moreBtnEl\",\n            ref: We,\n            type: \"button\",\n            class: \"fe-btn fe-btn--icon-only\",\n            title: s(y)(\"toolbar.more\"),\n            \"aria-label\": s(y)(\"toolbar.more\"),\n            \"aria-haspopup\": \"menu\",\n            \"data-testid\": \"drive-more\",\n            onClick: Ye\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"more\")\n            }, null, 8, ym)\n          ], 8, mm)) : g(\"\", !0),\n          _n(fe.$slots, \"header-actions\")\n        ])\n      ], 64)),\n      Ge(Ps, {\n        ref_key: \"moreRef\",\n        ref: Ie,\n        locale: e.locale,\n        theme: e.theme || \"auto\",\n        sheet: L.value,\n        actions: at.value,\n        onSelect: lt\n      }, null, 8, [\"locale\", \"theme\", \"sheet\", \"actions\"]),\n      (c(), et(ja, {\n        to: ue.value || \"body\",\n        disabled: !ue.value\n      }, [\n        $.value ? (c(), d(\"div\", {\n          key: 0,\n          class: we([\"fe-selbar\", { \"fe-selbar--inline\": !ue.value }]),\n          role: \"toolbar\",\n          \"aria-label\": De.value,\n          \"data-testid\": \"selection-bar\"\n        }, [\n          o(\"span\", Am, f(De.value), 1),\n          o(\"div\", {\n            ref_key: \"selBarEl\",\n            ref: z,\n            class: \"fe-selbar__actions\"\n          }, [\n            (c(!0), d(ae, null, Te(G.value, (Be) => (c(), d(\"button\", {\n              key: Be.key,\n              type: \"button\",\n              class: we([\"fe-selbar__btn\", { \"fe-selbar__btn--danger\": Be.danger, \"is-disabled\": Be.disabled }]),\n              disabled: Be.disabled,\n              title: Be.title || V(Be.label, Be.key),\n              \"aria-label\": Be.label,\n              \"data-key\": Be.key,\n              \"data-testid\": `selbar-${Be.key}`,\n              onClick: (ht) => ce(Be.key)\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: r(Be)\n              }, null, 8, Lm)\n            ], 10, Pm))), 128)),\n            P.value.length > 0 ? (c(), d(\"button\", {\n              key: 0,\n              ref_key: \"selMoreBtnEl\",\n              ref: Y,\n              type: \"button\",\n              class: \"fe-selbar__btn\",\n              title: s(y)(\"toolbar.more\"),\n              \"aria-label\": s(y)(\"toolbar.more\"),\n              \"aria-haspopup\": \"menu\",\n              \"data-testid\": \"selbar-more\",\n              onClick: he\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"more\")\n              }, null, 8, Om)\n            ], 8, Dm)) : g(\"\", !0),\n            o(\"div\", {\n              ref_key: \"measureEl\",\n              ref: T,\n              class: \"fe-selbar__measure\",\n              \"aria-hidden\": \"true\"\n            }, [\n              (c(!0), d(ae, null, Te(M.value.icons, (Be) => (c(), d(\"button\", {\n                key: \"m-\" + Be.key,\n                type: \"button\",\n                class: \"fe-selbar__btn\",\n                \"data-key\": Be.key,\n                tabindex: \"-1\"\n              }, [\n                o(\"span\", {\n                  class: \"fe-icon\",\n                  \"aria-hidden\": \"true\",\n                  innerHTML: r(Be)\n                }, null, 8, Im)\n              ], 8, Bm))), 128))\n            ], 512)\n          ], 512),\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-selbar__close\",\n            title: s(y)(\"selection.clear\"),\n            \"aria-label\": s(y)(\"selection.clear\"),\n            \"data-testid\": \"selection-clear\",\n            onClick: ie\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"close\")\n            }, null, 8, Fm)\n          ], 8, Hm)\n        ], 10, zm)) : g(\"\", !0)\n      ], 8, [\"to\", \"disabled\"])),\n      Ge(Ps, {\n        ref_key: \"selMoreRef\",\n        ref: O,\n        locale: e.locale,\n        theme: e.theme || \"auto\",\n        sheet: L.value,\n        actions: P.value,\n        onSelect: Pe[11] || (Pe[11] = (Be) => ce(Be.key))\n      }, null, 8, [\"locale\", \"theme\", \"sheet\", \"actions\"])\n    ], 2));\n  }\n}), Rm = [\"title\", \"aria-label\", \"data-testid\", \"onClick\"], Um = [\"onClick\", \"aria-label\"], Vm = [\"placeholder\", \"aria-label\"], td = /* @__PURE__ */ qe({\n  __name: \"TagPicker\",\n  props: {\n    nodeId: {},\n    locale: {},\n    apiBase: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    palette: {}\n  },\n  emits: [\"change\", \"error\", \"open\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale ?? \"en\");\n    function u(x) {\n      return a(\"tags.open\", { tag: x });\n    }\n    const v = m([]), p = m(!1), h = m(!1), b = m(\"\"), y = k(() => n.palette ?? [\n      \"#ef4444\",\n      \"#f59e0b\",\n      \"#10b981\",\n      \"#3b82f6\",\n      \"#8b5cf6\",\n      \"#ec4899\",\n      \"#14b8a6\",\n      \"#f97316\"\n    ]);\n    function A(x) {\n      let E = 0;\n      for (let M = 0; M < x.length; M++) E = E * 31 + x.charCodeAt(M) | 0;\n      const $ = y.value;\n      return $[Math.abs(E) % $.length];\n    }\n    async function D(x = {}) {\n      return { ...await (n.authHeaders ?? (() => ({})))(), ...x };\n    }\n    async function C() {\n      p.value = !0;\n      try {\n        const x = n.apiBase ?? \"\", E = await fetch(`${x}/api/files/manager/tags?node_id=${n.nodeId}`, {\n          headers: await D(),\n          credentials: n.authCredentials ?? \"same-origin\"\n        });\n        if (E.ok) {\n          const $ = await E.json();\n          v.value = Array.isArray($.tags) ? $.tags : [];\n        }\n      } catch (x) {\n        r(\"error\", x instanceof Error ? x.message : String(x));\n      } finally {\n        p.value = !1;\n      }\n    }\n    async function B(x) {\n      const E = [...v.value];\n      v.value = x;\n      try {\n        const $ = n.apiBase ?? \"\", M = await fetch(`${$}/api/files/manager/tags`, {\n          method: \"POST\",\n          headers: await D({ \"Content-Type\": \"application/json\" }),\n          credentials: n.authCredentials ?? \"same-origin\",\n          body: JSON.stringify({ node_id: n.nodeId, tags: x })\n        });\n        if (!M.ok) throw new Error(`tag save failed: ${M.status}`);\n        r(\"change\", x);\n      } catch ($) {\n        v.value = E, r(\"error\", $ instanceof Error ? $.message : String($));\n      }\n    }\n    function I() {\n      const x = b.value.trim();\n      if (!x || v.value.includes(x)) {\n        b.value = \"\", h.value = !1;\n        return;\n      }\n      B([...v.value, x]), b.value = \"\", h.value = !1;\n    }\n    function U(x) {\n      B(v.value.filter((E) => E !== x));\n    }\n    return dt(C), He(() => n.nodeId, C), (x, E) => (c(), d(\"div\", {\n      class: we([\"filex-tag-picker\", { \"is-loading\": p.value }])\n    }, [\n      (c(!0), d(ae, null, Te(v.value, ($) => (c(), d(\"span\", {\n        key: $,\n        class: \"filex-tag\",\n        style: Ct({ \"--filex-tag-color\": A($) })\n      }, [\n        o(\"button\", {\n          class: \"filex-tag-open\",\n          type: \"button\",\n          title: u($),\n          \"aria-label\": u($),\n          \"data-testid\": `tag-open-${$}`,\n          onClick: (M) => r(\"open\", $)\n        }, f($), 9, Rm),\n        o(\"button\", {\n          class: \"filex-tag-x\",\n          type: \"button\",\n          onClick: (M) => U($),\n          \"aria-label\": s(a)(\"tags.remove\")\n        }, \"×\", 8, Um)\n      ], 4))), 128)),\n      h.value ? (c(), d(\"form\", {\n        key: 0,\n        class: \"filex-tag-add\",\n        onSubmit: Re(I, [\"prevent\"])\n      }, [\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": E[0] || (E[0] = ($) => b.value = $),\n          autofocus: \"\",\n          placeholder: s(a)(\"tags.name\"),\n          \"aria-label\": s(a)(\"tags.name\"),\n          onBlur: I,\n          onKeydown: E[1] || (E[1] = Ut(($) => {\n            h.value = !1, b.value = \"\";\n          }, [\"escape\"]))\n        }, null, 40, Vm), [\n          [rt, b.value]\n        ])\n      ], 32)) : (c(), d(\"button\", {\n        key: 1,\n        class: \"filex-tag-add-btn\",\n        type: \"button\",\n        onClick: E[2] || (E[2] = ($) => h.value = !0)\n      }, f(s(a)(\"tags.add\")), 1))\n    ], 2));\n  }\n}), nd = {};\nfunction Dn(e, t) {\n  for (const n of t) nd[n] = e;\n}\nDn(\"image\", [\"jpg\", \"jpeg\", \"png\", \"webp\", \"gif\", \"bmp\", \"avif\", \"heic\", \"svg\", \"ico\", \"tiff\", \"tif\"]);\nDn(\"video\", [\"mp4\", \"webm\", \"mov\", \"mkv\", \"avi\", \"ogv\", \"m4v\"]);\nDn(\"audio\", [\"mp3\", \"wav\", \"flac\", \"ogg\", \"m4a\", \"aac\", \"opus\"]);\nDn(\"pdf\", [\"pdf\"]);\nDn(\"doc\", [\"doc\", \"docx\", \"odt\", \"rtf\"]);\nDn(\"sheet\", [\"xls\", \"xlsx\", \"ods\", \"csv\", \"tsv\"]);\nDn(\"slides\", [\"ppt\", \"pptx\", \"odp\"]);\nDn(\"archive\", [\"zip\", \"tar\", \"gz\", \"bz2\", \"7z\", \"rar\", \"xz\", \"zst\"]);\nDn(\"code\", [\n  \"js\",\n  \"ts\",\n  \"jsx\",\n  \"tsx\",\n  \"mjs\",\n  \"cjs\",\n  \"vue\",\n  \"py\",\n  \"go\",\n  \"rs\",\n  \"php\",\n  \"rb\",\n  \"java\",\n  \"kt\",\n  \"swift\",\n  \"c\",\n  \"cpp\",\n  \"h\",\n  \"hpp\",\n  \"cs\",\n  \"css\",\n  \"scss\",\n  \"less\",\n  \"html\",\n  \"htm\",\n  \"json\",\n  \"yml\",\n  \"yaml\",\n  \"xml\",\n  \"sh\",\n  \"bash\",\n  \"ps1\",\n  \"sql\",\n  \"toml\"\n]);\nDn(\"text\", [\"txt\", \"md\", \"markdown\", \"log\", \"ini\", \"conf\", \"cfg\", \"env\"]);\nfunction Pi(e) {\n  return e.mime_type === \"inode/storage\";\n}\nfunction jn(e) {\n  if (Pi(e)) return \"storage\";\n  if (e.basename === \".trash\") return \"trash\";\n  if (e.type === \"dir\") return \"folder\";\n  const t = (e.extension || \"\").toLowerCase();\n  return nd[t] ?? \"unknown\";\n}\nconst ea = '<path d=\"M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z\"/><path d=\"M13.5 3v5h5\"/>', jm = {\n  // Folder is the one \"filled\" member — a soft currentColor wash keeps it\n  // visually anchored without breaking the line style.\n  /**\n   * gorunum:v1 — the folder is SOLID, and it is the one glyph that never\n   * gets a tile. A folder is the most common thing in a listing; drawn as an\n   * outline in the same weight as the file glyphs it disappears into them,\n   * and the eye has to read the label to tell a folder from a document. Filled\n   * and in its own colour it is recognisable before the name is read.\n   */\n  folder: '<path d=\"M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5z\" fill=\"currentColor\" stroke=\"none\"/>',\n  image: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><circle cx=\"8.6\" cy=\"10\" r=\"1.6\"/><path d=\"M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7\"/>',\n  video: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M10.2 9.3v5.4l4.8-2.7z\" fill=\"currentColor\" stroke=\"none\"/>',\n  audio: '<path d=\"M9 17.5V7.2l9-2.2v10.4\"/><circle cx=\"6.8\" cy=\"17.6\" r=\"2.2\"/><circle cx=\"15.8\" cy=\"15.5\" r=\"2.2\"/>',\n  pdf: ea + '<rect x=\"7.5\" y=\"12\" width=\"9\" height=\"5\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.14\"/>',\n  doc: ea + '<path d=\"M8.5 13h7M8.5 16h7\"/>',\n  sheet: ea + '<path d=\"M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18\"/>',\n  slides: ea + '<rect x=\"8\" y=\"12.5\" width=\"8\" height=\"5\" rx=\"0.8\"/>',\n  archive: ea + '<path d=\"M10 3v1.6M10 6.6v1.6M10 10.2v1.6\"/><rect x=\"8.6\" y=\"14\" width=\"2.8\" height=\"3.4\" rx=\"0.8\"/>',\n  code: ea + '<path d=\"M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5\"/>',\n  text: ea + '<path d=\"M8.5 12h7M8.5 15h7M8.5 18h4.5\"/>',\n  // The two-bay drive the sidebar already draws for the same storages, so a\n  // drive is one shape across the panel rather than one per surface.\n  storage: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"6\" rx=\"1.6\"/><rect x=\"3\" y=\"13\" width=\"18\" height=\"6\" rx=\"1.6\"/><path d=\"M6.5 8h.01M6.5 16h.01\"/>',\n  trash: '<path d=\"M4 7h16\"/><path d=\"M9.5 7V5.6A1.6 1.6 0 0 1 11.1 4h1.8a1.6 1.6 0 0 1 1.6 1.6V7\"/><path d=\"M6.2 7l.85 11.6A1.6 1.6 0 0 0 8.65 20h6.7a1.6 1.6 0 0 0 1.6-1.4L17.8 7\"/><path d=\"M10.2 10.8v5.6M13.8 10.8v5.6\"/>',\n  unknown: ea + '<path d=\"M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4\"/><circle cx=\"12\" cy=\"18.4\" r=\"0.9\" fill=\"currentColor\" stroke=\"none\"/>'\n}, Gc = /* @__PURE__ */ new Map();\nfunction Xc(e) {\n  let t = Gc.get(e);\n  return t || (t = `<svg class=\"fe-ficon fe-ficon--${e}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${jm[e]}</svg>`, Gc.set(e, t)), t;\n}\nconst Jc = /* @__PURE__ */ new Map();\nfunction Li(e) {\n  if (e === \"folder\")\n    return `<span class=\"fe-ftile fe-ftile--folder\">${Xc(e)}</span>`;\n  let t = Jc.get(e);\n  return t || (t = `<span class=\"fe-ftile fe-ftile--${e}\">${Xc(e)}</span>`, Jc.set(e, t)), t;\n}\nfunction fn(e) {\n  return Li(jn(e));\n}\nfunction Ls(e) {\n  return e.type === \"dir\" && e.e2e === !0;\n}\nconst Ym = '<path fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\" d=\"M2.5 6.5A2.5 2.5 0 0 1 5 4h4.6a2.5 2.5 0 0 1 1.77.73L13 6.4h6a2.5 2.5 0 0 1 2.5 2.5v8.6A2.5 2.5 0 0 1 19 20H5a2.5 2.5 0 0 1-2.5-2.5zM9.7 12a2.3 2.3 0 0 1 4.6 0h-1.05a1.25 1.25 0 0 0-2.5 0zM9.2 12h5.6a1 1 0 0 1 1 1v3.6a1 1 0 0 1-1 1H9.2a1 1 0 0 1-1-1V13a1 1 0 0 1 1-1z\"/>';\nlet Gr = \"\";\nfunction Ds() {\n  return Gr || (Gr = `<span class=\"fe-ftile fe-ftile--folder fe-ftile--folder-locked\"><svg class=\"fe-ficon fe-ficon--folder\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${Ym}</svg></span>`), Gr;\n}\nconst Wm = {\n  // Languages the person reading the column thinks of by name.\n  ts: \"ftype.typescript\",\n  tsx: \"ftype.typescript\",\n  mts: \"ftype.typescript\",\n  cts: \"ftype.typescript\",\n  js: \"ftype.javascript\",\n  jsx: \"ftype.javascript\",\n  mjs: \"ftype.javascript\",\n  cjs: \"ftype.javascript\",\n  vue: \"ftype.vue\",\n  py: \"ftype.python\",\n  go: \"ftype.go\",\n  rs: \"ftype.rust\",\n  php: \"ftype.php\",\n  rb: \"ftype.ruby\",\n  java: \"ftype.java\",\n  kt: \"ftype.kotlin\",\n  swift: \"ftype.swift\",\n  c: \"ftype.c\",\n  h: \"ftype.c\",\n  cpp: \"ftype.cpp\",\n  hpp: \"ftype.cpp\",\n  cs: \"ftype.csharp\",\n  // Structured text that is code by family but not a language.\n  css: \"ftype.stylesheet\",\n  scss: \"ftype.stylesheet\",\n  less: \"ftype.stylesheet\",\n  html: \"ftype.html\",\n  htm: \"ftype.html\",\n  json: \"ftype.json\",\n  yml: \"ftype.yaml\",\n  yaml: \"ftype.yaml\",\n  xml: \"ftype.xml\",\n  toml: \"ftype.toml\",\n  sql: \"ftype.sql\",\n  sh: \"ftype.shell\",\n  bash: \"ftype.shell\",\n  zsh: \"ftype.shell\",\n  ps1: \"ftype.powershell\",\n  // Plain-text family members that are each their own thing.\n  md: \"ftype.markdown\",\n  markdown: \"ftype.markdown\",\n  txt: \"ftype.plaintext\",\n  log: \"ftype.log\",\n  ini: \"ftype.config\",\n  conf: \"ftype.config\",\n  cfg: \"ftype.config\",\n  env: \"ftype.config\",\n  // Tabular: a `.csv` IS a spreadsheet to the person looking at the column,\n  // whatever the program that wrote it was.\n  csv: \"ftype.sheet\",\n  tsv: \"ftype.sheet\",\n  // Design files. No icon family of their own (they fall to `unknown`, which\n  // is a decision for the GLYPH, not for the word) — naming them still beats\n  // printing \"FIG\".\n  fig: \"ftype.figma\",\n  sketch: \"ftype.design\",\n  xd: \"ftype.design\",\n  psd: \"ftype.design\",\n  ai: \"ftype.design\"\n}, qm = {\n  folder: \"node.folder\",\n  image: \"ftype.image\",\n  video: \"ftype.video\",\n  audio: \"ftype.audio\",\n  pdf: \"ftype.pdf\",\n  doc: \"ftype.document\",\n  sheet: \"ftype.sheet\",\n  slides: \"ftype.slides\",\n  archive: \"ftype.archive\",\n  code: \"ftype.code\",\n  text: \"ftype.plaintext\"\n};\nfunction ad(e) {\n  if (e.type === \"dir\") return \"node.folder\";\n  const t = (e.extension || \"\").trim().toLowerCase(), n = Wm[t];\n  return n || (qm[jn(e)] ?? null);\n}\nfunction Os(e, t) {\n  const n = ad(e);\n  if (n) return t(n);\n  const r = (e.extension || \"\").trim();\n  return r ? r.toUpperCase() : \"—\";\n}\nconst ha = \".filex-e2e.json\", Gm = \"filexe2e\", od = 1, sd = 2, rd = 6e5, id = 6e5, ld = 200 * 1024 * 1024, Xm = 8, _s = 20, cd = \"RSA-OAEP-256\", Eo = \"filex-e2e-verify-v1\", ws = new TextEncoder().encode(Gm), Bs = 97, ii = 9, li = 21, Jm = 48, ci = 69, aa = 12, Ga = 32, Zm = \"filex-e2e-recovery-v1\", Qm = 16;\nclass xo extends Error {\n  constructor(t = \"e2e: decrypt failed\") {\n    super(t), this.name = \"E2eDecryptError\";\n  }\n}\nfunction Xa(e) {\n  let t = \"\";\n  for (let n = 0; n < e.length; n++) t += String.fromCharCode(e[n]);\n  return btoa(t);\n}\nfunction On(e) {\n  const t = atob(e), n = new Uint8Array(t.length);\n  for (let r = 0; r < t.length; r++) n[r] = t.charCodeAt(r);\n  return n;\n}\nfunction Tt(e) {\n  return new Uint8Array(e).buffer;\n}\nfunction ey(e, t) {\n  const n = new Uint8Array(e.length + t.length);\n  return n.set(e, 0), n.set(t, e.length), Xa(n);\n}\nasync function Is(e, t) {\n  const n = crypto.getRandomValues(new Uint8Array(aa)), r = new Uint8Array(\n    await crypto.subtle.encrypt({ name: \"AES-GCM\", iv: Tt(n) }, e, Tt(t))\n  );\n  return ey(n, r);\n}\nasync function Ka(e, t) {\n  let n;\n  try {\n    n = On(t);\n  } catch {\n    return null;\n  }\n  if (n.length <= aa) return null;\n  try {\n    const r = await crypto.subtle.decrypt(\n      { name: \"AES-GCM\", iv: Tt(n.slice(0, aa)) },\n      e,\n      Tt(n.slice(aa))\n    );\n    return new Uint8Array(r);\n  } catch {\n    return null;\n  }\n}\nasync function zo(e, t, n) {\n  const r = await crypto.subtle.importKey(\n    \"raw\",\n    new TextEncoder().encode(e),\n    \"PBKDF2\",\n    !1,\n    [\"deriveKey\"]\n  );\n  return crypto.subtle.deriveKey(\n    { name: \"PBKDF2\", salt: Tt(t), iterations: n, hash: \"SHA-256\" },\n    r,\n    { name: \"AES-GCM\", length: 256 },\n    !1,\n    // non-extractable\n    [\"encrypt\", \"decrypt\"]\n  );\n}\nasync function ud(e, t, n) {\n  const r = await crypto.subtle.importKey(\n    \"raw\",\n    new TextEncoder().encode(e),\n    \"PBKDF2\",\n    !1,\n    [\"deriveBits\"]\n  ), a = await crypto.subtle.deriveBits(\n    { name: \"PBKDF2\", salt: Tt(t), iterations: n, hash: \"SHA-256\" },\n    r,\n    Ga * 8\n  );\n  return new Uint8Array(a);\n}\nasync function Zs(e) {\n  return crypto.subtle.importKey(\"raw\", Tt(e), { name: \"AES-GCM\" }, !1, [\n    \"encrypt\",\n    \"decrypt\"\n  ]);\n}\nconst ui = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nfunction ty(e) {\n  let t = 0, n = 0, r = \"\";\n  for (let a = 0; a < e.length; a++)\n    for (n = n << 8 | e[a], t += 8; t >= 5; )\n      r += ui[n >>> t - 5 & 31], t -= 5;\n  return t > 0 && (r += ui[n << 5 - t & 31]), (r.match(/.{1,4}/g) || []).join(\"-\");\n}\nfunction dd() {\n  return ty(crypto.getRandomValues(new Uint8Array(_s)));\n}\nfunction Di(e) {\n  const t = (e || \"\").toUpperCase().replace(/[\\s-]/g, \"\").replace(/O/g, \"0\").replace(/[IL]/g, \"1\"), n = Math.ceil(_s * 8 / 5);\n  if (t.length !== n) return null;\n  const r = new Uint8Array(_s);\n  let a = 0, u = 0, v = 0;\n  for (const p of t) {\n    const h = ui.indexOf(p);\n    if (h < 0) return null;\n    a = a << 5 | h, u += 5, u >= 8 && (r[v++] = a >>> u - 8 & 255, u -= 8);\n  }\n  return v === _s ? r : null;\n}\nasync function fd(e, t) {\n  const n = await crypto.subtle.importKey(\"raw\", Tt(e), \"HKDF\", !1, [\"deriveKey\"]);\n  return crypto.subtle.deriveKey(\n    {\n      name: \"HKDF\",\n      hash: \"SHA-256\",\n      salt: Tt(t),\n      info: Tt(new TextEncoder().encode(Zm))\n    },\n    n,\n    { name: \"AES-GCM\", length: 256 },\n    !1,\n    [\"encrypt\", \"decrypt\"]\n  );\n}\nasync function pd(e, t) {\n  const n = Di(t);\n  if (!n) throw new Error(\"e2e: malformed recovery key\");\n  const r = crypto.getRandomValues(new Uint8Array(Qm)), a = await fd(n, r), u = { salt: Xa(r), blob: await Is(a, e) };\n  return n.fill(0), u;\n}\nasync function ny(e) {\n  return crypto.subtle.importKey(\n    \"spki\",\n    Tt(On(e)),\n    { name: \"RSA-OAEP\", hash: \"SHA-256\" },\n    !0,\n    [\"encrypt\"]\n  );\n}\nasync function ay(e) {\n  const t = (e || \"\").replace(/-----[A-Z ]+-----/g, \"\").replace(/\\s+/g, \"\");\n  return crypto.subtle.importKey(\n    \"pkcs8\",\n    Tt(On(t)),\n    { name: \"RSA-OAEP\", hash: \"SHA-256\" },\n    !1,\n    [\"decrypt\"]\n  );\n}\nasync function oy(e) {\n  const t = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", Tt(On(e))));\n  return Array.from(t.slice(0, 8)).map((n) => n.toString(16).padStart(2, \"0\")).join(\"\");\n}\nasync function Oi(e, t) {\n  const n = await ny(t), r = new Uint8Array(await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, n, Tt(e)));\n  return { kid: await oy(t), alg: cd, blob: Xa(r) };\n}\nasync function HD(e, t = rd) {\n  const n = Math.max(id, t), r = crypto.getRandomValues(new Uint8Array(16)), a = await zo(e, r, n), u = await Is(a, new TextEncoder().encode(Eo));\n  return { marker: { v: 1, salt: Xa(r), iter: n, verify: u }, kek: a };\n}\nasync function sy(e, t = {}) {\n  const n = Math.max(id, t.iterations ?? rd), r = crypto.getRandomValues(new Uint8Array(16)), a = await zo(e, r, n), u = crypto.getRandomValues(new Uint8Array(Ga)), v = dd(), p = {\n    v: sd,\n    salt: Xa(r),\n    iter: n,\n    verify: await Is(a, new TextEncoder().encode(Eo)),\n    fmk: \"wrapped\",\n    fmk_pw: await Is(a, u),\n    rk: await pd(u, v)\n  };\n  t.escrowPublicKey && (p.esc = await Oi(u, t.escrowPublicKey));\n  const h = await Zs(u);\n  return u.fill(0), { marker: p, fmk: h, recoveryKey: v };\n}\nasync function ry(e, t, n = {}) {\n  if (e.v !== 1) throw new Error(\"e2e: not a v1 marker\");\n  const r = On(e.salt), a = await zo(t, r, e.iter), u = await Ka(a, e.verify);\n  if (!u || new TextDecoder().decode(u) !== Eo)\n    throw new xo(\"e2e: wrong password\");\n  const v = await ud(t, r, e.iter), p = dd(), h = {\n    v: sd,\n    salt: e.salt,\n    iter: e.iter,\n    verify: e.verify,\n    fmk: \"kek\",\n    rk: await pd(v, p)\n  };\n  return n.escrowPublicKey && (h.esc = await Oi(v, n.escrowPublicKey)), v.fill(0), { marker: h, fmk: a, recoveryKey: p };\n}\nasync function iy(e, t, n) {\n  if (e.v !== 2) throw new Error(\"e2e: not a v2 marker\");\n  if (e.esc) throw new Error(\"e2e: this folder already has an escrow slot\");\n  if (!n) throw new Error(\"e2e: no escrow public key\");\n  const r = On(e.salt), a = await zo(t, r, e.iter), u = await Ka(a, e.verify);\n  if (!u || new TextDecoder().decode(u) !== Eo)\n    throw new xo(\"e2e: wrong password\");\n  let v;\n  if (e.fmk === \"wrapped\") {\n    const b = e.fmk_pw ? await Ka(a, e.fmk_pw) : null;\n    if (!b || b.length !== Ga)\n      throw new xo(\"e2e: could not unwrap the folder master key\");\n    v = b;\n  } else\n    v = await ud(t, r, e.iter);\n  const p = await Oi(v, n);\n  v.fill(0);\n  const h = { ...e, esc: p };\n  return delete h.esc_declined, h;\n}\nfunction ly(e, t) {\n  return { ...e, esc_declined: t };\n}\nfunction Zc(e, t) {\n  return !t || !e || e.v !== 2 || e.esc ? \"n/a\" : e.esc_declined ? \"declined\" : \"offer\";\n}\nfunction Qc(e) {\n  try {\n    const t = JSON.parse(e);\n    return !t || t.v !== 1 && t.v !== 2 || typeof t.salt != \"string\" || typeof t.verify != \"string\" || typeof t.iter != \"number\" || t.iter < 1 || t.v === 2 && (t.fmk !== \"kek\" && t.fmk !== \"wrapped\" || t.fmk === \"wrapped\" && typeof t.fmk_pw != \"string\") ? null : t;\n  } catch {\n    return null;\n  }\n}\nfunction cy(e) {\n  return !!e && e.v === 2 && !!e.rk;\n}\nfunction uy(e) {\n  return !!e && e.v === 2 && !!e.esc;\n}\nfunction dy(e, t) {\n  return t ? uy(e) ? e.esc.kid === t ? \"available\" : \"other-key\" : \"predates\" : \"off\";\n}\nasync function fy(e, t) {\n  const n = await zo(t, On(e.salt), e.iter), r = await Ka(n, e.verify);\n  return !r || new TextDecoder().decode(r) !== Eo ? null : n;\n}\nasync function py(e, t) {\n  if (e.v === 1 || e.fmk === \"kek\") return t;\n  if (!e.fmk_pw) return null;\n  const n = await Ka(t, e.fmk_pw);\n  if (!n || n.length !== Ga) return null;\n  const r = await Zs(n);\n  return n.fill(0), r;\n}\nasync function vy(e, t) {\n  const n = await fy(e, t);\n  return n ? py(e, n) : null;\n}\nasync function hy(e, t) {\n  if (e.v !== 2 || !e.rk) return null;\n  const n = Di(t);\n  if (!n) return null;\n  let r;\n  try {\n    r = On(e.rk.salt);\n  } catch {\n    return null;\n  }\n  const a = await fd(n, r);\n  n.fill(0);\n  const u = await Ka(a, e.rk.blob);\n  if (!u || u.length !== Ga) return null;\n  const v = await Zs(u);\n  return u.fill(0), v;\n}\nasync function my(e, t) {\n  if (e.v !== 2 || !e.esc || e.esc.alg !== cd) return null;\n  let n;\n  try {\n    n = new Uint8Array(\n      await crypto.subtle.decrypt(\n        { name: \"RSA-OAEP\" },\n        t,\n        Tt(On(e.esc.blob))\n      )\n    );\n  } catch {\n    return null;\n  }\n  if (n.length !== Ga) return null;\n  const r = await Zs(n);\n  return n.fill(0), r;\n}\nfunction di(e) {\n  const t = e instanceof Uint8Array ? e : new Uint8Array(e);\n  if (t.length < ws.length) return !1;\n  for (let n = 0; n < ws.length; n++)\n    if (t[n] !== ws[n]) return !1;\n  return !0;\n}\nasync function yy(e, t) {\n  if (t.byteLength > ld)\n    throw new Error(\"e2e: file exceeds the 200MB single-shot limit\");\n  const n = crypto.getRandomValues(new Uint8Array(32)), r = await crypto.subtle.importKey(\"raw\", Tt(n), { name: \"AES-GCM\" }, !1, [\n    \"encrypt\"\n  ]), a = crypto.getRandomValues(new Uint8Array(aa)), u = crypto.getRandomValues(new Uint8Array(aa)), v = new Uint8Array(\n    await crypto.subtle.encrypt({ name: \"AES-GCM\", iv: Tt(a) }, e, Tt(n))\n  ), p = new Uint8Array(\n    await crypto.subtle.encrypt({ name: \"AES-GCM\", iv: Tt(u) }, r, t)\n  );\n  n.fill(0);\n  const h = new Uint8Array(Bs + p.length);\n  return h.set(ws, 0), h[8] = od, h.set(a, ii), h.set(v, li), h.set(u, ci), h.set(p, Bs), h.buffer;\n}\nasync function eu(e, t) {\n  const n = new Uint8Array(t);\n  if (!di(n) || n.length < Bs)\n    throw new Error(\"e2e: not an encrypted file\");\n  if (n[8] !== od)\n    throw new Error(`e2e: unsupported version ${n[8]}`);\n  const r = n.slice(ii, ii + aa), a = n.slice(li, li + Jm), u = n.slice(ci, ci + aa);\n  let v;\n  try {\n    v = await crypto.subtle.decrypt({ name: \"AES-GCM\", iv: Tt(r) }, e, Tt(a));\n  } catch {\n    throw new xo(\"e2e: DEK unwrap failed (wrong key?)\");\n  }\n  const p = await crypto.subtle.importKey(\"raw\", v, { name: \"AES-GCM\" }, !1, [\"decrypt\"]);\n  try {\n    return await crypto.subtle.decrypt(\n      { name: \"AES-GCM\", iv: Tt(u) },\n      p,\n      Tt(n.slice(Bs))\n    );\n  } catch {\n    throw new xo(\"e2e: content decrypt failed\");\n  }\n}\nfunction by() {\n  const e = /* @__PURE__ */ new Map();\n  return {\n    get(t) {\n      return e.get(t);\n    },\n    set(t, n) {\n      e.set(t, n);\n    },\n    /** Drop one folder's key (\"Lock\"). */\n    lock(t) {\n      e.delete(t);\n    },\n    has(t) {\n      return e.has(t);\n    },\n    clear() {\n      e.clear();\n    }\n  };\n}\nfunction Bi(e) {\n  const t = e.indexOf(\"://\");\n  return t === -1 ? e : e.slice(t + 3);\n}\nfunction ya(e) {\n  const t = Bi(String(e ?? \"\")), n = t.lastIndexOf(\"/\");\n  return n === -1 ? \"\" : t.slice(0, n);\n}\nfunction gy(e) {\n  return (e || []).filter((t) => !(t.path.includes(\".thumbs\") || t.path.includes(\".versions\") || t.basename === \".versions\" || t.basename === \".trash\" || t.basename === \".filex-open\" || t.basename === \".keepdir\" || t.basename === ha));\n}\nconst vd = \"filex.showHidden\";\nfunction ky() {\n  try {\n    return localStorage.getItem(vd) === \"1\";\n  } catch {\n    return !1;\n  }\n}\nconst Hs = m(ky());\nfunction _y(e) {\n  Hs.value = e;\n  try {\n    localStorage.setItem(vd, e ? \"1\" : \"0\");\n  } catch {\n  }\n}\nfunction wy(e, t) {\n  return t ? e || [] : (e || []).filter((n) => !(n.basename || \"\").startsWith(\".\"));\n}\nfunction $s(e) {\n  return wy(gy(e), Hs.value);\n}\nfunction $y(e) {\n  const t = Bi(e);\n  return t === \"fileman\" || t === \"\";\n}\nfunction xy(e) {\n  return Bi(e).startsWith(\"fileman/.trash\");\n}\nfunction Sy(e) {\n  return {\n    type: \"dir\",\n    path: `${e}://fileman/.trash`,\n    basename: \".trash\",\n    extension: \"\",\n    storage: e,\n    visibility: \"private\",\n    size: 0,\n    file_size: 0,\n    mime_type: \"inode/directory\",\n    extra_metadata: {}\n  };\n}\nfunction hd(e, t, n, r, a = {}) {\n  return !r || a.navOffersTrash || a.isSearchResult || xy(n) || !$y(n) ? !1 : (e.unshift(Sy(t)), !0);\n}\nasync function md(e, t, n) {\n  try {\n    const { entries: r } = await n.listTrash(t), a = e.find((p) => p.basename === \".trash\");\n    if (!a) return;\n    let u = 0, v = 0;\n    for (const p of r) {\n      u += p.size || 0;\n      const h = Date.parse(p.deleted_at);\n      !Number.isNaN(h) && h > v && (v = h);\n    }\n    a.size = u, v > 0 && (a.last_modified = v);\n  } catch {\n  }\n}\nconst yd = {\n  /* gorunum:v3-shell — Home is a destination like the rest, so it gets a\n     sentinel like the rest: a restored tab, a reload and a pasted `#.home`\n     all have to reopen the overview instead of asking the backend for a\n     folder called `.home` and landing on \"not found\". */\n  \".home\": \"node.home\",\n  \".trash\": \"node.trash\",\n  \".recent\": \"node.recent\",\n  \".starred\": \"node.starred\",\n  \".shared\": \"node.shared\"\n}, fi = \".tag~\";\nfunction Cy(e) {\n  return `${fi}${e}`;\n}\nfunction Ii(e) {\n  return e.startsWith(fi) ? e.slice(fi.length) : \"\";\n}\nfunction Ty(e) {\n  const t = (e || \"\").replace(/^\\/+|\\/+$/g, \"\");\n  return Ii(t.split(\"/\").pop() || t);\n}\nfunction Fs(e, t) {\n  const n = yd[e];\n  if (n) return t(n);\n  const r = Ii(e);\n  return r ? `#${r}` : \"\";\n}\nfunction bd(e) {\n  const t = String(e ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n  return t ? !!yd[t] || !!Ii(t) : !1;\n}\nfunction pi(e, t) {\n  const n = e.type === \"dir\" ? 0 : 1, r = t.type === \"dir\" ? 0 : 1;\n  return n - r;\n}\nconst gd = [\"name\", \"type\", \"modified\", \"size\"], kd = \"filex.list-sort\", Xr = \"name\";\nfunction Ns(e) {\n  return e === \"modified\" ? \"desc\" : \"asc\";\n}\nfunction My(e) {\n  return typeof e == \"string\" && gd.includes(e);\n}\nfunction _d() {\n  const e = { key: Xr, dir: Ns(Xr) };\n  if (typeof localStorage > \"u\") return e;\n  try {\n    const t = localStorage.getItem(kd);\n    if (!t) return e;\n    const n = JSON.parse(t), r = My(n.key) ? n.key : Xr, a = n.dir === \"asc\" || n.dir === \"desc\" ? n.dir : Ns(r);\n    return { key: r, dir: a };\n  } catch {\n    return e;\n  }\n}\nconst wd = m(\"en\");\nfunction Hi(e) {\n  wd.value = e;\n}\nfunction tu(e) {\n  const t = e.last_modified;\n  return t ? t * (t < 1e12 ? 1e3 : 1) : null;\n}\nfunction nu(e, t) {\n  return (e.basename || \"\").localeCompare(t.basename || \"\", void 0, {\n    numeric: !0,\n    sensitivity: \"base\"\n  });\n}\nfunction au(e) {\n  const t = ad(e);\n  if (t)\n    return (Ms[wd.value] ?? Ms.en)[t] ?? t;\n  const n = (e.extension || \"\").trim();\n  return n ? n.toUpperCase() : \"\";\n}\nfunction Ey(e, t, n, r) {\n  const a = t === \"asc\" ? 1 : -1;\n  switch (e) {\n    case \"name\":\n      return a * nu(n, r);\n    case \"size\":\n      return a * ((n.size ?? -1) - (r.size ?? -1));\n    case \"type\": {\n      const u = au(n).localeCompare(au(r), void 0, { sensitivity: \"base\" });\n      return u !== 0 ? a * u : nu(n, r);\n    }\n    default: {\n      const u = tu(n), v = tu(r);\n      return u == null && v == null ? 0 : u == null ? 1 : v == null ? -1 : a * (u - v);\n    }\n  }\n}\nfunction ou(e, t) {\n  try {\n    localStorage.setItem(kd, JSON.stringify({ key: e, dir: t }));\n  } catch {\n  }\n}\nfunction $d() {\n  const e = _d(), t = m(e.key), n = m(e.dir);\n  function r(b, y) {\n    t.value = b, n.value = y ?? Ns(b), ou(t.value, n.value);\n  }\n  function a(b, y) {\n    t.value = b, n.value = y;\n  }\n  function u() {\n    n.value = n.value === \"asc\" ? \"desc\" : \"asc\", ou(t.value, n.value);\n  }\n  function v(b) {\n    t.value === b ? u() : r(b);\n  }\n  function p(b, y) {\n    return pi(b, y) || Ey(t.value, n.value, b, y);\n  }\n  function h(b) {\n    return b === \"relevance\" ? pi : p;\n  }\n  return {\n    key: t,\n    dir: n,\n    setSort: r,\n    applySort: a,\n    toggleSortDir: u,\n    chooseSortKey: v,\n    compareNodes: p,\n    compareInOrder: h,\n    sortListing: (b, y = \"sort\") => [...b || []].sort(h(y))\n  };\n}\nconst Qs = $d(), xd = Symbol(\"fe-sort-store\");\nfunction Ao() {\n  return Ws(xd, Qs);\n}\nfunction su() {\n  return Qs.key.value;\n}\nfunction ru() {\n  return Qs.dir.value;\n}\nfunction iu(e, t) {\n  Qs.applySort(e, t);\n}\nfunction zy() {\n  return _d();\n}\nlet Ra = null;\nconst Po = m(!1), Lo = m(!1);\nfunction lu() {\n  return Po.value;\n}\nconst $n = m(!1);\nfunction Ay() {\n  return $n.value;\n}\nfunction FD(e) {\n  $n.value !== e && ($n.value = e, hn());\n}\nfunction Sd() {\n  return Math.floor(Date.now() / 1e3);\n}\nfunction Py(e) {\n  return e === \"list\" || e === \"grid\" || e === \"gallery\";\n}\nconst Vt = m({});\nfunction Ly(e) {\n  if (!e || typeof e != \"object\" || Array.isArray(e)) return {};\n  const t = {};\n  for (const [n, r] of Object.entries(e)) {\n    if (!r || typeof r != \"object\") continue;\n    const a = r, v = { t: typeof a.t == \"number\" && Number.isFinite(a.t) ? a.t : 0 };\n    Py(a.v) && (v.v = a.v), (a.k === \"name\" || a.k === \"type\" || a.k === \"modified\" || a.k === \"size\") && (v.k = a.k), (a.d === \"asc\" || a.d === \"desc\") && (v.d = a.d), (v.v || v.k) && (t[n] = v);\n  }\n  return t;\n}\nconst cu = 300;\nfunction Dy() {\n  const e = Object.entries(Vt.value);\n  if (e.length <= cu) return;\n  e.sort((n, r) => r[1].t - n[1].t);\n  const t = {};\n  for (const [n, r] of e.slice(0, cu)) t[n] = r;\n  Vt.value = t;\n}\nfunction uu(e, t) {\n  const n = String(e ?? \"\").trim(), r = String(t ?? \"\").replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, \"\").replace(/\\/{2,}/g, \"/\").replace(/^\\/+|\\/+$/g, \"\");\n  return n ? r ? `${n}/${r}` : n : r;\n}\nconst Oy = {\n  \".recent\": { k: \"modified\", d: \"desc\" }\n};\nfunction By(e) {\n  if (!e) return null;\n  if ($n.value) {\n    const t = Vt.value[e];\n    if (t) {\n      const { t: n, ...r } = t;\n      return r;\n    }\n  }\n  return Oy[e] ?? null;\n}\nfunction Iy(e) {\n  return $n.value && !!e && !!Vt.value[e];\n}\nfunction Hy() {\n  return $n.value ? Object.keys(Vt.value).length : 0;\n}\nfunction Fy(e, t) {\n  if (!e || !$n.value) return;\n  const n = Vt.value[e];\n  Vt.value = {\n    ...Vt.value,\n    [e]: { ...n ?? {}, ...t, t: Sd() }\n  }, Dy(), hn();\n}\nfunction Ny(e) {\n  if (!e || !$n.value) return;\n  const t = Vt.value[e];\n  if (!t) return;\n  const n = Sd();\n  t.t !== n && (Vt.value = { ...Vt.value, [e]: { ...t, t: n } }, hn());\n}\nfunction Ky(e) {\n  if (!e || !Vt.value[e]) return;\n  const t = { ...Vt.value };\n  delete t[e], Vt.value = t, hn();\n}\nfunction Ry() {\n  Vt.value = {}, hn();\n}\nconst ma = [\n  /* Name is pinned first and cannot be hidden, but its width is the person's\n     like any other (see the note on ColumnId). */\n  { id: \"name\", width: 260, min: 120, max: 900, hideable: !1, resizable: !0 },\n  { id: \"type\", width: 88, min: 64, max: 220, hideable: !0, resizable: !0 },\n  { id: \"location\", width: 160, min: 80, max: 420, hideable: !0, resizable: !0 },\n  { id: \"owner\", width: 104, min: 72, max: 260, hideable: !0, resizable: !0 },\n  { id: \"modified\", width: 160, min: 96, max: 300, hideable: !0, resizable: !0 },\n  { id: \"size\", width: 88, min: 64, max: 200, hideable: !0, resizable: !0 },\n  /* The star is a control, not a value: there is nothing to size and hiding it\n     is the Starred view's own call (`starEnabled`), not a column preference.\n     It is in this list only so one pass owns every optional track and no\n     stylesheet has to agree with it about which ones exist. */\n  { id: \"star\", width: 24, min: 24, max: 24, hideable: !1, resizable: !1 }\n], du = { check: 28, menu: 28 }, ND = 120, fu = 220;\nfunction pn(e) {\n  return ma.find((t) => t.id === e);\n}\nfunction xs(e) {\n  return typeof e == \"string\" && ma.some((t) => t.id === e);\n}\nfunction Fi(e) {\n  const t = { w: {}, hidden: [] };\n  if (!e || typeof e != \"object\" || Array.isArray(e)) return t;\n  {\n    const n = e, r = {};\n    if (n.w && typeof n.w == \"object\")\n      for (const [v, p] of Object.entries(n.w)) {\n        if (!xs(v) || typeof p != \"number\" || !Number.isFinite(p)) continue;\n        const h = pn(v);\n        h && (r[v] = Math.min(h.max, Math.max(h.min, Math.round(p))));\n      }\n    const a = Array.isArray(n.hidden) ? n.hidden.filter((v) => {\n      var p;\n      return xs(v) && ((p = pn(v)) == null ? void 0 : p.hideable);\n    }) : [], u = Array.isArray(n.o) ? [...new Set(n.o.filter(xs))] : void 0;\n    return { w: r, hidden: [...new Set(a)], o: u };\n  }\n}\nconst Mt = m(Fi(null));\nfunction ga() {\n  const e = Mt.value.o, t = ma.map((r) => r.id);\n  if (!e || e.length === 0) return t;\n  const n = e.filter((r) => t.includes(r) && r !== \"name\");\n  n.unshift(\"name\");\n  for (const r of t) n.includes(r) || n.push(r);\n  return n;\n}\nfunction Cd(e, t) {\n  const n = pn(e);\n  if (!n || !n.hideable) return;\n  const r = ga(), a = r.indexOf(e);\n  if (a === -1) return;\n  const u = [...r];\n  u.splice(a, 1), u.splice(Math.max(0, Math.min(u.length, t)), 0, e), u.join() !== r.join() && (Mt.value = { ...Mt.value, o: u }, hn());\n}\nfunction Uy(e, t) {\n  const n = ga().filter((p) => {\n    var h;\n    return (h = pn(p)) == null ? void 0 : h.hideable;\n  }), r = n.indexOf(e);\n  if (r === -1) return;\n  const a = r + t;\n  if (a < 0 || a >= n.length) return;\n  const u = n[a], v = ga();\n  Cd(e, v.indexOf(u));\n}\nfunction pu(e, t) {\n  const n = ga().filter((a) => {\n    var u;\n    return (u = pn(a)) == null ? void 0 : u.hideable;\n  }), r = n.indexOf(e);\n  return r === -1 ? !1 : r + t >= 0 && r + t < n.length;\n}\nfunction wo(e) {\n  const t = pn(e);\n  return t ? Mt.value.w[e] ?? t.width : 0;\n}\nfunction Jr(e, t) {\n  const n = pn(e);\n  if (!n || !n.resizable) return;\n  const r = Math.min(n.max, Math.max(n.min, Math.round(t)));\n  Mt.value.w[e] !== r && (Mt.value = { ...Mt.value, w: { ...Mt.value.w, [e]: r } }, hn());\n}\nfunction Td() {\n  return Mt.value.w.name === void 0;\n}\nfunction Vy(e) {\n  const t = { ...Mt.value.w };\n  let n = !1;\n  for (const [r, a] of Object.entries(e)) {\n    if (!xs(r) || typeof a != \"number\" || !Number.isFinite(a) || t[r] !== void 0) continue;\n    const u = pn(r);\n    !u || !u.resizable || (t[r] = Math.min(u.max, Math.max(u.min, Math.round(a))), n = !0);\n  }\n  n && (Mt.value = { ...Mt.value, w: t }, hn());\n}\nfunction Ks(e) {\n  return Mt.value.hidden.includes(e);\n}\nfunction jy(e, t) {\n  const n = pn(e);\n  if (!n || !n.hideable || Ks(e) === t) return;\n  const r = new Set(Mt.value.hidden);\n  t ? r.add(e) : r.delete(e), Mt.value = { ...Mt.value, hidden: [...r] }, hn();\n}\nfunction Yy() {\n  Mt.value = { w: {}, hidden: [] }, hn();\n}\nfunction Wy() {\n  var e;\n  return Object.keys(Mt.value.w).length > 0 || Mt.value.hidden.length > 0 || (((e = Mt.value.o) == null ? void 0 : e.length) ?? 0) > 0;\n}\nconst Md = [\"on\", \"f\", \"c\"], Kn = m({});\nfunction qy(e) {\n  const t = {};\n  for (const [n, r] of Object.entries(e))\n    Md.includes(n) || (t[n] = r);\n  return t;\n}\nfunction Gy() {\n  return { ...Kn.value, on: $n.value, f: Vt.value, c: Mt.value };\n}\nfunction KD(e) {\n  if (!e || Md.includes(e))\n    throw new Error(`viewPrefsSlot: \"${e}\" is reserved by lib/viewPrefs`);\n  return {\n    get: () => Kn.value[e],\n    set(t) {\n      Kn.value = { ...Kn.value, [e]: t }, hn();\n    },\n    clear() {\n      if (!(e in Kn.value)) return;\n      const t = { ...Kn.value };\n      delete t[e], Kn.value = t, hn();\n    },\n    ready: () => Po.value,\n    persistable: () => Lo.value\n  };\n}\nconst Xy = 800;\nlet Un, Rs = !1;\nfunction hn() {\n  !Po.value || !Lo.value || !Ra || (Rs = !0, Un && clearTimeout(Un), Un = setTimeout(Us, Xy));\n}\nfunction Us() {\n  Un && clearTimeout(Un), Un = void 0, !(!Rs || !Ra || !Lo.value) && (Rs = !1, Ra.save(Gy()));\n}\ntypeof window < \"u\" && (window.addEventListener(\"pagehide\", Us), window.addEventListener(\"visibilitychange\", () => {\n  typeof document < \"u\" && document.visibilityState === \"hidden\" && Us();\n}));\nfunction Jy(e) {\n  Ra || (Ra = e, (async () => {\n    let t = null;\n    try {\n      t = await e.load();\n    } catch {\n      t = null;\n    }\n    if (t && typeof t == \"object\" && !Array.isArray(t)) {\n      const n = t;\n      $n.value = n.on === !0, Vt.value = Ly(n.f), Mt.value = Fi(n.c), Kn.value = qy(n), Lo.value = !0;\n    }\n    Po.value = !0;\n  })());\n}\nfunction RD() {\n  Ra = null, Po.value = !1, Lo.value = !1, $n.value = !1, Vt.value = {}, Mt.value = Fi(null), Kn.value = {}, Rs = !1, Un && clearTimeout(Un), Un = void 0;\n}\nfunction UD() {\n  Us();\n}\nfunction Zy(e, t, n = {}) {\n  const r = n.gap ?? 8, a = n.padding ?? 24, u = ga().filter(\n    (A) => A !== \"name\" && t.includes(A) && !Ks(A)\n  ), v = {};\n  for (const A of u) v[A] = wo(A);\n  v.name = wo(\"name\");\n  const p = du.check + du.menu + a + r * (u.length + 2), h = Td(), b = pn(\"name\");\n  if (h && e > 0) {\n    const A = e - p;\n    let D = u.reduce((B, I) => B + v[I], 0);\n    const C = A - fu;\n    if (D > C) {\n      const B = u.reduce((I, U) => I + (v[U] - pn(U).min), 0);\n      if (B > 0) {\n        const I = Math.min(1, (D - C) / B);\n        for (const U of u) {\n          const x = pn(U);\n          v[U] = Math.max(x.min, v[U] - Math.ceil((v[U] - x.min) * I));\n        }\n        D = u.reduce((U, x) => U + v[x], 0);\n      }\n    }\n    v.name = Math.round(\n      Math.max(fu, Math.min(b.max, A - D))\n    );\n  }\n  const y = p + v.name + u.reduce((A, D) => A + v[D], 0);\n  return { visible: u, widths: v, total: y, auto: h };\n}\nconst Qy = [\"standard\", \"simple\"], Zr = \"standard\", vi = /* @__PURE__ */ new Set();\nfunction eb(e) {\n  if (e === \"simple\") return \"simple\";\n  if (e === \"standard\" || e === void 0 || e === null || e === \"\")\n    return Zr;\n  const t = typeof e == \"string\" ? e : String(e);\n  return !vi.has(t) && typeof console < \"u\" && (vi.add(t), console.warn(\n    `[filex] unknown uiProfile ${JSON.stringify(t)} — using \"${Zr}\". Valid values: ${Qy.map((n) => `\"${n}\"`).join(\", \")}. (The former \"drive\" profile was removed; pass \"simple\" for the reduced explorer.)`\n  )), Zr;\n}\nfunction VD() {\n  vi.clear();\n}\nconst tb = { class: \"filex-recent\" }, nb = [\"disabled\"], ab = [\"innerHTML\"], ob = { key: 0 }, sb = [\"data-fe-path\"], rb = [\"onClick\", \"onContextmenu\"], ib = { class: \"filex-recent-name\" }, lb = { class: \"filex-recent-meta\" }, cb = {\n  key: 1,\n  class: \"filex-recent-empty\"\n}, ub = {\n  key: 2,\n  class: \"filex-recent-empty\"\n}, db = /* @__PURE__ */ qe({\n  __name: \"RecentlyOpened\",\n  props: {\n    apiBase: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    limit: {},\n    refreshKey: {}\n  },\n  emits: [\"open\", \"context\", \"error\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = m([]), u = m(!1);\n    async function v() {\n      u.value = !0;\n      try {\n        const h = await (n.authHeaders ?? (() => ({})))(), b = n.apiBase ?? \"\", y = n.limit ?? 20, A = await fetch(`${b}/api/files/manager/recent?limit=${y}`, {\n          headers: h,\n          credentials: n.authCredentials ?? \"same-origin\"\n        });\n        if (A.ok) {\n          const D = await A.json();\n          a.value = Array.isArray(D.nodes) ? D.nodes : Array.isArray(D.entries) ? D.entries : Array.isArray(D) ? D : [];\n        }\n      } catch (h) {\n        r(\"error\", h instanceof Error ? h.message : String(h));\n      } finally {\n        u.value = !1;\n      }\n    }\n    function p(h) {\n      if (!h) return \"\";\n      const b = new Date(h).getTime();\n      if (Number.isNaN(b)) return \"\";\n      const y = Date.now() - b;\n      return y < 6e4 ? \"just now\" : y < 36e5 ? `${Math.floor(y / 6e4)}m ago` : y < 864e5 ? `${Math.floor(y / 36e5)}h ago` : `${Math.floor(y / 864e5)}d ago`;\n    }\n    return dt(v), He(() => n.refreshKey, v), (h, b) => (c(), d(\"div\", tb, [\n      o(\"header\", null, [\n        b[0] || (b[0] = o(\"h3\", null, \"Recently opened\", -1)),\n        o(\"button\", {\n          class: \"filex-recent-refresh\",\n          type: \"button\",\n          title: \"Refresh\",\n          \"aria-label\": \"Refresh\",\n          onClick: v,\n          disabled: u.value\n        }, [\n          o(\"span\", {\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"refresh\")\n          }, null, 8, ab)\n        ], 8, nb)\n      ]),\n      a.value.length ? (c(), d(\"ul\", ob, [\n        (c(!0), d(ae, null, Te(a.value, (y) => (c(), d(\"li\", {\n          key: y.id,\n          \"data-testid\": \"recent-tray-item\",\n          \"data-fe-path\": y.path\n        }, [\n          o(\"button\", {\n            type: \"button\",\n            class: \"filex-recent-item\",\n            onClick: (A) => r(\"open\", y),\n            onContextmenu: Re((A) => r(\"context\", y, A), [\"prevent\"])\n          }, [\n            o(\"span\", ib, f(y.name), 1),\n            o(\"span\", lb, f(p(y.last_opened)), 1)\n          ], 40, rb)\n        ], 8, sb))), 128))\n      ])) : u.value ? (c(), d(\"p\", ub, \"Loading…\")) : (c(), d(\"p\", cb, \"Nothing here yet.\"))\n    ]));\n  }\n}), na = {\n  type: \"any\",\n  modified: \"any\",\n  size: \"any\",\n  name: \"\",\n  aroundDate: \"\",\n  aroundSpan: \"d1\",\n  sizeMin: null,\n  sizeMax: null,\n  pathMode: \"any\",\n  pathBase: \"\",\n  people: \"any\"\n};\nfunction vu(e) {\n  return e.normalize(\"NFD\").replace(new RegExp(\"\\\\p{M}+\", \"gu\"), \"\").toLowerCase();\n}\nfunction Ni(e) {\n  return (e.name ?? \"\").trim();\n}\nfunction Ed(e) {\n  return (e.pathMode ?? \"any\") !== \"any\" && !!(e.pathBase ?? \"\");\n}\nfunction Ki(e) {\n  return e.people ?? \"any\";\n}\nfunction $o(e) {\n  return e.type !== \"any\" || e.modified !== \"any\" || e.size !== \"any\" || Ni(e) !== \"\" || Ed(e) || Ki(e) !== \"any\";\n}\nfunction fb(e) {\n  return (e.type !== \"any\" ? 1 : 0) + (e.modified !== \"any\" ? 1 : 0) + (e.size !== \"any\" ? 1 : 0) + (Ni(e) !== \"\" ? 1 : 0) + (Ed(e) ? 1 : 0) + (Ki(e) !== \"any\" ? 1 : 0);\n}\nconst pb = {\n  folder: [\"folder\"],\n  document: [\"doc\", \"text\"],\n  spreadsheet: [\"sheet\"],\n  presentation: [\"slides\"],\n  pdf: [\"pdf\"],\n  image: [\"image\"],\n  video: [\"video\"],\n  audio: [\"audio\"],\n  archive: [\"archive\"],\n  code: [\"code\"]\n}, vb = {\n  image: [\"image/\"],\n  video: [\"video/\"],\n  audio: [\"audio/\"],\n  pdf: [\"application/pdf\"],\n  document: [\"text/plain\", \"application/msword\", \"application/vnd.openxmlformats-officedocument.wordprocessing\"],\n  spreadsheet: [\"text/csv\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheet\"],\n  presentation: [\"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentation\"],\n  archive: [\"application/zip\", \"application/x-tar\", \"application/gzip\", \"application/x-7z\"]\n};\nfunction hb(e, t) {\n  if (t === \"any\") return !0;\n  if (t === \"folder\") return e.type === \"dir\";\n  if (e.type === \"dir\") return !1;\n  if (pb[t].includes(jn(e))) return !0;\n  const n = (e.mime_type || \"\").toLowerCase();\n  return !!n && (vb[t] ?? []).some((r) => n.startsWith(r));\n}\nconst mb = {\n  h1: 36e5,\n  d1: 864e5,\n  w1: 7 * 864e5\n};\nfunction yb(e) {\n  const t = (e ?? \"\").trim();\n  if (!t) return null;\n  const n = Date.parse(t.includes(\"T\") ? t : `${t}T00:00`);\n  return Number.isNaN(n) ? null : n;\n}\nfunction bb(e, t, n) {\n  const r = t.modified;\n  if (r === \"any\") return !0;\n  const a = typeof e.last_modified == \"number\" ? e.last_modified : 0;\n  if (!a) return !1;\n  if (r === \"around\") {\n    const v = yb(t.aroundDate);\n    return v === null ? !0 : Math.abs(a - v) <= mb[t.aroundSpan ?? \"d1\"];\n  }\n  if (r === \"year\")\n    return new Date(a).getFullYear() === new Date(n).getFullYear();\n  if (r === \"today\") {\n    const v = new Date(n);\n    return v.setHours(0, 0, 0, 0), a >= v.getTime();\n  }\n  return a >= n - (r === \"7d\" ? 7 : 30) * 864e5;\n}\nconst Oa = 1024 * 1024;\nfunction gb(e, t) {\n  const n = t.size;\n  if (n === \"any\") return !0;\n  if (e.type === \"dir\") return !1;\n  const r = typeof e.size == \"number\" ? e.size : 0;\n  if (n === \"range\") {\n    const a = typeof t.sizeMin == \"number\" ? t.sizeMin : null, u = typeof t.sizeMax == \"number\" ? t.sizeMax : null;\n    return !(a !== null && r < a || u !== null && r > u);\n  }\n  return n === \"lt1\" ? r < Oa : n === \"1to10\" ? r >= Oa && r < 10 * Oa : n === \"10to100\" ? r >= 10 * Oa && r < 100 * Oa : r >= 100 * Oa;\n}\nfunction Ss(e, t) {\n  return t ? vu(e || \"\").includes(vu(t)) : !0;\n}\nfunction kb(e, t) {\n  return Ss(e.basename || \"\", t);\n}\nfunction _b(e, t) {\n  const n = t.pathMode ?? \"any\", r = (t.pathBase ?? \"\").replace(/\\/+$/, \"\");\n  if (n === \"any\" || !r) return !0;\n  const a = e.path || \"\", u = a === r || a.startsWith(`${r}/`);\n  return n === \"here\" ? u : !u;\n}\nfunction So(e) {\n  const t = e.owner_id;\n  return typeof t == \"number\" && t > 0 ? t : null;\n}\nfunction Ri(e) {\n  return e.owner_self === !0;\n}\nfunction zd(e) {\n  const t = e.owner_name;\n  return typeof t == \"string\" ? t : \"\";\n}\nfunction wb(e) {\n  return e.external_upload === !0;\n}\nfunction $b(e) {\n  const t = [{ value: \"any\" }, { value: \"me\" }, { value: \"system\" }], n = /* @__PURE__ */ new Set();\n  for (const u of e) {\n    const v = So(u);\n    v === null || Ri(u) || n.has(v) || (n.add(v), t.push({ value: `u:${v}`, name: zd(u) }));\n  }\n  const r = t.slice(0, 3), a = t.slice(3).sort((u, v) => (u.name ?? \"\").localeCompare(v.name ?? \"\", void 0, { sensitivity: \"base\" }));\n  return [...r, ...a];\n}\nfunction xb(e, t) {\n  const n = Ki(t);\n  if (n === \"any\") return !0;\n  if (n === \"me\") return Ri(e);\n  if (n === \"system\") return So(e) === null;\n  const r = Number(n.slice(2));\n  return Number.isFinite(r) && So(e) === r;\n}\nfunction hi(e, t, n = Date.now()) {\n  if (!$o(t)) return e;\n  const r = Ni(t);\n  return e.filter(\n    (a) => hb(a, t.type) && bb(a, t, n) && gb(a, t) && kb(a, r) && _b(a, t) && xb(a, t)\n  );\n}\nconst Sb = /* @__PURE__ */ qe({\n  __name: \"UploadProgress\",\n  props: {\n    jobs: {},\n    locale: {},\n    center: {}\n  },\n  emits: [\"cancel\", \"dismiss\", \"retry\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t;\n    function a(u) {\n      return u === \"done\" ? \"done\" : u === \"error\" ? \"error\" : u === \"aborted\" ? \"aborted\" : \"running\";\n    }\n    return He(\n      () => n.jobs,\n      (u) => {\n        n.center.sync(\n          \"upload\",\n          u.map((v) => ({\n            input: {\n              id: v.id,\n              kind: \"upload\",\n              name: v.file.name,\n              percent: v.totalBytes > 0 || v.status === \"done\" ? v.percent : null,\n              status: a(v.status),\n              error: v.error ?? null,\n              uploadedBytes: v.uploadedBytes,\n              totalBytes: v.totalBytes,\n              // Cancellable only while chunks are still moving: once the commit is\n              // accepted the bytes are filex's and the ops worker owns the rest.\n              cancellable: v.status === \"uploading\" || v.status === \"initializing\",\n              retryable: v.status === \"error\"\n            },\n            actions: {\n              cancel: () => r(\"cancel\", v),\n              dismiss: () => r(\"dismiss\", v),\n              retry: () => r(\"retry\", v)\n            }\n          }))\n        );\n      },\n      { immediate: !0 }\n    ), (u, v) => g(\"\", !0);\n  }\n});\nfunction hu(e) {\n  return Math.max(0, Math.min(100, Math.round(e)));\n}\nfunction Cb(e) {\n  if (e.status === \"done\") return 100;\n  const t = e.bytes_total ?? 0, n = e.bytes_done ?? 0;\n  return t > 0 ? hu(n / t * 100) : n > 0 || e.progress_total <= 1 ? null : hu(e.progress_done / e.progress_total * 100);\n}\nconst Tb = /* @__PURE__ */ qe({\n  __name: \"PendingOpsTray\",\n  props: {\n    ops: {},\n    locale: {},\n    center: {}\n  },\n  emits: [\"dismiss\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t;\n    function a(v) {\n      return v.status === \"done\" ? \"done\" : v.status === \"error\" ? \"error\" : \"running\";\n    }\n    const u = (v) => Cb(v);\n    return He(\n      () => n.ops,\n      (v) => {\n        n.center.sync(\n          \"ops\",\n          v.map((p) => ({\n            input: {\n              id: p.id,\n              kind: p.op_type,\n              name: p.target_path || p.source_dir || \"\",\n              percent: u(p),\n              status: a(p),\n              error: p.error_message,\n              queued: p.status === \"pending\",\n              doneCount: p.progress_done,\n              totalCount: p.progress_total,\n              cancellable: !1,\n              retryable: !1\n            },\n            actions: {\n              dismiss: () => r(\"dismiss\", p.id)\n            }\n          }))\n        );\n      },\n      { immediate: !0 }\n    ), (v, p) => g(\"\", !0);\n  }\n}), Mb = [\"aria-label\"], Eb = { class: \"fe-inspector__head\" }, zb = [\"innerHTML\"], Ab = { class: \"fe-inspector__head-text\" }, Pb = [\"title\"], Lb = { class: \"fe-inspector__caption\" }, Db = {\n  key: 0,\n  class: \"fe-inspector__held\",\n  role: \"note\",\n  \"data-testid\": \"inspector-held\"\n}, Ob = [\"title\", \"aria-label\"], Bb = [\"innerHTML\"], Ib = [\"title\", \"aria-label\"], Hb = [\"innerHTML\"], Fb = [\"aria-label\"], Nb = [\"aria-selected\"], Kb = [\"aria-selected\"], Rb = { class: \"fe-inspector__scroll\" }, Ub = {\n  key: 0,\n  class: \"fe-inspector__section\"\n}, Vb = { class: \"fe-inspector__heading\" }, jb = {\n  key: 0,\n  class: \"fe-inspector__meta\"\n}, Yb = { class: \"fe-inspector__row\" }, Wb = [\"src\"], qb = { class: \"fe-inspector__meta\" }, Gb = { class: \"fe-inspector__row\" }, Xb = { class: \"fe-inspector__row\" }, Jb = { class: \"fe-inspector__pathcell\" }, Zb = [\"title\"], Qb = [\"title\", \"aria-label\"], eg = [\"innerHTML\"], tg = {\n  key: 0,\n  class: \"fe-inspector__row\"\n}, ng = { class: \"fe-inspector__row\" }, ag = {\n  key: 1,\n  class: \"fe-inspector__row\"\n}, og = { class: \"fe-inspector__mime\" }, sg = {\n  key: 2,\n  class: \"fe-inspector__row\"\n}, rg = { class: \"fe-inspector__pathcell\" }, ig = { class: \"fe-inspector__path\" }, lg = [\"title\", \"aria-label\"], cg = [\"innerHTML\"], ug = {\n  key: 3,\n  class: \"fe-inspector__row\"\n}, dg = { class: \"fe-inspector__pathcell\" }, fg = [\"title\"], pg = [\"title\", \"aria-label\"], vg = [\"innerHTML\"], hg = {\n  key: 2,\n  class: \"fe-inspector__empty\"\n}, mg = {\n  key: 1,\n  class: \"fe-inspector__section\",\n  \"data-testid\": \"inspector-tags\"\n}, yg = { class: \"fe-inspector__heading\" }, bg = {\n  key: 2,\n  class: \"fe-inspector__section\"\n}, gg = { class: \"fe-inspector__heading\" }, kg = {\n  key: 0,\n  class: \"fe-inspector__empty\"\n}, _g = {\n  key: 0,\n  class: \"fe-inspector__empty\"\n}, wg = {\n  key: 1,\n  class: \"fe-inspector__versions\"\n}, $g = { class: \"fe-inspector__version-main\" }, xg = { class: \"fe-inspector__version-n\" }, Sg = { class: \"fe-inspector__version-meta\" }, Cg = {\n  key: 0,\n  class: \"fe-inspector__confirm\"\n}, Tg = { class: \"fe-inspector__confirm-q\" }, Mg = { class: \"fe-inspector__check\" }, Eg = { class: \"fe-inspector__confirm-actions\" }, zg = [\"disabled\", \"onClick\"], Ag = [\"disabled\"], Pg = [\"disabled\", \"onClick\"], Lg = [\"disabled\"], Dg = {\n  key: 3,\n  class: \"fe-inspector__section\"\n}, Og = { class: \"fe-inspector__heading\" }, Bg = { class: \"fe-inspector__permrow\" }, Ig = {\n  key: 4,\n  class: \"fe-inspector__section\",\n  \"data-testid\": \"inspector-people\"\n}, Hg = { class: \"fe-inspector__heading\" }, Fg = {\n  key: 0,\n  class: \"fe-inspector__empty\"\n}, Ng = {\n  key: 1,\n  class: \"fe-inspector__people\"\n}, Kg = {\n  class: \"fe-inspector__avatar\",\n  \"aria-hidden\": \"true\"\n}, Rg = { class: \"fe-inspector__person-main\" }, Ug = [\"title\"], Vg = { class: \"fe-inspector__person-sub\" }, jg = {\n  key: 5,\n  class: \"fe-inspector__section\",\n  \"data-testid\": \"inspector-shares\"\n}, Yg = { class: \"fe-inspector__heading\" }, Wg = {\n  key: 0,\n  class: \"fe-inspector__linkrow\"\n}, qg = [\"innerHTML\"], Gg = { class: \"fe-inspector__linknone\" }, Xg = [\"disabled\"], Jg = {\n  key: 1,\n  class: \"fe-inspector__empty\"\n}, Zg = {\n  key: 2,\n  class: \"fe-inspector__shares\"\n}, Qg = [\"title\"], ek = {\n  key: 0,\n  class: \"fe-inspector__badge fe-inspector__badge--pin\"\n}, tk = {\n  key: 1,\n  class: \"fe-inspector__share-exp\"\n}, nk = [\"title\", \"aria-label\", \"onClick\"], ak = [\"innerHTML\"], ok = {\n  key: 6,\n  class: \"fe-inspector__section\"\n}, sk = { class: \"fe-inspector__heading\" }, rk = {\n  key: 0,\n  class: \"fe-inspector__countbadge\"\n}, ik = {\n  key: 0,\n  class: \"fe-inspector__empty\"\n}, lk = {\n  key: 0,\n  class: \"fe-inspector__empty\"\n}, ck = {\n  key: 1,\n  class: \"fe-inspector__comments\"\n}, uk = { class: \"fe-inspector__comment-top\" }, dk = [\"title\"], fk = [\"title\"], pk = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], vk = { class: \"fe-inspector__comment-body\" }, hk = [\"placeholder\", \"aria-label\", \"disabled\"], mk = [\"disabled\"], yk = {\n  key: 7,\n  class: \"fe-inspector__section\",\n  \"data-testid\": \"inspector-activity-empty\"\n}, bk = { class: \"fe-inspector__empty\" }, gk = {\n  key: 0,\n  class: \"fe-inspector__hint\"\n}, kk = /* @__PURE__ */ qe({\n  __name: \"InspectorPanel\",\n  props: {\n    api: {},\n    nodes: {},\n    dirLabel: {},\n    dirCount: {},\n    dirPerm: { default: \"\" },\n    heldIn: {},\n    locale: {},\n    narrow: { type: Boolean, default: !1 },\n    thumbSrc: { type: Function, default: void 0 },\n    tabs: { type: Boolean, default: !0 },\n    apiBase: {},\n    authHeaders: {},\n    authCredentials: {}\n  },\n  emits: [\"close\", \"share-created\", \"manage-permissions\", \"toast\", \"changed\", \"tags-changed\", \"open-tag\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u, formatDate: v, nodeDisplayName: p } = tt(\n      () => n.locale\n    ), h = k(\n      () => n.nodes.length === 1 ? n.nodes[0] : null\n    ), b = k(() => n.nodes.length > 1), y = k(() => {\n      var V;\n      return ((V = h.value) == null ? void 0 : V.type) === \"file\";\n    }), A = k(\n      () => {\n        var V;\n        return typeof ((V = h.value) == null ? void 0 : V.id) == \"number\" ? h.value.id : null;\n      }\n    ), D = k(\n      () => n.nodes.reduce((V, R) => V + (typeof R.size == \"number\" ? R.size : 0), 0)\n    ), C = k(() => {\n      var R;\n      const V = (R = h.value) == null ? void 0 : R.etag;\n      return typeof V == \"string\" && V !== \"\" ? V : null;\n    }), B = k(\n      () => h.value && y.value && n.thumbSrc ? n.thumbSrc(h.value) : null\n    ), I = k(() => b.value ? a(\"inspector.items\", { n: n.nodes.length }) : h.value ? p(h.value) : n.dirLabel), U = k(() => {\n      if (b.value) return u(D.value);\n      const V = h.value;\n      if (V) {\n        const R = Os(V, a);\n        if (V.type === \"dir\") return R;\n        const X = typeof V.size == \"number\" ? u(V.size) : \"\";\n        return X ? `${R} · ${X}` : R;\n      }\n      return a(\"inspector.folder_items\", { n: n.dirCount });\n    }), x = k(\n      () => {\n        var V;\n        return B.value && /^(image|video)[/]/.test(String(((V = h.value) == null ? void 0 : V.mime_type) ?? \"\")) ? B.value : null;\n      }\n    ), E = k(\n      () => fn(h.value && !b.value ? h.value : { type: \"dir\" })\n    ), $ = k(\n      () => A.value != null && n.apiBase !== void 0 && !b.value\n    );\n    function M(V) {\n      return V.length > 12 ? `${V.slice(0, 12)}…` : V;\n    }\n    function z(V) {\n      return v(V, { time: !0 }) || \"—\";\n    }\n    function T(V) {\n      if (!V) return \"—\";\n      const R = Date.parse(V);\n      return Number.isNaN(R) ? V : z(R);\n    }\n    async function Y(V) {\n      try {\n        await navigator.clipboard.writeText(V), r(\"toast\", a(\"inspector.copied\"));\n      } catch {\n        r(\"toast\", V);\n      }\n    }\n    const O = k(() => {\n      if (!h.value) return \"\";\n      const V = h.value.perm;\n      return typeof V == \"string\" && V !== \"\" ? V : n.dirPerm || \"\";\n    }), J = k(\n      () => O.value === \"editor\" || O.value === \"owner\"\n    );\n    function G(V) {\n      return a(`inspector.perm.${V}`) === `inspector.perm.${V}` ? V : a(`inspector.perm.${V}`);\n    }\n    const N = m(\"idle\"), P = m([]), le = m(null), ve = m(!0), he = m(!1), oe = m(\"idle\"), ue = m([]);\n    let Q = 0;\n    async function pe() {\n      const V = ++Q;\n      if (le.value = null, P.value = [], ue.value = [], h.value && y.value && A.value != null ? (N.value = \"loading\", re(V)) : N.value = \"hidden\", h.value) {\n        oe.value = \"loading\";\n        const R = h.value.path;\n        try {\n          const { shares: X } = await n.api.listShares(R);\n          if (V !== Q) return;\n          ue.value = Array.isArray(X) ? X : [], oe.value = \"ok\";\n        } catch {\n          if (V !== Q) return;\n          oe.value = \"hidden\";\n        }\n      } else\n        oe.value = \"hidden\";\n    }\n    async function re(V) {\n      const R = A.value;\n      if (R != null)\n        try {\n          const X = await n.api.listVersions(R);\n          if (V !== Q) return;\n          P.value = X, N.value = \"ok\";\n        } catch (X) {\n          if (V !== Q) return;\n          const ye = X.status;\n          ye === 401 || ye === 403 || ye === 404 ? N.value = \"hidden\" : N.value = \"error\";\n        }\n    }\n    function S(V) {\n      le.value = V.id, ve.value = !0;\n    }\n    async function w(V) {\n      const R = A.value;\n      if (!(R == null || he.value)) {\n        he.value = !0;\n        try {\n          await n.api.restoreVersion(R, V.id, ve.value), r(\"toast\", a(\"inspector.versions.restored\")), le.value = null, r(\"changed\"), await re(++Q);\n        } catch (X) {\n          r(\"toast\", X.message);\n        } finally {\n          he.value = !1;\n        }\n      }\n    }\n    async function j() {\n      const V = A.value;\n      if (!(V == null || he.value)) {\n        he.value = !0;\n        try {\n          await n.api.snapshotVersion(V), r(\"toast\", a(\"inspector.versions.snapshotted\")), await re(++Q);\n        } catch (R) {\n          const X = R.status;\n          X === 404 || X === 405 || X === 501 ? r(\"toast\", a(\"inspector.versions.unsupported\")) : r(\"toast\", R.message);\n        } finally {\n          he.value = !1;\n        }\n      }\n    }\n    const K = m(\"details\"), Z = m(\"hidden\"), W = m([]);\n    let $e = 0;\n    async function Se() {\n      const V = ++$e, R = h.value;\n      if (!n.tabs || !R) {\n        Z.value = \"hidden\", W.value = [];\n        return;\n      }\n      Z.value = \"loading\";\n      try {\n        const X = await n.api.listPermissions(R.path);\n        if (V !== $e) return;\n        if (!X.storage_rbac) {\n          Z.value = \"hidden\", W.value = [];\n          return;\n        }\n        W.value = [...X.direct ?? [], ...X.inherited ?? []], Z.value = \"ok\";\n      } catch {\n        if (V !== $e) return;\n        W.value = [], Z.value = \"hidden\";\n      }\n    }\n    function ze(V) {\n      return V.user_display_name || V.user_email || `#${V.user_id}`;\n    }\n    function Ne(V) {\n      const R = ze(V).trim();\n      return R ? R[0].toUpperCase() : \"?\";\n    }\n    k(() => ue.value.length ? ue.value[0] : null);\n    const be = m(!1);\n    async function De() {\n      var R;\n      const V = h.value;\n      if (!(!V || be.value)) {\n        be.value = !0;\n        try {\n          const ye = ((R = (await n.api.createShare({ path: V.path })).share) == null ? void 0 : R.url) ?? \"\", { shares: je } = await n.api.listShares(V.path);\n          ue.value = Array.isArray(je) ? je : [], oe.value = \"ok\", ye && (r(\"share-created\", { path: V.path, url: ye }), await Y(ye));\n        } catch (X) {\n          r(\"toast\", X.message);\n        } finally {\n          be.value = !1;\n        }\n      }\n    }\n    He(\n      () => [n.nodes.map((V) => V.path).join(\"|\"), n.tabs],\n      () => void Se(),\n      { immediate: !0 }\n    );\n    const ie = k(\n      () => N.value !== \"hidden\" || ce.value !== \"hidden\"\n    );\n    He(\n      () => n.nodes.map((V) => V.path).join(\"\\0\"),\n      () => void pe(),\n      { immediate: !0 }\n    );\n    const ce = m(\"hidden\"), L = m([]), se = m(\"\"), Ce = m(!1), We = k(\n      () => {\n        var V;\n        return typeof ((V = h.value) == null ? void 0 : V.id) == \"number\" ? h.value.id : null;\n      }\n    );\n    let Ie = 0;\n    async function Ze() {\n      const V = ++Ie, R = We.value;\n      if (R == null) {\n        ce.value = \"hidden\", L.value = [];\n        return;\n      }\n      ce.value = L.value.length > 0 ? \"ok\" : \"loading\";\n      try {\n        const X = await n.api.listComments(R);\n        if (V !== Ie) return;\n        L.value = X, ce.value = \"ok\";\n      } catch (X) {\n        if (V !== Ie) return;\n        L.value = [];\n        const ye = X.status;\n        ce.value = ye === 401 || ye === 403 || ye === 404 ? \"hidden\" : \"error\";\n      }\n    }\n    async function vt() {\n      const V = We.value, R = se.value.trim();\n      if (!(V == null || R === \"\" || Ce.value)) {\n        Ce.value = !0;\n        try {\n          await n.api.addComment(V, R), se.value = \"\", await Ze();\n        } catch (X) {\n          r(\"toast\", X.message);\n        } finally {\n          Ce.value = !1;\n        }\n      }\n    }\n    async function Xe(V) {\n      if (!Ce.value) {\n        Ce.value = !0;\n        try {\n          await n.api.deleteComment(V.id), await Ze();\n        } catch (R) {\n          r(\"toast\", R.message);\n        } finally {\n          Ce.value = !1;\n        }\n      }\n    }\n    function Ae(V) {\n      const R = Date.parse(V);\n      if (Number.isNaN(R)) return V;\n      const X = Math.round((R - Date.now()) / 1e3), ye = Math.abs(X), je = [\n        [\"year\", 31536e3],\n        [\"month\", 2592e3],\n        [\"day\", 86400],\n        [\"hour\", 3600],\n        [\"minute\", 60]\n      ];\n      try {\n        const Qe = new Intl.RelativeTimeFormat(\n          n.locale === \"en\" ? \"en\" : \"tr\",\n          { numeric: \"auto\" }\n        );\n        for (const [at, Ye] of je)\n          if (ye >= Ye) return Qe.format(Math.trunc(X / Ye), at);\n        return Qe.format(X, \"second\");\n      } catch {\n        return T(V);\n      }\n    }\n    return He(\n      () => We.value,\n      () => {\n        L.value = [], se.value = \"\", Ze();\n      },\n      { immediate: !0 }\n    ), (V, R) => (c(), d(\"aside\", {\n      class: we([\"fe-inspector\", { \"fe-inspector--overlay\": e.narrow }]),\n      role: \"complementary\",\n      \"aria-label\": s(a)(\"inspector.title\")\n    }, [\n      o(\"header\", Eb, [\n        o(\"span\", {\n          class: \"fe-inspector__head-icon\",\n          \"aria-hidden\": \"true\",\n          innerHTML: E.value\n        }, null, 8, zb),\n        o(\"div\", Ab, [\n          o(\"h2\", {\n            class: \"fe-inspector__title\",\n            title: I.value\n          }, f(I.value), 9, Pb),\n          o(\"p\", Lb, f(U.value), 1),\n          e.heldIn ? (c(), d(\"p\", Db, f(s(a)(\"inspector.held\", { where: e.heldIn })), 1)) : g(\"\", !0)\n        ]),\n        h.value ? (c(), d(\"button\", {\n          key: 0,\n          type: \"button\",\n          class: \"fe-inspector__iconbtn\",\n          title: s(a)(\"inspector.copy_name\"),\n          \"aria-label\": s(a)(\"inspector.copy_name\"),\n          \"data-testid\": \"inspector-copy-name\",\n          onClick: R[0] || (R[0] = (X) => Y(I.value))\n        }, [\n          o(\"span\", {\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"copy\")\n          }, null, 8, Bb)\n        ], 8, Ob)) : g(\"\", !0),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-inspector__iconbtn fe-inspector__close\",\n          title: s(a)(\"inspector.close\"),\n          \"aria-label\": s(a)(\"inspector.close\"),\n          onClick: R[1] || (R[1] = (X) => r(\"close\"))\n        }, [\n          o(\"span\", {\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"close\")\n          }, null, 8, Hb)\n        ], 8, Ib)\n      ]),\n      e.tabs ? (c(), d(\"div\", {\n        key: 0,\n        class: \"fe-inspector__tabs\",\n        role: \"tablist\",\n        \"aria-label\": s(a)(\"inspector.title\")\n      }, [\n        o(\"button\", {\n          type: \"button\",\n          class: we([\"fe-inspector__tab\", { \"is-active\": K.value === \"details\" }]),\n          role: \"tab\",\n          \"aria-selected\": K.value === \"details\",\n          \"data-testid\": \"inspector-tab-details\",\n          onClick: R[2] || (R[2] = (X) => K.value = \"details\")\n        }, f(s(a)(\"inspector.tab.details\")), 11, Nb),\n        o(\"button\", {\n          type: \"button\",\n          class: we([\"fe-inspector__tab\", { \"is-active\": K.value === \"activity\" }]),\n          role: \"tab\",\n          \"aria-selected\": K.value === \"activity\",\n          \"data-testid\": \"inspector-tab-activity\",\n          onClick: R[3] || (R[3] = (X) => K.value = \"activity\")\n        }, f(s(a)(\"inspector.tab.activity\")), 11, Kb)\n      ], 8, Fb)) : g(\"\", !0),\n      o(\"div\", Rb, [\n        !e.tabs || K.value === \"details\" ? (c(), d(\"section\", Ub, [\n          o(\"h3\", Vb, f(s(a)(\"inspector.section.general\")), 1),\n          b.value ? (c(), d(\"dl\", jb, [\n            o(\"div\", Yb, [\n              o(\"dt\", null, f(s(a)(\"inspector.size\")), 1),\n              o(\"dd\", null, f(s(u)(D.value)), 1)\n            ])\n          ])) : h.value ? (c(), d(ae, { key: 1 }, [\n            x.value ? (c(), d(\"img\", {\n              key: 0,\n              class: \"fe-inspector__preview\",\n              src: x.value,\n              alt: \"\",\n              \"aria-hidden\": \"true\"\n            }, null, 8, Wb)) : g(\"\", !0),\n            o(\"dl\", qb, [\n              o(\"div\", Gb, [\n                o(\"dt\", null, f(s(a)(\"inspector.type\")), 1),\n                o(\"dd\", null, f(s(Os)(h.value, s(a))), 1)\n              ]),\n              o(\"div\", Xb, [\n                o(\"dt\", null, f(s(a)(\"inspector.path\")), 1),\n                o(\"dd\", Jb, [\n                  o(\"span\", {\n                    class: \"fe-inspector__path\",\n                    title: h.value.path\n                  }, f(h.value.path), 9, Zb),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-inspector__copy\",\n                    title: s(a)(\"inspector.copy\"),\n                    \"aria-label\": s(a)(\"inspector.copy\"),\n                    onClick: R[4] || (R[4] = (X) => Y(h.value.path))\n                  }, [\n                    o(\"span\", {\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"copy\")\n                    }, null, 8, eg)\n                  ], 8, Qb)\n                ])\n              ]),\n              y.value ? (c(), d(\"div\", tg, [\n                o(\"dt\", null, f(s(a)(\"inspector.size\")), 1),\n                o(\"dd\", null, f(s(u)(typeof h.value.size == \"number\" ? h.value.size : null)), 1)\n              ])) : g(\"\", !0),\n              o(\"div\", ng, [\n                o(\"dt\", null, f(s(a)(\"inspector.modified\")), 1),\n                o(\"dd\", null, f(z(h.value.last_modified)), 1)\n              ]),\n              y.value && h.value.mime_type ? (c(), d(\"div\", ag, [\n                o(\"dt\", null, f(s(a)(\"inspector.mime\")), 1),\n                o(\"dd\", og, f(h.value.mime_type), 1)\n              ])) : g(\"\", !0),\n              typeof h.value.id == \"number\" ? (c(), d(\"div\", sg, [\n                o(\"dt\", null, f(s(a)(\"inspector.nodeId\")), 1),\n                o(\"dd\", rg, [\n                  o(\"span\", ig, f(h.value.id), 1),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-inspector__copy\",\n                    title: s(a)(\"inspector.copy\"),\n                    \"aria-label\": s(a)(\"inspector.copy\"),\n                    onClick: R[5] || (R[5] = (X) => Y(String(h.value.id)))\n                  }, [\n                    o(\"span\", {\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"copy\")\n                    }, null, 8, cg)\n                  ], 8, lg)\n                ])\n              ])) : g(\"\", !0),\n              C.value ? (c(), d(\"div\", ug, [\n                o(\"dt\", null, f(s(a)(\"inspector.etag\")), 1),\n                o(\"dd\", dg, [\n                  o(\"span\", {\n                    class: \"fe-inspector__path\",\n                    title: C.value\n                  }, f(M(C.value)), 9, fg),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-inspector__copy\",\n                    title: s(a)(\"inspector.copy\"),\n                    \"aria-label\": s(a)(\"inspector.copy\"),\n                    onClick: R[6] || (R[6] = (X) => Y(C.value))\n                  }, [\n                    o(\"span\", {\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"copy\")\n                    }, null, 8, vg)\n                  ], 8, pg)\n                ])\n              ])) : g(\"\", !0)\n            ])\n          ], 64)) : (c(), d(\"p\", hg, f(s(a)(\"inspector.select_hint\")), 1))\n        ])) : g(\"\", !0),\n        $.value && (!e.tabs || K.value === \"details\") ? (c(), d(\"section\", mg, [\n          o(\"h3\", yg, f(s(a)(\"inspector.section.tags\")), 1),\n          Ge(td, {\n            \"node-id\": A.value,\n            locale: e.locale,\n            \"api-base\": e.apiBase,\n            \"auth-headers\": e.authHeaders,\n            \"auth-credentials\": e.authCredentials,\n            onChange: R[7] || (R[7] = (X) => r(\"tags-changed\", X)),\n            onOpen: R[8] || (R[8] = (X) => r(\"open-tag\", X)),\n            onError: R[9] || (R[9] = () => r(\"toast\", s(a)(\"inspector.error\")))\n          }, null, 8, [\"node-id\", \"locale\", \"api-base\", \"auth-headers\", \"auth-credentials\"])\n        ])) : g(\"\", !0),\n        (N.value === \"ok\" || N.value === \"error\") && (!e.tabs || K.value === \"activity\") ? (c(), d(\"section\", bg, [\n          o(\"h3\", gg, f(s(a)(\"inspector.section.versions\")), 1),\n          N.value === \"error\" ? (c(), d(\"p\", kg, f(s(a)(\"inspector.error\")), 1)) : (c(), d(ae, { key: 1 }, [\n            P.value.length === 0 ? (c(), d(\"p\", _g, f(s(a)(\"inspector.versions.empty\")), 1)) : (c(), d(\"ul\", wg, [\n              (c(!0), d(ae, null, Te(P.value, (X) => (c(), d(\"li\", {\n                key: X.id,\n                class: \"fe-inspector__version\"\n              }, [\n                o(\"div\", $g, [\n                  o(\"span\", xg, f(s(a)(\"inspector.versions.v\", { n: X.version_n })), 1),\n                  o(\"span\", Sg, f(T(X.created_at)) + \" · \" + f(s(u)(X.size)), 1)\n                ]),\n                le.value === X.id ? (c(), d(\"div\", Cg, [\n                  o(\"p\", Tg, f(s(a)(\"inspector.versions.restore_confirm\")), 1),\n                  o(\"label\", Mg, [\n                    Ve(o(\"input\", {\n                      \"onUpdate:modelValue\": R[10] || (R[10] = (ye) => ve.value = ye),\n                      type: \"checkbox\"\n                    }, null, 512), [\n                      [An, ve.value]\n                    ]),\n                    Je(\" \" + f(s(a)(\"inspector.versions.snapshot_current\")), 1)\n                  ]),\n                  o(\"div\", Eg, [\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-btn fe-btn--primary fe-btn--sm\",\n                      disabled: he.value,\n                      onClick: (ye) => w(X)\n                    }, f(s(a)(\"inspector.versions.confirm\")), 9, zg),\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-btn fe-btn--sm\",\n                      disabled: he.value,\n                      onClick: R[11] || (R[11] = (ye) => le.value = null)\n                    }, f(s(a)(\"inspector.versions.cancel\")), 9, Ag)\n                  ])\n                ])) : (c(), d(\"button\", {\n                  key: 1,\n                  type: \"button\",\n                  class: \"fe-btn fe-btn--sm\",\n                  disabled: he.value,\n                  onClick: (ye) => S(X)\n                }, f(s(a)(\"inspector.versions.restore\")), 9, Pg))\n              ]))), 128))\n            ])),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--sm fe-inspector__snapshot\",\n              disabled: he.value,\n              onClick: j\n            }, f(s(a)(\"inspector.versions.take_snapshot\")), 9, Lg)\n          ], 64))\n        ])) : g(\"\", !0),\n        h.value && O.value && (!e.tabs || K.value === \"details\") && !(e.tabs && Z.value === \"ok\") ? (c(), d(\"section\", Dg, [\n          o(\"h3\", Og, f(s(a)(\"inspector.section.permissions\")), 1),\n          o(\"div\", Bg, [\n            o(\"span\", {\n              class: we([\"fe-inspector__badge\", `fe-inspector__badge--${O.value}`])\n            }, f(G(O.value)), 3),\n            J.value ? (c(), d(\"button\", {\n              key: 0,\n              type: \"button\",\n              class: \"fe-btn fe-btn--sm\",\n              onClick: R[12] || (R[12] = (X) => r(\"manage-permissions\", h.value))\n            }, f(s(a)(\"inspector.perm.manage\")), 1)) : g(\"\", !0)\n          ])\n        ])) : g(\"\", !0),\n        e.tabs && K.value === \"details\" && Z.value === \"ok\" ? (c(), d(\"section\", Ig, [\n          o(\"h3\", Hg, f(s(a)(\"inspector.people\")), 1),\n          W.value.length === 0 ? (c(), d(\"p\", Fg, f(s(a)(\"inspector.people.empty\")), 1)) : (c(), d(\"ul\", Ng, [\n            (c(!0), d(ae, null, Te(W.value, (X) => (c(), d(\"li\", {\n              key: `${X.id}-${X.user_id}`,\n              class: \"fe-inspector__person\"\n            }, [\n              o(\"span\", Kg, f(Ne(X)), 1),\n              o(\"span\", Rg, [\n                o(\"span\", {\n                  class: \"fe-inspector__person-name\",\n                  title: X.user_email\n                }, f(ze(X)), 9, Ug),\n                o(\"span\", Vg, [\n                  Je(f(G(X.level)), 1),\n                  X.inherited ? (c(), d(ae, { key: 0 }, [\n                    Je(\" · \" + f(s(a)(\"inspector.people.inherited\")), 1)\n                  ], 64)) : g(\"\", !0)\n                ])\n              ])\n            ]))), 128))\n          ])),\n          J.value && h.value ? (c(), d(\"button\", {\n            key: 2,\n            type: \"button\",\n            class: \"fe-btn fe-btn--sm\",\n            onClick: R[13] || (R[13] = (X) => r(\"manage-permissions\", h.value))\n          }, f(s(a)(\"inspector.people.manage\")), 1)) : g(\"\", !0)\n        ])) : g(\"\", !0),\n        oe.value === \"ok\" && (!e.tabs || K.value === \"details\") ? (c(), d(\"section\", jg, [\n          o(\"h3\", Yg, f(e.tabs ? s(a)(\"inspector.link\") : s(a)(\"inspector.section.shares\")), 1),\n          e.tabs && ue.value.length === 0 ? (c(), d(\"div\", Wg, [\n            o(\"span\", {\n              class: \"fe-inspector__linkicon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"link\")\n            }, null, 8, qg),\n            o(\"span\", Gg, f(s(a)(\"inspector.link.none\")), 1),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--sm\",\n              disabled: be.value || !h.value,\n              \"data-testid\": \"inspector-create-link\",\n              onClick: De\n            }, f(s(a)(\"inspector.link.create\")), 9, Xg)\n          ])) : ue.value.length === 0 ? (c(), d(\"p\", Jg, f(s(a)(\"inspector.shares.empty\")), 1)) : (c(), d(\"ul\", Zg, [\n            (c(!0), d(ae, null, Te(ue.value, (X) => (c(), d(\"li\", {\n              key: X.uuid,\n              class: \"fe-inspector__share\"\n            }, [\n              o(\"span\", {\n                class: \"fe-inspector__share-url\",\n                title: X.url\n              }, f(X.url), 9, Qg),\n              X.password_pin ? (c(), d(\"span\", ek, \"PIN\")) : g(\"\", !0),\n              X.expires_at ? (c(), d(\"span\", tk, f(T(X.expires_at)), 1)) : g(\"\", !0),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-inspector__copy\",\n                title: s(a)(\"inspector.shares.copy\"),\n                \"aria-label\": s(a)(\"inspector.shares.copy\"),\n                onClick: (ye) => Y(X.url)\n              }, [\n                o(\"span\", {\n                  \"aria-hidden\": \"true\",\n                  innerHTML: s(Ue)(\"copy\")\n                }, null, 8, ak)\n              ], 8, nk)\n            ]))), 128))\n          ]))\n        ])) : g(\"\", !0),\n        (ce.value === \"ok\" || ce.value === \"error\") && (!e.tabs || K.value === \"activity\") ? (c(), d(\"section\", ok, [\n          o(\"h3\", sk, [\n            Je(f(s(a)(\"inspector.section.comments\")) + \" \", 1),\n            L.value.length > 0 ? (c(), d(\"span\", rk, f(L.value.length), 1)) : g(\"\", !0)\n          ]),\n          ce.value === \"error\" ? (c(), d(\"p\", ik, f(s(a)(\"inspector.error\")), 1)) : (c(), d(ae, { key: 1 }, [\n            L.value.length === 0 ? (c(), d(\"p\", lk, f(s(a)(\"inspector.comments.empty\")), 1)) : (c(), d(\"ul\", ck, [\n              (c(!0), d(ae, null, Te(L.value, (X) => (c(), d(\"li\", {\n                key: X.id,\n                class: \"fe-inspector__comment\"\n              }, [\n                o(\"div\", uk, [\n                  o(\"span\", {\n                    class: \"fe-inspector__comment-author\",\n                    title: X.author_name\n                  }, f(X.author_name || \"—\"), 9, dk),\n                  o(\"span\", {\n                    class: \"fe-inspector__comment-time\",\n                    title: T(X.created_at)\n                  }, f(Ae(X.created_at)), 9, fk),\n                  X.can_delete ? (c(), d(\"button\", {\n                    key: 0,\n                    type: \"button\",\n                    class: \"fe-inspector__comment-del\",\n                    disabled: Ce.value,\n                    title: s(a)(\"inspector.comments.delete\"),\n                    \"aria-label\": s(a)(\"inspector.comments.delete\"),\n                    onClick: (ye) => Xe(X)\n                  }, \"×\", 8, pk)) : g(\"\", !0)\n                ]),\n                o(\"p\", vk, f(X.body), 1)\n              ]))), 128))\n            ])),\n            o(\"form\", {\n              class: \"fe-inspector__comment-form\",\n              onSubmit: Re(vt, [\"prevent\"])\n            }, [\n              Ve(o(\"input\", {\n                \"onUpdate:modelValue\": R[14] || (R[14] = (X) => se.value = X),\n                type: \"text\",\n                class: \"fe-inspector__comment-input\",\n                maxlength: \"5000\",\n                placeholder: s(a)(\"inspector.comments.placeholder\"),\n                \"aria-label\": s(a)(\"inspector.comments.placeholder\"),\n                disabled: Ce.value\n              }, null, 8, hk), [\n                [rt, se.value]\n              ]),\n              o(\"button\", {\n                type: \"submit\",\n                class: \"fe-btn fe-btn--primary fe-btn--sm\",\n                disabled: Ce.value || se.value.trim() === \"\"\n              }, f(s(a)(\"inspector.comments.send\")), 9, mk)\n            ], 32)\n          ], 64))\n        ])) : g(\"\", !0),\n        e.tabs && K.value === \"activity\" && !ie.value ? (c(), d(\"section\", yk, [\n          o(\"p\", bk, f(h.value ? s(a)(\"inspector.activity.empty\") : s(a)(\"inspector.activity.select\")), 1),\n          h.value ? (c(), d(\"p\", gk, f(s(a)(\"inspector.activity.hint\")), 1)) : g(\"\", !0)\n        ])) : g(\"\", !0)\n      ])\n    ], 10, Mb));\n  }\n}), _k = [\"aria-label\"], wk = {\n  key: 0,\n  class: \"fe-sidenav__head\"\n}, $k = [\"aria-expanded\", \"title\", \"aria-label\"], xk = { class: \"fe-sidenav__primary\" }, Sk = [\"title\", \"aria-label\"], Ck = { class: \"fe-sidenav__new-main\" }, Tk = {\n  key: 0,\n  class: \"fe-sidenav__text\"\n}, Mk = {\n  key: 0,\n  class: \"fe-sidenav__new-rule\",\n  \"aria-hidden\": \"true\"\n}, Ek = {\n  key: 1,\n  class: \"fe-sidenav__new-caret\",\n  \"aria-hidden\": \"true\"\n}, zk = { class: \"fe-sidenav__scroll\" }, Ak = [\"aria-label\"], Pk = [\"aria-current\", \"title\", \"aria-label\", \"data-testid\", \"onClick\"], Lk = {\n  class: \"fe-ficon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.8\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, Dk = {\n  key: 1,\n  d: \"M3.5 7.5A1.5 1.5 0 0 1 5 6h4l2 2.5h8A1.5 1.5 0 0 1 20.5 10v7.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5z\"\n}, Ok = {\n  key: 3,\n  d: \"M12 4l2.4 4.9 5.4.8-3.9 3.8.9 5.4-4.8-2.5-4.8 2.5.9-5.4-3.9-3.8 5.4-.8z\"\n}, Bk = {\n  key: 0,\n  class: \"fe-sidenav__text\"\n}, Ik = {\n  key: 0,\n  class: \"fe-sidenav__section\"\n}, Hk = { class: \"fe-sidenav__heading\" }, Fk = [\"aria-label\"], Nk = [\"aria-current\", \"title\", \"aria-label\", \"data-testid\", \"onClick\"], Kk = { class: \"fe-sidenav__text\" }, Rk = { key: 0 }, Uk = { class: \"fe-sidenav__hint\" }, Vk = { key: 1 }, jk = { key: 2 }, Yk = [\"aria-label\"], Wk = [\"title\", \"aria-label\"], qk = {\n  key: 1,\n  class: \"fe-sidenav__section\"\n}, Gk = {\n  key: 0,\n  class: \"fe-sidenav__heading\"\n}, Xk = {\n  key: 1,\n  class: \"fe-sidenav__rule\",\n  \"aria-hidden\": \"true\"\n}, Jk = [\"aria-label\"], Zk = [\"title\", \"aria-label\", \"data-testid\", \"onClick\"], Qk = {\n  class: \"fe-ficon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.8\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, e_ = {\n  key: 0,\n  class: \"fe-sidenav__text\"\n}, t_ = [\"aria-label\"], n_ = [\"aria-label\"], a_ = {\n  key: 2,\n  class: \"fe-sidenav__section\"\n}, o_ = {\n  key: 0,\n  class: \"fe-sidenav__heading\"\n}, s_ = {\n  key: 1,\n  class: \"fe-sidenav__rule\",\n  \"aria-hidden\": \"true\"\n}, r_ = [\"aria-label\"], i_ = [\"title\", \"aria-label\"], l_ = {\n  key: 0,\n  class: \"fe-sidenav__text\"\n}, c_ = { key: 0 }, u_ = [\"title\", \"aria-label\"], d_ = {\n  key: 0,\n  class: \"fe-sidenav__text\"\n}, f_ = {\n  key: 1,\n  class: \"fe-sidenav__quota\",\n  \"data-testid\": \"sidenav-quota\"\n}, p_ = {\n  key: 0,\n  class: \"fe-sidenav__quota-label\"\n}, v_ = [\"aria-valuenow\", \"aria-label\", \"title\"], h_ = {\n  key: 1,\n  class: \"fe-sidenav__quota-text\"\n}, m_ = 8, y_ = /* @__PURE__ */ qe({\n  __name: \"SideNav\",\n  props: {\n    expanded: { type: Boolean },\n    narrow: { type: Boolean },\n    activeView: {},\n    activeStorage: {},\n    storages: {},\n    sharedStorages: {},\n    trashVisible: { type: Boolean },\n    tags: {},\n    tagsLoaded: { type: Boolean },\n    activeTag: {},\n    showConnections: { type: Boolean },\n    showIdentitySurfaces: { type: Boolean },\n    canWrite: { type: Boolean },\n    locale: {},\n    canRequestFiles: { type: Boolean },\n    canNewDocument: { type: Boolean },\n    quota: {},\n    theme: {}\n  },\n  emits: [\"toggle\", \"open-view\", \"open-tag\", \"open-storage\", \"open-root\", \"upload\", \"new-folder\", \"new-document\", \"open-connections\", \"open-tokens\", \"request-files\", \"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u } = tt(() => n.locale), v = k(() => n.expanded || !!n.narrow), p = k(() => new Set(n.sharedStorages ?? [])), h = /* @__PURE__ */ new Set([\"recent\", \"starred\", \"shared\"]), b = k(() => {\n      const G = [\n        { key: \"home\", label: a(\"sidenav.home\") },\n        ...n.storages.length <= 1 ? [{ key: \"myfiles\", label: a(\"sidenav.myfiles\") }] : [],\n        { key: \"shared\", label: a(\"sidenav.shared\") },\n        { key: \"recent\", label: a(\"sidenav.recent\") },\n        { key: \"starred\", label: a(\"sidenav.starred\") }\n      ];\n      return n.trashVisible !== !1 && G.push({ key: \"trash\", label: a(\"sidenav.trash\") }), n.showIdentitySurfaces === !1 ? G.filter((N) => !h.has(N.key)) : G;\n    }), y = k(() => n.canWrite !== !1), A = k(\n      () => !!n.activeStorage && n.storages.some((G) => G.name === n.activeStorage && G.readOnly === !0)\n    );\n    function D(G) {\n      return G === \"myfiles\" ? !n.activeView && !n.activeStorage : n.activeView === G;\n    }\n    const C = m(!1), B = k(() => n.tags ?? []), I = k(\n      () => C.value ? B.value : B.value.slice(0, m_)\n    ), U = k(() => Math.max(0, B.value.length - I.value.length)), x = k(() => !!n.tagsLoaded || B.value.length > 0), E = m(null), $ = m(null), M = k(() => {\n      const G = [\n        /* ⚠ NO `icon:` on any of these three, and that is the fix rather than an\n           omission. `ContextMenu.iconFor` resolves `actionIconSvg(a.icon || a.key)`,\n           so an `icon` string is an OVERRIDE — and `'⬆'` / `'📁'` / `'🔗'` are not\n           keys, so the lookup missed, the component fell through to its literal\n           branch and printed the emoji. Meanwhile `new-document`, which carries no\n           override, resolved by key and drew a proper glyph: one menu, two icon\n           systems, three rows apart. All three keys have had stroked glyphs in\n           `lib/actionIcons.ts` the whole time (`upload`, `new-folder`,\n           `request-files`); dropping the override is what reaches them.\n           ⚠ Emoji in markup is forbidden here for a reason that is visible in this\n           very menu: they are rendered by whatever font the OS ships, so the row\n           came out flat-grey on one machine and full-colour on another, at a weight\n           that matched nothing beside it. */\n        { key: \"upload\", label: a(\"drive.new.upload\"), disabled: !y.value },\n        { key: \"new-folder\", label: a(\"drive.new.folder\"), disabled: !y.value }\n      ];\n      return n.canNewDocument && G.push({ key: \"new-document\", label: a(\"drive.new.document\"), disabled: !y.value }), G.push({ divider: !0, key: \"new-sep\", label: \"\" }), G.push({\n        key: \"request-files\",\n        label: a(\"drive.new.request\"),\n        disabled: !n.canRequestFiles\n      }), G;\n    });\n    function z() {\n      var N, P;\n      const G = (N = E.value) == null ? void 0 : N.getBoundingClientRect();\n      (P = $.value) == null || P.show(\n        { clientX: G ? G.left : 0, clientY: G ? G.bottom + 6 : 0 },\n        []\n      );\n    }\n    function T(G) {\n      G.key === \"upload\" ? r(\"upload\") : G.key === \"new-document\" ? r(\"new-document\") : G.key === \"new-folder\" ? r(\"new-folder\") : G.key === \"request-files\" && r(\"request-files\");\n    }\n    const Y = k(() => {\n      const G = n.quota;\n      return !G || G.unlimited || G.total <= 0 ? 0 : Math.max(0, Math.min(100, Math.round(G.used / G.total * 100)));\n    }), O = k(() => {\n      const G = n.quota;\n      return G ? G.unlimited || G.total <= 0 ? a(\"drive.storage.used_unlimited\", { used: u(G.used) }) : a(\"drive.storage.used\", { used: u(G.used), total: u(G.total) }) : \"\";\n    }), J = k(() => a(\"sidenav.close\"));\n    return (G, N) => (c(), d(\"nav\", {\n      class: we([\"fe-sidenav\", {\n        \"fe-sidenav--rail\": !e.expanded && !e.narrow,\n        \"fe-sidenav--drawer\": e.narrow\n      }]),\n      role: \"navigation\",\n      \"aria-label\": s(a)(\"sidenav.title\"),\n      \"data-testid\": \"sidenav\"\n    }, [\n      e.narrow ? (c(), d(\"div\", wk, [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-sidenav__toggle\",\n          \"aria-expanded\": v.value,\n          title: J.value,\n          \"aria-label\": J.value,\n          \"data-testid\": \"sidenav-toggle\",\n          onClick: N[0] || (N[0] = (P) => r(\"close\"))\n        }, [...N[6] || (N[6] = [\n          o(\"svg\", {\n            class: \"fe-ficon\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"1.8\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"path\", { d: \"M6 6l12 12M18 6L6 18\" })\n          ], -1)\n        ])], 8, $k)\n      ])) : g(\"\", !0),\n      o(\"div\", xk, [\n        A.value ? g(\"\", !0) : (c(), d(\"button\", {\n          key: 0,\n          ref_key: \"newBtnEl\",\n          ref: E,\n          type: \"button\",\n          class: \"fe-sidenav__new\",\n          \"aria-haspopup\": \"menu\",\n          title: s(a)(\"drive.new\"),\n          \"aria-label\": s(a)(\"drive.new\"),\n          \"data-testid\": \"sidenav-new\",\n          onClick: z\n        }, [\n          o(\"span\", Ck, [\n            N[7] || (N[7] = o(\"svg\", {\n              class: \"fe-ficon\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"2\",\n              \"stroke-linecap\": \"round\",\n              \"aria-hidden\": \"true\",\n              focusable: \"false\"\n            }, [\n              o(\"path\", { d: \"M12 5v14M5 12h14\" })\n            ], -1)),\n            v.value ? (c(), d(\"span\", Tk, f(s(a)(\"drive.new\")), 1)) : g(\"\", !0)\n          ]),\n          v.value ? (c(), d(\"span\", Mk)) : g(\"\", !0),\n          v.value ? (c(), d(\"span\", Ek, [...N[8] || (N[8] = [\n            o(\"svg\", {\n              class: \"fe-ficon\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"2\",\n              \"stroke-linecap\": \"round\",\n              \"stroke-linejoin\": \"round\",\n              \"aria-hidden\": \"true\",\n              focusable: \"false\"\n            }, [\n              o(\"path\", { d: \"M7 10l5 5 5-5\" })\n            ], -1)\n          ])])) : g(\"\", !0)\n        ], 8, Sk))\n      ]),\n      o(\"div\", zk, [\n        o(\"ul\", {\n          class: \"fe-sidenav__group\",\n          \"aria-label\": s(a)(\"sidenav.views\")\n        }, [\n          (c(!0), d(ae, null, Te(b.value, (P) => (c(), d(\"li\", {\n            key: P.key\n          }, [\n            o(\"button\", {\n              type: \"button\",\n              class: we([\"fe-sidenav__item\", { \"is-active\": D(P.key) }]),\n              \"aria-current\": D(P.key) ? \"page\" : void 0,\n              title: P.label,\n              \"aria-label\": P.label,\n              \"data-testid\": `sidenav-view-${P.key}`,\n              onClick: (le) => r(\"open-view\", P.key)\n            }, [\n              (c(), d(\"svg\", Lk, [\n                P.key === \"home\" ? (c(), d(ae, { key: 0 }, [\n                  N[9] || (N[9] = o(\"path\", { d: \"M4 10.5L12 4l8 6.5\" }, null, -1)),\n                  N[10] || (N[10] = o(\"path\", { d: \"M6 9.8V19a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9.8\" }, null, -1)),\n                  N[11] || (N[11] = o(\"path\", { d: \"M10 20v-5.5h4V20\" }, null, -1))\n                ], 64)) : P.key === \"myfiles\" ? (c(), d(\"path\", Dk)) : P.key === \"recent\" ? (c(), d(ae, { key: 2 }, [\n                  N[12] || (N[12] = o(\"circle\", {\n                    cx: \"12\",\n                    cy: \"12\",\n                    r: \"8.5\"\n                  }, null, -1)),\n                  N[13] || (N[13] = o(\"path\", { d: \"M12 7.5V12l3 2\" }, null, -1))\n                ], 64)) : P.key === \"starred\" ? (c(), d(\"path\", Ok)) : P.key === \"shared\" ? (c(), d(ae, { key: 4 }, [\n                  N[14] || (N[14] = o(\"circle\", {\n                    cx: \"17.5\",\n                    cy: \"6.5\",\n                    r: \"2.5\"\n                  }, null, -1)),\n                  N[15] || (N[15] = o(\"circle\", {\n                    cx: \"6.5\",\n                    cy: \"12\",\n                    r: \"2.5\"\n                  }, null, -1)),\n                  N[16] || (N[16] = o(\"circle\", {\n                    cx: \"17.5\",\n                    cy: \"17.5\",\n                    r: \"2.5\"\n                  }, null, -1)),\n                  N[17] || (N[17] = o(\"path\", { d: \"M8.8 10.8l6.4-3.2M8.8 13.2l6.4 3.2\" }, null, -1))\n                ], 64)) : (c(), d(ae, { key: 5 }, [\n                  N[18] || (N[18] = o(\"path\", { d: \"M4.5 7h15\" }, null, -1)),\n                  N[19] || (N[19] = o(\"path\", { d: \"M9.5 7V5.2A1.2 1.2 0 0 1 10.7 4h2.6a1.2 1.2 0 0 1 1.2 1.2V7\" }, null, -1)),\n                  N[20] || (N[20] = o(\"path\", { d: \"M6.5 7l.9 11.1A1.4 1.4 0 0 0 8.8 19.4h6.4a1.4 1.4 0 0 0 1.4-1.3L17.5 7\" }, null, -1))\n                ], 64))\n              ])),\n              v.value ? (c(), d(\"span\", Bk, f(P.label), 1)) : g(\"\", !0)\n            ], 10, Pk)\n          ]))), 128))\n        ], 8, Ak),\n        x.value ? (c(), d(\"div\", Ik, [\n          v.value ? (c(), d(ae, { key: 0 }, [\n            o(\"p\", Hk, f(s(a)(\"sidenav.tags\")), 1),\n            o(\"ul\", {\n              class: \"fe-sidenav__group\",\n              \"aria-label\": s(a)(\"sidenav.tags\")\n            }, [\n              (c(!0), d(ae, null, Te(I.value, (P) => (c(), d(\"li\", { key: P }, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: we([\"fe-sidenav__item fe-sidenav__item--tag\", { \"is-active\": e.activeView === \"tag\" && e.activeTag === P }]),\n                  \"aria-current\": e.activeView === \"tag\" && e.activeTag === P ? \"page\" : void 0,\n                  title: P,\n                  \"aria-label\": P,\n                  \"data-testid\": `sidenav-tag-${P}`,\n                  onClick: (le) => r(\"open-tag\", P)\n                }, [\n                  N[21] || (N[21] = o(\"svg\", {\n                    class: \"fe-ficon\",\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.8\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\",\n                    \"aria-hidden\": \"true\",\n                    focusable: \"false\"\n                  }, [\n                    o(\"path\", { d: \"M4 4.5h7l9 9-6.5 6.5-9-9z\" }),\n                    o(\"circle\", {\n                      cx: \"8\",\n                      cy: \"8.5\",\n                      r: \"1.4\"\n                    })\n                  ], -1)),\n                  o(\"span\", Kk, f(P), 1)\n                ], 10, Nk)\n              ]))), 128)),\n              B.value.length === 0 ? (c(), d(\"li\", Rk, [\n                o(\"p\", Uk, f(s(a)(\"sidenav.tags.empty\")), 1)\n              ])) : g(\"\", !0),\n              U.value > 0 ? (c(), d(\"li\", Vk, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-sidenav__more\",\n                  \"data-testid\": \"sidenav-tags-more\",\n                  onClick: N[1] || (N[1] = (P) => C.value = !0)\n                }, f(s(a)(\"sidenav.tags.more\", { count: U.value })), 1)\n              ])) : C.value && B.value.length > 8 ? (c(), d(\"li\", jk, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-sidenav__more\",\n                  \"data-testid\": \"sidenav-tags-less\",\n                  onClick: N[2] || (N[2] = (P) => C.value = !1)\n                }, f(s(a)(\"sidenav.tags.less\")), 1)\n              ])) : g(\"\", !0)\n            ], 8, Fk)\n          ], 64)) : (c(), d(ae, { key: 1 }, [\n            N[23] || (N[23] = o(\"hr\", {\n              class: \"fe-sidenav__rule\",\n              \"aria-hidden\": \"true\"\n            }, null, -1)),\n            o(\"ul\", {\n              class: \"fe-sidenav__group\",\n              \"aria-label\": s(a)(\"sidenav.tags\")\n            }, [\n              o(\"li\", null, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: we([\"fe-sidenav__item\", { \"is-active\": e.activeView === \"tag\" }]),\n                  title: s(a)(\"sidenav.tags\"),\n                  \"aria-label\": s(a)(\"sidenav.tags\"),\n                  \"data-testid\": \"sidenav-tags-rail\",\n                  onClick: N[3] || (N[3] = (P) => r(\"toggle\"))\n                }, [...N[22] || (N[22] = [\n                  o(\"svg\", {\n                    class: \"fe-ficon\",\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.8\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\",\n                    \"aria-hidden\": \"true\",\n                    focusable: \"false\"\n                  }, [\n                    o(\"path\", { d: \"M4 4.5h7l9 9-6.5 6.5-9-9z\" }),\n                    o(\"circle\", {\n                      cx: \"8\",\n                      cy: \"8.5\",\n                      r: \"1.4\"\n                    })\n                  ], -1)\n                ])], 10, Wk)\n              ])\n            ], 8, Yk)\n          ], 64))\n        ])) : g(\"\", !0),\n        e.storages.length ? (c(), d(\"div\", qk, [\n          v.value ? (c(), d(\"p\", Gk, f(s(a)(\"sidenav.storages\")), 1)) : (c(), d(\"hr\", Xk)),\n          o(\"ul\", {\n            class: \"fe-sidenav__group\",\n            \"aria-label\": s(a)(\"sidenav.storages\")\n          }, [\n            (c(!0), d(ae, null, Te(e.storages, (P) => (c(), d(\"li\", {\n              key: P.name\n            }, [\n              o(\"button\", {\n                type: \"button\",\n                class: we([\"fe-sidenav__item\", { \"is-active\": !e.activeView && e.activeStorage === P.name }]),\n                title: p.value.has(P.name) ? `${P.label || P.name} — ${s(a)(\"sidenav.storage.shared\")}` : P.label || P.name,\n                \"aria-label\": p.value.has(P.name) ? `${P.label || P.name} — ${s(a)(\"sidenav.storage.shared\")}` : P.label || P.name,\n                \"data-testid\": `sidenav-storage-${P.name}`,\n                onClick: (le) => r(\"open-storage\", P.name)\n              }, [\n                (c(), d(\"svg\", Qk, [\n                  p.value.has(P.name) ? (c(), d(ae, { key: 0 }, [\n                    N[24] || (N[24] = o(\"path\", { d: \"M3 8.5A1.5 1.5 0 0 1 4.5 7h5L11 9h8.5A1.5 1.5 0 0 1 21 10.5v7A1.5 1.5 0 0 1 19.5 19h-15A1.5 1.5 0 0 1 3 17.5z\" }, null, -1)),\n                    N[25] || (N[25] = o(\"circle\", {\n                      cx: \"15.6\",\n                      cy: \"13.6\",\n                      r: \"1.6\"\n                    }, null, -1)),\n                    N[26] || (N[26] = o(\"circle\", {\n                      cx: \"9.4\",\n                      cy: \"15.4\",\n                      r: \"1.6\"\n                    }, null, -1)),\n                    N[27] || (N[27] = o(\"path\", { d: \"M10.9 14.7l3.3-.9\" }, null, -1))\n                  ], 64)) : (c(), d(ae, { key: 1 }, [\n                    N[28] || (N[28] = o(\"rect\", {\n                      x: \"3\",\n                      y: \"5\",\n                      width: \"18\",\n                      height: \"6\",\n                      rx: \"1.6\"\n                    }, null, -1)),\n                    N[29] || (N[29] = o(\"rect\", {\n                      x: \"3\",\n                      y: \"13\",\n                      width: \"18\",\n                      height: \"6\",\n                      rx: \"1.6\"\n                    }, null, -1)),\n                    N[30] || (N[30] = o(\"path\", { d: \"M6.5 8h.01M6.5 16h.01\" }, null, -1))\n                  ], 64))\n                ])),\n                v.value ? (c(), d(\"span\", e_, f(P.label || P.name), 1)) : g(\"\", !0),\n                v.value && p.value.has(P.name) ? (c(), d(\"span\", {\n                  key: 1,\n                  class: \"fe-sidenav__tag\",\n                  role: \"img\",\n                  \"aria-label\": s(a)(\"sidenav.storage.shared\")\n                }, f(s(a)(\"sidenav.storage.shared\")), 9, t_)) : g(\"\", !0),\n                v.value && P.readOnly ? (c(), d(\"span\", {\n                  key: 2,\n                  class: \"fe-sidenav__tag\",\n                  role: \"img\",\n                  \"data-testid\": \"sidenav-storage-readonly\",\n                  \"aria-label\": s(a)(\"sidenav.storage.readOnly\")\n                }, f(s(a)(\"sidenav.storage.readOnly\")), 9, n_)) : g(\"\", !0)\n              ], 10, Zk)\n            ]))), 128))\n          ], 8, Jk)\n        ])) : g(\"\", !0),\n        e.showConnections ? (c(), d(\"div\", a_, [\n          v.value ? (c(), d(\"p\", o_, f(s(a)(\"sidenav.connections\")), 1)) : (c(), d(\"hr\", s_)),\n          o(\"ul\", {\n            class: \"fe-sidenav__group\",\n            \"aria-label\": s(a)(\"sidenav.connections\")\n          }, [\n            o(\"li\", null, [\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-sidenav__item\",\n                title: s(a)(\"sidenav.connect\"),\n                \"aria-label\": s(a)(\"sidenav.connect\"),\n                \"data-testid\": \"sidenav-connect\",\n                onClick: N[4] || (N[4] = (P) => r(\"open-connections\"))\n              }, [\n                N[31] || (N[31] = o(\"svg\", {\n                  class: \"fe-ficon\",\n                  viewBox: \"0 0 24 24\",\n                  fill: \"none\",\n                  stroke: \"currentColor\",\n                  \"stroke-width\": \"1.8\",\n                  \"stroke-linecap\": \"round\",\n                  \"stroke-linejoin\": \"round\",\n                  \"aria-hidden\": \"true\",\n                  focusable: \"false\"\n                }, [\n                  o(\"path\", { d: \"M9.5 14.5l-2.6 2.6a3.7 3.7 0 0 1-5.2-5.2l2.6-2.6\" }),\n                  o(\"path\", { d: \"M14.5 9.5l2.6-2.6a3.7 3.7 0 0 1 5.2 5.2l-2.6 2.6\" }),\n                  o(\"path\", { d: \"M9 15l6-6\" })\n                ], -1)),\n                v.value ? (c(), d(\"span\", l_, f(s(a)(\"sidenav.connect\")), 1)) : g(\"\", !0)\n              ], 8, i_)\n            ]),\n            e.showIdentitySurfaces !== !1 ? (c(), d(\"li\", c_, [\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-sidenav__item\",\n                title: s(a)(\"sidenav.apikeys\"),\n                \"aria-label\": s(a)(\"sidenav.apikeys\"),\n                \"data-testid\": \"sidenav-apikeys\",\n                onClick: N[5] || (N[5] = (P) => r(\"open-tokens\"))\n              }, [\n                N[32] || (N[32] = o(\"svg\", {\n                  class: \"fe-ficon\",\n                  viewBox: \"0 0 24 24\",\n                  fill: \"none\",\n                  stroke: \"currentColor\",\n                  \"stroke-width\": \"1.8\",\n                  \"stroke-linecap\": \"round\",\n                  \"stroke-linejoin\": \"round\",\n                  \"aria-hidden\": \"true\",\n                  focusable: \"false\"\n                }, [\n                  o(\"circle\", {\n                    cx: \"8\",\n                    cy: \"12\",\n                    r: \"3.5\"\n                  }),\n                  o(\"path\", { d: \"M11.5 12H21\" }),\n                  o(\"path\", { d: \"M17.5 12v3.2M20 12v2.2\" })\n                ], -1)),\n                v.value ? (c(), d(\"span\", d_, f(s(a)(\"sidenav.apikeys\")), 1)) : g(\"\", !0)\n              ], 8, u_)\n            ])) : g(\"\", !0)\n          ], 8, r_)\n        ])) : g(\"\", !0)\n      ]),\n      e.quota ? (c(), d(\"div\", f_, [\n        v.value ? (c(), d(\"p\", p_, f(s(a)(\"drive.storage.label\")), 1)) : g(\"\", !0),\n        o(\"div\", {\n          class: \"fe-sidenav__quota-bar\",\n          role: \"progressbar\",\n          \"aria-valuenow\": Y.value,\n          \"aria-valuemin\": \"0\",\n          \"aria-valuemax\": \"100\",\n          \"aria-label\": O.value,\n          title: O.value\n        }, [\n          o(\"span\", {\n            class: \"fe-sidenav__quota-fill\",\n            style: Ct({ width: Y.value + \"%\" })\n          }, null, 4)\n        ], 8, v_),\n        v.value ? (c(), d(\"p\", h_, f(O.value), 1)) : g(\"\", !0)\n      ])) : g(\"\", !0),\n      Ge(Ps, {\n        ref_key: \"newMenuRef\",\n        ref: $,\n        locale: e.locale,\n        theme: e.theme,\n        actions: M.value,\n        onSelect: T\n      }, null, 8, [\"locale\", \"theme\", \"actions\"])\n    ], 10, _k));\n  }\n}), Ad = \"application/x-brf-files\", b_ = \"application/x-brf-files-src\";\nlet Fa = null;\nconst g_ = 5 * 6e4;\nfunction k_(e, t) {\n  Fa = { items: e.slice(), origin: t, startedAt: Date.now() };\n}\nfunction Ba() {\n  Fa = null;\n}\nfunction Co() {\n  return Fa ? Date.now() - Fa.startedAt > g_ ? (Fa = null, null) : Fa : null;\n}\nfunction vn(e) {\n  var t;\n  return (t = e.dataTransfer) != null && t.types.includes(Ad) ? !0 : Co() !== null;\n}\nfunction Cs(e) {\n  var r;\n  const t = (r = e.dataTransfer) == null ? void 0 : r.getData(Ad);\n  if (t)\n    try {\n      const a = JSON.parse(t);\n      return Array.isArray(a) && a.length > 0 ? a : null;\n    } catch {\n      return null;\n    }\n  const n = Co();\n  return n && n.items.length > 0 ? n.items : null;\n}\nfunction mi(e) {\n  var n, r;\n  const t = (n = e.dataTransfer) == null ? void 0 : n.getData(b_);\n  return t || ((r = Co()) == null ? void 0 : r.origin) || void 0;\n}\nfunction __(e) {\n  const t = w_(e);\n  return t === void 0 || t === \"none\" || t === \"csrf\";\n}\nfunction w_(e) {\n  if (!e || typeof e != \"object\") return;\n  const t = e;\n  return typeof t.kind == \"string\" ? t.kind : typeof t.type == \"string\" ? t.type : void 0;\n}\nfunction $_(e, t, n) {\n  if (e.type !== \"file\") return null;\n  let r = t;\n  try {\n    r = new URL(t, typeof location < \"u\" ? location.href : void 0).toString();\n  } catch {\n    return null;\n  }\n  if (!/^https?:/i.test(r)) return null;\n  const a = e.basename.replace(/[:\\r\\n]/g, \"_\");\n  return `${n && n.trim() ? n : \"application/octet-stream\"}:${a}:${r}`;\n}\nfunction x_(e) {\n  return e.map((t) => t.path).sort().join(\"\\0\");\n}\nconst S_ = 500, C_ = 800, mu = 10, T_ = 'button, a, input, select, textarea, label, [role=\"checkbox\"], [data-fe-control]';\nfunction Ui(e, t) {\n  return { ctrl: e.ctrlKey || e.metaKey, shift: e.shiftKey, touch: t };\n}\nfunction Vi(e) {\n  return { ctrl: !0, shift: e.shiftKey, check: !0 };\n}\nfunction M_(e) {\n  const t = e.target;\n  if (typeof (t == null ? void 0 : t.closest) != \"function\") return !1;\n  const n = t.closest(T_), r = e.currentTarget;\n  return n !== null && (r === null || typeof r.contains != \"function\" || r.contains(n));\n}\nfunction ji(e, t = {}) {\n  let n, r = null, a = { clientX: 0, clientY: 0 }, u = !1, v = 0, p = !1;\n  function h() {\n    n && clearTimeout(n), n = void 0;\n  }\n  function b(C, B) {\n    const I = B.touches[0];\n    I && (h(), r = C, u = !1, a = { clientX: I.clientX, clientY: I.clientY }, p = !M_(B), n = setTimeout(() => {\n      n = void 0, r !== null && (u = !0, e(r, a));\n    }, S_));\n  }\n  function y(C) {\n    const B = C.touches[0];\n    (!B || Math.abs(B.clientX - a.clientX) > mu || Math.abs(B.clientY - a.clientY) > mu) && (h(), r = null);\n  }\n  function A(C) {\n    h();\n    const B = r, I = B !== null && !u;\n    I && (v = Date.now()), r = null, I && p && t.onTap && (C != null && C.cancelable && C.preventDefault(), t.onTap(B)), p = !1;\n  }\n  function D(C) {\n    const B = C.pointerType;\n    return B ? B === \"touch\" : Date.now() - v < C_;\n  }\n  return it(h), { onTouchStart: b, onTouchMove: y, onTouchEnd: A, isTap: D };\n}\nconst E_ = [\"aria-checked\", \"aria-label\", \"title\"], Yi = /* @__PURE__ */ qe({\n  __name: \"ItemCheck\",\n  props: {\n    on: { type: Boolean },\n    label: {}\n  },\n  setup(e) {\n    return (t, n) => (c(), d(\"button\", {\n      type: \"button\",\n      class: we([\"fe-list__check\", { \"is-on\": e.on }]),\n      role: \"checkbox\",\n      \"aria-checked\": e.on ? \"true\" : \"false\",\n      \"aria-label\": e.label,\n      title: e.label,\n      onMousedown: n[0] || (n[0] = Re(() => {\n      }, [\"prevent\"]))\n    }, null, 42, E_));\n  }\n}), Ia = 8 * 1024, z_ = 4 * 1024 * 1024, A_ = 3, P_ = 24, yu = 120, L_ = 16, D_ = 8, O_ = 400, B_ = /* @__PURE__ */ new Set([\"csv\", \"tsv\"]);\nfunction I_(e) {\n  if (e.trashed) return !0;\n  const t = e.extra_metadata;\n  return !!t && typeof t == \"object\" && \"deleted_at\" in t;\n}\nfunction yi(e) {\n  if (e.type !== \"file\" || e.basename === \".trash\" || e.mime_type === \"inode/storage\" || I_(e)) return null;\n  const t = e.size ?? 0;\n  if (t <= 0 || t > z_) return null;\n  const n = (e.extension || \"\").trim().toLowerCase();\n  if (B_.has(n)) return \"table\";\n  const r = jn(e);\n  return r === \"code\" ? \"code\" : r === \"text\" ? \"text\" : null;\n}\nfunction Wi(e) {\n  if (e.type !== \"file\") return !1;\n  switch (jn(e)) {\n    case \"pdf\":\n    case \"doc\":\n    case \"sheet\":\n    case \"slides\":\n      return !0;\n    default:\n      return !1;\n  }\n}\nfunction Pd(e) {\n  return e.type === \"file\" && jn(e) === \"video\";\n}\nconst H_ = /* @__PURE__ */ new Set([\n  \"import\",\n  \"export\",\n  \"from\",\n  \"require\",\n  \"include\",\n  \"use\",\n  \"using\",\n  \"package\",\n  \"module\",\n  \"namespace\",\n  \"const\",\n  \"let\",\n  \"var\",\n  \"function\",\n  \"func\",\n  \"fn\",\n  \"def\",\n  \"class\",\n  \"struct\",\n  \"enum\",\n  \"interface\",\n  \"type\",\n  \"impl\",\n  \"trait\",\n  \"public\",\n  \"private\",\n  \"protected\",\n  \"static\",\n  \"async\",\n  \"await\",\n  \"return\",\n  \"if\",\n  \"else\",\n  \"for\",\n  \"while\",\n  \"switch\",\n  \"case\",\n  \"try\",\n  \"catch\",\n  \"select\",\n  \"insert\",\n  \"update\",\n  \"delete\",\n  \"create\",\n  \"alter\",\n  \"drop\"\n]), F_ = /^(#{1,6}|[-*+]|>|\\d+\\.)$/;\nfunction N_(e) {\n  return e.replace(/[(){}[\\];:,.]+$/, \"\").toLowerCase();\n}\nfunction K_(e, t) {\n  const n = e.length > yu ? e.slice(0, yu) : e, r = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(n);\n  if (!r) return { indent: \"\", tint: \"\", text: n };\n  const [, a, u, v] = r;\n  return (t === \"code\" ? H_.has(N_(u)) : F_.test(u)) ? { indent: a, tint: u, text: v } : { indent: \"\", tint: \"\", text: n };\n}\nfunction R_(e, t) {\n  const n = [];\n  let r = \"\", a = !1;\n  for (let u = 0; u < e.length; u++) {\n    const v = e[u];\n    a ? v === '\"' ? e[u + 1] === '\"' ? (r += '\"', u++) : a = !1 : r += v : v === '\"' ? a = !0 : v === t ? (n.push(r), r = \"\") : r += v;\n  }\n  return n.push(r), n;\n}\nfunction U_(e, t) {\n  return e === \"tsv\" ? \"\t\" : !t.includes(\",\") && t.includes(\";\") ? \";\" : \",\";\n}\nfunction V_(e, t, n, r) {\n  for (let p = 0; p < e.length; p++)\n    if (e[p] === 0) return null;\n  const a = new TextDecoder(\"utf-8\", { fatal: !1 }).decode(e);\n  let u = 0;\n  for (const p of a) p === \"�\" && u++;\n  if (a.length > 0 && u / a.length > 0.1) return null;\n  const v = a.split(/\\r\\n|\\r|\\n/);\n  for (r && v.length > 1 && v.pop(); v.length && v[0].trim() === \"\"; ) v.shift();\n  for (; v.length && v[v.length - 1].trim() === \"\"; ) v.pop();\n  if (v.length === 0) return null;\n  if (t === \"table\") {\n    const p = U_(n, v[0]), h = v.filter((y) => y.trim() !== \"\").slice(0, L_).map((y) => R_(y, p).slice(0, D_).map((A) => A.trim().slice(0, 24)));\n    if (h.length === 0) return null;\n    const b = h.reduce((y, A) => Math.max(y, A.length), 0);\n    for (const y of h) for (; y.length < b; ) y.push(\"\");\n    return { kind: t, lines: [], rows: h, cols: b };\n  }\n  return {\n    kind: t,\n    lines: v.slice(0, P_).map((p) => K_(p, t)),\n    rows: [],\n    cols: 0\n  };\n}\nfunction go(e) {\n  const n = (typeof e.etag == \"string\" ? e.etag : \"\") || String(e.last_modified ?? \"\") || String(e.size ?? \"\");\n  return `${e.path}\\0${n}`;\n}\nfunction Ld(e) {\n  const t = e.apiBase !== void 0 && typeof e.authHeaders == \"function\" && typeof IntersectionObserver < \"u\" && typeof fetch == \"function\", n = m({}), r = [], a = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set(), v = [], p = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new WeakMap();\n  let b = 0, y = null;\n  const A = /* @__PURE__ */ new Map();\n  function D(M) {\n    const z = Ku({ apiBase: e.apiBase }).manager, T = z.includes(\"?\") ? \"&\" : \"?\", Y = new URLSearchParams({ q: \"preview\", action: \"preview\", path: M });\n    return `${z}${T}${Y.toString()}`;\n  }\n  function C(M, z) {\n    if (r.length >= O_) {\n      const T = r.shift();\n      if (T) {\n        const Y = { ...n.value };\n        delete Y[T], n.value = Y;\n      }\n    }\n    r.push(M), n.value = { ...n.value, [M]: z };\n  }\n  async function B(M) {\n    const z = M.body;\n    if (!z) {\n      const N = new Uint8Array(await M.arrayBuffer());\n      return { bytes: N.slice(0, Ia), truncated: N.length > Ia };\n    }\n    const T = z.getReader(), Y = [];\n    let O = 0;\n    try {\n      for (; O < Ia; ) {\n        const { done: N, value: P } = await T.read();\n        if (N) break;\n        P && P.length && (Y.push(P), O += P.length);\n      }\n    } finally {\n      try {\n        await T.cancel();\n      } catch {\n      }\n    }\n    const J = new Uint8Array(Math.min(O, Ia));\n    let G = 0;\n    for (const N of Y) {\n      if (G >= J.length) break;\n      J.set(N.subarray(0, J.length - G), G), G += N.length;\n    }\n    return { bytes: J, truncated: O >= Ia };\n  }\n  async function I(M, z) {\n    const T = go(M), Y = new AbortController();\n    p.add(Y);\n    try {\n      const O = e.authHeaders ? await e.authHeaders() : {}, J = await fetch(D(M.path), {\n        headers: { ...O, Accept: \"*/*\", Range: `bytes=0-${Ia - 1}` },\n        credentials: e.credentials,\n        signal: Y.signal\n      });\n      if (!J.ok && J.status !== 206) throw new Error(String(J.status));\n      const { bytes: G, truncated: N } = await B(J);\n      Y.abort();\n      const P = (M.extension || \"\").trim().toLowerCase(), le = V_(G, z, P, N);\n      if (!le) {\n        a.add(T);\n        return;\n      }\n      C(T, le);\n    } catch {\n      a.add(T);\n    } finally {\n      p.delete(Y);\n    }\n  }\n  function U() {\n    for (; b < A_ && v.length > 0; ) {\n      const M = v.shift(), z = yi(M);\n      u.delete(go(M)), z && (b++, I(M, z).finally(() => {\n        b--, U();\n      }));\n    }\n  }\n  function x(M) {\n    const z = go(M);\n    n.value[z] || a.has(z) || u.has(z) || (u.add(z), v.push(M), U());\n  }\n  function E() {\n    return t ? (y || (y = new IntersectionObserver(\n      (M) => {\n        for (const z of M) {\n          if (!z.isIntersecting) continue;\n          const T = A.get(z.target);\n          y == null || y.unobserve(z.target), A.delete(z.target), T && x(T);\n        }\n      },\n      { rootMargin: \"150px\" }\n    )), y) : null;\n  }\n  function $(M) {\n    var z;\n    return !t || (z = e.disabled) != null && z.call(e) ? null : yi(M);\n  }\n  return {\n    enabled: t,\n    kindFor: $,\n    get(M) {\n      return t ? n.value[go(M)] ?? null : null;\n    },\n    bind(M, z) {\n      if (!M || !$(z)) return;\n      const T = go(z);\n      if (h.get(M) === T || (h.set(M, T), n.value[T] || a.has(T))) return;\n      const Y = E();\n      Y && (A.set(M, z), Y.observe(M));\n    },\n    stats: () => ({\n      loaded: r.length,\n      inflight: b,\n      queued: v.length,\n      failed: a.size\n    }),\n    dispose() {\n      y == null || y.disconnect(), y = null, A.clear();\n      for (const M of p) M.abort();\n      p.clear(), v.length = 0, u.clear();\n    }\n  };\n}\nfunction j_(e, t) {\n  if (!e) return { id: \"none\", label: t.t(\"group.no_date\") };\n  const n = /* @__PURE__ */ new Date(), r = Ic(n), a = Ic(e);\n  if (a >= r) return { id: \"today\", label: t.t(\"group.today\") };\n  if (a === r - 1) return { id: \"yesterday\", label: t.t(\"group.yesterday\") };\n  if (a > r - 7) return { id: \"week\", label: t.t(\"group.this_week\") };\n  const u = t.zonedYearMonth(e);\n  return u === t.zonedYearMonth(n) ? { id: \"month\", label: t.t(\"group.this_month\") } : { id: `m-${u}`, label: t.formatMonthYear(e) };\n}\nfunction qi(e, t) {\n  return t !== \"relevance\" && e === \"modified\";\n}\nfunction Gi(e, t) {\n  var a;\n  const n = [];\n  if (!t.active)\n    n.push({ id: \"all\", label: null, items: [...e] });\n  else {\n    let u = null;\n    for (const v of e) {\n      const p = ((a = t.aside) == null ? void 0 : a.call(t, v)) ?? null, h = p ? { id: p.id, label: p.label ?? null } : j_(t.dateOf(v), t.labels);\n      (!u || u.id !== h.id) && (u = { id: h.id, label: h.label, items: [] }, n.push(u)), u.items.push(v);\n    }\n  }\n  const r = /* @__PURE__ */ new Map();\n  for (const u of n)\n    u.label && u.items.length && r.set(u.items[0], u.label);\n  return {\n    active: t.active,\n    runs: n,\n    headingBefore: (u) => r.get(u) ?? null\n  };\n}\nasync function Dd(e, t, n = {}) {\n  const r = {\n    \"Content-Type\": \"application/json\",\n    ...await (n.authHeaders ?? (() => ({})))()\n  }, a = n.apiBase ?? \"\", u = await fetch(`${a}/api/files/manager/star`, {\n    method: \"POST\",\n    headers: r,\n    credentials: n.authCredentials ?? \"same-origin\",\n    body: JSON.stringify({ node_id: e, starred: t })\n  });\n  if (!u.ok) throw new Error(`star toggle failed: ${u.status}`);\n}\nconst Y_ = [\"aria-pressed\", \"title\", \"aria-label\"], W_ = {\n  viewBox: \"0 0 24 24\",\n  width: \"16\",\n  height: \"16\",\n  \"aria-hidden\": \"true\"\n}, q_ = [\"fill\"], G_ = {\n  key: 0,\n  class: \"filex-star-label\"\n}, er = /* @__PURE__ */ qe({\n  __name: \"StarButton\",\n  props: {\n    starred: { type: Boolean },\n    nodeId: {},\n    apiBase: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    compact: { type: Boolean },\n    card: { type: Boolean },\n    locale: {}\n  },\n  emits: [\"change\", \"error\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = m(n.starred);\n    He(() => n.starred, (h) => {\n      a.value = h;\n    });\n    const { t: u } = tt(() => cn(n.locale)), v = k(() => u(a.value ? \"ctx.unstar\" : \"ctx.star\"));\n    async function p() {\n      const h = !a.value;\n      a.value = h;\n      try {\n        await Dd(n.nodeId, h, {\n          apiBase: n.apiBase,\n          authHeaders: n.authHeaders,\n          authCredentials: n.authCredentials\n        }), r(\"change\", h);\n      } catch (b) {\n        a.value = !h, r(\"error\", b instanceof Error ? b.message : String(b));\n      }\n    }\n    return (h, b) => (c(), d(\"button\", {\n      type: \"button\",\n      class: we([\"filex-star-btn\", { \"is-starred\": a.value, \"is-compact\": e.compact, \"is-card\": e.card }]),\n      \"aria-pressed\": a.value,\n      title: v.value,\n      \"aria-label\": v.value,\n      \"data-testid\": \"star-toggle\",\n      onClick: Re(p, [\"stop\"])\n    }, [\n      (c(), d(\"svg\", W_, [\n        o(\"path\", {\n          fill: a.value ? \"currentColor\" : \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"2\",\n          \"stroke-linejoin\": \"round\",\n          d: \"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z\"\n        }, null, 8, q_)\n      ])),\n      e.compact ? g(\"\", !0) : (c(), d(\"span\", G_, f(v.value), 1))\n    ], 10, Y_));\n  }\n});\nfunction Vs(e) {\n  const t = [];\n  if (!e) return t;\n  const n = /«([^«»]*)»/g;\n  let r = 0, a;\n  for (; (a = n.exec(e)) !== null; )\n    a.index > r && t.push({ text: e.slice(r, a.index), match: !1 }), a[1] && t.push({ text: a[1], match: !0 }), r = a.index + a[0].length;\n  return r < e.length && t.push({ text: e.slice(r), match: !1 }), t;\n}\nfunction Od(e) {\n  return e === \"content\" || e === \"both\";\n}\nfunction Xi(e, t, n) {\n  const r = e.dataTransfer;\n  if (!(!r || typeof document > \"u\" || typeof r.setDragImage != \"function\"))\n    try {\n      const a = document.createElement(\"div\");\n      a.className = \"fe-dragghost\";\n      const u = document.createElement(\"span\");\n      if (u.className = \"fe-dragghost__name\", u.textContent = t, a.appendChild(u), n > 1) {\n        const v = document.createElement(\"span\");\n        v.className = \"fe-dragghost__badge\", v.textContent = String(n), a.appendChild(v);\n      }\n      a.style.position = \"fixed\", a.style.top = \"-1000px\", a.style.left = \"-1000px\", document.body.appendChild(a), r.setDragImage(a, 14, 14), setTimeout(() => a.remove(), 0);\n    } catch {\n    }\n}\nconst X_ = [\"aria-label\", \"aria-busy\"], J_ = {\n  key: 0,\n  class: \"fe-grid__heading\",\n  \"aria-hidden\": \"true\"\n}, Z_ = [\"aria-selected\", \"aria-label\", \"data-fe-path\", \"onClick\", \"onDblclick\", \"onContextmenu\", \"onDragstart\", \"onDragover\", \"onDragleave\", \"onDrop\", \"onTouchstartPassive\"], Q_ = {\n  key: 0,\n  class: \"fe-fprev__tint\"\n}, ew = [\"innerHTML\"], tw = [\"src\", \"alt\"], nw = [\"aria-label\", \"innerHTML\"], aw = [\"innerHTML\"], ow = {\n  key: 4,\n  class: \"fe-thumb__play\",\n  \"aria-hidden\": \"true\"\n}, sw = { class: \"fe-grid__foot\" }, rw = [\"aria-label\", \"innerHTML\"], iw = [\"innerHTML\"], lw = [\"onClick\"], cw = { class: \"fe-grid__main\" }, uw = [\"title\"], dw = [\"title\", \"aria-label\"], fw = { class: \"fe-grid__meta\" }, pw = [\"title\"], vw = [\"title\"], hw = {\n  key: 0,\n  class: \"fe-grid__mark\"\n}, mw = [\"aria-label\", \"title\", \"onClick\"], yw = {\n  key: 0,\n  class: \"fe-grid__empty\"\n}, bi = /* @__PURE__ */ qe({\n  __name: \"GridView\",\n  props: {\n    files: {},\n    selected: {},\n    clipped: {},\n    showParentPath: { type: Boolean },\n    locale: {},\n    loading: { type: Boolean },\n    thumbSrc: {},\n    keepBadgeFor: {},\n    starredIds: {},\n    starEnabled: { type: Boolean },\n    apiBase: {},\n    authHeaders: {},\n    authCredentials: {},\n    sections: { type: Boolean },\n    order: {},\n    e2eActive: { type: Boolean },\n    selectable: { type: Boolean, default: !0 }\n  },\n  emits: [\"click-card\", \"dbl-card\", \"context-card\", \"item-drag-start\", \"item-drop-into\", \"star-change\", \"display-order\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u, nodeDisplayName: v, formatDate: p, formatMonthYear: h, zonedYearMonth: b, toDate: y } = tt(() => n.locale), A = k(() => [...n.files].sort(pi));\n    He(\n      A,\n      (K) => r(\"display-order\", K),\n      { immediate: !0 }\n    );\n    const D = k(() => {\n      var K;\n      return ((K = A.value.find((Z) => Z.type === \"dir\")) == null ? void 0 : K.path) ?? null;\n    }), C = k(() => {\n      var K;\n      return ((K = A.value.find((Z) => Z.type !== \"dir\")) == null ? void 0 : K.path) ?? null;\n    }), B = Ao(), I = k(\n      () => Gi(A.value, {\n        active: qi(B.key.value, n.order),\n        dateOf: (K) => y(K.last_modified),\n        /* Folders keep their own run at the top — the same rule the list follows,\n         * and the reason \"folders before files\" survives a date sort. Here the run\n         * is the one that already had a name. */\n        aside: (K) => K.type === \"dir\" ? { id: \"dirs\", label: n.sections ? a(\"drive.section.folders\") : null } : null,\n        labels: { t: a, formatMonthYear: h, zonedYearMonth: b }\n      })\n    );\n    function U(K) {\n      return I.value.active ? I.value.headingBefore(K) : n.sections ? K.path === D.value ? a(\"drive.section.folders\") : K.path === C.value ? a(\"drive.section.files\") : null : null;\n    }\n    function x(K) {\n      return n.thumbSrc ? n.thumbSrc(K) : K.thumb_url ?? null;\n    }\n    const E = Ld({\n      // Read once: the explorer's `config.apiBase` is fixed for the life of a\n      // mounted panel, and `enabled` has to be answerable at construction.\n      apiBase: n.apiBase,\n      // Wrapped rather than passed, so a parent that re-creates its arrow on each\n      // render is still called through the CURRENT prop. ⚠ The builder is async;\n      // `createFilePreviews` awaits it (see the note there — a Promise spread into\n      // a headers object sends no Authorization and 401s in silence).\n      authHeaders: n.authHeaders ? () => n.authHeaders() : void 0,\n      credentials: n.authCredentials,\n      disabled: () => n.e2eActive === !0\n    });\n    it(() => E.dispose());\n    function $(K) {\n      return E.kindFor(K);\n    }\n    function M(K) {\n      const Z = E.get(K);\n      return Z ? [Z] : [];\n    }\n    function z(K, Z) {\n      E.bind(K instanceof Element ? K : null, Z);\n    }\n    function T(K) {\n      return n.starEnabled === !1 ? !1 : n.apiBase !== void 0 && typeof K.id == \"number\" && K.type === \"file\";\n    }\n    function Y(K) {\n      return n.selected.has(K.path);\n    }\n    function O(K, Z) {\n      r(\"click-card\", K, Vi(Z));\n    }\n    function J(K, Z) {\n      r(\"click-card\", K, Ui(Z, Q.isTap(Z)));\n    }\n    function G(K) {\n      r(\"dbl-card\", K);\n    }\n    function N(K, Z) {\n      Z.preventDefault(), Z.stopPropagation(), r(\"context-card\", K, Z);\n    }\n    function P(K, Z) {\n      N(K, Z);\n    }\n    function le(K, Z) {\n      Xi(\n        Z,\n        v(K),\n        n.selected.has(K.path) ? n.selected.size : 1\n      ), r(\"item-drag-start\", K, Z);\n    }\n    const ve = m(null);\n    function he(K, Z) {\n      K.type === \"dir\" && vn(Z) && (Z.preventDefault(), Z.stopPropagation(), Z.dataTransfer && (Z.dataTransfer.dropEffect = \"move\"), ve.value = K.path);\n    }\n    function oe(K) {\n      ve.value === K.path && (ve.value = null);\n    }\n    function ue(K, Z) {\n      ve.value = null, K.type === \"dir\" && vn(Z) && (Z.preventDefault(), Z.stopPropagation(), r(\"item-drop-into\", K, Z));\n    }\n    const Q = ji(\n      (K, Z) => r(\"context-card\", K, { ...Z, preventDefault: () => {\n      }, stopPropagation: () => {\n      } }),\n      {\n        // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n        onTap: (K) => r(\"click-card\", K, { ctrl: !1, shift: !1, touch: !0 })\n      }\n    );\n    function pe(K) {\n      return p(K);\n    }\n    function re(K) {\n      if (K.type === \"dir\") return a(\"node.folder\");\n      const Z = pe(K.last_modified), W = u(K.size);\n      return Z ? `${W} • ${Z}` : W;\n    }\n    function S(K) {\n      return K === \"kept\" ? \"✓\" : K === \"syncing\" ? \"⟳\" : K === \"partial\" ? \"◐\" : \"☁\";\n    }\n    function w(K) {\n      const Z = K.snippet;\n      return typeof Z == \"string\" ? Z : \"\";\n    }\n    function j(K) {\n      return Vs(K).map((Z) => Z.text).join(\"\");\n    }\n    return (K, Z) => (c(), d(\"div\", {\n      class: we([\"fe-grid\", { \"is-loading\": e.loading, \"has-selection\": e.selectable && e.selected.size > 0 }]),\n      role: \"listbox\",\n      \"aria-multiselectable\": \"true\",\n      \"aria-label\": s(a)(\"grid.aria\"),\n      \"aria-busy\": e.loading ? \"true\" : void 0\n    }, [\n      (c(!0), d(ae, null, Te(A.value, (W) => {\n        var $e, Se;\n        return c(), d(ae, {\n          key: W.path\n        }, [\n          U(W) ? (c(), d(\"p\", J_, f(U(W)), 1)) : g(\"\", !0),\n          o(\"div\", {\n            class: we([\"fe-grid__card\", {\n              \"fe-grid__card--folder\": W.type === \"dir\",\n              \"fe-grid__card--file\": W.type !== \"dir\",\n              \"is-selected\": Y(W),\n              \"is-dir\": W.type === \"dir\",\n              \"is-trash\": W.trashed,\n              \"is-clipped\": ($e = e.clipped) == null ? void 0 : $e.has(W.path),\n              \"is-droptarget\": ve.value === W.path\n            }]),\n            tabindex: \"0\",\n            role: \"option\",\n            \"aria-selected\": Y(W) ? \"true\" : \"false\",\n            \"aria-label\": s(v)(W),\n            \"data-fe-path\": W.path,\n            draggable: \"true\",\n            onClick: (ze) => J(W, ze),\n            onDblclick: (ze) => G(W),\n            onContextmenu: (ze) => N(W, ze),\n            onDragstart: (ze) => le(W, ze),\n            onDragover: (ze) => he(W, ze),\n            onDragleave: (ze) => oe(W),\n            onDrop: (ze) => ue(W, ze),\n            onTouchstartPassive: (ze) => s(Q).onTouchStart(W, ze),\n            onTouchend: Z[4] || (Z[4] = //@ts-ignore\n            (...ze) => s(Q).onTouchEnd && s(Q).onTouchEnd(...ze)),\n            onTouchmovePassive: Z[5] || (Z[5] = //@ts-ignore\n            (...ze) => s(Q).onTouchMove && s(Q).onTouchMove(...ze))\n          }, [\n            W.type !== \"dir\" ? (c(), d(\"div\", {\n              key: 0,\n              class: \"fe-grid__thumb\",\n              ref_for: !0,\n              ref: (ze) => z(ze, W)\n            }, [\n              $(W) ? (c(), d(ae, { key: 0 }, [\n                (c(!0), d(ae, null, Te(M(W), (ze) => (c(), d(\"div\", {\n                  key: \"fprev\",\n                  class: we([\"fe-fprev\", \"fe-fprev--\" + ze.kind]),\n                  style: Ct(ze.kind === \"table\" ? { \"--fprev-cols\": String(ze.cols) } : void 0),\n                  \"aria-hidden\": \"true\"\n                }, [\n                  ze.kind === \"table\" ? (c(!0), d(ae, { key: 0 }, Te(ze.rows, (Ne, be) => (c(), d(ae, { key: be }, [\n                    (c(!0), d(ae, null, Te(Ne, (De, ie) => (c(), d(\"span\", {\n                      key: ie,\n                      class: we([\"fe-fprev__cell\", { \"is-head\": be === 0 }])\n                    }, f(De), 3))), 128))\n                  ], 64))), 128)) : (c(!0), d(ae, { key: 1 }, Te(ze.lines, (Ne, be) => (c(), d(\"div\", {\n                    key: be,\n                    class: \"fe-fprev__line\"\n                  }, [\n                    Ne.tint ? (c(), d(\"span\", Q_, f(Ne.indent) + f(Ne.tint), 1)) : g(\"\", !0),\n                    Je(f(Ne.text), 1)\n                  ]))), 128))\n                ], 6))), 128)),\n                M(W).length === 0 ? (c(), d(\"span\", {\n                  key: 0,\n                  class: \"fe-grid__icon fe-grid__icon--svg\",\n                  innerHTML: s(fn)(W)\n                }, null, 8, ew)) : g(\"\", !0)\n              ], 64)) : x(W) ? (c(), d(\"img\", {\n                key: 1,\n                src: x(W),\n                alt: W.basename,\n                class: we({\n                  \"fe-thumb--page\": s(Wi)(W)\n                  /* gorunum:v1-preview — crop a page from its TOP */\n                }),\n                loading: \"lazy\",\n                draggable: \"false\"\n              }, null, 10, tw)) : s(Ls)(W) ? (c(), d(\"span\", {\n                key: 2,\n                class: \"fe-grid__icon fe-grid__icon--svg\",\n                role: \"img\",\n                \"aria-label\": s(a)(\"e2e.badge\"),\n                innerHTML: s(Ds)()\n              }, null, 8, nw)) : (c(), d(\"span\", {\n                key: 3,\n                class: \"fe-grid__icon fe-grid__icon--svg\",\n                innerHTML: s(fn)(W)\n              }, null, 8, aw)),\n              !$(W) && x(W) && s(Pd)(W) ? (c(), d(\"span\", ow)) : g(\"\", !0),\n              T(W) ? (c(), d(\"div\", {\n                key: 5,\n                class: \"fe-grid__star\",\n                onClick: Z[0] || (Z[0] = Re(() => {\n                }, [\"stop\"])),\n                onDblclick: Z[1] || (Z[1] = Re(() => {\n                }, [\"stop\"]))\n              }, [\n                Ge(er, {\n                  starred: !!((Se = e.starredIds) != null && Se.has(W.id)),\n                  \"node-id\": W.id,\n                  \"api-base\": e.apiBase,\n                  \"auth-headers\": e.authHeaders,\n                  \"auth-credentials\": e.authCredentials,\n                  locale: e.locale,\n                  compact: \"\",\n                  card: \"\",\n                  onChange: (ze) => r(\"star-change\", W, ze)\n                }, null, 8, [\"starred\", \"node-id\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"locale\", \"onChange\"])\n              ], 32)) : g(\"\", !0)\n            ], 512)) : g(\"\", !0),\n            o(\"div\", sw, [\n              o(\"span\", {\n                class: we([\"fe-grid__lead\", { \"fe-grid__lead--pick\": e.selectable }])\n              }, [\n                s(Ls)(W) ? (c(), d(\"span\", {\n                  key: 0,\n                  class: \"fe-grid__tile fe-grid__tile--svg\",\n                  role: \"img\",\n                  \"aria-label\": s(a)(\"e2e.badge\"),\n                  innerHTML: s(Ds)()\n                }, null, 8, rw)) : (c(), d(\"span\", {\n                  key: 1,\n                  class: \"fe-grid__tile fe-grid__tile--svg\",\n                  innerHTML: s(fn)(W)\n                }, null, 8, iw)),\n                e.selectable ? (c(), d(\"span\", {\n                  key: 2,\n                  class: \"fe-item-check\",\n                  \"data-fe-control\": \"\",\n                  onClick: Re((ze) => O(W, ze), [\"stop\"]),\n                  onDblclick: Z[2] || (Z[2] = Re(() => {\n                  }, [\"stop\"]))\n                }, [\n                  Ge(Yi, {\n                    on: Y(W),\n                    label: s(v)(W)\n                  }, null, 8, [\"on\", \"label\"])\n                ], 40, lw)) : g(\"\", !0)\n              ], 2),\n              o(\"div\", cw, [\n                o(\"div\", {\n                  class: \"fe-grid__label\",\n                  title: W.basename\n                }, [\n                  Je(f(s(v)(W)) + \" \", 1),\n                  e.keepBadgeFor && e.keepBadgeFor(W) ? (c(), d(\"span\", {\n                    key: 0,\n                    class: we([\"fe-keepbadge\", \"fe-keepbadge--\" + e.keepBadgeFor(W)]),\n                    title: s(a)(\"keep.badge_\" + e.keepBadgeFor(W)),\n                    role: \"img\",\n                    \"aria-label\": s(a)(\"keep.badge_\" + e.keepBadgeFor(W))\n                  }, f(S(e.keepBadgeFor(W))), 11, dw)) : g(\"\", !0)\n                ], 8, uw),\n                o(\"div\", fw, f(re(W)), 1),\n                e.showParentPath && s(ya)(W.path) ? (c(), d(\"div\", {\n                  key: 0,\n                  class: \"fe-grid__parent\",\n                  title: s(ya)(W.path)\n                }, f(s(ya)(W.path)), 9, pw)) : g(\"\", !0),\n                w(W) ? (c(), d(\"div\", {\n                  key: 1,\n                  class: \"fe-grid__snippet\",\n                  title: j(w(W))\n                }, [\n                  (c(!0), d(ae, null, Te(s(Vs)(w(W)), (ze, Ne) => (c(), d(ae, { key: Ne }, [\n                    ze.match ? (c(), d(\"mark\", hw, f(ze.text), 1)) : (c(), d(ae, { key: 1 }, [\n                      Je(f(ze.text), 1)\n                    ], 64))\n                  ], 64))), 128))\n                ], 8, vw)) : g(\"\", !0)\n              ]),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-grid__menu\",\n                \"aria-label\": s(a)(\"toolbar.more\"),\n                title: s(a)(\"toolbar.more\"),\n                onClick: Re((ze) => P(W, ze), [\"stop\"]),\n                onDblclick: Z[3] || (Z[3] = Re(() => {\n                }, [\"stop\"]))\n              }, \"⋮\", 40, mw)\n            ])\n          ], 42, Z_)\n        ], 64);\n      }), 128)),\n      !e.loading && e.files.length === 0 ? (c(), d(\"div\", yw, f(s(a)(\"empty.folder\")), 1)) : g(\"\", !0)\n    ], 10, X_));\n  }\n}), bw = {\n  class: \"fe-home\",\n  \"data-testid\": \"home-view\"\n}, gw = {\n  class: \"fe-home__section\",\n  \"data-testid\": \"home-storages\"\n}, kw = { class: \"fe-home__heading\" }, _w = {\n  key: 0,\n  class: \"fe-home__storages\"\n}, ww = [\"data-storage\", \"title\", \"onClick\"], $w = [\"innerHTML\"], xw = { class: \"fe-home__storage-main\" }, Sw = { class: \"fe-home__storage-label\" }, Cw = { class: \"fe-home__storage-meta\" }, Tw = {\n  key: 1,\n  class: \"fe-home__nomatch\",\n  \"data-testid\": \"home-storages-nomatch\"\n}, Mw = {\n  key: 2,\n  class: \"fe-state fe-home__state\",\n  \"data-testid\": \"home-storages-empty\"\n}, Ew = { class: \"fe-state__title\" }, zw = { class: \"fe-state__hint\" }, Aw = {\n  class: \"fe-home__section\",\n  \"data-testid\": \"home-recent\"\n}, Pw = { class: \"fe-home__heading\" }, Lw = {\n  key: 1,\n  class: \"fe-home__loading\"\n}, Dw = {\n  key: 2,\n  class: \"fe-home__nomatch\",\n  \"data-testid\": \"home-recent-nomatch\"\n}, Ow = {\n  key: 3,\n  class: \"fe-state fe-home__state\",\n  \"data-testid\": \"home-recent-empty\"\n}, Bw = { class: \"fe-state__title\" }, Iw = { class: \"fe-state__hint\" }, Hw = {\n  class: \"fe-home__section\",\n  \"data-testid\": \"home-starred\"\n}, Fw = { class: \"fe-home__heading\" }, Nw = {\n  key: 1,\n  class: \"fe-home__loading\"\n}, Kw = {\n  key: 2,\n  class: \"fe-home__nomatch\",\n  \"data-testid\": \"home-starred-nomatch\"\n}, Rw = {\n  key: 3,\n  class: \"fe-state fe-home__state\",\n  \"data-testid\": \"home-starred-empty\"\n}, Uw = { class: \"fe-state__title\" }, Vw = { class: \"fe-state__hint\" }, jw = /* @__PURE__ */ qe({\n  __name: \"HomeView\",\n  props: {\n    storages: {},\n    recent: {},\n    starred: {},\n    loading: { type: Boolean },\n    locale: {},\n    nameFilter: {},\n    thumbSrc: { type: Function }\n  },\n  emits: [\"open-storage\", \"open-node\", \"context-node\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u } = tt(() => n.locale), v = k(() => (n.nameFilter ?? \"\").trim()), p = k(() => v.value !== \"\"), h = k(\n      () => n.storages.filter((x) => Ss(x.label || x.name, v.value))\n    ), b = k(\n      () => n.recent.filter((x) => Ss(x.basename || \"\", v.value))\n    ), y = k(\n      () => n.starred.filter((x) => Ss(x.basename || \"\", v.value))\n    );\n    function A(x, E) {\n      return p.value && x > 0 && E === 0;\n    }\n    const D = /* @__PURE__ */ new Set(), C = fn({ type: \"dir\", mime_type: \"inode/storage\" });\n    function B(x) {\n      const E = typeof x.usedBytes == \"number\" && x.usedBytes >= 0 ? a(\"drive.storage.used_unlimited\", { used: u(x.usedBytes) }) : a(\"conn.guide.storage\");\n      return x.readOnly ? `${E} · ${a(\"sidenav.storage.readOnly\")}` : E;\n    }\n    const I = m({ path: \"\", at: 0 });\n    function U(x) {\n      const E = Date.now();\n      x.path === I.value.path && E - I.value.at < 700 || (I.value = { path: x.path, at: E }, r(\"open-node\", x));\n    }\n    return (x, E) => (c(), d(\"div\", bw, [\n      o(\"section\", gw, [\n        o(\"h2\", kw, f(s(a)(\"sidenav.storages\")), 1),\n        h.value.length ? (c(), d(\"div\", _w, [\n          (c(!0), d(ae, null, Te(h.value, ($) => (c(), d(\"button\", {\n            key: $.name,\n            type: \"button\",\n            class: \"fe-home__storage\",\n            \"data-testid\": \"home-storage-card\",\n            \"data-storage\": $.name,\n            title: $.label || $.name,\n            onClick: (M) => r(\"open-storage\", $.name)\n          }, [\n            o(\"span\", {\n              class: \"fe-home__storage-tile\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(C)\n            }, null, 8, $w),\n            o(\"span\", xw, [\n              o(\"span\", Sw, f($.label || $.name), 1),\n              o(\"span\", Cw, f(B($)), 1)\n            ])\n          ], 8, ww))), 128))\n        ])) : A(e.storages.length, h.value.length) ? (c(), d(\"p\", Tw, f(s(a)(\"filter.empty.title\")), 1)) : (c(), d(\"div\", Mw, [\n          E[2] || (E[2] = o(\"svg\", {\n            class: \"fe-state__art\",\n            viewBox: \"0 0 120 100\",\n            width: \"96\",\n            height: \"80\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\"\n          }, [\n            o(\"rect\", {\n              x: \"26\",\n              y: \"30\",\n              width: \"68\",\n              height: \"18\",\n              rx: \"5\"\n            }),\n            o(\"rect\", {\n              x: \"26\",\n              y: \"54\",\n              width: \"68\",\n              height: \"18\",\n              rx: \"5\"\n            }),\n            o(\"path\", { d: \"M38 39h.01M38 63h.01\" })\n          ], -1)),\n          o(\"p\", Ew, f(s(a)(\"home.storages.empty\")), 1),\n          o(\"p\", zw, f(s(a)(\"home.storages.hint\")), 1)\n        ]))\n      ]),\n      o(\"section\", Aw, [\n        o(\"h2\", Pw, f(s(a)(\"sidenav.recent\")), 1),\n        b.value.length ? (c(), et(bi, {\n          key: 0,\n          files: b.value,\n          selected: s(D),\n          selectable: !1,\n          locale: e.locale,\n          \"thumb-src\": e.thumbSrc,\n          onClickCard: U,\n          onDblCard: U,\n          onContextCard: E[0] || (E[0] = ($, M) => r(\"context-node\", $, M))\n        }, null, 8, [\"files\", \"selected\", \"locale\", \"thumb-src\"])) : e.loading ? (c(), d(\"p\", Lw, f(s(a)(\"loading\")), 1)) : A(e.recent.length, b.value.length) ? (c(), d(\"p\", Dw, f(s(a)(\"filter.empty.title\")), 1)) : (c(), d(\"div\", Ow, [\n          E[3] || (E[3] = o(\"svg\", {\n            class: \"fe-state__art\",\n            viewBox: \"0 0 120 100\",\n            width: \"96\",\n            height: \"80\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\"\n          }, [\n            o(\"circle\", {\n              cx: \"60\",\n              cy: \"50\",\n              r: \"28\"\n            }),\n            o(\"path\", { d: \"M60 32v18l12 8\" })\n          ], -1)),\n          o(\"p\", Bw, f(s(a)(\"empty.recent.title\")), 1),\n          o(\"p\", Iw, f(s(a)(\"empty.recent.hint\")), 1)\n        ]))\n      ]),\n      o(\"section\", Hw, [\n        o(\"h2\", Fw, f(s(a)(\"sidenav.starred\")), 1),\n        y.value.length ? (c(), et(bi, {\n          key: 0,\n          files: y.value,\n          selected: s(D),\n          selectable: !1,\n          locale: e.locale,\n          \"thumb-src\": e.thumbSrc,\n          onClickCard: U,\n          onDblCard: U,\n          onContextCard: E[1] || (E[1] = ($, M) => r(\"context-node\", $, M))\n        }, null, 8, [\"files\", \"selected\", \"locale\", \"thumb-src\"])) : e.loading ? (c(), d(\"p\", Nw, f(s(a)(\"loading\")), 1)) : A(e.starred.length, y.value.length) ? (c(), d(\"p\", Kw, f(s(a)(\"filter.empty.title\")), 1)) : (c(), d(\"div\", Rw, [\n          E[4] || (E[4] = o(\"svg\", {\n            class: \"fe-state__art\",\n            viewBox: \"0 0 120 100\",\n            width: \"96\",\n            height: \"80\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\"\n          }, [\n            o(\"path\", { d: \"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\" })\n          ], -1)),\n          o(\"p\", Uw, f(s(a)(\"empty.starred.title\")), 1),\n          o(\"p\", Vw, f(s(a)(\"empty.starred.hint\")), 1)\n        ]))\n      ])\n    ]));\n  }\n});\nfunction wa(e) {\n  if (e.apiBase != null) return e.apiBase.replace(/\\/+$/, \"\");\n  const t = e.endpoint ?? \"\", n = t.indexOf(\"/api/\");\n  return n >= 0 ? t.slice(0, n) : \"\";\n}\nfunction Yw(e, t) {\n  const n = String(t ?? \"\").trim();\n  if (/^https?:\\/\\/[^/]/i.test(n)) return n.replace(/\\/+$/, \"\");\n  const r = wa(e);\n  if (/^https?:\\/\\//i.test(r))\n    try {\n      return new URL(r).origin;\n    } catch {\n      return r;\n    }\n  return typeof window < \"u\" && window.location ? window.location.origin : r;\n}\nfunction Ww(e) {\n  const t = Ya(e), n = wa(e), r = (G) => `${n}${G}`, a = wn([]), u = wn([]), v = wn([]), p = m(null), h = m(null), b = m(!1), y = m(!1), A = m(null), D = m(null), C = m(null);\n  function B(G) {\n    return G == null ? void 0 : G.status;\n  }\n  function I(G) {\n    const N = G;\n    return (N == null ? void 0 : N.message) || String(G);\n  }\n  async function U() {\n    b.value = !0, A.value = null;\n    try {\n      const G = t.capabilities().then((N) => {\n        const P = N == null ? void 0 : N.public_url;\n        h.value = typeof P == \"string\" && P ? P : null;\n      }).catch(() => {\n        h.value = null;\n      });\n      try {\n        const N = await t.jsonFetch(r(\"/api/auth/me\"));\n        p.value = (N == null ? void 0 : N.user) ?? null;\n      } catch (N) {\n        B(N) === 401 && (D.value = !1, C.value = \"anonymous\"), p.value = null;\n      }\n      try {\n        a.value = await t.jsonFetch(\n          r(\"/api/admin/storage-drivers\")\n        ), D.value = !0, C.value = null;\n      } catch (N) {\n        a.value = [], D.value = !1;\n        const P = B(N);\n        P === 403 ? C.value = \"none\" : P === 401 ? C.value = \"anonymous\" : (C.value = \"unreachable\", A.value = I(N));\n      }\n      if (D.value)\n        try {\n          const N = await t.jsonFetch(r(\"/api/admin/storages\"));\n          u.value = Array.isArray(N) ? N : [], v.value = u.value.map((P) => P.name);\n        } catch (N) {\n          A.value = I(N);\n        }\n      else\n        try {\n          const N = await t.index(\"\");\n          v.value = Array.isArray(N == null ? void 0 : N.storages) ? N.storages : [];\n        } catch {\n          v.value = [];\n        }\n      await G, y.value = !0;\n    } finally {\n      b.value = !1;\n    }\n  }\n  async function x(G) {\n    const N = await t.jsonFetch(r(\"/api/admin/storages\"), {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(G)\n    });\n    return await U(), N;\n  }\n  async function E(G, N) {\n    const P = await t.jsonFetch(r(`/api/admin/storages/${G}`), {\n      method: \"PATCH\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(N)\n    });\n    return await U(), P;\n  }\n  async function $(G) {\n    await t.jsonFetch(r(`/api/admin/storages/${G}`), { method: \"DELETE\" }), await U();\n  }\n  async function M(G) {\n    try {\n      return await t.jsonFetch(r(\"/api/admin/storages/test\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(G)\n      });\n    } catch (N) {\n      return { ok: !1, error: I(N) };\n    }\n  }\n  function z(G) {\n    return a.value.find((N) => N.driver === G);\n  }\n  function T(G) {\n    var N;\n    return ((N = z(G)) == null ? void 0 : N.fields) ?? [];\n  }\n  function Y(G) {\n    const N = {};\n    for (const P of T(G))\n      P.default !== void 0 && P.default !== null && (N[P.key] = P.default);\n    return N;\n  }\n  function O(G, N) {\n    return T(G).filter((P) => {\n      if (!P.required || P.default !== void 0) return !1;\n      for (const le of [P.key, ...P.aliases ?? []]) {\n        const ve = N[le];\n        if (ve != null && !(typeof ve == \"string\" && ve.trim() === \"\"))\n          return !1;\n      }\n      return !0;\n    });\n  }\n  const J = k(() => a.value.map((G) => G.driver));\n  return {\n    // state\n    drivers: a,\n    driverNames: J,\n    storages: u,\n    visible: v,\n    me: p,\n    publicUrl: h,\n    loading: b,\n    loaded: y,\n    error: A,\n    canManage: D,\n    denial: C,\n    // actions\n    load: U,\n    createStorage: x,\n    updateStorage: E,\n    deleteStorage: $,\n    testStorage: M,\n    // descriptor helpers\n    descriptor: z,\n    fields: T,\n    defaults: Y,\n    missingRequired: O\n  };\n}\nfunction ka(e) {\n  try {\n    return new URL(e).host;\n  } catch {\n    return e.replace(/^https?:\\/\\//i, \"\").replace(/\\/+$/, \"\");\n  }\n}\nfunction Bd(e) {\n  return /^http:\\/\\//i.test(e);\n}\nfunction Ji(e, t) {\n  return e.user || t(\"conn.guide.userPlaceholder\");\n}\nconst qw = (e, t) => {\n  const n = e.origin.replace(/\\/+$/, \"\"), r = `${n}/dav/`, a = e.storage ? `${n}/dav/${e.storage}/` : r, u = Ji(e, t), v = t(\"conn.guide.secretPlaceholder\"), p = [\n    { label: t(\"conn.guide.fact.url\"), value: a, hint: e.storage ? t(\"conn.guide.fact.urlStorageHint\", { storage: e.storage }) : t(\"conn.guide.fact.urlRootHint\") },\n    { label: t(\"conn.guide.fact.user\"), value: u, hint: t(\"conn.guide.webdav.userHint\") },\n    { label: t(\"conn.guide.fact.password\"), value: v, hint: t(\"conn.guide.webdav.passwordHint\"), placeholderOnly: !0 }\n  ], h = [\n    {\n      id: \"windows\",\n      name: \"Windows Explorer\",\n      platform: \"windows\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.webdav.win.s1\"),\n            t(\"conn.guide.webdav.win.s2\", { url: a }),\n            t(\"conn.guide.webdav.win.s3\")\n          ]\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.webdav.win.cmdCaption\"),\n          code: `net use Z: \"${a}\" /user:${u} ${v} /persistent:yes`\n        },\n        {\n          kind: \"warn\",\n          text: t(\"conn.guide.webdav.win.limits\")\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.webdav.win.regCaption\"),\n          code: [\n            'reg add \"HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\WebClient\\\\Parameters\" /v FileSizeLimitInBytes /t REG_DWORD /d 4294967295 /f',\n            'reg add \"HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\WebClient\\\\Parameters\" /v FileAttributesLimitInBytes /t REG_DWORD /d 20000000 /f',\n            \"net stop webclient && net start webclient\"\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.webdav.win.https\") },\n        { kind: \"note\", text: t(\"conn.guide.webdav.win.persist\") },\n        { kind: \"note\", text: t(\"conn.guide.webdav.win.service\") }\n      ]\n    },\n    {\n      id: \"macos\",\n      name: \"macOS Finder\",\n      platform: \"macos\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.webdav.mac.s1\"),\n            t(\"conn.guide.webdav.mac.s2\", { url: a }),\n            t(\"conn.guide.webdav.mac.s3\")\n          ]\n        },\n        { kind: \"note\", text: t(\"conn.guide.webdav.mac.note\") }\n      ]\n    },\n    {\n      id: \"linux\",\n      name: \"Linux (davfs2 / GNOME / KDE)\",\n      platform: \"linux\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.webdav.linux.mountCaption\"),\n          code: [\n            `sudo mount -t davfs ${a} /mnt/filex`,\n            \"\",\n            `# ${t(\"conn.guide.webdav.linux.gvfsComment\")}`,\n            `gio mount ${a.replace(/^https:/i, \"davs:\").replace(/^http:/i, \"dav:\")}`\n          ].join(`\n`)\n        },\n        {\n          kind: \"warn\",\n          text: t(\"conn.guide.webdav.linux.locks\")\n        },\n        {\n          kind: \"code\",\n          caption: \"/etc/davfs2/davfs2.conf\",\n          code: \"use_locks 0\"\n        }\n      ]\n    },\n    {\n      id: \"rclone\",\n      name: \"rclone\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.webdav.rclone.obscureCaption\"),\n          code: `rclone obscure \"${v}\"`\n        },\n        {\n          kind: \"code\",\n          caption: \"~/.config/rclone/rclone.conf\",\n          code: [\n            \"[filex]\",\n            \"type = webdav\",\n            `url = ${n}/dav`,\n            \"vendor = other\",\n            `user = ${u}`,\n            `pass = ${t(\"conn.guide.webdav.rclone.passPlaceholder\")}`\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.webdav.rclone.useCaption\"),\n          code: [\n            \"rclone lsd filex:\",\n            e.storage ? `rclone lsl filex:${e.storage}` : \"rclone lsl filex:<storage>\",\n            e.storage ? `rclone copy ./local filex:${e.storage}/backup` : \"rclone copy ./local filex:<storage>/backup\",\n            \"rclone mount filex: /mnt/filex\"\n          ].join(`\n`)\n        }\n      ]\n    },\n    {\n      id: \"cyberduck\",\n      name: \"Cyberduck / Mountain Duck\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.webdav.duck.s1\"),\n            t(\"conn.guide.webdav.duck.s2\", { host: ka(n) }),\n            t(\"conn.guide.webdav.duck.s3\", { path: e.storage ? `/dav/${e.storage}/` : \"/dav/\" }),\n            t(\"conn.guide.webdav.duck.s4\", { user: u })\n          ]\n        }\n      ]\n    }\n  ], b = [\n    { kind: \"note\", text: t(\"conn.guide.webdav.note.delete\") },\n    { kind: \"note\", text: t(\"conn.guide.webdav.note.locks\") },\n    { kind: \"note\", text: t(\"conn.guide.webdav.note.permissions\") }\n  ];\n  return Bd(n) && b.unshift({ kind: \"warn\", text: t(\"conn.guide.webdav.note.http\") }), {\n    id: \"webdav\",\n    name: \"WebDAV\",\n    summary: t(\"conn.guide.webdav.summary\"),\n    facts: p,\n    clients: h,\n    notes: b\n  };\n}, Gw = (e, t) => {\n  const n = (e.s3Endpoint || `${e.origin.replace(/\\/+$/, \"\")}/s3`).replace(/\\/+$/, \"\"), r = e.storage || e.storages[0] || \"<bucket>\", a = e.s3AccessKeyID || t(\"conn.guide.s3.keyPlaceholder\"), u = e.s3Secret || t(\"conn.guide.s3.secretPlaceholder\"), v = e.s3PathStyle !== !1, p = ka(n), h = [\n    { label: t(\"conn.guide.s3.fact.endpoint\"), value: n, hint: t(\"conn.guide.s3.fact.endpointHint\") },\n    { label: t(\"conn.guide.s3.fact.bucket\"), value: r, hint: t(\"conn.guide.s3.fact.bucketHint\") },\n    { label: t(\"conn.guide.s3.fact.key\"), value: a, hint: t(\"conn.guide.s3.fact.keyHint\") },\n    {\n      label: t(\"conn.guide.s3.fact.secret\"),\n      value: u,\n      hint: t(\"conn.guide.s3.fact.secretHint\"),\n      // ⚠ Only real right after minting. filex stores the secret sealed and\n      // cannot show it again, and a guide that printed something secret-shaped\n      // would be teaching a value that authenticates as nothing.\n      placeholderOnly: !e.s3Secret\n    },\n    { label: t(\"conn.guide.s3.fact.region\"), value: \"us-east-1\", hint: t(\"conn.guide.s3.fact.regionHint\") },\n    {\n      label: t(\"conn.guide.s3.fact.addressing\"),\n      value: t(v ? \"conn.guide.s3.fact.pathStyle\" : \"conn.guide.s3.fact.virtualHosted\"),\n      hint: t(v ? \"conn.guide.s3.fact.pathStyleHint\" : \"conn.guide.s3.fact.virtualHostedHint\")\n    }\n  ], b = [\n    {\n      id: \"rclone\",\n      name: \"rclone\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: \"~/.config/rclone/rclone.conf\",\n          code: [\n            \"[filex]\",\n            \"type = s3\",\n            \"provider = Other\",\n            `endpoint = ${n}`,\n            `access_key_id = ${a}`,\n            `secret_access_key = ${u}`,\n            \"region = us-east-1\",\n            ...v ? [\"force_path_style = true\"] : []\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.rclone.useCaption\"),\n          code: [\n            \"rclone lsd filex:\",\n            `rclone copy ./local filex:${r}/backup -P`,\n            `rclone sync ./local filex:${r}/backup`,\n            `rclone mount filex:${r} /mnt/filex`\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.s3.rclone.mtime\") }\n      ]\n    },\n    {\n      id: \"awscli\",\n      name: \"AWS CLI\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.aws.configureCaption\"),\n          code: [\n            \"aws configure set aws_access_key_id \" + a,\n            \"aws configure set aws_secret_access_key \" + u,\n            \"aws configure set region us-east-1\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.aws.useCaption\"),\n          code: [\n            `aws --endpoint-url ${n} s3 ls`,\n            `aws --endpoint-url ${n} s3 cp ./file.pdf s3://${r}/file.pdf`,\n            `aws --endpoint-url ${n} s3 sync ./local s3://${r}/backup`,\n            `aws --endpoint-url ${n} s3 presign s3://${r}/file.pdf --expires-in 300`\n          ].join(`\n`)\n        },\n        ...v ? [\n          {\n            kind: \"note\",\n            text: t(\"conn.guide.s3.aws.pathStyle\")\n          },\n          {\n            kind: \"code\",\n            caption: \"~/.aws/config\",\n            code: [\"[default]\", \"s3 =\", \"    addressing_style = path\"].join(`\n`)\n          }\n        ] : []\n      ]\n    },\n    {\n      id: \"restic\",\n      name: \"restic\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.restic.envCaption\"),\n          code: [\n            `export AWS_ACCESS_KEY_ID=${a}`,\n            `export AWS_SECRET_ACCESS_KEY=${u}`,\n            `export RESTIC_REPOSITORY=\"s3:${n}/${r}/restic\"`,\n            \"export RESTIC_PASSWORD=…\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.restic.useCaption\"),\n          code: [\n            `restic init${v ? \" -o s3.bucket-lookup=path\" : \"\"}`,\n            `restic backup ~/Documents${v ? \" -o s3.bucket-lookup=path\" : \"\"}`,\n            `restic check --read-data${v ? \" -o s3.bucket-lookup=path\" : \"\"}`,\n            `restic forget --keep-daily 7 --prune${v ? \" -o s3.bucket-lookup=path\" : \"\"}`\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.s3.restic.verified\") }\n      ]\n    },\n    {\n      id: \"mc\",\n      name: \"MinIO Client (mc)\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.mc.aliasCaption\"),\n          code: `mc alias set filex ${n} ${a} ${u} --api S3v4${v ? \" --path on\" : \"\"}`\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.mc.useCaption\"),\n          code: [\n            \"mc ls filex\",\n            `mc cp ./file.pdf filex/${r}/file.pdf`,\n            `mc mirror ./local filex/${r}/backup`,\n            `mc du filex/${r}`\n          ].join(`\n`)\n        }\n      ]\n    },\n    {\n      id: \"s3fs\",\n      name: \"s3fs (Linux / macOS)\",\n      platform: \"linux\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.s3fs.credsCaption\"),\n          code: [\n            `echo \"${a}:${u}\" > ~/.passwd-s3fs`,\n            \"chmod 600 ~/.passwd-s3fs\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.s3.s3fs.mountCaption\"),\n          code: [\n            `s3fs ${r} /mnt/filex \\\\`,\n            \"  -o passwd_file=~/.passwd-s3fs \\\\\",\n            `  -o url=${n} \\\\`,\n            ...v ? [\"  -o use_path_request_style\"] : []\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.s3.s3fs.note\") }\n      ]\n    },\n    {\n      id: \"cyberduck\",\n      name: \"Cyberduck / Mountain Duck\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.s3.duck.s1\"),\n            t(\"conn.guide.s3.duck.s2\", { host: p }),\n            t(\"conn.guide.s3.duck.s3\", { key: a }),\n            t(\"conn.guide.s3.duck.s4\")\n          ]\n        },\n        ...v ? [{ kind: \"warn\", text: t(\"conn.guide.s3.duck.pathStyle\") }] : []\n      ]\n    },\n    {\n      id: \"sdk\",\n      name: \"SDK (Go / Python / JS)\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: \"boto3\",\n          code: [\n            \"import boto3\",\n            \"s3 = boto3.client(\",\n            '    \"s3\",',\n            `    endpoint_url=\"${n}\",`,\n            `    aws_access_key_id=\"${a}\",`,\n            `    aws_secret_access_key=\"${u}\",`,\n            '    region_name=\"us-east-1\",',\n            ...v ? [\n              '    config=boto3.session.Config(s3={\"addressing_style\": \"path\"}),'\n            ] : [],\n            \")\",\n            `print([o[\"Key\"] for o in s3.list_objects_v2(Bucket=\"${r}\").get(\"Contents\", [])])`\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.s3.sdk.note\") }\n      ]\n    }\n  ], y = [\n    { kind: \"note\", text: t(\"conn.guide.s3.note.buckets\") },\n    { kind: \"note\", text: t(\"conn.guide.s3.note.permissions\") },\n    { kind: \"note\", text: t(\"conn.guide.s3.note.trash\") },\n    { kind: \"note\", text: t(\"conn.guide.s3.note.mtime\") }\n  ];\n  return v && y.unshift({ kind: \"warn\", text: t(\"conn.guide.s3.note.pathStyle\") }), Bd(n) && y.unshift({ kind: \"warn\", text: t(\"conn.guide.s3.note.http\") }), {\n    id: \"s3\",\n    name: \"S3\",\n    summary: t(\"conn.guide.s3.summary\"),\n    facts: h,\n    clients: b,\n    notes: y\n  };\n}, Xw = (e, t) => {\n  const n = e.sftpHost || ka(e.origin), r = e.sftpPort || 2022, a = e.sftpLogin || Ji(e, t), u = e.storage ? `/${e.storage}` : \"/<storage>\", v = r === 22 ? \"\" : ` -P ${r}`, p = [\n    { label: t(\"conn.guide.sftp.fact.host\"), value: n, hint: t(\"conn.guide.sftp.fact.hostHint\") },\n    { label: t(\"conn.guide.sftp.fact.port\"), value: String(r), hint: t(\"conn.guide.sftp.fact.portHint\") },\n    { label: t(\"conn.guide.fact.user\"), value: a, hint: t(\"conn.guide.sftp.fact.userHint\") },\n    {\n      label: t(\"conn.guide.sftp.fact.auth\"),\n      value: e.sftpHasKey ? t(\"conn.guide.sftp.fact.authKey\") : t(\"conn.guide.sftp.fact.authPassword\"),\n      hint: t(\"conn.guide.sftp.fact.authHint\"),\n      placeholderOnly: !0\n    },\n    { label: t(\"conn.guide.sftp.fact.path\"), value: u, hint: t(\"conn.guide.sftp.fact.pathHint\") }\n  ], h = [\n    {\n      id: \"openssh\",\n      name: \"OpenSSH (sftp / scp)\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.sftp.openssh.connectCaption\"),\n          code: [\n            `sftp${v} ${a}@${n}`,\n            `scp${v} ./report.pdf ${a}@${n}:${u}/report.pdf`,\n            `scp${v} ${a}@${n}:${u}/report.pdf ./`\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: \"~/.ssh/config\",\n          code: [\n            \"Host filex\",\n            `  HostName ${n}`,\n            `  Port ${r}`,\n            `  User ${a}`,\n            \"  # IdentityFile ~/.ssh/id_ed25519\"\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.sftp.openssh.noShell\") }\n      ]\n    },\n    {\n      id: \"key\",\n      name: t(\"conn.guide.sftp.key.tab\"),\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.sftp.key.s1\"),\n            t(\"conn.guide.sftp.key.s2\"),\n            t(\"conn.guide.sftp.key.s3\")\n          ]\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.sftp.key.genCaption\"),\n          code: ['ssh-keygen -t ed25519 -C \"filex\"', \"cat ~/.ssh/id_ed25519.pub\"].join(`\n`)\n        },\n        // ⚠ The one command people reach for, and the one that cannot work.\n        { kind: \"warn\", text: t(\"conn.guide.sftp.key.noCopyId\") }\n      ]\n    },\n    {\n      id: \"winscp\",\n      name: \"WinSCP\",\n      platform: \"windows\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.sftp.winscp.s1\"),\n            t(\"conn.guide.sftp.winscp.s2\", { host: n, port: String(r) }),\n            t(\"conn.guide.sftp.winscp.s3\", { user: a }),\n            t(\"conn.guide.sftp.winscp.s4\")\n          ]\n        }\n      ]\n    },\n    {\n      id: \"filezilla\",\n      name: \"FileZilla\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.sftp.filezilla.s1\"),\n            t(\"conn.guide.sftp.filezilla.s2\", { host: `sftp://${n}`, port: String(r) }),\n            t(\"conn.guide.sftp.filezilla.s3\", { user: a })\n          ]\n        }\n      ]\n    },\n    {\n      id: \"rclone\",\n      name: \"rclone\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: \"~/.config/rclone/rclone.conf\",\n          code: [\n            \"[filex-sftp]\",\n            \"type = sftp\",\n            `host = ${n}`,\n            `port = ${r}`,\n            `user = ${a}`,\n            \"key_file = ~/.ssh/id_ed25519\",\n            \"# filex has no shell, so tell rclone not to look for one:\",\n            \"shell_type = none\",\n            \"md5sum_command = none\",\n            \"sha1sum_command = none\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.sftp.rclone.useCaption\"),\n          code: [\n            \"rclone lsd filex-sftp:\",\n            `rclone copy ./local filex-sftp:${u}/backup -P`,\n            `rclone sync ./local filex-sftp:${u}/backup`\n          ].join(`\n`)\n        }\n      ]\n    },\n    {\n      id: \"sshfs\",\n      name: \"sshfs (Linux / macOS)\",\n      platform: \"linux\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.sftp.sshfs.mountCaption\"),\n          code: [\n            `sshfs -p ${r} ${a}@${n}:${u} /mnt/filex`,\n            \"fusermount -u /mnt/filex\"\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.sftp.sshfs.note\") }\n      ]\n    }\n  ], b = [\n    { kind: \"note\", text: t(\"conn.guide.sftp.note.storages\") },\n    { kind: \"note\", text: t(\"conn.guide.sftp.note.permissions\") },\n    { kind: \"note\", text: t(\"conn.guide.sftp.note.trash\") },\n    { kind: \"note\", text: t(\"conn.guide.sftp.note.totp\") }\n  ];\n  return e.sftpEnabled === !1 && b.unshift({ kind: \"warn\", text: t(\"conn.guide.sftp.note.disabled\") }), {\n    id: \"sftp\",\n    name: \"SFTP\",\n    summary: t(\"conn.guide.sftp.summary\"),\n    facts: p,\n    clients: h,\n    notes: b\n  };\n}, Jw = (e, t) => {\n  const n = e.ftpsHost || ka(e.origin), r = e.ftpsPort || 2121, a = e.sftpLogin || Ji(e, t), u = t(\"conn.guide.secretPlaceholder\"), v = e.storage ? `/${e.storage}` : \"/<storage>\", p = e.ftpsPasvMin && e.ftpsPasvMax ? `${e.ftpsPasvMin}-${e.ftpsPasvMax}` : \"30000-30100\", h = [\n    { label: t(\"conn.guide.ftps.fact.host\"), value: n, hint: t(\"conn.guide.ftps.fact.hostHint\") },\n    { label: t(\"conn.guide.ftps.fact.port\"), value: String(r), hint: t(\"conn.guide.ftps.fact.portHint\") },\n    { label: t(\"conn.guide.ftps.fact.mode\"), value: t(\"conn.guide.ftps.fact.modeValue\"), hint: t(\"conn.guide.ftps.fact.modeHint\") },\n    { label: t(\"conn.guide.fact.user\"), value: a, hint: t(\"conn.guide.ftps.fact.userHint\") },\n    { label: t(\"conn.guide.fact.password\"), value: u, hint: t(\"conn.guide.ftps.fact.passwordHint\"), placeholderOnly: !0 },\n    { label: t(\"conn.guide.ftps.fact.pasv\"), value: p, hint: t(\"conn.guide.ftps.fact.pasvHint\") }\n  ], b = [\n    {\n      id: \"filezilla\",\n      name: \"FileZilla\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.ftps.filezilla.s1\"),\n            t(\"conn.guide.ftps.filezilla.s2\", { host: n, port: String(r) }),\n            t(\"conn.guide.ftps.filezilla.s3\", { user: a }),\n            t(\"conn.guide.ftps.filezilla.s4\")\n          ]\n        }\n      ]\n    },\n    {\n      id: \"winscp\",\n      name: \"WinSCP\",\n      platform: \"windows\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.ftps.winscp.s1\"),\n            t(\"conn.guide.ftps.winscp.s2\", { host: n, port: String(r) }),\n            t(\"conn.guide.ftps.winscp.s3\", { user: a })\n          ]\n        }\n      ]\n    },\n    {\n      id: \"curl\",\n      name: \"curl\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.ftps.curl.caption\"),\n          code: [\n            `curl --ssl-reqd --ftp-pasv --user ${a} \\\\`,\n            `  -T ./report.pdf \"ftp://${n}:${r}${v}/report.pdf\"`,\n            \"\",\n            `curl --ssl-reqd --ftp-pasv --user ${a} \\\\`,\n            `  -o ./report.pdf \"ftp://${n}:${r}${v}/report.pdf\"`\n          ].join(`\n`)\n        },\n        // ⚠ The flag that matters. Without it curl will happily fall back to\n        // plaintext against a server that allows it — this one does not, but\n        // the habit is what protects you against the ones that do.\n        { kind: \"note\", text: t(\"conn.guide.ftps.curl.sslReqd\") }\n      ]\n    },\n    {\n      id: \"lftp\",\n      name: \"lftp\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: \"~/.lftprc\",\n          code: [\n            \"set ftp:ssl-force true\",\n            \"set ftp:ssl-protect-data true\",\n            \"set ftp:passive-mode true\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.ftps.lftp.caption\"),\n          code: [\n            `lftp -u ${a} ftp://${n}:${r}`,\n            `# then: cd ${v}; put ./report.pdf; ls`\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.ftps.lftp.protectData\") }\n      ]\n    },\n    {\n      id: \"rclone\",\n      name: \"rclone\",\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: \"~/.config/rclone/rclone.conf\",\n          code: [\n            \"[filex-ftp]\",\n            \"type = ftp\",\n            `host = ${n}`,\n            `port = ${r}`,\n            `user = ${a}`,\n            '# rclone obscure \"<your password>\"',\n            \"pass = …\",\n            \"explicit_tls = true\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.ftps.rclone.useCaption\"),\n          code: [\n            \"rclone lsd filex-ftp:\",\n            `rclone copy ./local filex-ftp:${v}/backup -P`\n          ].join(`\n`)\n        }\n      ]\n    },\n    {\n      id: \"printer\",\n      name: t(\"conn.guide.ftps.printer.tab\"),\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.ftps.printer.s1\", { host: n, port: String(r) }),\n            t(\"conn.guide.ftps.printer.s2\", { user: a }),\n            t(\"conn.guide.ftps.printer.s3\", { path: v }),\n            t(\"conn.guide.ftps.printer.s4\")\n          ]\n        },\n        // ⚠ The honest warning: plenty of scan-to-FTP firmware cannot do TLS\n        // at all, and this endpoint will not talk to it. Saying so beats an\n        // afternoon spent debugging a device that was never going to connect.\n        { kind: \"warn\", text: t(\"conn.guide.ftps.printer.noTLS\") }\n      ]\n    }\n  ], y = [\n    { kind: \"warn\", text: t(\"conn.guide.ftps.note.tls\") },\n    { kind: \"note\", text: t(\"conn.guide.ftps.note.passive\") },\n    { kind: \"note\", text: t(\"conn.guide.ftps.note.storages\") },\n    { kind: \"note\", text: t(\"conn.guide.ftps.note.trash\") },\n    { kind: \"note\", text: t(\"conn.guide.ftps.note.prefer\") }\n  ];\n  return e.ftpsSelfSigned && y.push({ kind: \"warn\", text: t(\"conn.guide.ftps.note.selfSigned\") }), e.ftpsEnabled === !1 && y.unshift({ kind: \"warn\", text: t(\"conn.guide.ftps.note.disabled\") }), {\n    id: \"ftps\",\n    name: \"FTPS\",\n    summary: t(\"conn.guide.ftps.summary\"),\n    facts: h,\n    clients: b,\n    notes: y\n  };\n}, Zw = (e, t) => {\n  const n = e.nfsHost || ka(e.origin), r = e.nfsPort || 2049, a = e.nfsPath || t(\"conn.guide.nfs.pathPlaceholder\"), u = e.nfsReadOnly ? \",ro\" : \"\", v = `nfsvers=3,tcp,port=${r},mountport=${r},nolock${u}`, p = [\n    { label: t(\"conn.guide.nfs.fact.host\"), value: n, hint: t(\"conn.guide.nfs.fact.hostHint\") },\n    { label: t(\"conn.guide.nfs.fact.port\"), value: String(r), hint: t(\"conn.guide.nfs.fact.portHint\") },\n    {\n      label: t(\"conn.guide.nfs.fact.export\"),\n      value: a,\n      hint: t(\"conn.guide.nfs.fact.exportHint\"),\n      // ⚠ Only real right after minting: the path is stored hashed and cannot\n      // be shown again, and printing something path-shaped would produce a\n      // mount line that fails with no clue why.\n      placeholderOnly: !e.nfsPath\n    },\n    { label: t(\"conn.guide.nfs.fact.options\"), value: v, hint: t(\"conn.guide.nfs.fact.optionsHint\") }\n  ], h = [\n    {\n      id: \"linux\",\n      name: \"Linux\",\n      platform: \"linux\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.nfs.linux.mountCaption\"),\n          code: [\n            \"sudo mkdir -p /mnt/filex\",\n            `sudo mount -t nfs -o ${v} ${n}:${a} /mnt/filex`,\n            \"\",\n            \"# and to unmount:\",\n            \"sudo umount /mnt/filex\"\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: \"/etc/fstab\",\n          code: `${n}:${a}  /mnt/filex  nfs  ${v},_netdev,noauto,x-systemd.automount  0  0`\n        },\n        // ⚠ The warning that belongs next to the fstab line rather than in a\n        // document: that file is world-readable on most systems.\n        { kind: \"warn\", text: t(\"conn.guide.nfs.linux.fstabSecret\") }\n      ]\n    },\n    {\n      id: \"macos\",\n      name: \"macOS\",\n      platform: \"macos\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.nfs.mac.mountCaption\"),\n          code: [\n            \"sudo mkdir -p /Volumes/filex\",\n            `sudo mount -t nfs -o vers=3,tcp,port=${r},mountport=${r},nolock${u},resvport ${n}:${a} /Volumes/filex`\n          ].join(`\n`)\n        },\n        { kind: \"note\", text: t(\"conn.guide.nfs.mac.resvport\") }\n      ]\n    },\n    {\n      id: \"windows\",\n      name: \"Windows (Client for NFS)\",\n      platform: \"windows\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.nfs.win.s1\"),\n            t(\"conn.guide.nfs.win.s2\"),\n            t(\"conn.guide.nfs.win.s3\")\n          ]\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.nfs.win.cmdCaption\"),\n          code: `mount -o anon nolock ${n}:${a} Z:`\n        },\n        // ⚠ Windows' client has no way to say \"the mount service is on this\n        // port\", so it only works when filex is on 2049.\n        { kind: \"warn\", text: t(\"conn.guide.nfs.win.port\") }\n      ]\n    },\n    {\n      id: \"synology\",\n      name: t(\"conn.guide.nfs.nas.tab\"),\n      platform: \"any\",\n      blocks: [\n        {\n          kind: \"steps\",\n          steps: [\n            t(\"conn.guide.nfs.nas.s1\", { host: n, port: String(r) }),\n            t(\"conn.guide.nfs.nas.s2\"),\n            t(\"conn.guide.nfs.nas.s3\")\n          ]\n        }\n      ]\n    }\n  ], b = [\n    { kind: \"warn\", text: t(\"conn.guide.nfs.note.unencrypted\") },\n    { kind: \"warn\", text: t(\"conn.guide.nfs.note.pathIsSecret\") },\n    { kind: \"note\", text: t(\"conn.guide.nfs.note.noPortmapper\") },\n    { kind: \"note\", text: t(\"conn.guide.nfs.note.uid\") },\n    { kind: \"note\", text: t(\"conn.guide.nfs.note.trash\") },\n    { kind: \"note\", text: t(\"conn.guide.nfs.note.revoke\") }\n  ];\n  return e.nfsEnabled === !1 && b.unshift({ kind: \"warn\", text: t(\"conn.guide.nfs.note.disabled\") }), {\n    id: \"nfs\",\n    name: \"NFS\",\n    summary: t(\"conn.guide.nfs.summary\"),\n    facts: p,\n    clients: h,\n    notes: b\n  };\n}, Qw = (e, t) => {\n  const n = e.origin.replace(/\\/+$/, \"\"), r = e.storage || e.storages[0] || \"main\", a = [\n    { label: t(\"conn.guide.mount.fact.url\"), value: n, hint: t(\"conn.guide.mount.fact.urlHint\") },\n    {\n      label: t(\"conn.guide.mount.fact.token\"),\n      value: t(\"conn.guide.mount.fact.tokenPlaceholder\"),\n      hint: t(\"conn.guide.mount.fact.tokenHint\"),\n      // filex never has the plaintext of a token after it is minted, and a\n      // fact row that looked like one would be a lie the user pastes.\n      placeholderOnly: !0\n    },\n    { label: t(\"conn.guide.mount.fact.remote\"), value: `${r}://`, hint: t(\"conn.guide.mount.fact.remoteHint\") }\n  ], u = [\n    {\n      id: \"linux\",\n      name: \"Linux\",\n      platform: \"linux\",\n      blocks: [\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.mount.linux.mountCaption\"),\n          code: [\n            `export FILEX_URL=${n}`,\n            \"export FILEX_TOKEN=<token>\",\n            \"\",\n            \"mkdir -p ~/filex\",\n            \"filex mount ~/filex\",\n            \"\",\n            \"# one storage only, or a subfolder of it:\",\n            `filex mount --remote '${r}://' ~/filex`,\n            `filex mount --remote '${r}://projects/acme' --read-only ~/acme`\n          ].join(`\n`)\n        },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.mount.linux.umountCaption\"),\n          code: \"fusermount -u ~/filex\"\n        },\n        // ⚠ The one that costs an afternoon if it is not said: killing the\n        // process leaves a directory where every `ls` hangs.\n        { kind: \"warn\", text: t(\"conn.guide.mount.linux.umountWarn\") },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.mount.linux.systemdCaption\"),\n          code: [\n            \"# ~/.config/systemd/user/filex-mount.service\",\n            \"[Unit]\",\n            \"Description=filex mount\",\n            \"After=network-online.target\",\n            \"\",\n            \"[Service]\",\n            `Environment=FILEX_URL=${n}`,\n            \"Environment=FILEX_TOKEN=<token>\",\n            \"ExecStart=%h/.local/bin/filex mount %h/filex\",\n            \"ExecStop=/bin/fusermount -u %h/filex\",\n            \"Restart=on-failure\",\n            \"\",\n            \"[Install]\",\n            \"WantedBy=default.target\"\n          ].join(`\n`)\n        }\n      ]\n    },\n    {\n      id: \"windows\",\n      name: \"Windows\",\n      platform: \"windows\",\n      blocks: [\n        { kind: \"note\", text: t(\"conn.guide.mount.win.winfsp\") },\n        {\n          kind: \"code\",\n          caption: t(\"conn.guide.mount.win.mountCaption\"),\n          code: [\n            `$env:FILEX_URL   = \"${n}\"`,\n            '$env:FILEX_TOKEN = \"<token>\"',\n            \"\",\n            \"filex mount Z:\"\n          ].join(`\n`)\n        },\n        // ⚠ The drive letter is CREATED, not reused — pointing it at one that\n        // already exists is the commonest way this fails, and the message the\n        // driver gives for it says nothing useful.\n        { kind: \"warn\", text: t(\"conn.guide.mount.win.freeLetter\") },\n        { kind: \"note\", text: t(\"conn.guide.mount.win.stop\") }\n      ]\n    },\n    {\n      id: \"macos\",\n      name: \"macOS\",\n      platform: \"macos\",\n      blocks: [\n        // ⚠⚠ A refusal stated up front rather than discovered. macFUSE's Go\n        // binding needs a C toolchain filex deliberately does not use, and its\n        // licence forbids a commercial program from installing it. Pretending\n        // otherwise would mean a command that appears to work and does nothing.\n        { kind: \"warn\", text: t(\"conn.guide.mount.mac.unsupported\") },\n        { kind: \"note\", text: t(\"conn.guide.mount.mac.alternatives\") }\n      ]\n    }\n  ], v = [\n    { kind: \"note\", text: t(\"conn.guide.mount.note.notASync\") },\n    { kind: \"note\", text: t(\"conn.guide.mount.note.reachable\") },\n    { kind: \"note\", text: t(\"conn.guide.mount.note.wholeFileWrites\") },\n    { kind: \"note\", text: t(\"conn.guide.mount.note.trash\") },\n    { kind: \"note\", text: t(\"conn.guide.mount.note.revoke\") }\n  ];\n  return {\n    id: \"mount\",\n    name: \"filex mount\",\n    summary: t(\"conn.guide.mount.summary\"),\n    facts: a,\n    clients: u,\n    notes: v\n  };\n}, Id = {\n  webdav: qw,\n  s3: Gw,\n  sftp: Xw,\n  ftps: Jw,\n  nfs: Zw,\n  mount: Qw\n}, e1 = {\n  webdav: \"WebDAV\",\n  s3: \"S3\",\n  sftp: \"SFTP\",\n  ftps: \"FTPS\",\n  nfs: \"NFS\",\n  mount: \"filex mount\"\n};\nfunction t1(e) {\n  return e1[e] || e.toUpperCase();\n}\nfunction n1() {\n  return Object.keys(Id);\n}\nfunction a1(e, t, n) {\n  const r = Id[e];\n  return r ? r(t, n) : null;\n}\nconst o1 = { class: \"fe-cfield\" }, s1 = {\n  key: 0,\n  class: \"fe-cfield__empty\"\n}, r1 = {\n  key: 0,\n  class: \"fe-cfield__check\"\n}, i1 = [\"checked\", \"disabled\", \"onChange\"], l1 = [\"for\"], c1 = {\n  key: 0,\n  class: \"fe-cfield__req\",\n  \"aria-hidden\": \"true\"\n}, u1 = [\"id\", \"value\", \"disabled\", \"onChange\"], d1 = [\"value\"], f1 = [\"id\", \"value\", \"placeholder\", \"disabled\", \"onInput\"], p1 = {\n  key: 4,\n  class: \"fe-cfield__secret\"\n}, v1 = [\"id\", \"type\", \"value\", \"placeholder\", \"disabled\", \"onInput\"], h1 = [\"title\", \"aria-label\", \"onClick\"], m1 = [\"innerHTML\"], y1 = [\"id\", \"type\", \"value\", \"placeholder\", \"min\", \"max\", \"disabled\", \"onInput\"], b1 = {\n  key: 6,\n  class: \"fe-cfield__help\"\n}, g1 = {\n  key: 7,\n  class: \"fe-cfield__error\"\n}, k1 = {\n  key: 1,\n  class: \"fe-cfield__adv\"\n}, _1 = {\n  key: 0,\n  class: \"fe-cfield__advbody\"\n}, w1 = {\n  key: 0,\n  class: \"fe-cfield__check\"\n}, $1 = [\"checked\", \"disabled\", \"onChange\"], x1 = [\"for\"], S1 = [\"id\", \"type\", \"value\", \"placeholder\", \"disabled\", \"onInput\"], C1 = {\n  key: 2,\n  class: \"fe-cfield__help\"\n}, T1 = /* @__PURE__ */ qe({\n  __name: \"StorageFields\",\n  props: {\n    fields: {},\n    modelValue: {},\n    locale: {},\n    invalid: {},\n    disabled: { type: Boolean }\n  },\n  emits: [\"update:modelValue\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(!1), v = m({}), p = k(() => n.fields.filter((M) => !M.advanced)), h = k(() => n.fields.filter((M) => M.advanced));\n    function b(M) {\n      const z = a(M.i18n_key);\n      return z === M.i18n_key ? M.label : z;\n    }\n    function y(M) {\n      if (!M.help_i18n_key) return M.help ?? \"\";\n      const z = a(M.help_i18n_key);\n      return z === M.help_i18n_key ? M.help ?? \"\" : z;\n    }\n    function A(M) {\n      if (!M.i18n_key) return M.label;\n      const z = a(M.i18n_key);\n      return z === M.i18n_key ? M.label : z;\n    }\n    function D(M, z) {\n      r(\"update:modelValue\", { ...n.modelValue, [M]: z });\n    }\n    function C(M) {\n      var T, Y;\n      const z = (T = n.modelValue) == null ? void 0 : T[M.key];\n      if (z != null) return z;\n      for (const O of M.aliases ?? []) {\n        const J = (Y = n.modelValue) == null ? void 0 : Y[O];\n        if (J != null) return J;\n      }\n      return M.default ?? void 0;\n    }\n    function B(M) {\n      const z = C(M);\n      return z == null ? \"\" : String(z);\n    }\n    function I(M) {\n      const z = C(M);\n      return z === \"\" || z === void 0 || z === null ? \"\" : String(z);\n    }\n    function U(M) {\n      return C(M) === !0;\n    }\n    function x(M) {\n      return (n.invalid ?? []).includes(M.key);\n    }\n    function E(M) {\n      return M.type === \"int\" ? \"number\" : M.type === \"password\" && !v.value[M.key] ? \"password\" : \"text\";\n    }\n    function $(M) {\n      v.value = { ...v.value, [M]: !v.value[M] };\n    }\n    return (M, z) => (c(), d(\"div\", o1, [\n      e.fields.length ? g(\"\", !0) : (c(), d(\"p\", s1, f(s(a)(\"conn.form.noFields\")), 1)),\n      (c(!0), d(ae, null, Te(p.value, (T) => (c(), d(\"div\", {\n        key: T.key,\n        class: we([\"fe-cfield__row\", { \"is-invalid\": x(T) }])\n      }, [\n        T.type === \"bool\" ? (c(), d(\"label\", r1, [\n          o(\"input\", {\n            type: \"checkbox\",\n            checked: U(T),\n            disabled: e.disabled,\n            onChange: (Y) => D(T.key, Y.target.checked)\n          }, null, 40, i1),\n          o(\"span\", null, f(b(T)), 1)\n        ])) : (c(), d(\"label\", {\n          key: 1,\n          class: \"fe-cfield__label\",\n          for: `fe-cf-${T.key}`\n        }, [\n          Je(f(b(T)), 1),\n          T.required ? (c(), d(\"span\", c1, \"*\")) : g(\"\", !0)\n        ], 8, l1)),\n        T.type === \"select\" ? (c(), d(\"select\", {\n          key: 2,\n          id: `fe-cf-${T.key}`,\n          class: \"fe-cfield__input\",\n          value: B(T),\n          disabled: e.disabled,\n          onChange: (Y) => D(T.key, Y.target.value)\n        }, [\n          (c(!0), d(ae, null, Te(T.options ?? [], (Y) => (c(), d(\"option\", {\n            key: Y.value,\n            value: Y.value\n          }, f(A(Y)), 9, d1))), 128))\n        ], 40, u1)) : T.multiline ? (c(), d(\"textarea\", {\n          key: 3,\n          id: `fe-cf-${T.key}`,\n          class: we([\"fe-cfield__input fe-cfield__input--area\", { \"fe-cfield__input--mono\": T.monospace }]),\n          rows: \"4\",\n          value: B(T),\n          placeholder: T.placeholder,\n          disabled: e.disabled,\n          onInput: (Y) => D(T.key, Y.target.value)\n        }, null, 42, f1)) : T.type === \"password\" ? (c(), d(\"div\", p1, [\n          o(\"input\", {\n            id: `fe-cf-${T.key}`,\n            class: \"fe-cfield__input fe-cfield__input--mono\",\n            type: E(T),\n            autocomplete: \"new-password\",\n            spellcheck: \"false\",\n            value: B(T),\n            placeholder: T.placeholder,\n            disabled: e.disabled,\n            onInput: (Y) => D(T.key, Y.target.value)\n          }, null, 40, v1),\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-cfield__eye\",\n            title: v.value[T.key] ? s(a)(\"conn.form.hide\") : s(a)(\"conn.form.reveal\"),\n            \"aria-label\": v.value[T.key] ? s(a)(\"conn.form.hide\") : s(a)(\"conn.form.reveal\"),\n            onClick: (Y) => $(T.key)\n          }, [\n            o(\"span\", {\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(v.value[T.key] ? \"toggle-hidden\" : \"preview\")\n            }, null, 8, m1)\n          ], 8, h1)\n        ])) : T.type !== \"bool\" ? (c(), d(\"input\", {\n          key: 5,\n          id: `fe-cf-${T.key}`,\n          class: we([\"fe-cfield__input\", { \"fe-cfield__input--mono\": T.monospace }]),\n          type: E(T),\n          value: T.type === \"int\" ? I(T) : B(T),\n          placeholder: T.placeholder,\n          min: T.min,\n          max: T.max,\n          disabled: e.disabled,\n          onInput: (Y) => D(\n            T.key,\n            T.type === \"int\" ? Y.target.value === \"\" ? null : Number(Y.target.value) : Y.target.value\n          )\n        }, null, 42, y1)) : g(\"\", !0),\n        y(T) ? (c(), d(\"p\", b1, f(y(T)), 1)) : g(\"\", !0),\n        x(T) ? (c(), d(\"p\", g1, f(s(a)(\"conn.form.required\")), 1)) : g(\"\", !0)\n      ], 2))), 128)),\n      h.value.length ? (c(), d(\"div\", k1, [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-cfield__advtoggle\",\n          onClick: z[0] || (z[0] = (T) => u.value = !u.value)\n        }, f(u.value ? \"▾\" : \"▸\") + \" \" + f(s(a)(\"conn.form.advanced\")), 1),\n        u.value ? (c(), d(\"div\", _1, [\n          (c(!0), d(ae, null, Te(h.value, (T) => (c(), d(\"div\", {\n            key: T.key,\n            class: \"fe-cfield__row\"\n          }, [\n            T.type === \"bool\" ? (c(), d(\"label\", w1, [\n              o(\"input\", {\n                type: \"checkbox\",\n                checked: U(T),\n                disabled: e.disabled,\n                onChange: (Y) => D(T.key, Y.target.checked)\n              }, null, 40, $1),\n              o(\"span\", null, f(b(T)), 1)\n            ])) : (c(), d(ae, { key: 1 }, [\n              o(\"label\", {\n                class: \"fe-cfield__label\",\n                for: `fe-cfa-${T.key}`\n              }, f(b(T)), 9, x1),\n              o(\"input\", {\n                id: `fe-cfa-${T.key}`,\n                class: we([\"fe-cfield__input\", { \"fe-cfield__input--mono\": T.monospace }]),\n                type: E(T),\n                value: T.type === \"int\" ? I(T) : B(T),\n                placeholder: T.placeholder,\n                disabled: e.disabled,\n                onInput: (Y) => D(\n                  T.key,\n                  T.type === \"int\" ? Y.target.value === \"\" ? null : Number(Y.target.value) : Y.target.value\n                )\n              }, null, 42, S1)\n            ], 64)),\n            y(T) ? (c(), d(\"p\", C1, f(y(T)), 1)) : g(\"\", !0)\n          ]))), 128))\n        ])) : g(\"\", !0)\n      ])) : g(\"\", !0)\n    ]));\n  }\n}), M1 = { class: \"fe-guide\" }, E1 = { class: \"fe-guide__summary\" }, z1 = {\n  class: \"fe-guide__facts\",\n  \"data-testid\": \"guide-facts\"\n}, A1 = { class: \"fe-guide__factlabel\" }, P1 = { class: \"fe-guide__factvalue\" }, L1 = [\"data-testid\", \"onClick\"], D1 = {\n  key: 0,\n  class: \"fe-guide__facthint\"\n}, O1 = {\n  class: \"fe-guide__tabs\",\n  role: \"tablist\"\n}, B1 = [\"aria-selected\", \"data-testid\", \"onClick\"], I1 = {\n  key: 0,\n  class: \"fe-guide__body\",\n  role: \"tabpanel\"\n}, H1 = {\n  key: 0,\n  class: \"fe-guide__steps\"\n}, F1 = {\n  key: 1,\n  class: \"fe-guide__codewrap\"\n}, N1 = { class: \"fe-guide__codehead\" }, K1 = { class: \"fe-guide__caption\" }, R1 = [\"data-testid\", \"onClick\"], U1 = { class: \"fe-guide__code\" }, V1 = {\n  key: 2,\n  class: \"fe-guide__warn\"\n}, j1 = {\n  key: 3,\n  class: \"fe-guide__note\"\n}, Y1 = {\n  key: 4,\n  class: \"fe-guide__text\"\n}, W1 = {\n  key: 1,\n  class: \"fe-guide__notes\"\n}, q1 = { class: \"fe-guide__notestitle\" }, G1 = /* @__PURE__ */ qe({\n  __name: \"ConnectionGuideView\",\n  props: {\n    guide: {},\n    locale: {}\n  },\n  setup(e) {\n    var y;\n    const t = e, { t: n } = tt(() => t.locale), r = m(((y = t.guide.clients[0]) == null ? void 0 : y.id) ?? \"\"), a = m(null);\n    let u = null;\n    const v = k(\n      () => t.guide.clients.find((A) => A.id === r.value) ?? t.guide.clients[0]\n    );\n    async function p(A, D) {\n      let C = !1;\n      try {\n        await navigator.clipboard.writeText(A), C = !0;\n      } catch {\n        try {\n          const B = document.createElement(\"textarea\");\n          B.value = A, B.setAttribute(\"readonly\", \"\"), B.style.position = \"fixed\", B.style.opacity = \"0\", document.body.appendChild(B), B.select(), C = document.execCommand(\"copy\"), document.body.removeChild(B);\n        } catch {\n          C = !1;\n        }\n      }\n      a.value = C ? D : null, u && clearTimeout(u), u = setTimeout(() => {\n        a.value = null;\n      }, 1600);\n    }\n    function h(A, D) {\n      return `${A}-${D}`;\n    }\n    function b(A) {\n      return A.kind === \"code\";\n    }\n    return (A, D) => (c(), d(\"div\", M1, [\n      o(\"p\", E1, f(e.guide.summary), 1),\n      o(\"section\", z1, [\n        (c(!0), d(ae, null, Te(e.guide.facts, (C, B) => (c(), d(\"div\", {\n          key: C.label,\n          class: \"fe-guide__fact\"\n        }, [\n          o(\"span\", A1, f(C.label), 1),\n          o(\"span\", P1, [\n            o(\"code\", {\n              class: we({ \"fe-guide__ph\": C.placeholderOnly })\n            }, f(C.value), 3),\n            C.placeholderOnly ? g(\"\", !0) : (c(), d(\"button\", {\n              key: 0,\n              type: \"button\",\n              class: \"fe-guide__copy\",\n              \"data-testid\": `copy-fact-${B}`,\n              onClick: (I) => p(C.value, h(\"fact\", B))\n            }, f(a.value === h(\"fact\", B) ? s(n)(\"conn.guide.copied\") : s(n)(\"conn.guide.copy\")), 9, L1))\n          ]),\n          C.hint ? (c(), d(\"span\", D1, f(C.hint), 1)) : g(\"\", !0)\n        ]))), 128))\n      ]),\n      o(\"nav\", O1, [\n        (c(!0), d(ae, null, Te(e.guide.clients, (C) => (c(), d(\"button\", {\n          key: C.id,\n          type: \"button\",\n          role: \"tab\",\n          class: we([\"fe-guide__tab\", { \"is-active\": v.value && C.id === v.value.id }]),\n          \"aria-selected\": v.value && C.id === v.value.id,\n          \"data-testid\": `guide-tab-${C.id}`,\n          onClick: (B) => r.value = C.id\n        }, f(C.name), 11, B1))), 128))\n      ]),\n      v.value ? (c(), d(\"div\", I1, [\n        (c(!0), d(ae, null, Te(v.value.blocks, (C, B) => (c(), d(ae, { key: B }, [\n          C.kind === \"steps\" ? (c(), d(\"ol\", H1, [\n            (c(!0), d(ae, null, Te(C.steps ?? [], (I, U) => (c(), d(\"li\", { key: U }, f(I), 1))), 128))\n          ])) : b(C) ? (c(), d(\"div\", F1, [\n            o(\"div\", N1, [\n              o(\"span\", K1, f(C.caption), 1),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-guide__copy\",\n                \"data-testid\": `copy-code-${B}`,\n                onClick: (I) => p(C.code ?? \"\", h(v.value.id, B))\n              }, f(a.value === h(v.value.id, B) ? s(n)(\"conn.guide.copied\") : s(n)(\"conn.guide.copy\")), 9, R1)\n            ]),\n            o(\"pre\", U1, [\n              o(\"code\", null, f(C.code), 1)\n            ])\n          ])) : C.kind === \"warn\" ? (c(), d(\"p\", V1, f(C.text), 1)) : C.kind === \"note\" ? (c(), d(\"p\", j1, f(C.text), 1)) : (c(), d(\"p\", Y1, f(C.text), 1))\n        ], 64))), 128))\n      ])) : g(\"\", !0),\n      e.guide.notes.length ? (c(), d(\"section\", W1, [\n        o(\"h4\", q1, f(s(n)(\"conn.guide.goodToKnow\")), 1),\n        (c(!0), d(ae, null, Te(e.guide.notes, (C, B) => (c(), d(\"p\", {\n          key: B,\n          class: we(C.kind === \"warn\" ? \"fe-guide__warn\" : \"fe-guide__note\")\n        }, f(C.text), 3))), 128))\n      ])) : g(\"\", !0)\n    ]));\n  }\n});\nfunction X1(e) {\n  const t = Ya(e), n = wa(e), r = ($) => `${n}${$}`, a = wn([]), u = m(null), v = m(!1), p = m(!1), h = m(null), b = m(null), y = m(null);\n  function A($) {\n    const M = $;\n    if (M != null && M.detail)\n      try {\n        const z = JSON.parse(M.detail);\n        if (z != null && z.error) return z.error;\n      } catch {\n      }\n    return (M == null ? void 0 : M.message) || String($);\n  }\n  function D($) {\n    return $ == null ? void 0 : $.status;\n  }\n  async function C() {\n    v.value = !0, h.value = null;\n    try {\n      const $ = await t.jsonFetch(\n        r(\"/api/auth/s3-keys\")\n      );\n      a.value = Array.isArray($ == null ? void 0 : $.keys) ? $.keys : [], u.value = {\n        endpoint: ($ == null ? void 0 : $.endpoint) ?? \"\",\n        enabled: ($ == null ? void 0 : $.enabled) !== !1,\n        path_style: ($ == null ? void 0 : $.path_style) !== !1\n      }, b.value = !0;\n    } catch ($) {\n      a.value = [];\n      const M = D($);\n      M === 401 || M === 403 ? b.value = !1 : (b.value = !1, h.value = A($));\n    } finally {\n      v.value = !1, p.value = !0;\n    }\n  }\n  async function B($) {\n    h.value = null;\n    try {\n      const M = await t.jsonFetch(r(\"/api/auth/s3-keys\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify($)\n      });\n      return y.value = M, M != null && M.endpoint && (u.value = {\n        endpoint: M.endpoint,\n        enabled: M.enabled !== !1,\n        path_style: M.path_style !== !1\n      }), await C(), M;\n    } catch (M) {\n      return h.value = A(M), null;\n    }\n  }\n  async function I($, M) {\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/s3-keys/${$}/state`), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ disabled: M })\n      }), await C();\n    } catch (z) {\n      h.value = A(z);\n    }\n  }\n  async function U($) {\n    var M, z;\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/s3-keys/${$}`), { method: \"DELETE\" }), ((z = (M = y.value) == null ? void 0 : M.key) == null ? void 0 : z.id) === $ && (y.value = null), await C();\n    } catch (T) {\n      h.value = A(T);\n    }\n  }\n  function x() {\n    y.value = null;\n  }\n  const E = k(() => {\n    var M;\n    if ((M = y.value) != null && M.key) return y.value.key;\n    const $ = a.value.filter((z) => !z.disabled_at);\n    return $.length ? $.reduce((z, T) => z.created_at >= T.created_at ? z : T) : null;\n  });\n  return {\n    keys: a,\n    connection: u,\n    loading: v,\n    loaded: p,\n    error: h,\n    canMint: b,\n    revealed: y,\n    guideKey: E,\n    load: C,\n    create: B,\n    setDisabled: I,\n    remove: U,\n    dismissSecret: x\n  };\n}\nfunction Zi() {\n  const e = m(!1);\n  function t(n) {\n    const r = n.currentTarget, a = ((r == null ? void 0 : r.scrollLeft) ?? 0) > 0;\n    a !== e.value && (e.value = a);\n  }\n  return { scrolledX: e, onScroll: t };\n}\nconst J1 = {\n  class: \"fe-s3keys\",\n  \"data-testid\": \"s3-keys\"\n}, Z1 = { class: \"fe-s3keys__head\" }, Q1 = { class: \"fe-s3keys__title\" }, e0 = { class: \"fe-s3keys__lead\" }, t0 = {\n  key: 0,\n  class: \"fe-s3keys__warn\"\n}, n0 = {\n  key: 1,\n  class: \"fe-s3keys__muted\"\n}, a0 = {\n  key: 2,\n  class: \"fe-s3keys__warn\"\n}, o0 = {\n  key: 3,\n  class: \"fe-s3keys__form\"\n}, s0 = [\"placeholder\"], r0 = { value: \"\" }, i0 = [\"value\"], l0 = [\"placeholder\", \"disabled\"], c0 = [\"disabled\"], u0 = {\n  key: 4,\n  class: \"fe-s3keys__hint\"\n}, d0 = {\n  key: 5,\n  class: \"fe-s3keys__secret\",\n  \"data-testid\": \"s3-key-secret\"\n}, f0 = { class: \"fe-s3keys__once\" }, p0 = { class: \"fe-s3keys__pair\" }, v0 = { class: \"fe-s3keys__k\" }, h0 = { class: \"fe-s3keys__pair\" }, m0 = { class: \"fe-s3keys__k\" }, y0 = {\n  key: 6,\n  class: \"fe-s3keys__muted\"\n}, b0 = { class: \"fe-s3keys__table\" }, g0 = { class: \"fe-s3keys__actions\" }, k0 = [\"disabled\", \"onClick\"], _0 = [\"disabled\", \"onClick\"], w0 = {\n  key: 8,\n  class: \"fe-s3keys__muted\"\n}, $0 = /* @__PURE__ */ qe({\n  __name: \"S3KeysPanel\",\n  props: {\n    config: {},\n    storages: {}\n  },\n  emits: [\"active\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = k(() => cn(n.config.locale)), { t: u, formatDate: v } = tt(a), { scrolledX: p, onScroll: h } = Zi(), {\n      keys: b,\n      connection: y,\n      loading: A,\n      error: D,\n      canMint: C,\n      revealed: B,\n      guideKey: I,\n      load: U,\n      create: x,\n      setDisabled: E,\n      remove: $,\n      dismissSecret: M\n    } = X1(n.config), z = m(\"\"), T = m(\"\"), Y = m(\"\"), O = m(!1), J = m(null), G = m(null);\n    let N = null;\n    function P() {\n      var re, S, w, j, K;\n      const pe = y.value;\n      pe && r(\"active\", {\n        accessKeyID: ((re = I.value) == null ? void 0 : re.access_key_id) ?? \"\",\n        // Only the freshly minted one. Re-emitting a stale secret would put a\n        // dead credential into the commands.\n        secret: ((w = (S = B.value) == null ? void 0 : S.key) == null ? void 0 : w.id) === ((j = I.value) == null ? void 0 : j.id) ? (K = B.value) == null ? void 0 : K.secret : void 0,\n        endpoint: pe.endpoint,\n        pathStyle: pe.path_style\n      });\n    }\n    dt(async () => {\n      await U(), P();\n    });\n    async function le() {\n      O.value = !0;\n      try {\n        await x({\n          label: z.value.trim() || u(\"conn.s3keys.defaultLabel\"),\n          bucket: T.value.trim() || void 0,\n          prefix: Y.value.trim() || void 0\n        }), z.value = \"\", P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    async function ve(pe) {\n      O.value = !0;\n      try {\n        await E(pe.id, !pe.disabled_at), P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    async function he(pe) {\n      if (J.value !== pe.id) {\n        J.value = pe.id;\n        return;\n      }\n      J.value = null, O.value = !0;\n      try {\n        await $(pe.id), P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    async function oe(pe, re) {\n      let S = !1;\n      try {\n        await navigator.clipboard.writeText(pe), S = !0;\n      } catch {\n        try {\n          const w = document.createElement(\"textarea\");\n          w.value = pe, w.setAttribute(\"readonly\", \"\"), w.style.position = \"fixed\", w.style.opacity = \"0\", document.body.appendChild(w), w.select(), S = document.execCommand(\"copy\"), document.body.removeChild(w);\n        } catch {\n          S = !1;\n        }\n      }\n      S && (G.value = re, N && clearTimeout(N), N = setTimeout(() => G.value = null, 1600));\n    }\n    function ue(pe) {\n      const re = new Date(pe ?? \"\").getTime();\n      return Number.isNaN(re) ? \"\" : v(re);\n    }\n    function Q(pe) {\n      return pe.bucket ? pe.prefix ? `${pe.bucket}/${pe.prefix}` : pe.bucket : u(\"conn.s3keys.scopeAll\");\n    }\n    return (pe, re) => (c(), d(\"section\", J1, [\n      o(\"header\", Z1, [\n        o(\"h4\", Q1, f(s(u)(\"conn.s3keys.title\")), 1),\n        o(\"p\", e0, f(s(u)(\"conn.s3keys.lead\")), 1)\n      ]),\n      s(y) && !s(y).enabled ? (c(), d(\"p\", t0, f(s(u)(\"conn.s3keys.disabled\")), 1)) : g(\"\", !0),\n      s(C) === !1 ? (c(), d(\"p\", n0, f(s(u)(\"conn.s3keys.cannotMint\")), 1)) : g(\"\", !0),\n      s(D) ? (c(), d(\"p\", a0, f(s(D)), 1)) : g(\"\", !0),\n      s(C) ? (c(), d(\"div\", o0, [\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": re[0] || (re[0] = (S) => z.value = S),\n          class: \"fe-cfield__input\",\n          placeholder: s(u)(\"conn.s3keys.label\"),\n          \"data-testid\": \"s3-key-label\"\n        }, null, 8, s0), [\n          [rt, z.value]\n        ]),\n        Ve(o(\"select\", {\n          \"onUpdate:modelValue\": re[1] || (re[1] = (S) => T.value = S),\n          class: \"fe-cfield__input\",\n          \"data-testid\": \"s3-key-bucket\"\n        }, [\n          o(\"option\", r0, f(s(u)(\"conn.s3keys.everyBucket\")), 1),\n          (c(!0), d(ae, null, Te(e.storages, (S) => (c(), d(\"option\", {\n            key: S,\n            value: S\n          }, f(S), 9, i0))), 128))\n        ], 512), [\n          [on, T.value]\n        ]),\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": re[2] || (re[2] = (S) => Y.value = S),\n          class: \"fe-cfield__input\",\n          placeholder: s(u)(\"conn.s3keys.prefix\"),\n          disabled: !T.value,\n          \"data-testid\": \"s3-key-prefix\"\n        }, null, 8, l0), [\n          [rt, Y.value]\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__btn\",\n          disabled: O.value,\n          \"data-testid\": \"s3-key-mint\",\n          onClick: le\n        }, f(s(u)(\"conn.s3keys.mint\")), 9, c0)\n      ])) : g(\"\", !0),\n      s(C) ? (c(), d(\"p\", u0, f(s(u)(\"conn.s3keys.inheritNote\")), 1)) : g(\"\", !0),\n      s(B) ? (c(), d(\"div\", d0, [\n        o(\"p\", f0, f(s(u)(\"conn.s3keys.once\")), 1),\n        o(\"div\", p0, [\n          o(\"span\", v0, f(s(u)(\"conn.s3keys.accessKeyID\")), 1),\n          o(\"code\", null, f(s(B).key.access_key_id), 1),\n          o(\"button\", {\n            class: \"fe-s3keys__copy\",\n            onClick: re[3] || (re[3] = (S) => oe(s(B).key.access_key_id, \"akid\"))\n          }, f(G.value === \"akid\" ? s(u)(\"conn.guide.copied\") : s(u)(\"conn.guide.copy\")), 1)\n        ]),\n        o(\"div\", h0, [\n          o(\"span\", m0, f(s(u)(\"conn.s3keys.secret\")), 1),\n          o(\"code\", null, f(s(B).secret), 1),\n          o(\"button\", {\n            class: \"fe-s3keys__copy\",\n            onClick: re[4] || (re[4] = (S) => oe(s(B).secret, \"secret\"))\n          }, f(G.value === \"secret\" ? s(u)(\"conn.guide.copied\") : s(u)(\"conn.guide.copy\")), 1)\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__dismiss\",\n          onClick: re[5] || (re[5] = //@ts-ignore\n          (...S) => s(M) && s(M)(...S))\n        }, f(s(u)(\"conn.s3keys.dismiss\")), 1)\n      ])) : g(\"\", !0),\n      s(A) ? (c(), d(\"p\", y0, \"…\")) : s(b).length ? (c(), d(\"div\", {\n        key: 7,\n        class: we([\"fe-s3keys__scroll\", { \"is-scrolled-x\": s(p) }]),\n        onScrollPassive: re[6] || (re[6] = //@ts-ignore\n        (...S) => s(h) && s(h)(...S))\n      }, [\n        o(\"table\", b0, [\n          o(\"thead\", null, [\n            o(\"tr\", null, [\n              o(\"th\", null, f(s(u)(\"conn.s3keys.col.label\")), 1),\n              o(\"th\", null, f(s(u)(\"conn.s3keys.col.key\")), 1),\n              o(\"th\", null, f(s(u)(\"conn.s3keys.col.scope\")), 1),\n              o(\"th\", null, f(s(u)(\"conn.s3keys.col.lastUsed\")), 1),\n              re[7] || (re[7] = o(\"th\", null, null, -1))\n            ])\n          ]),\n          o(\"tbody\", null, [\n            (c(!0), d(ae, null, Te(s(b), (S) => (c(), d(\"tr\", {\n              key: S.id,\n              class: we({ \"is-off\": !!S.disabled_at })\n            }, [\n              o(\"td\", null, f(S.label || s(u)(\"conn.s3keys.noLabel\")), 1),\n              o(\"td\", null, [\n                o(\"code\", null, f(S.access_key_id), 1)\n              ]),\n              o(\"td\", null, f(Q(S)), 1),\n              o(\"td\", null, f(S.last_used_at ? ue(S.last_used_at) : s(u)(\"conn.s3keys.neverUsed\")), 1),\n              o(\"td\", g0, [\n                o(\"button\", {\n                  class: \"fe-s3keys__link\",\n                  disabled: O.value,\n                  onClick: (w) => ve(S)\n                }, f(S.disabled_at ? s(u)(\"conn.s3keys.enable\") : s(u)(\"conn.s3keys.disable\")), 9, k0),\n                o(\"button\", {\n                  class: \"fe-s3keys__link is-danger\",\n                  disabled: O.value,\n                  onClick: (w) => he(S)\n                }, f(J.value === S.id ? s(u)(\"conn.s3keys.confirm\") : s(u)(\"conn.s3keys.revoke\")), 9, _0)\n              ])\n            ], 2))), 128))\n          ])\n        ])\n      ], 34)) : s(C) ? (c(), d(\"p\", w0, f(s(u)(\"conn.s3keys.empty\")), 1)) : g(\"\", !0)\n    ]));\n  }\n});\nfunction x0(e) {\n  const t = Ya(e), n = wa(e), r = (x) => `${n}${x}`, a = wn([]), u = m(null), v = m(!1), p = m(!1), h = m(null), b = m(null);\n  function y(x) {\n    const E = x;\n    if (E != null && E.detail)\n      try {\n        const $ = JSON.parse(E.detail);\n        if ($ != null && $.error) return $.error;\n      } catch {\n      }\n    return (E == null ? void 0 : E.message) || String(x);\n  }\n  function A(x) {\n    return x == null ? void 0 : x.status;\n  }\n  async function D() {\n    v.value = !0, h.value = null;\n    try {\n      const x = await t.jsonFetch(\n        r(\"/api/auth/ssh-keys\")\n      );\n      a.value = Array.isArray(x == null ? void 0 : x.keys) ? x.keys : [], u.value = {\n        enabled: (x == null ? void 0 : x.enabled) !== !1,\n        host: (x == null ? void 0 : x.host) ?? \"\",\n        port: (x == null ? void 0 : x.port) ?? 2022,\n        login: (x == null ? void 0 : x.login) ?? \"\",\n        ftps: x == null ? void 0 : x.ftps\n      }, b.value = !0;\n    } catch (x) {\n      a.value = [], b.value = !1, A(x) !== 401 && A(x) !== 403 && (h.value = y(x));\n    } finally {\n      v.value = !1, p.value = !0;\n    }\n  }\n  async function C(x, E) {\n    h.value = null;\n    try {\n      return await t.jsonFetch(r(\"/api/auth/ssh-keys\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ key: x, name: E })\n      }), await D(), !0;\n    } catch ($) {\n      return h.value = y($), !1;\n    }\n  }\n  async function B(x, E) {\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/ssh-keys/${x}/state`), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ disabled: E })\n      }), await D();\n    } catch ($) {\n      h.value = y($);\n    }\n  }\n  async function I(x) {\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/ssh-keys/${x}`), { method: \"DELETE\" }), await D();\n    } catch (E) {\n      h.value = y(E);\n    }\n  }\n  const U = k(() => a.value.some((x) => !x.disabled_at));\n  return { keys: a, connection: u, loading: v, loaded: p, error: h, canAdd: b, hasUsableKey: U, load: D, add: C, setDisabled: B, remove: I };\n}\nconst S0 = {\n  key: 0,\n  class: \"fe-s3keys\",\n  \"data-testid\": \"ssh-keys\"\n}, C0 = { class: \"fe-s3keys__head\" }, T0 = { class: \"fe-s3keys__title\" }, M0 = { class: \"fe-s3keys__lead\" }, E0 = {\n  key: 0,\n  class: \"fe-s3keys__warn\"\n}, z0 = {\n  key: 1,\n  class: \"fe-s3keys__muted\"\n}, A0 = {\n  key: 2,\n  class: \"fe-s3keys__warn\"\n}, P0 = {\n  key: 3,\n  class: \"fe-sshkeys__form\"\n}, L0 = [\"placeholder\"], D0 = { class: \"fe-sshkeys__row\" }, O0 = [\"placeholder\"], B0 = [\"disabled\"], I0 = { class: \"fe-s3keys__hint\" }, H0 = {\n  key: 4,\n  class: \"fe-s3keys__muted\"\n}, F0 = { class: \"fe-s3keys__table\" }, N0 = { class: \"fe-s3keys__actions\" }, K0 = [\"disabled\", \"onClick\"], R0 = [\"disabled\", \"onClick\"], U0 = {\n  key: 6,\n  class: \"fe-s3keys__muted\"\n}, V0 = /* @__PURE__ */ qe({\n  __name: \"SSHKeysPanel\",\n  props: {\n    config: {},\n    keysVisible: { type: Boolean }\n  },\n  emits: [\"active\"],\n  setup(e, { emit: t }) {\n    const n = e, r = k(() => n.keysVisible !== !1), a = t, u = k(() => cn(n.config.locale)), { t: v, formatDate: p } = tt(u), { scrolledX: h, onScroll: b } = Zi(), { keys: y, connection: A, loading: D, error: C, canAdd: B, hasUsableKey: I, load: U, add: x, setDisabled: E, remove: $ } = x0(n.config), M = m(\"\"), z = m(\"\"), T = m(!1), Y = m(null);\n    function O() {\n      const ve = A.value;\n      ve && a(\"active\", {\n        host: ve.host,\n        port: ve.port,\n        login: ve.login,\n        enabled: ve.enabled,\n        hasKey: I.value,\n        // The FTPS endpoint travels with the SSH facts: for the user this is one\n        // question (\"how do I reach this from a program?\"), and two calls to\n        // answer it would be two chances to disagree.\n        ftps: ve.ftps\n      });\n    }\n    dt(async () => {\n      await U(), O();\n    });\n    async function J() {\n      if (M.value.trim()) {\n        T.value = !0;\n        try {\n          await x(M.value.trim(), z.value.trim() || void 0) && (M.value = \"\", z.value = \"\"), O();\n        } finally {\n          T.value = !1;\n        }\n      }\n    }\n    async function G(ve) {\n      T.value = !0;\n      try {\n        await E(ve.id, !ve.disabled_at), O();\n      } finally {\n        T.value = !1;\n      }\n    }\n    async function N(ve) {\n      if (Y.value !== ve.id) {\n        Y.value = ve.id;\n        return;\n      }\n      Y.value = null, T.value = !0;\n      try {\n        await $(ve.id), O();\n      } finally {\n        T.value = !1;\n      }\n    }\n    function P(ve) {\n      const he = new Date(ve ?? \"\").getTime();\n      return Number.isNaN(he) ? \"\" : p(he);\n    }\n    function le(ve) {\n      return \"SHA256:\" + ve.fingerprint;\n    }\n    return (ve, he) => r.value ? (c(), d(\"section\", S0, [\n      o(\"header\", C0, [\n        o(\"h4\", T0, f(s(v)(\"conn.sshkeys.title\")), 1),\n        o(\"p\", M0, f(s(v)(\"conn.sshkeys.lead\")), 1)\n      ]),\n      s(A) && !s(A).enabled ? (c(), d(\"p\", E0, f(s(v)(\"conn.sshkeys.disabled\")), 1)) : g(\"\", !0),\n      s(B) === !1 ? (c(), d(\"p\", z0, f(s(v)(\"conn.sshkeys.cannotAdd\")), 1)) : g(\"\", !0),\n      s(C) ? (c(), d(\"p\", A0, f(s(C)), 1)) : g(\"\", !0),\n      s(B) ? (c(), d(\"div\", P0, [\n        Ve(o(\"textarea\", {\n          \"onUpdate:modelValue\": he[0] || (he[0] = (oe) => M.value = oe),\n          class: \"fe-cfield__input fe-sshkeys__paste\",\n          rows: \"2\",\n          spellcheck: \"false\",\n          placeholder: s(v)(\"conn.sshkeys.paste\"),\n          \"data-testid\": \"ssh-key-input\"\n        }, null, 8, L0), [\n          [rt, M.value]\n        ]),\n        o(\"div\", D0, [\n          Ve(o(\"input\", {\n            \"onUpdate:modelValue\": he[1] || (he[1] = (oe) => z.value = oe),\n            class: \"fe-cfield__input\",\n            placeholder: s(v)(\"conn.sshkeys.name\"),\n            \"data-testid\": \"ssh-key-name\"\n          }, null, 8, O0), [\n            [rt, z.value]\n          ]),\n          o(\"button\", {\n            class: \"fe-s3keys__btn\",\n            disabled: T.value,\n            \"data-testid\": \"ssh-key-add\",\n            onClick: J\n          }, f(s(v)(\"conn.sshkeys.add\")), 9, B0)\n        ]),\n        o(\"p\", I0, f(s(v)(\"conn.sshkeys.noCopyId\")), 1)\n      ])) : g(\"\", !0),\n      s(D) ? (c(), d(\"p\", H0, \"…\")) : s(y).length ? (c(), d(\"div\", {\n        key: 5,\n        class: we([\"fe-s3keys__scroll\", { \"is-scrolled-x\": s(h) }]),\n        onScrollPassive: he[2] || (he[2] = //@ts-ignore\n        (...oe) => s(b) && s(b)(...oe))\n      }, [\n        o(\"table\", F0, [\n          o(\"thead\", null, [\n            o(\"tr\", null, [\n              o(\"th\", null, f(s(v)(\"conn.sshkeys.col.name\")), 1),\n              o(\"th\", null, f(s(v)(\"conn.sshkeys.col.fingerprint\")), 1),\n              o(\"th\", null, f(s(v)(\"conn.sshkeys.col.lastUsed\")), 1),\n              he[3] || (he[3] = o(\"th\", null, null, -1))\n            ])\n          ]),\n          o(\"tbody\", null, [\n            (c(!0), d(ae, null, Te(s(y), (oe) => (c(), d(\"tr\", {\n              key: oe.id,\n              class: we({ \"is-off\": !!oe.disabled_at })\n            }, [\n              o(\"td\", null, f(oe.name || s(v)(\"conn.sshkeys.noName\")), 1),\n              o(\"td\", null, [\n                o(\"code\", null, f(le(oe)), 1)\n              ]),\n              o(\"td\", null, f(oe.last_used_at ? P(oe.last_used_at) : s(v)(\"conn.sshkeys.neverUsed\")), 1),\n              o(\"td\", N0, [\n                o(\"button\", {\n                  class: \"fe-s3keys__link\",\n                  disabled: T.value,\n                  onClick: (ue) => G(oe)\n                }, f(oe.disabled_at ? s(v)(\"conn.sshkeys.enable\") : s(v)(\"conn.sshkeys.disable\")), 9, K0),\n                o(\"button\", {\n                  class: \"fe-s3keys__link is-danger\",\n                  disabled: T.value,\n                  onClick: (ue) => N(oe)\n                }, f(Y.value === oe.id ? s(v)(\"conn.sshkeys.confirm\") : s(v)(\"conn.sshkeys.remove\")), 9, R0)\n              ])\n            ], 2))), 128))\n          ])\n        ])\n      ], 34)) : s(B) ? (c(), d(\"p\", U0, f(s(v)(\"conn.sshkeys.empty\")), 1)) : g(\"\", !0)\n    ])) : g(\"\", !0);\n  }\n});\nfunction j0(e) {\n  const t = Ya(e), n = wa(e), r = ($) => `${n}${$}`, a = wn([]), u = m(null), v = m(!1), p = m(!1), h = m(null), b = m(null), y = m(null);\n  function A($) {\n    const M = $;\n    if (M != null && M.detail)\n      try {\n        const z = JSON.parse(M.detail);\n        if (z != null && z.error) return z.error;\n      } catch {\n      }\n    return (M == null ? void 0 : M.message) || String($);\n  }\n  function D($) {\n    return $ == null ? void 0 : $.status;\n  }\n  async function C() {\n    v.value = !0, h.value = null;\n    try {\n      const $ = await t.jsonFetch(\n        r(\"/api/auth/nfs-exports\")\n      );\n      a.value = Array.isArray($ == null ? void 0 : $.exports) ? $.exports : [], u.value = {\n        enabled: ($ == null ? void 0 : $.enabled) !== !1,\n        host: ($ == null ? void 0 : $.host) ?? \"\",\n        port: ($ == null ? void 0 : $.port) ?? 2049\n      }, b.value = !0;\n    } catch ($) {\n      a.value = [], b.value = !1, D($) !== 401 && D($) !== 403 && (h.value = A($));\n    } finally {\n      v.value = !1, p.value = !0;\n    }\n  }\n  async function B($) {\n    h.value = null;\n    try {\n      const M = await t.jsonFetch(r(\"/api/auth/nfs-exports\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify($)\n      });\n      return y.value = M, M != null && M.host && (u.value = { enabled: M.enabled !== !1, host: M.host, port: M.port }), await C(), M;\n    } catch (M) {\n      return h.value = A(M), null;\n    }\n  }\n  async function I($, M) {\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/nfs-exports/${$}/state`), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ disabled: M })\n      }), await C();\n    } catch (z) {\n      h.value = A(z);\n    }\n  }\n  async function U($) {\n    var M, z;\n    h.value = null;\n    try {\n      await t.jsonFetch(r(`/api/auth/nfs-exports/${$}`), { method: \"DELETE\" }), ((z = (M = y.value) == null ? void 0 : M.export) == null ? void 0 : z.id) === $ && (y.value = null), await C();\n    } catch (T) {\n      h.value = A(T);\n    }\n  }\n  function x() {\n    y.value = null;\n  }\n  const E = k(() => {\n    var M;\n    if ((M = y.value) != null && M.export) return y.value.export;\n    const $ = a.value.filter((z) => !z.disabled_at);\n    return $.length ? $.reduce((z, T) => z.created_at >= T.created_at ? z : T) : null;\n  });\n  return {\n    exports: a,\n    connection: u,\n    loading: v,\n    loaded: p,\n    error: h,\n    canMint: b,\n    revealed: y,\n    guideExport: E,\n    load: C,\n    create: B,\n    setDisabled: I,\n    remove: U,\n    dismissPath: x\n  };\n}\nconst Y0 = {\n  class: \"fe-s3keys\",\n  \"data-testid\": \"nfs-exports\"\n}, W0 = { class: \"fe-s3keys__head\" }, q0 = { class: \"fe-s3keys__title\" }, G0 = { class: \"fe-s3keys__lead\" }, X0 = { class: \"fe-s3keys__warn\" }, J0 = {\n  key: 0,\n  class: \"fe-s3keys__warn\"\n}, Z0 = {\n  key: 1,\n  class: \"fe-s3keys__muted\"\n}, Q0 = {\n  key: 2,\n  class: \"fe-s3keys__warn\"\n}, e2 = {\n  key: 3,\n  class: \"fe-s3keys__form fe-nfs__form\"\n}, t2 = [\"placeholder\"], n2 = { value: \"\" }, a2 = [\"value\"], o2 = [\"placeholder\", \"disabled\"], s2 = [\"placeholder\"], r2 = { class: \"fe-nfs__ro\" }, i2 = [\"disabled\"], l2 = {\n  key: 4,\n  class: \"fe-s3keys__hint\"\n}, c2 = {\n  key: 5,\n  class: \"fe-s3keys__secret\",\n  \"data-testid\": \"nfs-path\"\n}, u2 = { class: \"fe-s3keys__once\" }, d2 = { class: \"fe-s3keys__pair\" }, f2 = {\n  key: 6,\n  class: \"fe-s3keys__muted\"\n}, p2 = {\n  key: 7,\n  class: \"fe-s3keys__table\"\n}, v2 = { class: \"fe-s3keys__actions\" }, h2 = [\"disabled\", \"onClick\"], m2 = [\"disabled\", \"onClick\"], y2 = {\n  key: 8,\n  class: \"fe-s3keys__muted\"\n}, b2 = /* @__PURE__ */ qe({\n  __name: \"NFSExportsPanel\",\n  props: {\n    config: {},\n    storages: {}\n  },\n  emits: [\"active\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = k(() => cn(n.config.locale)), { t: u, formatDate: v } = tt(a), {\n      exports: p,\n      connection: h,\n      loading: b,\n      error: y,\n      canMint: A,\n      revealed: D,\n      guideExport: C,\n      load: B,\n      create: I,\n      setDisabled: U,\n      remove: x,\n      dismissPath: E\n    } = j0(n.config), $ = m(\"\"), M = m(\"\"), z = m(\"\"), T = m(!0), Y = m(\"\"), O = m(!1), J = m(null), G = m(!1);\n    let N = null;\n    function P() {\n      var S, w;\n      const re = h.value;\n      re && r(\"active\", {\n        host: re.host,\n        port: re.port,\n        enabled: re.enabled,\n        // Only the freshly minted path — the stored ones cannot be recovered, and\n        // printing a placeholder in a mount line somebody copies would produce a\n        // command that fails with no clue why.\n        path: (S = D.value) == null ? void 0 : S.path,\n        readOnly: ((w = C.value) == null ? void 0 : w.read_only) ?? T.value\n      });\n    }\n    dt(async () => {\n      await B(), P();\n    });\n    async function le() {\n      O.value = !0;\n      try {\n        await I({\n          label: $.value.trim() || u(\"conn.nfs.defaultLabel\"),\n          storage: M.value.trim() || void 0,\n          prefix: z.value.trim() || void 0,\n          read_only: T.value,\n          allow_cidrs: Y.value.trim() || void 0\n        }), $.value = \"\", P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    async function ve(re) {\n      O.value = !0;\n      try {\n        await U(re.id, !re.disabled_at), P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    async function he(re) {\n      if (J.value !== re.id) {\n        J.value = re.id;\n        return;\n      }\n      J.value = null, O.value = !0;\n      try {\n        await x(re.id), P();\n      } finally {\n        O.value = !1;\n      }\n    }\n    const oe = k(() => {\n      var j, K, Z;\n      const re = h.value, S = (j = D.value) == null ? void 0 : j.path;\n      if (!re || !S) return \"\";\n      const w = (Z = (K = D.value) == null ? void 0 : K.export) != null && Z.read_only ? \",ro\" : \"\";\n      return `sudo mount -t nfs -o nfsvers=3,tcp,port=${re.port},mountport=${re.port},nolock${w} ${re.host}:${S} /mnt/filex`;\n    });\n    async function ue() {\n      const re = oe.value;\n      if (!re) return;\n      let S = !1;\n      try {\n        await navigator.clipboard.writeText(re), S = !0;\n      } catch {\n        try {\n          const w = document.createElement(\"textarea\");\n          w.value = re, w.setAttribute(\"readonly\", \"\"), w.style.position = \"fixed\", w.style.opacity = \"0\", document.body.appendChild(w), w.select(), S = document.execCommand(\"copy\"), document.body.removeChild(w);\n        } catch {\n          S = !1;\n        }\n      }\n      S && (G.value = !0, N && clearTimeout(N), N = setTimeout(() => G.value = !1, 1600));\n    }\n    function Q(re) {\n      const S = new Date(re ?? \"\").getTime();\n      return Number.isNaN(S) ? \"\" : v(S);\n    }\n    function pe(re) {\n      return re.storage_name ? re.prefix ? `${re.storage_name}/${re.prefix}` : re.storage_name : u(\"conn.nfs.scopeAll\");\n    }\n    return (re, S) => (c(), d(\"section\", Y0, [\n      o(\"header\", W0, [\n        o(\"h4\", q0, f(s(u)(\"conn.nfs.title\")), 1),\n        o(\"p\", G0, f(s(u)(\"conn.nfs.lead\")), 1)\n      ]),\n      o(\"p\", X0, f(s(u)(\"conn.nfs.pathIsSecret\")), 1),\n      s(h) && !s(h).enabled ? (c(), d(\"p\", J0, f(s(u)(\"conn.nfs.disabled\")), 1)) : g(\"\", !0),\n      s(A) === !1 ? (c(), d(\"p\", Z0, f(s(u)(\"conn.nfs.cannotMint\")), 1)) : g(\"\", !0),\n      s(y) ? (c(), d(\"p\", Q0, f(s(y)), 1)) : g(\"\", !0),\n      s(A) ? (c(), d(\"div\", e2, [\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": S[0] || (S[0] = (w) => $.value = w),\n          class: \"fe-cfield__input\",\n          placeholder: s(u)(\"conn.nfs.label\"),\n          \"data-testid\": \"nfs-label\"\n        }, null, 8, t2), [\n          [rt, $.value]\n        ]),\n        Ve(o(\"select\", {\n          \"onUpdate:modelValue\": S[1] || (S[1] = (w) => M.value = w),\n          class: \"fe-cfield__input\",\n          \"data-testid\": \"nfs-storage\"\n        }, [\n          o(\"option\", n2, f(s(u)(\"conn.nfs.everyStorage\")), 1),\n          (c(!0), d(ae, null, Te(e.storages, (w) => (c(), d(\"option\", {\n            key: w,\n            value: w\n          }, f(w), 9, a2))), 128))\n        ], 512), [\n          [on, M.value]\n        ]),\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": S[2] || (S[2] = (w) => z.value = w),\n          class: \"fe-cfield__input\",\n          placeholder: s(u)(\"conn.nfs.prefix\"),\n          disabled: !M.value,\n          \"data-testid\": \"nfs-prefix\"\n        }, null, 8, o2), [\n          [rt, z.value]\n        ]),\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": S[3] || (S[3] = (w) => Y.value = w),\n          class: \"fe-cfield__input\",\n          placeholder: s(u)(\"conn.nfs.allowCidrs\"),\n          \"data-testid\": \"nfs-cidrs\"\n        }, null, 8, s2), [\n          [rt, Y.value]\n        ]),\n        o(\"label\", r2, [\n          Ve(o(\"input\", {\n            type: \"checkbox\",\n            \"onUpdate:modelValue\": S[4] || (S[4] = (w) => T.value = w),\n            \"data-testid\": \"nfs-readonly\"\n          }, null, 512), [\n            [An, T.value]\n          ]),\n          Je(\" \" + f(s(u)(\"conn.nfs.readOnly\")), 1)\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__btn\",\n          disabled: O.value,\n          \"data-testid\": \"nfs-mint\",\n          onClick: le\n        }, f(s(u)(\"conn.nfs.mint\")), 9, i2)\n      ])) : g(\"\", !0),\n      s(A) ? (c(), d(\"p\", l2, f(s(u)(\"conn.nfs.readOnlyHint\")), 1)) : g(\"\", !0),\n      s(D) ? (c(), d(\"div\", c2, [\n        o(\"p\", u2, f(s(u)(\"conn.nfs.once\")), 1),\n        o(\"div\", d2, [\n          o(\"code\", null, f(oe.value), 1),\n          o(\"button\", {\n            class: \"fe-s3keys__copy\",\n            onClick: ue\n          }, f(G.value ? s(u)(\"conn.guide.copied\") : s(u)(\"conn.guide.copy\")), 1)\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__dismiss\",\n          onClick: S[5] || (S[5] = //@ts-ignore\n          (...w) => s(E) && s(E)(...w))\n        }, f(s(u)(\"conn.nfs.dismiss\")), 1)\n      ])) : g(\"\", !0),\n      s(b) ? (c(), d(\"p\", f2, \"…\")) : s(p).length ? (c(), d(\"table\", p2, [\n        o(\"thead\", null, [\n          o(\"tr\", null, [\n            o(\"th\", null, f(s(u)(\"conn.nfs.col.label\")), 1),\n            o(\"th\", null, f(s(u)(\"conn.nfs.col.scope\")), 1),\n            o(\"th\", null, f(s(u)(\"conn.nfs.col.mode\")), 1),\n            o(\"th\", null, f(s(u)(\"conn.nfs.col.lastUsed\")), 1),\n            S[6] || (S[6] = o(\"th\", null, null, -1))\n          ])\n        ]),\n        o(\"tbody\", null, [\n          (c(!0), d(ae, null, Te(s(p), (w) => (c(), d(\"tr\", {\n            key: w.id,\n            class: we({ \"is-off\": !!w.disabled_at })\n          }, [\n            o(\"td\", null, f(w.label || s(u)(\"conn.nfs.noLabel\")), 1),\n            o(\"td\", null, f(pe(w)), 1),\n            o(\"td\", null, f(w.read_only ? s(u)(\"conn.nfs.modeRead\") : s(u)(\"conn.nfs.modeWrite\")), 1),\n            o(\"td\", null, f(w.last_used_at ? Q(w.last_used_at) : s(u)(\"conn.nfs.neverUsed\")), 1),\n            o(\"td\", v2, [\n              o(\"button\", {\n                class: \"fe-s3keys__link\",\n                disabled: O.value,\n                onClick: (j) => ve(w)\n              }, f(w.disabled_at ? s(u)(\"conn.nfs.enable\") : s(u)(\"conn.nfs.disable\")), 9, h2),\n              o(\"button\", {\n                class: \"fe-s3keys__link is-danger\",\n                disabled: O.value,\n                onClick: (j) => he(w)\n              }, f(J.value === w.id ? s(u)(\"conn.nfs.confirm\") : s(u)(\"conn.nfs.revoke\")), 9, m2)\n            ])\n          ], 2))), 128))\n        ])\n      ])) : s(A) ? (c(), d(\"p\", y2, f(s(u)(\"conn.nfs.empty\")), 1)) : g(\"\", !0)\n    ]));\n  }\n});\nfunction g2(e) {\n  const t = Ya(e), n = wa(e), r = (U) => `${n}${U}`, a = wn([]), u = m(!1), v = m(!1), p = m(null), h = m(null), b = m(null);\n  function y(U) {\n    const x = U;\n    if (x != null && x.detail)\n      try {\n        const E = JSON.parse(x.detail);\n        if (E != null && E.error) return E.error;\n      } catch {\n      }\n    return (x == null ? void 0 : x.message) || String(U);\n  }\n  function A(U) {\n    return U == null ? void 0 : U.status;\n  }\n  async function D() {\n    u.value = !0, p.value = null;\n    try {\n      const U = await t.jsonFetch(r(\"/api/tokens\"));\n      a.value = Array.isArray(U == null ? void 0 : U.tokens) ? U.tokens : [], h.value = !0;\n    } catch (U) {\n      a.value = [];\n      const x = A(U);\n      h.value = !1, x !== 401 && x !== 403 && (p.value = y(U));\n    } finally {\n      u.value = !1, v.value = !0;\n    }\n  }\n  async function C(U) {\n    p.value = null;\n    try {\n      const x = await t.jsonFetch(r(\"/api/tokens\"), {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(U)\n      });\n      return b.value = x, await D(), x;\n    } catch (x) {\n      return p.value = y(x), null;\n    }\n  }\n  async function B(U) {\n    var x, E;\n    p.value = null;\n    try {\n      await t.jsonFetch(r(`/api/tokens/${U}`), { method: \"DELETE\" }), ((E = (x = b.value) == null ? void 0 : x.row) == null ? void 0 : E.id) === U && (b.value = null), await D();\n    } catch ($) {\n      p.value = y($);\n    }\n  }\n  function I() {\n    b.value = null;\n  }\n  return { tokens: a, loading: u, loaded: v, error: p, canMint: h, revealed: b, load: D, create: C, remove: B, dismiss: I };\n}\nconst k2 = {\n  class: \"fe-s3keys\",\n  \"data-testid\": \"api-tokens\"\n}, _2 = { class: \"fe-s3keys__head\" }, w2 = { class: \"fe-s3keys__title\" }, $2 = { class: \"fe-s3keys__lead\" }, x2 = {\n  key: 0,\n  class: \"fe-s3keys__muted\"\n}, S2 = {\n  key: 1,\n  class: \"fe-s3keys__warn\"\n}, C2 = {\n  key: 2,\n  class: \"fe-s3keys__form\"\n}, T2 = [\"placeholder\"], M2 = [\"disabled\"], E2 = {\n  key: 3,\n  class: \"fe-tokform\",\n  \"data-testid\": \"token-form-full\"\n}, z2 = [\"placeholder\"], A2 = { class: \"fe-tokform__scopes\" }, P2 = { class: \"fe-tokform__legend\" }, L2 = [\"onUpdate:modelValue\", \"data-testid\"], D2 = { class: \"fe-tokform__field\" }, O2 = { class: \"fe-tokform__label\" }, B2 = [\"placeholder\"], I2 = { class: \"fe-tokform__row\" }, H2 = { class: \"fe-tokform__field fe-tokform__field--narrow\" }, F2 = { class: \"fe-tokform__label\" }, N2 = [\"placeholder\"], K2 = [\"disabled\"], R2 = { class: \"fe-s3keys__hint\" }, U2 = {\n  key: 4,\n  class: \"fe-s3keys__secret\",\n  \"data-testid\": \"token-secret\"\n}, V2 = { class: \"fe-s3keys__once\" }, j2 = { class: \"fe-s3keys__pair\" }, Y2 = {\n  key: 5,\n  class: \"fe-s3keys__muted\"\n}, W2 = { class: \"fe-s3keys__table\" }, q2 = { class: \"fe-s3keys__actions\" }, G2 = [\"disabled\", \"onClick\"], X2 = {\n  key: 7,\n  class: \"fe-s3keys__muted\"\n}, J2 = {\n  key: 8,\n  class: \"fe-s3keys__hint\"\n}, Hd = /* @__PURE__ */ qe({\n  __name: \"TokensPanel\",\n  props: {\n    config: {},\n    full: { type: Boolean },\n    protocol: {},\n    host: {}\n  },\n  emits: [\"active\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = k(() => cn(n.config.locale)), { t: u, formatDate: v } = tt(a), { scrolledX: p, onScroll: h } = Zi(), { tokens: b, loading: y, error: A, canMint: D, revealed: C, load: B, create: I, remove: U, dismiss: x } = g2(\n      n.config\n    ), E = m(\"\"), $ = m(!1), M = m(!1), z = m(null), T = [\"read\", \"write\", \"delete\", \"mcp\"], Y = m({\n      read: !0,\n      write: !1,\n      delete: !1,\n      mcp: !1\n    }), O = m(\"\"), J = m(null);\n    function G() {\n      const Q = T.filter((re) => Y.value[re]), pe = O.value.trim();\n      return pe && Q.push(\"root:\" + pe), Q.join(\",\");\n    }\n    dt(async () => {\n      await B(), r(\"active\", { hasToken: b.value.length > 0 });\n    });\n    function N() {\n      const Q = (n.protocol || \"\").toUpperCase();\n      return Q ? n.host ? `${Q} — ${n.host}` : Q : u(\"conn.tokens.defaultName\", { date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) });\n    }\n    function P() {\n      return n.protocol ? N() : u(\"conn.tokens.namePlaceholder\");\n    }\n    async function le() {\n      if (!$.value) {\n        $.value = !0, M.value = !1;\n        try {\n          if (n.full) {\n            const Q = G() || \"read\";\n            await I({\n              label: E.value.trim() || N(),\n              scopes: Q,\n              expires_in_days: J.value && J.value > 0 ? J.value : void 0\n            }), await B(), r(\"active\", { hasToken: b.value.length > 0 }), E.value = \"\", O.value = \"\";\n            return;\n          }\n          await I({ label: E.value.trim() || N(), scopes: \"read,write,delete\" }), await B(), r(\"active\", { hasToken: b.value.length > 0 }), E.value = \"\";\n        } finally {\n          $.value = !1;\n        }\n      }\n    }\n    async function ve(Q) {\n      if (z.value !== Q.id) {\n        z.value = Q.id;\n        return;\n      }\n      z.value = null, $.value = !0;\n      try {\n        await U(Q.id), r(\"active\", { hasToken: b.value.length > 0 });\n      } finally {\n        $.value = !1;\n      }\n    }\n    async function he() {\n      var Q;\n      if ((Q = C.value) != null && Q.token)\n        try {\n          await navigator.clipboard.writeText(C.value.token), M.value = !0, window.setTimeout(() => M.value = !1, 1600);\n        } catch {\n        }\n    }\n    function oe(Q) {\n      const pe = new Date(Q ?? \"\").getTime();\n      return Number.isNaN(pe) ? \"\" : v(pe);\n    }\n    function ue(Q) {\n      return Q.last_used_at ? oe(Q.last_used_at) : u(\"conn.tokens.neverUsed\");\n    }\n    return (Q, pe) => (c(), d(\"section\", k2, [\n      o(\"header\", _2, [\n        o(\"h4\", w2, f(s(u)(\"conn.tokens.title\")), 1),\n        o(\"p\", $2, f(s(u)(\"conn.tokens.lead\")), 1)\n      ]),\n      s(D) === !1 ? (c(), d(\"p\", x2, f(s(u)(\"conn.tokens.cannotMint\")), 1)) : g(\"\", !0),\n      s(A) ? (c(), d(\"p\", S2, f(s(A)), 1)) : g(\"\", !0),\n      s(D) && !e.full ? (c(), d(\"div\", C2, [\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": pe[0] || (pe[0] = (re) => E.value = re),\n          class: \"fe-cfield__input\",\n          placeholder: P(),\n          \"data-testid\": \"token-label\"\n        }, null, 8, T2), [\n          [rt, E.value]\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__btn\",\n          disabled: $.value,\n          \"data-testid\": \"token-mint\",\n          onClick: le\n        }, f(s(u)(\"conn.tokens.mint\")), 9, M2)\n      ])) : s(D) ? (c(), d(\"div\", E2, [\n        Ve(o(\"input\", {\n          \"onUpdate:modelValue\": pe[1] || (pe[1] = (re) => E.value = re),\n          class: \"fe-cfield__input\",\n          placeholder: P(),\n          \"data-testid\": \"token-label\"\n        }, null, 8, z2), [\n          [rt, E.value]\n        ]),\n        o(\"fieldset\", A2, [\n          o(\"legend\", P2, f(s(u)(\"conn.tokens.scopes\")), 1),\n          (c(), d(ae, null, Te(T, (re) => o(\"label\", {\n            key: re,\n            class: \"fe-tokform__scope\"\n          }, [\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": (S) => Y.value[re] = S,\n              type: \"checkbox\",\n              \"data-testid\": `token-scope-${re}`\n            }, null, 8, L2), [\n              [An, Y.value[re]]\n            ]),\n            o(\"span\", null, f(re), 1)\n          ])), 64))\n        ]),\n        o(\"label\", D2, [\n          o(\"span\", O2, f(s(u)(\"conn.tokens.root\")), 1),\n          Ve(o(\"input\", {\n            \"onUpdate:modelValue\": pe[2] || (pe[2] = (re) => O.value = re),\n            class: \"fe-cfield__input\",\n            placeholder: s(u)(\"conn.tokens.rootPlaceholder\"),\n            \"data-testid\": \"token-root\"\n          }, null, 8, B2), [\n            [rt, O.value]\n          ])\n        ]),\n        o(\"div\", I2, [\n          o(\"label\", H2, [\n            o(\"span\", F2, f(s(u)(\"conn.tokens.expiry\")), 1),\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": pe[3] || (pe[3] = (re) => J.value = re),\n              type: \"number\",\n              min: \"0\",\n              class: \"fe-cfield__input\",\n              placeholder: s(u)(\"conn.tokens.expiryNever\"),\n              \"data-testid\": \"token-expiry\"\n            }, null, 8, N2), [\n              [\n                rt,\n                J.value,\n                void 0,\n                { number: !0 }\n              ]\n            ])\n          ]),\n          o(\"button\", {\n            class: \"fe-s3keys__btn\",\n            disabled: $.value,\n            \"data-testid\": \"token-mint\",\n            onClick: le\n          }, f(s(u)(\"conn.tokens.mint\")), 9, K2)\n        ]),\n        o(\"p\", R2, f(s(u)(\"conn.tokens.capNote\")), 1)\n      ])) : g(\"\", !0),\n      s(C) ? (c(), d(\"div\", U2, [\n        o(\"p\", V2, f(s(u)(\"conn.tokens.once\")), 1),\n        o(\"div\", j2, [\n          o(\"code\", null, f(s(C).token), 1),\n          o(\"button\", {\n            class: \"fe-s3keys__copy\",\n            onClick: he\n          }, f(M.value ? s(u)(\"conn.guide.copied\") : s(u)(\"conn.guide.copy\")), 1)\n        ]),\n        o(\"button\", {\n          class: \"fe-s3keys__dismiss\",\n          onClick: pe[4] || (pe[4] = //@ts-ignore\n          (...re) => s(x) && s(x)(...re))\n        }, f(s(u)(\"conn.tokens.dismiss\")), 1)\n      ])) : g(\"\", !0),\n      s(y) ? (c(), d(\"p\", Y2, \"…\")) : s(b).length ? (c(), d(\"div\", {\n        key: 6,\n        class: we([\"fe-s3keys__scroll\", { \"is-scrolled-x\": s(p) }]),\n        onScrollPassive: pe[5] || (pe[5] = //@ts-ignore\n        (...re) => s(h) && s(h)(...re))\n      }, [\n        o(\"table\", W2, [\n          o(\"thead\", null, [\n            o(\"tr\", null, [\n              o(\"th\", null, f(s(u)(\"conn.tokens.col.label\")), 1),\n              o(\"th\", null, f(s(u)(\"conn.tokens.col.scopes\")), 1),\n              o(\"th\", null, f(s(u)(\"conn.tokens.col.used\")), 1),\n              pe[6] || (pe[6] = o(\"th\", null, null, -1))\n            ])\n          ]),\n          o(\"tbody\", null, [\n            (c(!0), d(ae, null, Te(s(b), (re) => (c(), d(\"tr\", {\n              key: re.id\n            }, [\n              o(\"td\", null, f(re.label || \"—\"), 1),\n              o(\"td\", null, [\n                o(\"code\", null, f(re.scopes), 1)\n              ]),\n              o(\"td\", null, f(ue(re)), 1),\n              o(\"td\", q2, [\n                o(\"button\", {\n                  class: \"fe-s3keys__link is-danger\",\n                  disabled: $.value,\n                  onClick: (S) => ve(re)\n                }, f(z.value === re.id ? s(u)(\"conn.tokens.confirm\") : s(u)(\"conn.tokens.revoke\")), 9, G2)\n              ])\n            ]))), 128))\n          ])\n        ])\n      ], 34)) : s(D) ? (c(), d(\"p\", X2, f(s(u)(\"conn.tokens.empty\")), 1)) : g(\"\", !0),\n      s(D) ? (c(), d(\"p\", J2, f(s(u)(\"conn.tokens.revokeHint\")), 1)) : g(\"\", !0)\n    ]));\n  }\n}), Z2 = { class: \"fe-conn__head\" }, Q2 = { class: \"fe-conn__title\" }, e$ = { class: \"fe-conn__sub\" }, t$ = [\"aria-label\"], n$ = [\"innerHTML\"], a$ = {\n  class: \"fe-conn__tabs\",\n  role: \"tablist\"\n}, o$ = [\"aria-selected\"], s$ = [\"aria-selected\"], r$ = {\n  key: 0,\n  class: \"fe-conn__body\",\n  role: \"tabpanel\"\n}, i$ = {\n  key: 0,\n  class: \"fe-conn__muted\"\n}, l$ = {\n  key: 0,\n  class: \"fe-conn__card fe-conn__card--notice\",\n  \"data-testid\": \"no-admin\"\n}, c$ = { class: \"fe-conn__muted\" }, u$ = { class: \"fe-conn__muted\" }, d$ = {\n  key: 1,\n  class: \"fe-conn__list\"\n}, f$ = { class: \"fe-conn__rowmain\" }, p$ = { class: \"fe-conn__name\" }, v$ = { class: \"fe-conn__muted\" }, h$ = {\n  key: 0,\n  class: \"fe-conn__error\"\n}, m$ = {\n  key: 1,\n  class: \"fe-conn__card fe-conn__form\",\n  \"data-testid\": \"storage-form\"\n}, y$ = { class: \"fe-conn__formtitle\" }, b$ = { class: \"fe-cfield__row\" }, g$ = {\n  class: \"fe-cfield__label\",\n  for: \"fe-conn-name\"\n}, k$ = [\"placeholder\"], _$ = { class: \"fe-cfield__help\" }, w$ = { class: \"fe-cfield__row\" }, $$ = {\n  class: \"fe-cfield__label\",\n  for: \"fe-conn-driver\"\n}, x$ = [\"value\", \"disabled\"], S$ = [\"value\"], C$ = {\n  key: 0,\n  class: \"fe-cfield__help\"\n}, T$ = { class: \"fe-cfield__check\" }, M$ = { class: \"fe-cfield__check\" }, E$ = {\n  key: 0,\n  class: \"fe-conn__error\",\n  \"data-testid\": \"form-error\"\n}, z$ = { class: \"fe-conn__actions\" }, A$ = [\"disabled\"], P$ = [\"disabled\"], L$ = { key: 2 }, D$ = { class: \"fe-conn__listhead\" }, O$ = { class: \"fe-conn__muted\" }, B$ = {\n  key: 0,\n  class: \"fe-conn__empty\"\n}, I$ = {\n  class: \"fe-conn__list\",\n  \"data-testid\": \"storage-list\"\n}, H$ = { class: \"fe-conn__rowmain\" }, F$ = { class: \"fe-conn__rowtext\" }, N$ = { class: \"fe-conn__name\" }, K$ = { class: \"fe-conn__badge\" }, R$ = {\n  key: 0,\n  class: \"fe-conn__badge fe-conn__badge--warn\"\n}, U$ = {\n  key: 1,\n  class: \"fe-conn__badge\"\n}, V$ = {\n  key: 2,\n  class: \"fe-conn__muted fe-conn__summary\"\n}, j$ = { class: \"fe-conn__rowbtns\" }, Y$ = [\"data-testid\", \"onClick\"], W$ = [\"onClick\"], q$ = {\n  key: 1,\n  class: \"fe-conn__body\",\n  role: \"tabpanel\"\n}, G$ = { class: \"fe-conn__guidebar\" }, X$ = {\n  key: 0,\n  class: \"fe-conn__pick\"\n}, J$ = { class: \"fe-cfield__label\" }, Z$ = [\"value\"], Q$ = { class: \"fe-conn__pick\" }, ex = { class: \"fe-cfield__label\" }, tx = { value: \"\" }, nx = [\"value\"], ax = /* @__PURE__ */ qe({\n  __name: \"ConnectionsPanel\",\n  props: {\n    config: {},\n    initialTab: {},\n    closable: { type: Boolean }\n  },\n  emits: [\"changed\", \"close\", \"error\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = k(() => cn(n.config.locale)), { t: u } = tt(a), {\n      drivers: v,\n      storages: p,\n      visible: h,\n      me: b,\n      publicUrl: y,\n      loading: A,\n      loaded: D,\n      error: C,\n      canManage: B,\n      denial: I,\n      load: U,\n      createStorage: x,\n      updateStorage: E,\n      deleteStorage: $,\n      testStorage: M,\n      descriptor: z,\n      fields: T,\n      defaults: Y,\n      missingRequired: O\n    } = Ww(n.config), J = typeof window < \"u\" && window.matchMedia ? window.matchMedia(\"(prefers-color-scheme: dark)\") : void 0, G = m(!!(J != null && J.matches));\n    function N(R) {\n      G.value = R.matches;\n    }\n    const P = k(() => {\n      const R = n.config.theme ?? \"auto\";\n      return R === \"light\" || R === \"dark\" ? R : G.value ? \"dark\" : \"light\";\n    }), le = m(n.initialTab ?? \"storages\"), ve = m({ kind: \"none\" }), he = m(\"\"), oe = m(\"\"), ue = m(!1), Q = m(!0), pe = m({}), re = m([]), S = m(!1), w = m(!1), j = m(null), K = m(\n      null\n    ), Z = m(null), W = m(null), $e = k(\n      () => v.value.map((R) => {\n        const X = u(R.i18n_key);\n        return { value: R.driver, label: X === R.i18n_key ? R.label : X };\n      })\n    ), Se = k(() => T(oe.value));\n    function ze() {\n      var X;\n      const R = ((X = v.value[0]) == null ? void 0 : X.driver) ?? \"\";\n      oe.value = R, he.value = \"\", ue.value = !1, Q.value = !0, pe.value = Y(R), re.value = [], j.value = null, Z.value = null, ve.value = { kind: \"new\" };\n    }\n    function Ne(R) {\n      oe.value = R.driver, he.value = R.name, ue.value = !!R.read_only, Q.value = R.enabled !== !1, pe.value = { ...R.config ?? {} }, re.value = [], j.value = null, Z.value = null, ve.value = { kind: \"edit\", row: R };\n    }\n    function be() {\n      ve.value = { kind: \"none\" }, j.value = null, Z.value = null;\n    }\n    function De(R) {\n      oe.value = R, pe.value = Y(R), re.value = [], j.value = null;\n    }\n    function ie() {\n      const R = O(oe.value, pe.value).map((X) => X.key);\n      return re.value = R, he.value.trim() ? R.length ? Z.value = u(\"conn.form.fillRequired\") : Z.value = null : Z.value = u(\"conn.form.nameRequired\"), !Z.value;\n    }\n    async function ce() {\n      w.value = !0, j.value = null;\n      try {\n        j.value = await M({\n          driver: oe.value,\n          config: pe.value\n        });\n      } finally {\n        w.value = !1;\n      }\n    }\n    async function L() {\n      if (ie()) {\n        S.value = !0, Z.value = null;\n        try {\n          const R = {\n            name: he.value.trim(),\n            driver: oe.value,\n            config: pe.value,\n            read_only: ue.value,\n            enabled: Q.value\n          };\n          ve.value.kind === \"edit\" ? await E(ve.value.row.id, R) : await x(R), be(), r(\"changed\");\n        } catch (R) {\n          const X = R ?? {};\n          let ye = \"\";\n          try {\n            ye = X.detail ? JSON.parse(X.detail).error ?? \"\" : \"\";\n          } catch {\n            ye = X.detail ?? \"\";\n          }\n          Z.value = ye || X.message || String(R), r(\"error\", { message: Z.value });\n        } finally {\n          S.value = !1;\n        }\n      }\n    }\n    async function se(R) {\n      if (W.value !== R.id) {\n        W.value = R.id;\n        return;\n      }\n      W.value = null;\n      try {\n        await $(R.id), r(\"changed\");\n      } catch (X) {\n        r(\"error\", { message: X.message });\n      }\n    }\n    function Ce(R) {\n      const X = z(R.driver), ye = R.config ?? {}, je = [], Qe = X == null ? void 0 : X.fields.find((fe) => fe.root), at = (fe, Pe = []) => {\n        for (const Be of [fe, ...Pe]) {\n          const ht = ye[Be];\n          if (typeof ht == \"string\" && ht.trim()) return ht;\n        }\n        return \"\";\n      }, Ye = at(\"endpoint\") || at(\"url\") || at(\"host\");\n      Ye && je.push(Ye);\n      const lt = at(\"bucket\");\n      if (lt && je.push(lt), Qe) {\n        const fe = at(Qe.key, Qe.aliases ?? []);\n        fe && je.push(fe);\n      }\n      return je.join(\" · \");\n    }\n    const We = n1(), Ie = m(We[0] ?? \"webdav\"), Ze = m(\"\"), vt = k(() => Yw(n.config, y.value)), Xe = m(\n      null\n    ), Ae = m(null), V = k(\n      () => {\n        var R, X, ye, je, Qe, at, Ye, lt, fe, Pe, Be, ht, Ft, ft, qt, Gt, wt, en, $t, kt, Dt, At, Ot, Bt, un, pt, tn;\n        return a1(\n          Ie.value,\n          {\n            origin: vt.value,\n            user: ((R = b.value) == null ? void 0 : R.email) ?? \"\",\n            storages: h.value,\n            storage: Ze.value || void 0,\n            s3Endpoint: (X = Xe.value) == null ? void 0 : X.endpoint,\n            s3PathStyle: (ye = Xe.value) == null ? void 0 : ye.pathStyle,\n            s3AccessKeyID: ((je = Xe.value) == null ? void 0 : je.accessKeyID) || void 0,\n            s3Secret: (Qe = Xe.value) == null ? void 0 : Qe.secret,\n            sftpHost: ((at = Ae.value) == null ? void 0 : at.host) || void 0,\n            sftpPort: (Ye = Ae.value) == null ? void 0 : Ye.port,\n            sftpEnabled: (lt = Ae.value) == null ? void 0 : lt.enabled,\n            sftpLogin: ((fe = Ae.value) == null ? void 0 : fe.login) || void 0,\n            sftpHasKey: (Pe = Ae.value) == null ? void 0 : Pe.hasKey,\n            ftpsHost: ((ht = (Be = Ae.value) == null ? void 0 : Be.ftps) == null ? void 0 : ht.host) || void 0,\n            ftpsPort: (ft = (Ft = Ae.value) == null ? void 0 : Ft.ftps) == null ? void 0 : ft.port,\n            ftpsEnabled: (Gt = (qt = Ae.value) == null ? void 0 : qt.ftps) == null ? void 0 : Gt.enabled,\n            ftpsPasvMin: (en = (wt = Ae.value) == null ? void 0 : wt.ftps) == null ? void 0 : en.pasv_min,\n            ftpsPasvMax: (kt = ($t = Ae.value) == null ? void 0 : $t.ftps) == null ? void 0 : kt.pasv_max,\n            ftpsSelfSigned: (At = (Dt = Ae.value) == null ? void 0 : Dt.ftps) == null ? void 0 : At.self_signed,\n            nfsHost: ((Ot = K.value) == null ? void 0 : Ot.host) || void 0,\n            nfsPort: (Bt = K.value) == null ? void 0 : Bt.port,\n            nfsEnabled: (un = K.value) == null ? void 0 : un.enabled,\n            nfsPath: (pt = K.value) == null ? void 0 : pt.path,\n            nfsReadOnly: (tn = K.value) == null ? void 0 : tn.readOnly\n          },\n          u\n        );\n      }\n    );\n    return He(\n      () => h.value,\n      (R) => {\n        !Ze.value && R.length === 1 && (Ze.value = R[0]);\n      }\n    ), dt(() => {\n      var R;\n      (R = J == null ? void 0 : J.addEventListener) == null || R.call(J, \"change\", N), U();\n    }), it(() => {\n      var R;\n      return (R = J == null ? void 0 : J.removeEventListener) == null ? void 0 : R.call(J, \"change\", N);\n    }), He(\n      () => [n.config.apiBase, n.config.endpoint],\n      () => {\n        be(), U();\n      }\n    ), (R, X) => (c(), d(\"div\", {\n      class: we([\"fe-conn\", {\n        \"fe--theme-dark\": P.value === \"dark\",\n        \"fe--theme-light\": P.value === \"light\"\n      }]),\n      \"data-testid\": \"connections-panel\"\n    }, [\n      o(\"header\", Z2, [\n        o(\"div\", null, [\n          o(\"h2\", Q2, f(s(u)(\"conn.title\")), 1),\n          o(\"p\", e$, f(s(u)(\"conn.subtitle\", { host: s(ka)(vt.value) })), 1)\n        ]),\n        e.closable ? (c(), d(\"button\", {\n          key: 0,\n          type: \"button\",\n          class: \"fe-conn__btn\",\n          \"data-testid\": \"connections-close\",\n          \"aria-label\": s(u)(\"conn.close\"),\n          onClick: X[0] || (X[0] = (ye) => r(\"close\"))\n        }, [\n          o(\"span\", {\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"close\")\n          }, null, 8, n$)\n        ], 8, t$)) : g(\"\", !0)\n      ]),\n      o(\"nav\", a$, [\n        o(\"button\", {\n          type: \"button\",\n          role: \"tab\",\n          class: we([\"fe-conn__tab\", { \"is-active\": le.value === \"storages\" }]),\n          \"aria-selected\": le.value === \"storages\",\n          \"data-testid\": \"tab-storages\",\n          onClick: X[1] || (X[1] = (ye) => le.value = \"storages\")\n        }, f(s(u)(\"conn.tab.storages\")), 11, o$),\n        o(\"button\", {\n          type: \"button\",\n          role: \"tab\",\n          class: we([\"fe-conn__tab\", { \"is-active\": le.value === \"connect\" }]),\n          \"aria-selected\": le.value === \"connect\",\n          \"data-testid\": \"tab-connect\",\n          onClick: X[2] || (X[2] = (ye) => le.value = \"connect\")\n        }, f(s(u)(\"conn.tab.connect\")), 11, s$)\n      ]),\n      le.value === \"storages\" ? (c(), d(\"section\", r$, [\n        s(A) && !s(D) ? (c(), d(\"p\", i$, f(s(u)(\"conn.loading\")), 1)) : (c(), d(ae, { key: 1 }, [\n          s(B) === !1 ? (c(), d(\"div\", l$, [\n            o(\"strong\", null, f(s(u)(\"conn.denied.title\")), 1),\n            o(\"p\", c$, f(s(I) === \"anonymous\" ? s(u)(\"conn.denied.anonymous\") : s(I) === \"unreachable\" ? s(u)(\"conn.denied.unreachable\", { error: s(C) ?? \"\" }) : s(u)(\"conn.denied.none\")), 1),\n            o(\"p\", u$, f(s(u)(\"conn.denied.guideHint\")), 1),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-conn__btn fe-conn__btn--primary\",\n              onClick: X[3] || (X[3] = (ye) => le.value = \"connect\")\n            }, f(s(u)(\"conn.denied.guideCta\")), 1)\n          ])) : g(\"\", !0),\n          s(B) === !1 && s(h).length ? (c(), d(\"div\", d$, [\n            (c(!0), d(ae, null, Te(s(h), (ye) => (c(), d(\"div\", {\n              key: ye,\n              class: \"fe-conn__card\"\n            }, [\n              o(\"div\", f$, [\n                o(\"strong\", p$, f(ye), 1),\n                o(\"span\", v$, f(s(u)(\"conn.visibleOnly\")), 1)\n              ])\n            ]))), 128))\n          ])) : g(\"\", !0),\n          s(B) ? (c(), d(ae, { key: 2 }, [\n            s(C) ? (c(), d(\"p\", h$, f(s(C)), 1)) : g(\"\", !0),\n            ve.value.kind !== \"none\" ? (c(), d(\"div\", m$, [\n              o(\"h3\", y$, f(ve.value.kind === \"edit\" ? s(u)(\"conn.form.editTitle\", { name: he.value }) : s(u)(\"conn.form.newTitle\")), 1),\n              o(\"div\", b$, [\n                o(\"label\", g$, [\n                  Je(f(s(u)(\"conn.form.name\")), 1),\n                  X[14] || (X[14] = o(\"span\", { class: \"fe-cfield__req\" }, \"*\", -1))\n                ]),\n                Ve(o(\"input\", {\n                  id: \"fe-conn-name\",\n                  \"onUpdate:modelValue\": X[4] || (X[4] = (ye) => he.value = ye),\n                  class: \"fe-cfield__input\",\n                  \"data-testid\": \"storage-name\",\n                  placeholder: s(u)(\"conn.form.namePlaceholder\")\n                }, null, 8, k$), [\n                  [rt, he.value]\n                ]),\n                o(\"p\", _$, f(s(u)(\"conn.form.nameHelp\")), 1)\n              ]),\n              o(\"div\", w$, [\n                o(\"label\", $$, f(s(u)(\"conn.form.driver\")), 1),\n                o(\"select\", {\n                  id: \"fe-conn-driver\",\n                  class: \"fe-cfield__input\",\n                  \"data-testid\": \"storage-driver\",\n                  value: oe.value,\n                  disabled: ve.value.kind === \"edit\",\n                  onChange: X[5] || (X[5] = (ye) => De(ye.target.value))\n                }, [\n                  (c(!0), d(ae, null, Te($e.value, (ye) => (c(), d(\"option\", {\n                    key: ye.value,\n                    value: ye.value\n                  }, f(ye.label), 9, S$))), 128))\n                ], 40, x$),\n                ve.value.kind === \"edit\" ? (c(), d(\"p\", C$, f(s(u)(\"conn.form.driverLocked\")), 1)) : g(\"\", !0)\n              ]),\n              Ge(T1, {\n                modelValue: pe.value,\n                \"onUpdate:modelValue\": X[6] || (X[6] = (ye) => pe.value = ye),\n                fields: Se.value,\n                locale: a.value,\n                invalid: re.value\n              }, null, 8, [\"modelValue\", \"fields\", \"locale\", \"invalid\"]),\n              o(\"label\", T$, [\n                Ve(o(\"input\", {\n                  \"onUpdate:modelValue\": X[7] || (X[7] = (ye) => ue.value = ye),\n                  type: \"checkbox\",\n                  \"data-testid\": \"storage-readonly\"\n                }, null, 512), [\n                  [An, ue.value]\n                ]),\n                o(\"span\", null, f(s(u)(\"conn.form.readOnly\")), 1)\n              ]),\n              o(\"label\", M$, [\n                Ve(o(\"input\", {\n                  \"onUpdate:modelValue\": X[8] || (X[8] = (ye) => Q.value = ye),\n                  type: \"checkbox\"\n                }, null, 512), [\n                  [An, Q.value]\n                ]),\n                o(\"span\", null, f(s(u)(\"conn.form.enabled\")), 1)\n              ]),\n              Z.value ? (c(), d(\"p\", E$, f(Z.value), 1)) : g(\"\", !0),\n              j.value ? (c(), d(\"p\", {\n                key: 1,\n                class: we([\"fe-conn__testresult\", j.value.ok ? \"is-ok\" : \"is-bad\"]),\n                \"data-testid\": \"test-result\"\n              }, f(j.value.ok ? s(u)(\"conn.form.testOk\", { count: j.value.object_count ?? 0 }) : s(u)(\"conn.form.testFail\", { error: j.value.error ?? \"\" })), 3)) : g(\"\", !0),\n              o(\"div\", z$, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-conn__btn\",\n                  \"data-testid\": \"storage-test\",\n                  disabled: w.value,\n                  onClick: ce\n                }, f(w.value ? s(u)(\"conn.form.testing\") : s(u)(\"conn.form.test\")), 9, A$),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-conn__btn fe-conn__btn--primary\",\n                  \"data-testid\": \"storage-save\",\n                  disabled: S.value,\n                  onClick: L\n                }, f(S.value ? s(u)(\"conn.form.saving\") : s(u)(\"conn.form.save\")), 9, P$),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-conn__btn\",\n                  onClick: be\n                }, f(s(u)(\"conn.form.cancel\")), 1)\n              ])\n            ])) : (c(), d(\"div\", L$, [\n              o(\"div\", D$, [\n                o(\"span\", O$, f(s(u)(\"conn.list.count\", { n: s(p).length })), 1),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-conn__btn fe-conn__btn--primary\",\n                  \"data-testid\": \"storage-add\",\n                  onClick: ze\n                }, \" + \" + f(s(u)(\"conn.list.add\")), 1)\n              ]),\n              s(p).length ? g(\"\", !0) : (c(), d(\"p\", B$, f(s(u)(\"conn.list.empty\")), 1)),\n              o(\"div\", I$, [\n                (c(!0), d(ae, null, Te(s(p), (ye) => (c(), d(\"div\", {\n                  key: ye.id,\n                  class: \"fe-conn__card\"\n                }, [\n                  o(\"div\", H$, [\n                    o(\"div\", F$, [\n                      o(\"strong\", N$, f(ye.name), 1),\n                      o(\"span\", K$, f(ye.driver), 1),\n                      ye.read_only ? (c(), d(\"span\", R$, f(s(u)(\"conn.list.readOnly\")), 1)) : g(\"\", !0),\n                      ye.enabled === !1 ? (c(), d(\"span\", U$, f(s(u)(\"conn.list.disabled\")), 1)) : g(\"\", !0),\n                      Ce(ye) ? (c(), d(\"div\", V$, f(Ce(ye)), 1)) : g(\"\", !0)\n                    ]),\n                    o(\"div\", j$, [\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-conn__btn\",\n                        \"data-testid\": `storage-edit-${ye.name}`,\n                        onClick: (je) => Ne(ye)\n                      }, f(s(u)(\"conn.list.edit\")), 9, Y$),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-conn__btn fe-conn__btn--danger\",\n                        onClick: (je) => se(ye)\n                      }, f(W.value === ye.id ? s(u)(\"conn.list.confirm\") : s(u)(\"conn.list.remove\")), 9, W$)\n                    ])\n                  ])\n                ]))), 128))\n              ])\n            ]))\n          ], 64)) : g(\"\", !0)\n        ], 64))\n      ])) : (c(), d(\"section\", q$, [\n        o(\"div\", G$, [\n          s(We).length > 1 ? (c(), d(\"label\", X$, [\n            o(\"span\", J$, f(s(u)(\"conn.guide.protocol\")), 1),\n            Ve(o(\"select\", {\n              \"onUpdate:modelValue\": X[9] || (X[9] = (ye) => Ie.value = ye),\n              class: \"fe-cfield__input\",\n              \"data-testid\": \"guide-protocol\"\n            }, [\n              (c(!0), d(ae, null, Te(s(We), (ye) => (c(), d(\"option\", {\n                key: ye,\n                value: ye\n              }, f(s(t1)(ye)), 9, Z$))), 128))\n            ], 512), [\n              [on, Ie.value]\n            ])\n          ])) : g(\"\", !0),\n          o(\"label\", Q$, [\n            o(\"span\", ex, f(s(u)(\"conn.guide.storage\")), 1),\n            Ve(o(\"select\", {\n              \"onUpdate:modelValue\": X[10] || (X[10] = (ye) => Ze.value = ye),\n              class: \"fe-cfield__input\",\n              \"data-testid\": \"guide-storage\"\n            }, [\n              o(\"option\", tx, f(s(u)(\"conn.guide.allStorages\")), 1),\n              (c(!0), d(ae, null, Te(s(h), (ye) => (c(), d(\"option\", {\n                key: ye,\n                value: ye\n              }, f(ye), 9, nx))), 128))\n            ], 512), [\n              [on, Ze.value]\n            ])\n          ])\n        ]),\n        Ie.value === \"s3\" ? (c(), et($0, {\n          key: 0,\n          config: e.config,\n          storages: s(h),\n          onActive: X[11] || (X[11] = (ye) => Xe.value = ye)\n        }, null, 8, [\"config\", \"storages\"])) : g(\"\", !0),\n        Ie.value === \"sftp\" || Ie.value === \"ftps\" ? (c(), et(V0, {\n          key: 1,\n          config: e.config,\n          \"keys-visible\": Ie.value === \"sftp\",\n          onActive: X[12] || (X[12] = (ye) => Ae.value = ye)\n        }, null, 8, [\"config\", \"keys-visible\"])) : g(\"\", !0),\n        Ie.value === \"nfs\" ? (c(), et(b2, {\n          key: 2,\n          config: e.config,\n          storages: s(h),\n          onActive: X[13] || (X[13] = (ye) => K.value = ye)\n        }, null, 8, [\"config\", \"storages\"])) : g(\"\", !0),\n        Ie.value === \"ftps\" || Ie.value === \"webdav\" || Ie.value === \"mount\" ? (c(), et(Hd, {\n          key: 3,\n          config: e.config,\n          protocol: Ie.value,\n          host: s(ka)(vt.value)\n        }, null, 8, [\"config\", \"protocol\", \"host\"])) : g(\"\", !0),\n        V.value ? (c(), et(G1, {\n          key: 4,\n          guide: V.value,\n          locale: a.value\n        }, null, 8, [\"guide\", \"locale\"])) : g(\"\", !0)\n      ]))\n    ], 2));\n  }\n}), ox = [\"aria-label\"], sx = { class: \"fe-cmdp__inputwrap\" }, rx = [\"placeholder\"], ix = [\"aria-selected\", \"onMouseenter\", \"onClick\"], lx = [\"innerHTML\"], cx = { class: \"fe-cmdp__label\" }, ux = { class: \"fe-cmdp__group\" }, dx = [\"aria-selected\", \"onMouseenter\", \"onClick\"], fx = [\"innerHTML\"], px = { class: \"fe-cmdp__label\" }, vx = { class: \"fe-cmdp__group\" }, hx = {\n  key: 0,\n  class: \"fe-cmdp__loading\"\n}, mx = [\"aria-selected\", \"onMouseenter\", \"onClick\"], yx = [\"innerHTML\"], bx = { class: \"fe-cmdp__hitbody\" }, gx = { class: \"fe-cmdp__hitline\" }, kx = { class: \"fe-cmdp__label\" }, _x = {\n  key: 0,\n  class: \"fe-cmdp__badge\"\n}, wx = [\"title\"], $x = {\n  key: 1,\n  class: \"fe-cmdp__snippet\"\n}, xx = {\n  key: 0,\n  class: \"fe-cmdp__mark\"\n}, Sx = { class: \"fe-cmdp__group\" }, Cx = [\"aria-selected\", \"onMouseenter\", \"onClick\", \"onKeydown\"], Tx = [\"innerHTML\"], Mx = { class: \"fe-cmdp__label\" }, Ex = [\"title\", \"aria-label\", \"onClick\"], zx = [\"innerHTML\"], Ax = { class: \"fe-cmdp__group\" }, Px = [\"aria-selected\", \"onMouseenter\", \"onClick\"], Lx = [\"innerHTML\"], Dx = { class: \"fe-cmdp__label\" }, Ox = {\n  key: 4,\n  class: \"fe-cmdp__empty\"\n}, Bx = { class: \"fe-cmdp__hint\" }, Ix = 3, Hx = 8, Fx = 250, bu = \"filex.saved-searches\", gu = 10, Nx = /* @__PURE__ */ qe({\n  __name: \"CommandPalette\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    files: {},\n    viewMode: {},\n    canWrite: { type: Boolean },\n    canGoUp: { type: Boolean },\n    globalSearch: { type: Function },\n    splitEnabled: { type: Boolean },\n    initialQuery: {}\n  },\n  emits: [\"close\", \"open-node\", \"navigate\", \"new-folder\", \"upload\", \"toggle-view\", \"open-trash\", \"refresh\", \"go-up\", \"open-hit\", \"open-theme\", \"open-shortcut-settings\", \"start-tour\", \"tab-new\", \"split-toggle\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, nodeDisplayName: u } = tt(() => n.locale), v = m(\"\"), p = m(0), h = m(null), b = m(null);\n    function y(S) {\n      const w = S.lastIndexOf(\".\");\n      return w > 0 ? S.slice(w + 1) : \"\";\n    }\n    function A(S) {\n      if (S.kind === \"file\") return fn(S.node);\n      if (S.kind === \"hit\") {\n        const w = String(S.hit.name ?? \"\");\n        return fn({\n          type: S.hit.type === \"dir\" ? \"dir\" : \"file\",\n          extension: y(w),\n          basename: w\n        });\n      }\n      return Ue(S.icon);\n    }\n    function D(S, w) {\n      if (!w) return 0;\n      const j = S.toLocaleLowerCase(), K = w.toLocaleLowerCase(), Z = j.indexOf(K);\n      if (Z === -1) return -1;\n      let W = 100 - Math.min(Z, 50);\n      return Z === 0 && (W += 40), W -= Math.min(j.length, 40) / 4, W;\n    }\n    const C = k(() => {\n      const S = v.value.trim();\n      if (!S.includes(\"/\")) return [];\n      const w = S.replace(/^\\/+|\\/+$/g, \"\");\n      return w ? [\n        { kind: \"goto\", id: `goto:${w}`, label: `${a(\"palette.goto\")}: ${w}`, icon: \"goto\", path: w }\n      ] : [];\n    }), B = k(() => {\n      const S = v.value.trim(), w = n.files.map((j) => ({ f: j, name: u(j), s: D(u(j), S) })).filter((j) => j.s >= 0);\n      return S && w.sort((j, K) => K.s - j.s), w.slice(0, 8).map((j) => ({\n        kind: \"file\",\n        id: `file:${j.f.path}`,\n        label: j.name,\n        icon: \"\",\n        // file rows draw their real tile — see iconHtml()\n        node: j.f\n      }));\n    }), I = k(() => {\n      const S = v.value.trim();\n      return [\n        { command: \"new-folder\", label: a(\"toolbar.new_folder\"), icon: \"new-folder\", enabled: n.canWrite !== !1 },\n        { command: \"upload\", label: a(\"toolbar.upload\"), icon: \"upload\", enabled: n.canWrite !== !1 },\n        /* wiring:d2 — the mark is the NEXT mode (list→grid→gallery→list), which is\n           what pressing the row gets you; the three keys are the ViewSwitcher's own. */\n        { command: \"toggle-view\", label: a(\"cmd.view_toggle\"), icon: n.viewMode === \"list\" ? \"view-grid\" : n.viewMode === \"grid\" ? \"view-gallery\" : \"view-list\", enabled: !0 },\n        { command: \"open-trash\", label: a(\"cmd.trash\"), icon: \"open-trash\", enabled: !0 },\n        { command: \"refresh\", label: a(\"toolbar.refresh\"), icon: \"refresh\", enabled: !0 },\n        { command: \"go-up\", label: a(\"toolbar.go_up\"), icon: \"go-up\", enabled: n.canGoUp !== !1 },\n        /* wiring:int */\n        { command: \"open-theme\", label: a(\"theme.menu\"), icon: \"theme\", enabled: !0 },\n        { command: \"open-shortcut-settings\", label: a(\"shortcuts.settings.menu\"), icon: \"shortcut-settings\", enabled: !0 },\n        { command: \"start-tour\", label: a(\"tour.restart\"), icon: \"tour\", enabled: !0 },\n        /* wiring:d1 — tabs + split */\n        { command: \"tab-new\", label: a(\"cmd.tab_new\"), icon: \"tab-new\", enabled: !0 },\n        { command: \"split-toggle\", label: a(\"cmd.split_toggle\"), icon: \"split\", enabled: n.splitEnabled !== !1 }\n      ].filter((j) => j.enabled && D(j.label, S) >= 0).map((j) => ({ kind: \"command\", id: `cmd:${j.command}`, label: j.label, icon: j.icon, command: j.command }));\n    }), U = m([]), x = m(!1);\n    let E, $ = 0;\n    function M(S) {\n      E && clearTimeout(E);\n      const w = n.globalSearch;\n      if (!w || S.length < Ix) {\n        U.value = [], x.value = !1;\n        return;\n      }\n      x.value = !0, E = setTimeout(async () => {\n        const j = ++$;\n        try {\n          const K = await w(S);\n          if (j !== $) return;\n          U.value = Array.isArray(K) ? K.slice(0, Hx) : [];\n        } catch {\n          j === $ && (U.value = []);\n        } finally {\n          j === $ && (x.value = !1);\n        }\n      }, Fx);\n    }\n    function z(S) {\n      const w = String(S.path ?? \"\").replace(/^\\/+|\\/+$/g, \"\"), j = w.lastIndexOf(\"/\"), K = j === -1 ? \"\" : w.slice(0, j), Z = typeof S.storage == \"string\" && S.storage || typeof S.storage_name == \"string\" && S.storage_name || \"\";\n      return Z && K ? `${Z}/${K}` : Z || K || \"/\";\n    }\n    const T = k(\n      () => U.value.map((S) => ({\n        kind: \"hit\",\n        id: `hit:${S.storage_id ?? \"\"}:${S.path ?? \"\"}:${S.id ?? \"\"}`,\n        label: String(S.name ?? S.path ?? \"\"),\n        icon: \"\",\n        // hit rows draw their real tile — see iconHtml()\n        hit: S,\n        crumb: z(S),\n        inContent: Od(S.matched),\n        snippet: typeof S.snippet == \"string\" ? S.snippet : \"\"\n      }))\n    ), Y = m([]);\n    function O() {\n      try {\n        const S = localStorage.getItem(bu);\n        if (!S) return [];\n        const w = JSON.parse(S);\n        return Array.isArray(w) ? w.filter((j) => typeof j == \"string\" && j.trim() !== \"\").slice(0, gu) : [];\n      } catch {\n        return [];\n      }\n    }\n    function J(S) {\n      Y.value = S.slice(0, gu);\n      try {\n        localStorage.setItem(bu, JSON.stringify(Y.value));\n      } catch {\n      }\n    }\n    function G(S) {\n      const w = S.trim();\n      if (!w) return;\n      const j = Y.value.filter((K) => K !== w);\n      j.unshift(w), J(j);\n    }\n    function N(S) {\n      J(Y.value.filter((w) => w !== S)), p.value >= le.value.length && (p.value = Math.max(0, le.value.length - 1));\n    }\n    const P = k(() => {\n      const S = v.value.trim(), w = [];\n      S && !Y.value.includes(S) && w.push({ kind: \"save\", id: `save:${S}`, label: `${a(\"palette.save\")}: ${S}`, icon: \"save-search\", query: S });\n      const j = Y.value.map((K) => ({ s: K, sc: D(K, S) })).filter((K) => K.sc >= 0 || !S);\n      for (const K of j)\n        w.push({ kind: \"saved\", id: `saved:${K.s}`, label: K.s, icon: \"bookmark\", query: K.s });\n      return w;\n    }), le = k(() => [\n      ...C.value,\n      ...B.value,\n      ...T.value,\n      ...P.value,\n      ...I.value\n    ]), ve = k(() => C.value.length), he = k(() => ve.value + B.value.length), oe = k(() => he.value + T.value.length), ue = k(() => oe.value + P.value.length);\n    He(v, (S) => {\n      p.value = 0, M(S.trim());\n    });\n    function Q(S) {\n      const w = le.value.length;\n      w && (p.value = (p.value + S + w) % w, gt(() => {\n        var j, K;\n        (K = (j = b.value) == null ? void 0 : j.querySelector(\".is-active\")) == null || K.scrollIntoView({ block: \"nearest\" });\n      }));\n    }\n    function pe(S) {\n      const w = S ?? le.value[p.value];\n      if (w) {\n        if (w.kind === \"saved\") {\n          v.value = w.query, gt(() => {\n            var j;\n            return (j = h.value) == null ? void 0 : j.focus();\n          });\n          return;\n        }\n        if (w.kind === \"save\") {\n          G(w.query), gt(() => {\n            var j;\n            return (j = h.value) == null ? void 0 : j.focus();\n          });\n          return;\n        }\n        if (r(\"close\"), w.kind === \"hit\") {\n          r(\"open-hit\", w.hit);\n          return;\n        }\n        if (w.kind === \"file\")\n          r(\"open-node\", w.node);\n        else if (w.kind === \"goto\")\n          r(\"navigate\", w.path);\n        else\n          switch (w.command) {\n            case \"new-folder\":\n              r(\"new-folder\");\n              break;\n            case \"upload\":\n              r(\"upload\");\n              break;\n            case \"toggle-view\":\n              r(\"toggle-view\");\n              break;\n            case \"open-trash\":\n              r(\"open-trash\");\n              break;\n            case \"refresh\":\n              r(\"refresh\");\n              break;\n            case \"go-up\":\n              r(\"go-up\");\n              break;\n            case \"open-theme\":\n              r(\"open-theme\");\n              break;\n            case \"open-shortcut-settings\":\n              r(\"open-shortcut-settings\");\n              break;\n            case \"start-tour\":\n              r(\"start-tour\");\n              break;\n            case \"tab-new\":\n              r(\"tab-new\");\n              break;\n            case \"split-toggle\":\n              r(\"split-toggle\");\n              break;\n          }\n      }\n    }\n    function re(S) {\n      if (n.open)\n        switch (S.key) {\n          case \"ArrowDown\":\n            S.preventDefault(), S.stopPropagation(), Q(1);\n            break;\n          case \"ArrowUp\":\n            S.preventDefault(), S.stopPropagation(), Q(-1);\n            break;\n          case \"Enter\":\n            S.preventDefault(), S.stopPropagation(), pe();\n            break;\n          case \"Escape\":\n            S.preventDefault(), S.stopPropagation(), r(\"close\");\n            break;\n        }\n    }\n    return He(\n      () => n.open,\n      (S) => {\n        S ? (v.value = n.initialQuery ?? \"\", p.value = 0, U.value = [], x.value = !1, Y.value = O(), document.addEventListener(\"keydown\", re, !0), gt(() => {\n          var w, j;\n          (w = h.value) == null || w.focus(), (j = h.value) == null || j.select();\n        })) : (E && clearTimeout(E), document.removeEventListener(\"keydown\", re, !0));\n      }\n    ), it(() => {\n      E && clearTimeout(E), document.removeEventListener(\"keydown\", re, !0);\n    }), (S, w) => (c(), et(Rn, { name: \"fe-modal\" }, {\n      default: st(() => [\n        e.open ? (c(), d(\"div\", {\n          key: 0,\n          class: \"fe-modal__backdrop fe-cmdp__backdrop\",\n          role: \"presentation\",\n          onClick: w[2] || (w[2] = (j) => r(\"close\"))\n        }, [\n          o(\"div\", {\n            class: \"fe-cmdp\",\n            role: \"dialog\",\n            \"aria-modal\": \"true\",\n            \"aria-label\": s(a)(\"palette.placeholder\"),\n            onClick: w[1] || (w[1] = Re(() => {\n            }, [\"stop\"]))\n          }, [\n            o(\"div\", sx, [\n              w[3] || (w[3] = o(\"svg\", {\n                class: \"fe-cmdp__glyph\",\n                width: \"16\",\n                height: \"16\",\n                viewBox: \"0 0 16 16\",\n                fill: \"none\",\n                stroke: \"currentColor\",\n                \"stroke-width\": \"1.5\",\n                \"stroke-linecap\": \"round\",\n                \"aria-hidden\": \"true\"\n              }, [\n                o(\"circle\", {\n                  cx: \"7\",\n                  cy: \"7\",\n                  r: \"4.5\"\n                }),\n                o(\"path\", { d: \"m10.5 10.5 3.5 3.5\" })\n              ], -1)),\n              Ve(o(\"input\", {\n                ref_key: \"inputEl\",\n                ref: h,\n                \"onUpdate:modelValue\": w[0] || (w[0] = (j) => v.value = j),\n                type: \"text\",\n                class: \"fe-cmdp__input\",\n                placeholder: s(a)(\"palette.placeholder\"),\n                autocomplete: \"off\",\n                spellcheck: \"false\"\n              }, null, 8, rx), [\n                [rt, v.value]\n              ])\n            ]),\n            o(\"div\", {\n              ref_key: \"listEl\",\n              ref: b,\n              class: \"fe-cmdp__list\",\n              role: \"listbox\"\n            }, [\n              (c(!0), d(ae, null, Te(C.value, (j, K) => (c(), d(\"button\", {\n                key: j.id,\n                type: \"button\",\n                class: we([\"fe-cmdp__item\", { \"is-active\": K === p.value }]),\n                role: \"option\",\n                \"aria-selected\": K === p.value,\n                onMouseenter: (Z) => p.value = K,\n                onClick: (Z) => pe(j)\n              }, [\n                o(\"span\", {\n                  class: \"fe-cmdp__icon\",\n                  \"aria-hidden\": \"true\",\n                  innerHTML: A(j)\n                }, null, 8, lx),\n                o(\"span\", cx, f(j.label), 1)\n              ], 42, ix))), 128)),\n              B.value.length ? (c(), d(ae, { key: 0 }, [\n                o(\"div\", ux, f(s(a)(\"palette.files\")), 1),\n                (c(!0), d(ae, null, Te(B.value, (j, K) => (c(), d(\"button\", {\n                  key: j.id,\n                  type: \"button\",\n                  class: we([\"fe-cmdp__item\", { \"is-active\": ve.value + K === p.value }]),\n                  role: \"option\",\n                  \"aria-selected\": ve.value + K === p.value,\n                  onMouseenter: (Z) => p.value = ve.value + K,\n                  onClick: (Z) => pe(j)\n                }, [\n                  o(\"span\", {\n                    class: \"fe-cmdp__icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: A(j)\n                  }, null, 8, fx),\n                  o(\"span\", px, f(j.label), 1)\n                ], 42, dx))), 128))\n              ], 64)) : g(\"\", !0),\n              T.value.length || x.value ? (c(), d(ae, { key: 1 }, [\n                o(\"div\", vx, f(s(a)(\"palette.everywhere\")), 1),\n                x.value && !T.value.length ? (c(), d(\"div\", hx, f(s(a)(\"palette.searching\")), 1)) : g(\"\", !0),\n                (c(!0), d(ae, null, Te(T.value, (j, K) => (c(), d(\"button\", {\n                  key: j.id,\n                  type: \"button\",\n                  class: we([\"fe-cmdp__item fe-cmdp__item--hit\", { \"is-active\": he.value + K === p.value }]),\n                  role: \"option\",\n                  \"aria-selected\": he.value + K === p.value,\n                  onMouseenter: (Z) => p.value = he.value + K,\n                  onClick: (Z) => pe(j)\n                }, [\n                  o(\"span\", {\n                    class: \"fe-cmdp__icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: A(j)\n                  }, null, 8, yx),\n                  o(\"span\", bx, [\n                    o(\"span\", gx, [\n                      o(\"span\", kx, f(j.label), 1),\n                      j.inContent ? (c(), d(\"span\", _x, f(s(a)(\"search.in_content\")), 1)) : g(\"\", !0)\n                    ]),\n                    j.crumb ? (c(), d(\"span\", {\n                      key: 0,\n                      class: \"fe-cmdp__crumb\",\n                      title: j.crumb\n                    }, f(j.crumb), 9, wx)) : g(\"\", !0),\n                    j.snippet ? (c(), d(\"span\", $x, [\n                      (c(!0), d(ae, null, Te(s(Vs)(j.snippet), (Z, W) => (c(), d(ae, { key: W }, [\n                        Z.match ? (c(), d(\"mark\", xx, f(Z.text), 1)) : (c(), d(ae, { key: 1 }, [\n                          Je(f(Z.text), 1)\n                        ], 64))\n                      ], 64))), 128))\n                    ])) : g(\"\", !0)\n                  ])\n                ], 42, mx))), 128))\n              ], 64)) : g(\"\", !0),\n              P.value.length ? (c(), d(ae, { key: 2 }, [\n                o(\"div\", Sx, f(s(a)(\"palette.saved\")), 1),\n                (c(!0), d(ae, null, Te(P.value, (j, K) => (c(), d(\"div\", {\n                  key: j.id,\n                  class: we([\"fe-cmdp__item fe-cmdp__item--saved\", { \"is-active\": oe.value + K === p.value }]),\n                  role: \"option\",\n                  \"aria-selected\": oe.value + K === p.value,\n                  tabindex: \"-1\",\n                  onMouseenter: (Z) => p.value = oe.value + K,\n                  onClick: (Z) => pe(j),\n                  onKeydown: Ut(Re((Z) => pe(j), [\"prevent\"]), [\"enter\"])\n                }, [\n                  o(\"span\", {\n                    class: \"fe-cmdp__icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: A(j)\n                  }, null, 8, Tx),\n                  o(\"span\", Mx, f(j.label), 1),\n                  j.kind === \"saved\" ? (c(), d(\"button\", {\n                    key: 0,\n                    type: \"button\",\n                    class: \"fe-cmdp__del\",\n                    title: s(a)(\"palette.saved.delete\"),\n                    \"aria-label\": s(a)(\"palette.saved.delete\"),\n                    onClick: Re((Z) => N(j.query), [\"stop\"])\n                  }, [\n                    o(\"span\", {\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"delete\")\n                    }, null, 8, zx)\n                  ], 8, Ex)) : g(\"\", !0)\n                ], 42, Cx))), 128))\n              ], 64)) : g(\"\", !0),\n              I.value.length ? (c(), d(ae, { key: 3 }, [\n                o(\"div\", Ax, f(s(a)(\"palette.commands\")), 1),\n                (c(!0), d(ae, null, Te(I.value, (j, K) => (c(), d(\"button\", {\n                  key: j.id,\n                  type: \"button\",\n                  class: we([\"fe-cmdp__item\", { \"is-active\": ue.value + K === p.value }]),\n                  role: \"option\",\n                  \"aria-selected\": ue.value + K === p.value,\n                  onMouseenter: (Z) => p.value = ue.value + K,\n                  onClick: (Z) => pe(j)\n                }, [\n                  o(\"span\", {\n                    class: \"fe-cmdp__icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: A(j)\n                  }, null, 8, Lx),\n                  o(\"span\", Dx, f(j.label), 1)\n                ], 42, Px))), 128))\n              ], 64)) : g(\"\", !0),\n              le.value.length === 0 && !x.value ? (c(), d(\"div\", Ox, f(s(a)(\"palette.empty\")), 1)) : g(\"\", !0)\n            ], 512),\n            o(\"div\", Bx, f(s(a)(\"palette.hint\")), 1)\n          ], 8, ox)\n        ])) : g(\"\", !0)\n      ]),\n      _: 1\n    }));\n  }\n}), Kx = [\"aria-labelledby\", \"aria-label\"], Rx = {\n  key: 0,\n  class: \"fe-modal__head\"\n}, Ux = { class: \"fe-modal__body\" }, Vx = {\n  key: 1,\n  class: \"fe-modal__actions\"\n}, ku = 'input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),a[href],[tabindex]:not([tabindex=\"-1\"])', an = /* @__PURE__ */ qe({\n  __name: \"Modal\",\n  props: {\n    open: { type: Boolean },\n    title: {},\n    size: {},\n    closeOnBackdrop: { type: Boolean },\n    chromeless: { type: Boolean },\n    fullbleed: { type: Boolean },\n    theme: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = m(null);\n    let u = 0;\n    const v = `fe-modal-title-${++u}-${Math.random().toString(36).slice(2, 7)}`;\n    let p = null;\n    He(\n      () => n.open,\n      (y) => {\n        var A;\n        y ? (p = document.activeElement ?? null, document.addEventListener(\"keydown\", h), setTimeout(() => {\n          var C;\n          const D = (C = a.value) == null ? void 0 : C.querySelector(ku);\n          D == null || D.focus();\n        }, 30)) : (document.removeEventListener(\"keydown\", h), (A = p == null ? void 0 : p.focus) == null || A.call(p), p = null);\n      }\n    ), it(() => document.removeEventListener(\"keydown\", h));\n    function h(y) {\n      if (y.key === \"Escape\") {\n        r(\"close\");\n        return;\n      }\n      if (y.key === \"Tab\" && a.value) {\n        const A = Array.from(a.value.querySelectorAll(ku)).filter(\n          (I) => I.offsetParent !== null || I === document.activeElement\n        );\n        if (A.length === 0) return;\n        const D = A[0], C = A[A.length - 1], B = document.activeElement;\n        y.shiftKey && (B === D || !a.value.contains(B)) ? (y.preventDefault(), C.focus()) : !y.shiftKey && (B === C || !a.value.contains(B)) && (y.preventDefault(), D.focus());\n      }\n    }\n    function b() {\n      n.closeOnBackdrop !== !1 && r(\"close\");\n    }\n    return (y, A) => (c(), et(Rn, { name: \"fe-modal\" }, {\n      default: st(() => [\n        e.open ? (c(), d(\"div\", {\n          key: 0,\n          class: we([\"fe fe-modal__backdrop\", [\n            { \"fe-modal__backdrop--chromeless\": e.chromeless },\n            { \"fe-modal__backdrop--fullbleed\": e.fullbleed && !e.chromeless },\n            e.theme === \"light\" ? \"fe--theme-light\" : \"\",\n            e.theme === \"dark\" ? \"fe--theme-dark\" : \"\"\n          ]]),\n          role: \"presentation\",\n          onClick: b\n        }, [\n          o(\"div\", {\n            ref_key: \"cardEl\",\n            ref: a,\n            class: we([\"fe-modal__card\", [\n              `fe-modal__card--${e.size || \"md\"}`,\n              e.chromeless && \"fe-modal__card--chromeless\",\n              e.fullbleed && !e.chromeless && \"fe-modal__card--fullbleed\"\n            ]]),\n            role: \"dialog\",\n            \"aria-modal\": \"true\",\n            \"aria-labelledby\": e.title && !e.chromeless && !e.fullbleed ? v : void 0,\n            \"aria-label\": (!e.title || e.chromeless || e.fullbleed) && e.title || void 0,\n            onClick: A[1] || (A[1] = Re(() => {\n            }, [\"stop\"]))\n          }, [\n            e.title && !e.chromeless && !e.fullbleed ? (c(), d(\"header\", Rx, [\n              o(\"h2\", {\n                id: v,\n                class: \"fe-modal__title\"\n              }, f(e.title), 1),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-modal__close\",\n                \"aria-label\": \"Close\",\n                onClick: A[0] || (A[0] = (D) => r(\"close\"))\n              }, \"×\")\n            ])) : g(\"\", !0),\n            o(\"div\", Ux, [\n              _n(y.$slots, \"default\")\n            ]),\n            y.$slots.actions && !e.chromeless && !e.fullbleed ? (c(), d(\"footer\", Vx, [\n              _n(y.$slots, \"actions\")\n            ])) : g(\"\", !0)\n          ], 10, Kx)\n        ], 2)) : g(\"\", !0)\n      ]),\n      _: 3\n    }));\n  }\n});\nfunction jx(e = \"\") {\n  return {\n    text: \"\",\n    tags: [],\n    excludeTags: [],\n    scope: \"name\",\n    filters: { ...na, pathBase: e }\n  };\n}\nfunction _u(e, t) {\n  const n = e.trim();\n  if (!n) return \"\";\n  const r = /\\s/.test(n) ? `\"${n}\"` : n;\n  return `${t ? \"-\" : \"\"}tag:${r}`;\n}\nfunction js(e) {\n  const t = [], n = e.text.trim();\n  n && t.push(n);\n  for (const r of e.tags) {\n    const a = _u(r, !1);\n    a && t.push(a);\n  }\n  for (const r of e.excludeTags) {\n    const a = _u(r, !0);\n    a && t.push(a);\n  }\n  return t.join(\" \");\n}\nfunction Yx(e) {\n  return js(e) === \"\";\n}\nfunction wu(e) {\n  return e.split(/[,\\n]/).map((t) => t.trim()).filter((t) => t !== \"\");\n}\nfunction Wx(e, t) {\n  return e >= t;\n}\nconst qx = { class: \"fe-advsearch__head\" }, Gx = [\"innerHTML\"], Xx = { class: \"fe-advsearch__head-text\" }, Jx = { class: \"fe-advsearch__head-title\" }, Zx = { class: \"fe-advsearch__head-sub\" }, Qx = [\"title\", \"aria-label\"], eS = [\"innerHTML\"], tS = { class: \"fe-advsearch__box\" }, nS = [\"innerHTML\"], aS = [\"placeholder\", \"aria-label\"], oS = [\"aria-label\"], sS = [\"aria-selected\", \"data-testid\", \"onClick\"], rS = [\"innerHTML\"], iS = { class: \"fe-advsearch__cols\" }, lS = { class: \"fe-advsearch__col\" }, cS = { class: \"fe-advsearch__group\" }, uS = { class: \"fe-advsearch__field\" }, dS = { class: \"fe-advsearch__label\" }, fS = [\"value\"], pS = {\n  key: 0,\n  class: \"fe-advsearch__field\"\n}, vS = { class: \"fe-advsearch__sublabel\" }, hS = { class: \"fe-advsearch__pair\" }, mS = [\"aria-label\"], yS = [\"aria-label\"], bS = [\"aria-pressed\", \"onClick\"], gS = { class: \"fe-advsearch__field\" }, kS = { class: \"fe-advsearch__label\" }, _S = [\"value\"], wS = { class: \"fe-advsearch__group\" }, $S = { class: \"fe-advsearch__field\" }, xS = { class: \"fe-advsearch__label\" }, SS = [\"disabled\"], CS = [\"value\"], TS = {\n  key: 0,\n  class: \"fe-advsearch__hint fe-advsearch__hint--block\"\n}, MS = { class: \"fe-advsearch__group\" }, ES = { class: \"fe-advsearch__field\" }, zS = { class: \"fe-advsearch__label\" }, AS = [\"placeholder\"], PS = { class: \"fe-advsearch__field\" }, LS = { class: \"fe-advsearch__label\" }, DS = [\"placeholder\"], OS = { class: \"fe-advsearch__hint fe-advsearch__hint--block\" }, BS = { class: \"fe-advsearch__col\" }, IS = { class: \"fe-advsearch__group\" }, HS = { class: \"fe-advsearch__field\" }, FS = { class: \"fe-advsearch__label\" }, NS = [\"value\"], KS = {\n  key: 0,\n  class: \"fe-advsearch__field\"\n}, RS = { class: \"fe-advsearch__sublabel\" }, US = { class: \"fe-advsearch__pair\" }, VS = [\"placeholder\", \"aria-label\"], jS = [\"placeholder\", \"aria-label\"], YS = [\"aria-label\"], WS = { value: \"kb\" }, qS = { value: \"mb\" }, GS = { value: \"gb\" }, XS = { class: \"fe-advsearch__group\" }, JS = { class: \"fe-advsearch__label\" }, ZS = [\"aria-label\"], QS = [\"aria-pressed\", \"data-testid\", \"onClick\"], eC = { class: \"fe-advsearch__hint\" }, tC = { class: \"fe-advsearch__group\" }, nC = { class: \"fe-advsearch__grouphead\" }, aC = [\"innerHTML\"], oC = { class: \"fe-advsearch__hint fe-advsearch__hint--block\" }, sC = {\n  class: \"fe-advsearch__count\",\n  \"data-testid\": \"advsearch-count\"\n}, rC = { class: \"fe-advsearch__count-top\" }, iC = { class: \"fe-advsearch__count-line\" }, lC = { key: 0 }, cC = { key: 1 }, uC = { key: 2 }, dC = { key: 3 }, fC = { class: \"fe-advsearch__hint fe-advsearch__hint--block\" }, pC = {\n  key: 0,\n  class: \"fe-advsearch__wire\"\n}, vC = [\"innerHTML\"], hC = [\"disabled\"], mC = [\"innerHTML\"], yC = /* @__PURE__ */ qe({\n  __name: \"AdvancedSearch\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    theme: {},\n    initialQuery: {},\n    folderLabel: {},\n    pathBase: {},\n    contentSearch: { type: Boolean },\n    count: { type: Function }\n  },\n  emits: [\"close\", \"submit\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(null), v = m(\"\"), p = m(\"name\"), h = m(\"\"), b = m(\"\"), y = m(\"any\"), A = m(\"any\"), D = m(\"\"), C = m(\"d1\"), B = m(\"any\"), I = m(\"any\"), U = m(\"\"), x = m(\"\"), E = m(\"mb\"), $ = m(\"any\"), M = [\n      \"any\",\n      \"folder\",\n      \"document\",\n      \"spreadsheet\",\n      \"presentation\",\n      \"pdf\",\n      \"image\",\n      \"video\",\n      \"audio\",\n      \"archive\",\n      \"code\"\n    ], z = [\"any\", \"today\", \"7d\", \"30d\", \"year\", \"around\"], T = [\"any\", \"lt1\", \"1to10\", \"10to100\", \"gt100\", \"range\"], Y = [\"h1\", \"d1\", \"w1\"], O = {\n      kb: 1024,\n      mb: 1024 ** 2,\n      gb: 1024 ** 3\n    }, J = k(\n      () => n.contentSearch ? [\"all\", \"content\", \"name\"] : [\"name\"]\n    ), G = {\n      all: \"search\",\n      content: \"preview\",\n      name: \"copy-path\"\n    }, N = [\"any\", \"here\", \"skip\"], P = [\"any\", \"me\", \"system\"], le = k(() => p.value === \"name\");\n    He(le, (ie) => {\n      ie || (B.value = \"any\");\n    });\n    function ve() {\n      v.value = \"\", p.value = \"name\", h.value = \"\", b.value = \"\", y.value = \"any\", A.value = \"any\", D.value = \"\", C.value = \"d1\", I.value = \"any\", U.value = \"\", x.value = \"\", E.value = \"mb\", $.value = \"any\", B.value = \"any\";\n    }\n    function he() {\n      return {\n        text: v.value,\n        scope: p.value,\n        tagsRaw: h.value,\n        excludeRaw: b.value,\n        type: y.value,\n        modified: A.value,\n        aroundDate: D.value,\n        aroundSpan: C.value,\n        size: I.value,\n        sizeFrom: U.value,\n        sizeTo: x.value,\n        sizeUnit: E.value,\n        pathMode: $.value,\n        people: B.value\n      };\n    }\n    function oe(ie) {\n      v.value = ie.text, p.value = ie.scope, h.value = ie.tagsRaw, b.value = ie.excludeRaw, y.value = ie.type, A.value = ie.modified, D.value = ie.aroundDate, C.value = ie.aroundSpan, I.value = ie.size, U.value = ie.sizeFrom, x.value = ie.sizeTo, E.value = ie.sizeUnit, $.value = ie.pathMode, B.value = ie.people;\n    }\n    let ue = null;\n    He(\n      () => n.open,\n      (ie) => {\n        if (!ie) return;\n        const ce = n.initialQuery ?? \"\";\n        ue && ue.query !== \"\" && ue.query === ce ? oe(ue.form) : (ve(), v.value = ce), w.value = null, K.value = !1, setTimeout(() => {\n          var L;\n          return (L = u.value) == null ? void 0 : L.focus();\n        }, 60);\n      }\n    );\n    function Q(ie) {\n      const ce = String(ie ?? \"\").trim();\n      if (!ce) return null;\n      const L = Number(ce);\n      return !Number.isFinite(L) || L < 0 ? null : Math.round(L * O[E.value]);\n    }\n    const pe = k(() => ({\n      ...jx(n.pathBase ?? \"\"),\n      text: v.value,\n      tags: wu(h.value),\n      excludeTags: wu(b.value),\n      scope: p.value,\n      filters: {\n        ...na,\n        type: y.value,\n        modified: A.value,\n        aroundDate: D.value,\n        aroundSpan: C.value,\n        size: I.value,\n        sizeMin: I.value === \"range\" ? Q(U.value) : null,\n        sizeMax: I.value === \"range\" ? Q(x.value) : null,\n        pathMode: $.value,\n        pathBase: n.pathBase ?? \"\",\n        /* ⚠ Read through the guard, not off the ref. The `ownerFilterable` watch\n           below already clears the choice when the scope leaves `name`, so this is\n           the SECOND lock, not the first: a disabled select cannot be changed but\n           it can still hold a value chosen before the scope moved, and a filter\n           that outlives its own control narrows a search nobody asked it to. The\n           two are worth keeping apart — one is what the user sees change, the\n           other is what actually reaches the predicate. */\n        people: le.value ? B.value : \"any\"\n      }\n    })), re = k(() => Yx(pe.value)), S = k(() => js(pe.value)), w = m(null), j = m(!1), K = m(!1), Z = k(() => {\n      var ie;\n      return [\n        ...P.map((ce) => ({ value: ce })),\n        ...((ie = w.value) == null ? void 0 : ie.people) ?? []\n      ];\n    });\n    function W(ie) {\n      return ie.value === \"any\" || ie.value === \"me\" || ie.value === \"system\" ? a(`filter.people.${ie.value}`) : ie.name || a(\"filter.people.someone\");\n    }\n    He(Z, (ie) => {\n      ie.some((ce) => ce.value === B.value) || (B.value = \"any\");\n    });\n    let $e = null, Se = 0;\n    function ze() {\n      if ($e && clearTimeout($e), K.value = !1, re.value) {\n        w.value = null, j.value = !1;\n        return;\n      }\n      j.value = !0, $e = setTimeout(Ne, 450);\n    }\n    async function Ne() {\n      const ie = ++Se, ce = pe.value;\n      try {\n        const L = await n.count(ce);\n        if (ie !== Se) return;\n        w.value = L;\n      } catch {\n        if (ie !== Se) return;\n        w.value = null, K.value = !0;\n      } finally {\n        ie === Se && (j.value = !1);\n      }\n    }\n    He(\n      () => {\n        if (!n.open) return \"\";\n        try {\n          return JSON.stringify(pe.value);\n        } catch {\n          return \"ERR\";\n        }\n      },\n      (ie) => {\n        if (ie) {\n          if (ie === \"ERR\") {\n            $e && clearTimeout($e), Se++, w.value = null, j.value = !1, K.value = !0;\n            return;\n          }\n          ze();\n        }\n      }\n    ), it(() => {\n      $e && clearTimeout($e);\n    });\n    const be = k(() => {\n      const ie = w.value;\n      return ie ? a(ie.capped ? \"advsearch.count.capped\" : \"advsearch.count.result\", { n: String(ie.count) }) : \"\";\n    });\n    function De() {\n      re.value || (ue = { query: S.value, form: he() }, r(\"submit\", pe.value));\n    }\n    return (ie, ce) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"advsearch.title\"),\n      size: \"lg\",\n      theme: e.theme,\n      onClose: ce[13] || (ce[13] = (L) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-advsearch__reset\",\n          onClick: ve\n        }, [\n          o(\"span\", {\n            class: \"fe-advsearch__btn-icon\",\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"refresh\")\n          }, null, 8, vC),\n          Je(\" \" + f(s(a)(\"advsearch.reset\")), 1)\n        ]),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: ce[12] || (ce[12] = (L) => r(\"close\"))\n        }, f(s(a)(\"advsearch.cancel\")), 1),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          disabled: re.value,\n          \"data-testid\": \"advsearch-submit\",\n          onClick: De\n        }, [\n          o(\"span\", {\n            class: \"fe-advsearch__btn-icon\",\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"search\")\n          }, null, 8, mC),\n          Je(\" \" + f(s(a)(\"advsearch.submit\")), 1)\n        ], 8, hC)\n      ]),\n      default: st(() => [\n        o(\"form\", {\n          class: \"fe-advsearch\",\n          onSubmit: Re(De, [\"prevent\"])\n        }, [\n          o(\"header\", qx, [\n            o(\"span\", {\n              class: \"fe-advsearch__head-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"search\")\n            }, null, 8, Gx),\n            o(\"div\", Xx, [\n              o(\"p\", Jx, f(s(a)(\"advsearch.title\")), 1),\n              o(\"p\", Zx, f(s(a)(\"advsearch.subtitle\")), 1)\n            ]),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-advsearch__head-close\",\n              title: s(a)(\"advsearch.close\"),\n              \"aria-label\": s(a)(\"advsearch.close\"),\n              onClick: ce[0] || (ce[0] = (L) => r(\"close\"))\n            }, [\n              o(\"span\", {\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"close\")\n              }, null, 8, eS)\n            ], 8, Qx)\n          ]),\n          o(\"label\", tS, [\n            o(\"span\", {\n              class: \"fe-advsearch__glass\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"search\")\n            }, null, 8, nS),\n            Ve(o(\"input\", {\n              ref_key: \"queryEl\",\n              ref: u,\n              \"onUpdate:modelValue\": ce[1] || (ce[1] = (L) => v.value = L),\n              type: \"search\",\n              class: \"fe-advsearch__input\",\n              placeholder: s(a)(\"advsearch.query.placeholder\"),\n              \"aria-label\": s(a)(\"advsearch.query.label\"),\n              \"data-testid\": \"advsearch-query\"\n            }, null, 8, aS), [\n              [rt, v.value]\n            ])\n          ]),\n          o(\"div\", {\n            class: \"fe-advsearch__seg fe-advsearch__seg--tabs\",\n            role: \"tablist\",\n            \"aria-label\": s(a)(\"advsearch.scope.label\")\n          }, [\n            (c(!0), d(ae, null, Te(J.value, (L) => (c(), d(\"button\", {\n              key: L,\n              type: \"button\",\n              role: \"tab\",\n              class: we([\"fe-advsearch__seg-btn\", { \"is-active\": p.value === L }]),\n              \"aria-selected\": p.value === L,\n              \"data-testid\": `advsearch-scope-${L}`,\n              onClick: (se) => p.value = L\n            }, [\n              o(\"span\", {\n                class: \"fe-advsearch__seg-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(G[L])\n              }, null, 8, rS),\n              Je(\" \" + f(s(a)(`advsearch.scope.${L}`)), 1)\n            ], 10, sS))), 128))\n          ], 8, oS),\n          o(\"div\", iS, [\n            o(\"div\", lS, [\n              o(\"div\", cS, [\n                o(\"label\", uS, [\n                  o(\"span\", dS, f(s(a)(\"filter.modified\")), 1),\n                  Ve(o(\"select\", {\n                    \"onUpdate:modelValue\": ce[2] || (ce[2] = (L) => A.value = L),\n                    class: \"fe-input\",\n                    \"data-testid\": \"advsearch-modified\"\n                  }, [\n                    (c(), d(ae, null, Te(z, (L) => o(\"option\", {\n                      key: L,\n                      value: L\n                    }, f(s(a)(`filter.modified.${L}`)), 9, fS)), 64))\n                  ], 512), [\n                    [on, A.value]\n                  ])\n                ]),\n                A.value === \"around\" ? (c(), d(\"div\", pS, [\n                  o(\"span\", vS, f(s(a)(\"advsearch.around.label\")), 1),\n                  o(\"div\", hS, [\n                    Ve(o(\"input\", {\n                      \"onUpdate:modelValue\": ce[3] || (ce[3] = (L) => D.value = L),\n                      type: \"datetime-local\",\n                      class: \"fe-input\",\n                      \"aria-label\": s(a)(\"advsearch.around.date\"),\n                      \"data-testid\": \"advsearch-around-date\"\n                    }, null, 8, mS), [\n                      [rt, D.value]\n                    ]),\n                    o(\"div\", {\n                      class: \"fe-advsearch__seg\",\n                      role: \"group\",\n                      \"aria-label\": s(a)(\"advsearch.around.label\")\n                    }, [\n                      (c(), d(ae, null, Te(Y, (L) => o(\"button\", {\n                        key: L,\n                        type: \"button\",\n                        class: we([\"fe-advsearch__seg-btn\", { \"is-active\": C.value === L }]),\n                        \"aria-pressed\": C.value === L,\n                        onClick: (se) => C.value = L\n                      }, f(s(a)(`advsearch.around.${L}`)), 11, bS)), 64))\n                    ], 8, yS)\n                  ])\n                ])) : g(\"\", !0)\n              ]),\n              o(\"label\", gS, [\n                o(\"span\", kS, f(s(a)(\"filter.type\")), 1),\n                Ve(o(\"select\", {\n                  \"onUpdate:modelValue\": ce[4] || (ce[4] = (L) => y.value = L),\n                  class: \"fe-input\",\n                  \"data-testid\": \"advsearch-type\"\n                }, [\n                  (c(), d(ae, null, Te(M, (L) => o(\"option\", {\n                    key: L,\n                    value: L\n                  }, f(s(a)(`filter.type.${L}`)), 9, _S)), 64))\n                ], 512), [\n                  [on, y.value]\n                ])\n              ]),\n              o(\"div\", wS, [\n                o(\"label\", $S, [\n                  o(\"span\", xS, f(s(a)(\"filter.people\")), 1),\n                  Ve(o(\"select\", {\n                    \"onUpdate:modelValue\": ce[5] || (ce[5] = (L) => B.value = L),\n                    class: \"fe-input\",\n                    disabled: !le.value,\n                    \"data-testid\": \"advsearch-people\"\n                  }, [\n                    (c(!0), d(ae, null, Te(Z.value, (L) => (c(), d(\"option\", {\n                      key: L.value,\n                      value: L.value\n                    }, f(W(L)), 9, CS))), 128))\n                  ], 8, SS), [\n                    [on, B.value]\n                  ])\n                ]),\n                le.value ? g(\"\", !0) : (c(), d(\"p\", TS, f(s(a)(\"advsearch.people.name_only\")), 1))\n              ]),\n              o(\"div\", MS, [\n                o(\"label\", ES, [\n                  o(\"span\", zS, f(s(a)(\"advsearch.tags.label\")), 1),\n                  Ve(o(\"input\", {\n                    \"onUpdate:modelValue\": ce[6] || (ce[6] = (L) => h.value = L),\n                    type: \"text\",\n                    class: \"fe-input\",\n                    placeholder: s(a)(\"advsearch.tags.placeholder\"),\n                    \"data-testid\": \"advsearch-tags\"\n                  }, null, 8, AS), [\n                    [rt, h.value]\n                  ])\n                ]),\n                o(\"label\", PS, [\n                  o(\"span\", LS, f(s(a)(\"advsearch.tags.exclude\")), 1),\n                  Ve(o(\"input\", {\n                    \"onUpdate:modelValue\": ce[7] || (ce[7] = (L) => b.value = L),\n                    type: \"text\",\n                    class: \"fe-input\",\n                    placeholder: s(a)(\"advsearch.tags.exclude_placeholder\"),\n                    \"data-testid\": \"advsearch-extags\"\n                  }, null, 8, DS), [\n                    [rt, b.value]\n                  ])\n                ]),\n                o(\"p\", OS, f(s(a)(\"advsearch.tags.hint\")), 1)\n              ])\n            ]),\n            o(\"div\", BS, [\n              o(\"div\", IS, [\n                o(\"label\", HS, [\n                  o(\"span\", FS, f(s(a)(\"filter.size\")), 1),\n                  Ve(o(\"select\", {\n                    \"onUpdate:modelValue\": ce[8] || (ce[8] = (L) => I.value = L),\n                    class: \"fe-input\",\n                    \"data-testid\": \"advsearch-size\"\n                  }, [\n                    (c(), d(ae, null, Te(T, (L) => o(\"option\", {\n                      key: L,\n                      value: L\n                    }, f(s(a)(`filter.size.${L}`)), 9, NS)), 64))\n                  ], 512), [\n                    [on, I.value]\n                  ])\n                ]),\n                I.value === \"range\" ? (c(), d(\"div\", KS, [\n                  o(\"span\", RS, f(s(a)(\"advsearch.size.range_label\")), 1),\n                  o(\"div\", US, [\n                    Ve(o(\"input\", {\n                      \"onUpdate:modelValue\": ce[9] || (ce[9] = (L) => U.value = L),\n                      type: \"number\",\n                      min: \"0\",\n                      class: \"fe-input fe-advsearch__num\",\n                      placeholder: s(a)(\"advsearch.size.from\"),\n                      \"aria-label\": s(a)(\"advsearch.size.from\"),\n                      \"data-testid\": \"advsearch-size-from\"\n                    }, null, 8, VS), [\n                      [rt, U.value]\n                    ]),\n                    ce[14] || (ce[14] = o(\"span\", {\n                      class: \"fe-advsearch__dash\",\n                      \"aria-hidden\": \"true\"\n                    }, \"–\", -1)),\n                    Ve(o(\"input\", {\n                      \"onUpdate:modelValue\": ce[10] || (ce[10] = (L) => x.value = L),\n                      type: \"number\",\n                      min: \"0\",\n                      class: \"fe-input fe-advsearch__num\",\n                      placeholder: s(a)(\"advsearch.size.to\"),\n                      \"aria-label\": s(a)(\"advsearch.size.to\"),\n                      \"data-testid\": \"advsearch-size-to\"\n                    }, null, 8, jS), [\n                      [rt, x.value]\n                    ]),\n                    Ve(o(\"select\", {\n                      \"onUpdate:modelValue\": ce[11] || (ce[11] = (L) => E.value = L),\n                      class: \"fe-input fe-advsearch__unit\",\n                      \"aria-label\": s(a)(\"filter.size\")\n                    }, [\n                      o(\"option\", WS, f(s(a)(\"unit.kb\")), 1),\n                      o(\"option\", qS, f(s(a)(\"unit.mb\")), 1),\n                      o(\"option\", GS, f(s(a)(\"unit.gb\")), 1)\n                    ], 8, YS), [\n                      [on, E.value]\n                    ])\n                  ])\n                ])) : g(\"\", !0)\n              ]),\n              o(\"div\", XS, [\n                o(\"span\", JS, f(s(a)(\"advsearch.where.label\")), 1),\n                o(\"div\", {\n                  class: \"fe-advsearch__seg fe-advsearch__seg--wide\",\n                  role: \"group\",\n                  \"aria-label\": s(a)(\"advsearch.where.label\"),\n                  \"data-testid\": \"advsearch-where\"\n                }, [\n                  (c(), d(ae, null, Te(N, (L) => o(\"button\", {\n                    key: L,\n                    type: \"button\",\n                    class: we([\"fe-advsearch__seg-btn\", { \"is-active\": $.value === L }]),\n                    \"aria-pressed\": $.value === L,\n                    \"data-testid\": `advsearch-where-${L}`,\n                    onClick: (se) => $.value = L\n                  }, f(s(a)(`advsearch.where.${L}_short`)), 11, QS)), 64))\n                ], 8, ZS),\n                o(\"span\", eC, f(s(a)(`advsearch.where.${$.value}`, { folder: e.folderLabel || \"\" })), 1)\n              ]),\n              o(\"div\", tC, [\n                o(\"p\", nC, [\n                  o(\"span\", {\n                    class: \"fe-advsearch__grouphead-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"preview\")\n                  }, null, 8, aC),\n                  Je(\" \" + f(s(a)(\"advsearch.content.heading\")), 1)\n                ]),\n                o(\"p\", oC, f(e.contentSearch ? s(a)(\"advsearch.scope.hint\") : s(a)(\"advsearch.scope.name_only\")), 1)\n              ])\n            ])\n          ]),\n          o(\"div\", sC, [\n            o(\"div\", rC, [\n              o(\"p\", iC, [\n                re.value ? (c(), d(\"span\", lC, f(s(a)(\"advsearch.count.idle\")), 1)) : j.value ? (c(), d(\"span\", cC, f(s(a)(\"advsearch.count.counting\")), 1)) : K.value ? (c(), d(\"span\", uC, f(s(a)(\"advsearch.count.error\")), 1)) : w.value ? (c(), d(\"strong\", dC, f(be.value), 1)) : g(\"\", !0)\n              ]),\n              re.value ? g(\"\", !0) : (c(), d(\"button\", {\n                key: 0,\n                type: \"button\",\n                class: \"fe-advsearch__viewall\",\n                \"data-testid\": \"advsearch-viewall\",\n                onClick: De\n              }, f(s(a)(\"advsearch.viewall\")), 1))\n            ]),\n            o(\"p\", fC, f(s(a)(\"advsearch.count.cost\")), 1),\n            S.value ? (c(), d(\"p\", pC, [\n              Je(f(s(a)(\"advsearch.wire\")) + \" \", 1),\n              o(\"code\", null, f(S.value), 1)\n            ])) : g(\"\", !0)\n          ])\n        ], 32)\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\", \"theme\"]));\n  }\n}), bC = { class: \"fe-shortcuts\" }, gC = { class: \"fe-shortcuts__heading\" }, kC = { class: \"fe-shortcuts__table\" }, _C = { class: \"fe-shortcuts__keys\" }, wC = {\n  key: 0,\n  class: \"fe-shortcuts__unbound\"\n}, $C = { class: \"fe-kbd\" }, xC = {\n  key: 0,\n  class: \"fe-shortcuts__or\",\n  \"aria-hidden\": \"true\"\n}, SC = { class: \"fe-shortcuts__desc\" }, CC = [\"title\"], TC = [\"innerHTML\"], MC = /* @__PURE__ */ qe({\n  __name: \"ShortcutsHelp\",\n  props: {\n    open: { type: Boolean },\n    locale: {}\n  },\n  emits: [\"close\", \"customize\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = Uu(), v = k(() => {\n      const p = [], h = /* @__PURE__ */ new Map();\n      for (const b of u.value)\n        h.has(b.groupKey) || (h.set(b.groupKey, []), p.push(b.groupKey)), h.get(b.groupKey).push(b);\n      return p.map((b) => ({ key: b, items: h.get(b) }));\n    });\n    return (p, h) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"shortcuts.title\"),\n      size: \"md\",\n      onClose: h[2] || (h[2] = (b) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          onClick: h[0] || (h[0] = (b) => r(\"customize\"))\n        }, [\n          o(\"span\", {\n            class: \"fe-icon\",\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"shortcut-settings\")\n          }, null, 8, TC),\n          Je(\" \" + f(s(a)(\"shortcuts.customize\")), 1)\n        ]),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: h[1] || (h[1] = (b) => r(\"close\"))\n        }, f(s(a)(\"viewer.close\")), 1)\n      ]),\n      default: st(() => [\n        o(\"div\", bC, [\n          (c(!0), d(ae, null, Te(v.value, (b) => (c(), d(\"section\", {\n            key: b.key,\n            class: \"fe-shortcuts__group\"\n          }, [\n            o(\"h3\", gC, f(s(a)(b.key)), 1),\n            o(\"div\", kC, [\n              (c(!0), d(ae, null, Te(b.items, (y) => (c(), d(\"div\", {\n                key: y.id,\n                class: \"fe-shortcuts__row\"\n              }, [\n                o(\"span\", _C, [\n                  y.keys.length === 0 ? (c(), d(\"span\", wC, f(s(a)(\"shortcuts.settings.unbound\")), 1)) : (c(!0), d(ae, { key: 1 }, Te(y.keys, (A, D) => (c(), d(ae, { key: A }, [\n                    o(\"kbd\", $C, f(A), 1),\n                    D < y.keys.length - 1 ? (c(), d(\"span\", xC, \"/\")) : g(\"\", !0)\n                  ], 64))), 128))\n                ]),\n                o(\"span\", SC, [\n                  Je(f(s(a)(y.labelKey)) + \" \", 1),\n                  y.overridden ? (c(), d(\"span\", {\n                    key: 0,\n                    class: \"fe-shortcuts__custom\",\n                    title: s(a)(\"shortcuts.settings.customized\")\n                  }, \"●\", 8, CC)) : g(\"\", !0)\n                ])\n              ]))), 128))\n            ])\n          ]))), 128))\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), To = \"filex.palette\", $u = \"filex.theme\", Ln = \"default\", Qi = [\n  {\n    // Stock palette — the maps duplicate variables.css ONLY for the\n    // gallery preview; applying this theme clears all overrides.\n    id: Ln,\n    nameKey: \"theme.name.default\",\n    light: {\n      /* ⚠ Mirrors styles/variables.css exactly — web/tests/api/themeContrast.test.ts\n       * fails on any drift. It has drifted before: the stock primary was\n       * darkened for contrast and this preview map kept the old blue, so the\n       * gallery card advertised a colour the product no longer used. */\n      \"--fe-bg\": \"#ffffff\",\n      \"--fe-bg-elev\": \"#f7f8fb\",\n      \"--fe-bg-hover\": \"#f3f4f6\",\n      \"--fe-bg-selected\": \"#eef3ff\",\n      \"--fe-border\": \"#e5e7eb\",\n      \"--fe-border-soft\": \"#eef0f4\",\n      \"--fe-border-strong\": \"#d1d5db\",\n      \"--fe-text\": \"#1f2937\",\n      \"--fe-text-muted\": \"#6b7280\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#2f6ceb\",\n      \"--fe-primary-hover\": \"#2559c9\",\n      \"--fe-primary-soft\": \"#e6ecfa\",\n      \"--fe-primary-ink\": \"#2559c9\",\n      \"--fe-danger\": \"#dc2626\",\n      \"--fe-danger-hover\": \"#b91c1c\"\n    },\n    dark: {\n      \"--fe-bg\": \"#15171c\",\n      \"--fe-bg-elev\": \"#1a1d23\",\n      \"--fe-bg-hover\": \"#1f232a\",\n      \"--fe-bg-selected\": \"#1c2740\",\n      \"--fe-border\": \"#2e333c\",\n      \"--fe-border-soft\": \"#262a32\",\n      \"--fe-border-strong\": \"#3d444f\",\n      \"--fe-text\": \"#e6e8ec\",\n      \"--fe-text-muted\": \"#888f9b\",\n      /* Dark ink, not white: white on the button measures 3.16 against the 4.5\n       * this file claims. Mirrors styles/variables.css. */\n      \"--fe-text-on-primary\": \"#15171c\",\n      \"--fe-primary\": \"#5b8cff\",\n      \"--fe-primary-hover\": \"#7ba3ff\",\n      \"--fe-primary-soft\": \"#1c2740\",\n      \"--fe-primary-ink\": \"#7ba3ff\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // Night Blue — deep indigo/navy.\n    id: \"night\",\n    nameKey: \"theme.name.night\",\n    light: {\n      \"--fe-bg\": \"#f6f8fd\",\n      \"--fe-bg-elev\": \"#edf1fa\",\n      \"--fe-bg-hover\": \"#e2e9f7\",\n      \"--fe-bg-selected\": \"#d2ddf4\",\n      \"--fe-border\": \"#d6deee\",\n      \"--fe-border-soft\": \"#e3e8f4\",\n      \"--fe-border-strong\": \"#aebfda\",\n      \"--fe-text\": \"#151f38\",\n      \"--fe-text-muted\": \"#49587a\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#2c4a9e\",\n      \"--fe-primary-hover\": \"#213a80\",\n      \"--fe-primary-soft\": \"#e0e6f4\",\n      \"--fe-primary-ink\": \"#213a80\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\"\n    },\n    dark: {\n      \"--fe-bg\": \"#0a1024\",\n      \"--fe-bg-elev\": \"#111a35\",\n      \"--fe-bg-hover\": \"#1a2547\",\n      \"--fe-bg-selected\": \"#243665\",\n      \"--fe-border\": \"#26335a\",\n      \"--fe-border-soft\": \"#1d2748\",\n      \"--fe-border-strong\": \"#3c4e84\",\n      \"--fe-text\": \"#dfe6f7\",\n      \"--fe-text-muted\": \"#96a5cc\",\n      \"--fe-text-on-primary\": \"#050b26\",\n      \"--fe-primary\": \"#6d8dfc\",\n      \"--fe-primary-hover\": \"#5273f2\",\n      \"--fe-primary-soft\": \"#182243\",\n      \"--fe-primary-ink\": \"#6d8dfc\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // Forest — calm greens.\n    id: \"forest\",\n    nameKey: \"theme.name.forest\",\n    light: {\n      \"--fe-bg\": \"#f5faf5\",\n      \"--fe-bg-elev\": \"#eaf3eb\",\n      \"--fe-bg-hover\": \"#dcecdf\",\n      \"--fe-bg-selected\": \"#c8e2ce\",\n      \"--fe-border\": \"#d2e2d4\",\n      \"--fe-border-soft\": \"#e0ece1\",\n      \"--fe-border-strong\": \"#a2c3a8\",\n      \"--fe-text\": \"#182b1d\",\n      \"--fe-text-muted\": \"#42604a\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#2b7a41\",\n      \"--fe-primary-hover\": \"#226334\",\n      \"--fe-primary-soft\": \"#dbe9dc\",\n      \"--fe-primary-ink\": \"#226334\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\"\n    },\n    dark: {\n      \"--fe-bg\": \"#0d1611\",\n      \"--fe-bg-elev\": \"#132019\",\n      \"--fe-bg-hover\": \"#1b2d23\",\n      \"--fe-bg-selected\": \"#264532\",\n      \"--fe-border\": \"#28402f\",\n      \"--fe-border-soft\": \"#1f3225\",\n      \"--fe-border-strong\": \"#3e5f49\",\n      \"--fe-text\": \"#dcebe0\",\n      \"--fe-text-muted\": \"#93b09b\",\n      \"--fe-text-on-primary\": \"#04180b\",\n      \"--fe-primary\": \"#54c17a\",\n      \"--fe-primary-hover\": \"#3fae66\",\n      \"--fe-primary-soft\": \"#16291d\",\n      \"--fe-primary-ink\": \"#54c17a\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // Amber — warm amber/bronze.\n    id: \"amber\",\n    nameKey: \"theme.name.amber\",\n    light: {\n      \"--fe-bg\": \"#fdf9f0\",\n      \"--fe-bg-elev\": \"#f7efdd\",\n      \"--fe-bg-hover\": \"#f0e3c8\",\n      \"--fe-bg-selected\": \"#ead6ab\",\n      \"--fe-border\": \"#e6dabf\",\n      \"--fe-border-soft\": \"#efe6d3\",\n      \"--fe-border-strong\": \"#c6b184\",\n      \"--fe-text\": \"#33270f\",\n      \"--fe-text-muted\": \"#655631\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#9a4b00\",\n      \"--fe-primary-hover\": \"#7c3c00\",\n      \"--fe-primary-soft\": \"#f3e5d7\",\n      \"--fe-primary-ink\": \"#7c3c00\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\"\n    },\n    dark: {\n      \"--fe-bg\": \"#191307\",\n      \"--fe-bg-elev\": \"#231a0c\",\n      \"--fe-bg-hover\": \"#2f2312\",\n      \"--fe-bg-selected\": \"#44331b\",\n      \"--fe-border\": \"#3b2e17\",\n      \"--fe-border-soft\": \"#302512\",\n      \"--fe-border-strong\": \"#5b4a29\",\n      \"--fe-text\": \"#f2e7d4\",\n      \"--fe-text-muted\": \"#bda887\",\n      \"--fe-text-on-primary\": \"#2a1c02\",\n      \"--fe-primary\": \"#f5a524\",\n      \"--fe-primary-hover\": \"#ffb84d\",\n      \"--fe-primary-soft\": \"#31230c\",\n      \"--fe-primary-ink\": \"#ffb84d\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // Lilac — soft purple.\n    id: \"lilac\",\n    nameKey: \"theme.name.lilac\",\n    light: {\n      \"--fe-bg\": \"#faf7fd\",\n      \"--fe-bg-elev\": \"#f2ecfa\",\n      \"--fe-bg-hover\": \"#e8ddf5\",\n      \"--fe-bg-selected\": \"#dccaf0\",\n      \"--fe-border\": \"#e1d6ee\",\n      \"--fe-border-soft\": \"#ebe3f4\",\n      \"--fe-border-strong\": \"#bda6d9\",\n      \"--fe-text\": \"#241a33\",\n      \"--fe-text-muted\": \"#584871\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#7231e0\",\n      \"--fe-primary-hover\": \"#5f21c4\",\n      \"--fe-primary-soft\": \"#e9e3fc\",\n      \"--fe-primary-ink\": \"#5f21c4\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\"\n    },\n    dark: {\n      \"--fe-bg\": \"#130f1c\",\n      \"--fe-bg-elev\": \"#1b1527\",\n      \"--fe-bg-hover\": \"#261d37\",\n      \"--fe-bg-selected\": \"#37294f\",\n      \"--fe-border\": \"#302546\",\n      \"--fe-border-soft\": \"#261e38\",\n      \"--fe-border-strong\": \"#4b3a6d\",\n      \"--fe-text\": \"#e9e2f5\",\n      \"--fe-text-muted\": \"#a999c5\",\n      \"--fe-text-on-primary\": \"#180d33\",\n      \"--fe-primary\": \"#b197fa\",\n      \"--fe-primary-hover\": \"#9c7cf4\",\n      \"--fe-primary-soft\": \"#272038\",\n      \"--fe-primary-ink\": \"#b197fa\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // High Contrast — black/white with strong borders, saturated accents.\n    id: \"contrast\",\n    nameKey: \"theme.name.contrast\",\n    light: {\n      \"--fe-bg\": \"#ffffff\",\n      \"--fe-bg-elev\": \"#f2f2f2\",\n      \"--fe-bg-hover\": \"#e0e0e0\",\n      \"--fe-bg-selected\": \"#c9dcff\",\n      \"--fe-border\": \"#5c5c5c\",\n      \"--fe-border-soft\": \"#5c5c5c\",\n      \"--fe-border-strong\": \"#000000\",\n      \"--fe-text\": \"#000000\",\n      \"--fe-text-muted\": \"#3d3d3d\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#003d99\",\n      \"--fe-primary-hover\": \"#002a6b\",\n      \"--fe-primary-soft\": \"#e7edf7\",\n      \"--fe-primary-ink\": \"#002a6b\",\n      \"--fe-danger\": \"#a80000\",\n      \"--fe-danger-hover\": \"#7d0000\",\n      \"--fe-shadow\": \"0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)\",\n      \"--fe-shadow-sm\": \"0 0 0 1px #000000\"\n    },\n    dark: {\n      \"--fe-bg\": \"#000000\",\n      \"--fe-bg-elev\": \"#0d0d0d\",\n      \"--fe-bg-hover\": \"#212121\",\n      \"--fe-bg-selected\": \"#003d80\",\n      \"--fe-border\": \"#8f8f8f\",\n      \"--fe-border-soft\": \"#8f8f8f\",\n      \"--fe-border-strong\": \"#ffffff\",\n      \"--fe-text\": \"#ffffff\",\n      \"--fe-text-muted\": \"#d6d6d6\",\n      \"--fe-text-on-primary\": \"#001430\",\n      \"--fe-primary\": \"#7ab8ff\",\n      \"--fe-primary-hover\": \"#9ccaff\",\n      \"--fe-primary-soft\": \"#0e1a29\",\n      \"--fe-primary-ink\": \"#9ccaff\",\n      \"--fe-danger\": \"#ff7575\",\n      \"--fe-danger-hover\": \"#ff9999\",\n      \"--fe-shadow\": \"0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)\",\n      \"--fe-shadow-sm\": \"0 0 0 1px #ffffff\"\n    }\n  },\n  {\n    // Soft Gray — desaturated, quiet neutral.\n    id: \"gray\",\n    nameKey: \"theme.name.gray\",\n    light: {\n      \"--fe-bg\": \"#f7f7f8\",\n      \"--fe-bg-elev\": \"#efeff1\",\n      \"--fe-bg-hover\": \"#e4e4e7\",\n      \"--fe-bg-selected\": \"#d6d7db\",\n      \"--fe-border\": \"#dfdfe2\",\n      \"--fe-border-soft\": \"#e9e9eb\",\n      \"--fe-border-strong\": \"#b9b9c0\",\n      \"--fe-text\": \"#26272b\",\n      \"--fe-text-muted\": \"#585a63\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#4b4b54\",\n      \"--fe-primary-hover\": \"#38383f\",\n      \"--fe-primary-soft\": \"#e4e4e6\",\n      \"--fe-primary-ink\": \"#38383f\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\"\n    },\n    dark: {\n      \"--fe-bg\": \"#131316\",\n      \"--fe-bg-elev\": \"#1b1b1f\",\n      \"--fe-bg-hover\": \"#26262b\",\n      \"--fe-bg-selected\": \"#35353c\",\n      \"--fe-border\": \"#2d2d33\",\n      \"--fe-border-soft\": \"#242429\",\n      \"--fe-border-strong\": \"#4a4a52\",\n      \"--fe-text\": \"#e6e6e9\",\n      \"--fe-text-muted\": \"#a4a4ad\",\n      \"--fe-text-on-primary\": \"#17171b\",\n      \"--fe-primary\": \"#b0b0ba\",\n      \"--fe-primary-hover\": \"#c4c4cd\",\n      \"--fe-primary-soft\": \"#242428\",\n      \"--fe-primary-ink\": \"#c4c4cd\",\n      \"--fe-danger\": \"#f87171\",\n      \"--fe-danger-hover\": \"#ef4444\"\n    }\n  },\n  {\n    // Terminal Green — phosphor green, monospace face for the full CRT vibe.\n    id: \"terminal\",\n    nameKey: \"theme.name.terminal\",\n    light: {\n      \"--fe-bg\": \"#f3f9f4\",\n      \"--fe-bg-elev\": \"#e5f2e8\",\n      \"--fe-bg-hover\": \"#d5ead9\",\n      \"--fe-bg-selected\": \"#bce3c6\",\n      \"--fe-border\": \"#cbe2d1\",\n      \"--fe-border-soft\": \"#dbebdf\",\n      \"--fe-border-strong\": \"#94c2a0\",\n      \"--fe-text\": \"#0c2913\",\n      \"--fe-text-muted\": \"#31573c\",\n      \"--fe-text-on-primary\": \"#ffffff\",\n      \"--fe-primary\": \"#116b33\",\n      \"--fe-primary-hover\": \"#0c5427\",\n      \"--fe-primary-soft\": \"#dbe9dd\",\n      \"--fe-primary-ink\": \"#0c5427\",\n      \"--fe-danger\": \"#c62828\",\n      \"--fe-danger-hover\": \"#a51f1f\",\n      \"--fe-font\": 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace'\n    },\n    dark: {\n      \"--fe-bg\": \"#050d07\",\n      \"--fe-bg-elev\": \"#0a1710\",\n      \"--fe-bg-hover\": \"#112418\",\n      \"--fe-bg-selected\": \"#1a3a26\",\n      \"--fe-border\": \"#1c3a2a\",\n      \"--fe-border-soft\": \"#142b1e\",\n      \"--fe-border-strong\": \"#316144\",\n      \"--fe-text\": \"#4fdd8b\",\n      \"--fe-text-muted\": \"#38a668\",\n      \"--fe-text-on-primary\": \"#03180a\",\n      \"--fe-primary\": \"#25c95e\",\n      \"--fe-primary-hover\": \"#4fdd8b\",\n      \"--fe-primary-soft\": \"#0c2412\",\n      \"--fe-primary-ink\": \"#4fdd8b\",\n      \"--fe-danger\": \"#ff6b62\",\n      \"--fe-danger-hover\": \"#ff8d86\",\n      \"--fe-font\": 'ui-monospace, \"SF Mono\", Consolas, Menlo, monospace'\n    }\n  }\n];\nfunction Ua(e) {\n  return Qi.find((t) => t.id === e);\n}\nconst EC = Array.from(\n  new Set(Qi.flatMap((e) => [...Object.keys(e.light), ...Object.keys(e.dark)]))\n);\nfunction zC() {\n  try {\n    const e = localStorage.getItem(To);\n    if (e && Ua(e)) return e;\n    const t = localStorage.getItem($u);\n    return t && Ua(t) ? (localStorage.setItem(To, t), localStorage.removeItem($u), t) : Ln;\n  } catch {\n    return Ln;\n  }\n}\nconst el = m(\n  typeof window > \"u\" ? Ln : zC()\n);\nfunction AC(e) {\n  const t = Ua(e) ? e : Ln;\n  el.value = t;\n  try {\n    t === Ln ? localStorage.removeItem(To) : localStorage.setItem(To, t);\n  } catch {\n  }\n}\nfunction PC() {\n  return { themeId: el, setTheme: AC };\n}\nconst Ys = \"filex.thememode\", tl = [\"host\", \"auto\", \"light\", \"dark\"];\nfunction LC() {\n  try {\n    const e = localStorage.getItem(Ys);\n    return e && tl.includes(e) ? e : \"host\";\n  } catch {\n    return \"host\";\n  }\n}\nconst nl = m(\n  typeof window > \"u\" ? \"host\" : LC()\n);\nfunction DC(e) {\n  const t = tl.includes(e) ? e : \"host\";\n  nl.value = t;\n  try {\n    t === \"host\" ? localStorage.removeItem(Ys) : localStorage.setItem(Ys, t);\n  } catch {\n  }\n}\nfunction OC() {\n  return { themeMode: nl, setThemeMode: DC };\n}\nif (typeof window < \"u\")\n  try {\n    window.addEventListener(\"storage\", (e) => {\n      if (e.key !== Ys) return;\n      const t = e.newValue;\n      nl.value = t && tl.includes(t) ? t : \"host\";\n    });\n  } catch {\n  }\nif (typeof window < \"u\")\n  try {\n    window.addEventListener(\"storage\", (e) => {\n      e.key === To && (el.value = e.newValue && Ua(e.newValue) ? e.newValue : Ln);\n    });\n  } catch {\n  }\nfunction BC(e, t, n) {\n  for (const u of EC) e.style.removeProperty(u);\n  if (t === Ln) return;\n  const r = Ua(t);\n  if (!r) return;\n  const a = n ? r.dark : r.light;\n  for (const [u, v] of Object.entries(a)) e.style.setProperty(u, v);\n}\nconst xu = \"data-filex-theme\";\nfunction Su(e) {\n  return Object.entries(e).map(([t, n]) => `${t}:${n};`).join(\"\");\n}\nfunction IC(e) {\n  const t = Su(e.light), n = Su(e.dark), r = [\n    \".fe--theme-dark\",\n    \":root[data-theme='dark'] .fe\",\n    \".fe.fe--theme-dark\",\n    \":root.dark\",\n    \".dark\",\n    \":root.dark .fe\",\n    \".dark .fe\",\n    \".fe-ctx-backdrop--theme-dark\",\n    \".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']\"\n  ].join(\",\"), a = [\n    \".fe:not(.fe--theme-light)\",\n    \".fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)\"\n  ].join(\",\");\n  return `/* filex theme: ${e.id} */:root,.fe{${t}}${r}{${n}}@media (prefers-color-scheme: dark){${a}{${n}}}`;\n}\nfunction HC(e) {\n  if (typeof document > \"u\") return;\n  let t = document.head.querySelector(`style[${xu}]`);\n  const n = e === Ln ? void 0 : Ua(e);\n  if (!n) {\n    t && (t.textContent = \"\");\n    return;\n  }\n  t ? t !== document.head.lastElementChild && document.head.appendChild(t) : (t = document.createElement(\"style\"), t.setAttribute(xu, \"\"), document.head.appendChild(t));\n  const r = IC(n);\n  t.textContent !== r && (t.textContent = r);\n}\nconst FC = {\n  key: 0,\n  class: \"fe-themes__hint\"\n}, NC = [\"aria-label\"], KC = [\"aria-selected\", \"data-theme-id\", \"onClick\"], RC = { class: \"fe-themecard__name\" }, UC = [\"title\"], VC = /* @__PURE__ */ qe({\n  __name: \"ThemePalette\",\n  props: {\n    locale: {},\n    dark: { type: Boolean },\n    current: {},\n    hint: { type: Boolean }\n  },\n  emits: [\"select\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale);\n    function u(v) {\n      return n.dark ? v.dark : v.light;\n    }\n    return (v, p) => (c(), d(ae, null, [\n      e.hint !== !1 ? (c(), d(\"p\", FC, f(s(a)(\"theme.hint\")), 1)) : g(\"\", !0),\n      o(\"div\", {\n        class: \"fe-themes\",\n        role: \"listbox\",\n        \"aria-label\": s(a)(\"theme.title\")\n      }, [\n        (c(!0), d(ae, null, Te(s(Qi), (h) => (c(), d(\"button\", {\n          key: h.id,\n          type: \"button\",\n          class: we([\"fe-themecard\", { \"is-selected\": h.id === e.current }]),\n          role: \"option\",\n          \"aria-selected\": h.id === e.current,\n          \"data-theme-id\": h.id,\n          style: Ct(u(h)),\n          onClick: (b) => r(\"select\", h.id)\n        }, [\n          p[0] || (p[0] = Hu('<span class=\"fe-themecard__preview\" aria-hidden=\"true\"><span class=\"fe-themecard__topbar\"><span class=\"fe-themecard__chip fe-themecard__chip--primary\"></span><span class=\"fe-themecard__chip\"></span><span class=\"fe-themecard__chip fe-themecard__chip--ghost\"></span></span><span class=\"fe-themecard__row\"><span class=\"fe-themecard__dot\"></span><span class=\"fe-themecard__line\" style=\"width:62%;\"></span></span><span class=\"fe-themecard__row fe-themecard__row--selected\"><span class=\"fe-themecard__dot fe-themecard__dot--primary\"></span><span class=\"fe-themecard__line\" style=\"width:44%;\"></span></span><span class=\"fe-themecard__row\"><span class=\"fe-themecard__dot fe-themecard__dot--muted\"></span><span class=\"fe-themecard__line fe-themecard__line--muted\" style=\"width:74%;\"></span></span></span>', 1)),\n          o(\"span\", RC, [\n            Je(f(s(a)(h.nameKey)) + \" \", 1),\n            h.id === e.current ? (c(), d(\"span\", {\n              key: 0,\n              class: \"fe-themecard__check\",\n              title: s(a)(\"theme.selected\")\n            }, \"✓\", 8, UC)) : g(\"\", !0)\n          ])\n        ], 14, KC))), 128))\n      ], 8, NC)\n    ], 64));\n  }\n}), jC = [\"aria-label\"], YC = { class: \"fe-thememode__label\" }, WC = { class: \"fe-thememode__seg\" }, qC = [\"aria-pressed\", \"onClick\"], GC = {\n  class: \"fe-ficon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.8\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, XC = {\n  key: 1,\n  d: \"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"\n}, JC = [\"disabled\"], ZC = /* @__PURE__ */ qe({\n  __name: \"ThemeGallery\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    theme: {},\n    dark: { type: Boolean },\n    current: {},\n    mode: {},\n    hostMode: {}\n  },\n  emits: [\"close\", \"select\", \"mode\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = [\n      { id: \"light\", labelKey: \"theme.mode.light\" },\n      { id: \"dark\", labelKey: \"theme.mode.dark\" },\n      { id: \"auto\", labelKey: \"theme.mode.auto\" }\n    ], v = k(() => n.mode === \"host\" ? n.hostMode : n.mode), p = Ln;\n    return (h, b) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"theme.title\"),\n      size: \"lg\",\n      theme: e.theme,\n      onClose: b[3] || (b[3] = (y) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          disabled: e.current === s(p),\n          onClick: b[1] || (b[1] = (y) => r(\"select\", s(p)))\n        }, f(s(a)(\"theme.reset\")), 9, JC),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          onClick: b[2] || (b[2] = (y) => r(\"close\"))\n        }, f(s(a)(\"theme.close\")), 1)\n      ]),\n      default: st(() => [\n        o(\"div\", {\n          class: \"fe-thememode\",\n          role: \"group\",\n          \"aria-label\": s(a)(\"theme.mode.label\")\n        }, [\n          o(\"span\", YC, f(s(a)(\"theme.mode.label\")), 1),\n          o(\"div\", WC, [\n            (c(), d(ae, null, Te(u, (y) => o(\"button\", {\n              key: y.id,\n              type: \"button\",\n              class: we([\"fe-thememode__opt\", { \"is-active\": v.value === y.id }]),\n              \"aria-pressed\": v.value === y.id,\n              onClick: (A) => r(\"mode\", y.id)\n            }, [\n              (c(), d(\"svg\", GC, [\n                y.id === \"light\" ? (c(), d(ae, { key: 0 }, [\n                  b[4] || (b[4] = o(\"circle\", {\n                    cx: \"12\",\n                    cy: \"12\",\n                    r: \"4\"\n                  }, null, -1)),\n                  b[5] || (b[5] = o(\"path\", { d: \"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" }, null, -1))\n                ], 64)) : y.id === \"dark\" ? (c(), d(\"path\", XC)) : (c(), d(ae, { key: 2 }, [\n                  b[6] || (b[6] = o(\"circle\", {\n                    cx: \"12\",\n                    cy: \"12\",\n                    r: \"9\"\n                  }, null, -1)),\n                  b[7] || (b[7] = o(\"path\", {\n                    d: \"M12 3a9 9 0 0 1 0 18z\",\n                    fill: \"currentColor\",\n                    stroke: \"none\"\n                  }, null, -1))\n                ], 64))\n              ])),\n              o(\"span\", null, f(s(a)(y.labelKey)), 1)\n            ], 10, qC)), 64))\n          ])\n        ], 8, jC),\n        Ge(VC, {\n          locale: e.locale,\n          dark: e.dark,\n          current: e.current,\n          onSelect: b[0] || (b[0] = (y) => r(\"select\", y))\n        }, null, 8, [\"locale\", \"dark\", \"current\"])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\", \"theme\"]));\n  }\n}), QC = { class: \"fe-tzpick\" }, e3 = [\"id\", \"aria-expanded\", \"aria-activedescendant\", \"disabled\", \"data-testid\", \"placeholder\", \"value\"], t3 = [\"aria-label\", \"data-testid\"], n3 = [\"id\", \"data-tz-active\", \"data-testid\", \"aria-selected\", \"title\", \"onMousedown\", \"onMousemove\"], a3 = { class: \"fe-tzpick__main\" }, o3 = { class: \"fe-tzpick__city\" }, s3 = {\n  key: 0,\n  class: \"fe-tzpick__region\"\n}, r3 = { class: \"fe-tzpick__meta\" }, i3 = {\n  key: 0,\n  class: \"fe-tzpick__time\"\n}, l3 = { class: \"fe-tzpick__offset\" }, c3 = {\n  key: 0,\n  class: \"fe-tzpick__empty\",\n  role: \"presentation\"\n}, u3 = {\n  key: 1,\n  class: \"fe-tzpick__empty\",\n  role: \"presentation\"\n}, d3 = 50, f3 = /* @__PURE__ */ qe({\n  __name: \"TimeZonePicker\",\n  props: {\n    locale: {},\n    modelValue: {},\n    fallback: {},\n    disabled: { type: Boolean },\n    inputId: {},\n    label: {},\n    testid: {}\n  },\n  emits: [\"update:modelValue\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = k(() => Ai(n.locale)), v = k(() => n.testid || \"fe-tz\");\n    let p = 0;\n    const h = `fe-tz-${++p}-${Math.random().toString(36).slice(2, 7)}`, b = k(() => n.inputId || `${h}-input`), y = `${h}-list`;\n    function A(be) {\n      return be.replace(/[\\u0130\\u0131]/g, \"i\").replace(/[\\u015e\\u015f]/g, \"s\").replace(/[\\u011e\\u011f]/g, \"g\").replace(/[\\u00dc\\u00fc]/g, \"u\").replace(/[\\u00d6\\u00f6]/g, \"o\").replace(/[\\u00c7\\u00e7]/g, \"c\").toLowerCase().normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").replace(/[_/\\-.]+/g, \" \").replace(/\\s+/g, \" \").trim();\n    }\n    const D = {\n      UTC: \"utc gmt zulu z greenwich universal\",\n      \"Etc/UTC\": \"utc gmt zulu greenwich universal\",\n      \"Etc/GMT\": \"utc gmt greenwich\",\n      \"Europe/Istanbul\": \"turkey turkiye ist constantinople\",\n      \"Europe/London\": \"uk britain england gmt bst\",\n      \"America/New_York\": \"usa united states eastern est edt nyc\",\n      \"America/Los_Angeles\": \"usa united states pacific pst pdt la\",\n      \"Asia/Kolkata\": \"india calcutta ist\"\n    };\n    function C(be) {\n      const De = /GMT([+-])(\\d{1,2})(?::?(\\d{2}))?/.exec(be);\n      if (!De) return \"gmt utc\";\n      const [, ie, ce, L] = De, se = String(Number(ce)), Ce = se.padStart(2, \"0\"), We = L ?? \"00\", Ie = [`${ie}${se}`, `${ie}${Ce}`, `${ie}${Ce}:${We}`, `${ie}${Ce}${We}`];\n      return [...Ie.map((Ze) => `gmt${Ze}`), ...Ie.map((Ze) => `utc${Ze}`), ...Ie].join(\" \");\n    }\n    function B(be, De, ie) {\n      var ce;\n      try {\n        return ((ce = new Intl.DateTimeFormat(De, {\n          timeZone: be,\n          timeZoneName: ie\n        }).formatToParts(/* @__PURE__ */ new Date()).find((se) => se.type === \"timeZoneName\")) == null ? void 0 : ce.value) ?? \"\";\n      } catch {\n        return \"\";\n      }\n    }\n    function I(be) {\n      try {\n        return new Intl.DateTimeFormat(u.value, { timeZone: be, hour: \"2-digit\", minute: \"2-digit\" });\n      } catch {\n        return null;\n      }\n    }\n    const U = k(() => n.fallback.zone ?? qs()), x = k(() => {\n      const be = U.value;\n      return n.fallback.tier === \"host\" ? a(\"tz.default.host\", { zone: be }) : n.fallback.tier === \"account\" ? a(\"tz.default.account\", { zone: be }) : a(\"tz.default.device\", { zone: be });\n    }), E = m(null);\n    let $ = \"\";\n    function M() {\n      const be = u.value, De = U.value, ie = A(\n        `${De} ${x.value} default automatic device local system account site`\n      ), ce = [\n        {\n          value: \"\",\n          label: x.value,\n          region: \"\",\n          offset: B(De, be, \"shortOffset\"),\n          haystack: ie,\n          cityFold: A(De.split(\"/\").pop() ?? \"\"),\n          words: ie.split(\" \").filter(Boolean),\n          fmt: I(De)\n        }\n      ], L = Nv();\n      n.modelValue && !L.includes(n.modelValue) && L.unshift(n.modelValue);\n      for (const se of L) {\n        const Ce = se.split(\"/\"), We = (Ce[Ce.length - 1] ?? se).replace(/_/g, \" \"), Ie = Ce.length > 1 ? Ce[0].replace(/_/g, \" \") : \"\", Ze = B(se, be, \"shortOffset\"), vt = B(se, be, \"longGeneric\"), Xe = be === \"en-US\" ? \"\" : B(se, \"en-US\", \"longGeneric\"), Ae = A(\n          [se, We, Ie, vt, Xe, D[se] ?? \"\", C(Ze)].filter(Boolean).join(\" \")\n        );\n        ce.push({\n          value: se,\n          label: We,\n          region: Ie,\n          offset: Ze,\n          haystack: Ae,\n          cityFold: A(We),\n          words: Ae.split(\" \").filter(Boolean),\n          fmt: I(se)\n        });\n      }\n      return ce;\n    }\n    function z() {\n      const be = `${n.locale}|${n.fallback.tier}|${U.value}|${n.modelValue}`;\n      E.value && $ === be || ($ = be, E.value = M());\n    }\n    const T = m(!1), Y = m(\"\"), O = m(0), J = m(null), G = m(null), N = m(/* @__PURE__ */ new Date());\n    let P;\n    function le() {\n      N.value = /* @__PURE__ */ new Date(), P || (P = setInterval(() => N.value = /* @__PURE__ */ new Date(), 1e3));\n    }\n    function ve() {\n      P && clearInterval(P), P = void 0;\n    }\n    it(ve);\n    const he = m({ maxHeight: \"264px\", above: !1 });\n    function oe(be) {\n      let De = be.parentElement;\n      for (; De; ) {\n        const ie = getComputedStyle(De).overflowY;\n        if (ie === \"auto\" || ie === \"scroll\") {\n          const ce = De.getBoundingClientRect();\n          return { top: ce.top, bottom: ce.bottom };\n        }\n        De = De.parentElement;\n      }\n      return { top: 0, bottom: window.innerHeight };\n    }\n    function ue() {\n      const be = J.value;\n      if (!be) return;\n      const De = be.getBoundingClientRect(), ie = oe(be), ce = 12, L = ie.bottom - De.bottom - ce, se = De.top - ie.top - ce, Ce = 132, We = 264, Ie = L < Ce && se > L, Ze = Ie ? se : L;\n      he.value = {\n        maxHeight: `${Math.round(Math.max(Ce, Math.min(We, Ze)))}px`,\n        above: Ie\n      };\n    }\n    function Q(be, De) {\n      let ie = 0;\n      for (const ce of De) {\n        let L = 0;\n        if (be.cityFold === ce ? L = 120 : be.cityFold.startsWith(ce) ? L = 100 : be.words.some((se) => se.startsWith(ce)) ? L = 70 : be.haystack.includes(ce) && (L = 30), L === 0) return -1;\n        ie += L;\n      }\n      return ie;\n    }\n    const pe = k(() => {\n      const be = E.value ?? [], De = A(Y.value);\n      if (!De) {\n        const L = be.find((se) => se.value === n.modelValue);\n        return !L || L === be[0] ? be : [be[0], L, ...be.slice(1).filter((se) => se !== L)];\n      }\n      const ie = De.split(\" \").filter(Boolean), ce = [];\n      return be.forEach((L, se) => {\n        const Ce = Q(L, ie);\n        Ce >= 0 && ce.push({ row: L, score: Ce, i: se });\n      }), ce.sort((L, se) => se.score - L.score || L.i - se.i), ce.map((L) => L.row);\n    }), re = k(() => pe.value.slice(0, d3)), S = k(() => Math.max(0, pe.value.length - re.value.length)), w = k(() => {\n      if (!n.modelValue) return x.value;\n      const be = n.modelValue, De = (be.split(\"/\").pop() ?? be).replace(/_/g, \" \"), ie = B(be, u.value, \"shortOffset\");\n      return ie ? `${De} — ${ie}` : De;\n    });\n    function j(be) {\n      try {\n        return be.fmt ? be.fmt.format(N.value) : \"\";\n      } catch {\n        return \"\";\n      }\n    }\n    function K() {\n      z(), T.value = !0, Y.value = \"\", le();\n      const be = re.value.findIndex((De) => De.value === n.modelValue);\n      O.value = be >= 0 ? be : 0, gt(() => {\n        ue(), Se();\n      });\n    }\n    function Z() {\n      T.value = !1, Y.value = \"\", O.value = 0, ve();\n    }\n    function W(be) {\n      z(), T.value || le(), T.value = !0, Y.value = be.target.value, O.value = 0;\n    }\n    function $e(be) {\n      var De;\n      Z(), (De = J.value) == null || De.blur(), be.value !== n.modelValue && r(\"update:modelValue\", be.value);\n    }\n    function Se() {\n      var De;\n      const be = (De = G.value) == null ? void 0 : De.querySelector('[data-tz-active=\"1\"]');\n      be == null || be.scrollIntoView({ block: \"nearest\" });\n    }\n    function ze(be) {\n      const De = re.value.length;\n      if (De === 0) return;\n      const ie = Math.min(O.value, De - 1);\n      O.value = (ie + be + De) % De, gt(() => Se());\n    }\n    function Ne(be) {\n      switch (be.key) {\n        case \"ArrowDown\":\n          be.preventDefault(), T.value ? ze(1) : K();\n          break;\n        case \"ArrowUp\":\n          be.preventDefault(), T.value ? ze(-1) : K();\n          break;\n        case \"Home\":\n          if (!T.value) return;\n          be.preventDefault(), O.value = 0, gt(() => Se());\n          break;\n        case \"End\":\n          if (!T.value) return;\n          be.preventDefault(), O.value = Math.max(0, re.value.length - 1), gt(() => Se());\n          break;\n        case \"Enter\": {\n          if (!T.value) return;\n          be.preventDefault();\n          const De = re.value[O.value];\n          De && $e(De);\n          break;\n        }\n        case \"Escape\":\n          if (!T.value) return;\n          be.preventDefault(), be.stopPropagation(), Z();\n          break;\n        case \"Tab\":\n          Z();\n          break;\n      }\n    }\n    return (be, De) => (c(), d(\"div\", QC, [\n      o(\"input\", {\n        id: b.value,\n        ref_key: \"inputEl\",\n        ref: J,\n        class: \"fe-tzpick__input\",\n        type: \"text\",\n        role: \"combobox\",\n        autocomplete: \"off\",\n        spellcheck: \"false\",\n        \"aria-autocomplete\": \"list\",\n        \"aria-expanded\": T.value,\n        \"aria-controls\": y,\n        \"aria-activedescendant\": T.value && re.value.length ? `${y}-opt-${O.value}` : void 0,\n        disabled: e.disabled,\n        \"data-testid\": `${v.value}-filter`,\n        placeholder: s(a)(\"tz.search\"),\n        value: T.value ? Y.value : w.value,\n        onFocus: K,\n        onInput: W,\n        onKeydown: Ne,\n        onBlur: Z\n      }, null, 40, e3),\n      T.value ? (c(), d(\"ul\", {\n        key: 0,\n        id: y,\n        ref_key: \"listEl\",\n        ref: G,\n        class: we([\"fe-tzpick__list\", { \"is-above\": he.value.above }]),\n        style: Ct({ maxHeight: he.value.maxHeight }),\n        role: \"listbox\",\n        \"aria-label\": e.label || s(a)(\"tz.title\"),\n        \"data-testid\": `${v.value}-list`\n      }, [\n        (c(!0), d(ae, null, Te(re.value, (ie, ce) => (c(), d(\"li\", {\n          id: `${y}-opt-${ce}`,\n          key: ie.value || \"__default\",\n          class: we([\"fe-tzpick__opt\", { \"is-active\": ce === O.value, \"is-current\": ie.value === e.modelValue }]),\n          \"data-tz-active\": ce === O.value ? \"1\" : \"0\",\n          \"data-testid\": `${v.value}-opt-${ie.value || \"device\"}`,\n          role: \"option\",\n          \"aria-selected\": ie.value === e.modelValue,\n          title: ie.value || U.value,\n          onMousedown: Re((L) => $e(ie), [\"prevent\"]),\n          onMousemove: (L) => O.value = ce\n        }, [\n          o(\"span\", a3, [\n            o(\"span\", o3, f(ie.label), 1),\n            ie.region ? (c(), d(\"span\", s3, f(ie.region), 1)) : g(\"\", !0)\n          ]),\n          o(\"span\", r3, [\n            j(ie) ? (c(), d(\"span\", i3, f(j(ie)), 1)) : g(\"\", !0),\n            o(\"span\", l3, f(ie.offset), 1)\n          ])\n        ], 42, n3))), 128)),\n        re.value.length === 0 ? (c(), d(\"li\", c3, f(s(a)(\"tz.no_match\", { query: Y.value })), 1)) : S.value > 0 ? (c(), d(\"li\", u3, f(s(a)(\"tz.more\", { n: S.value })), 1)) : g(\"\", !0)\n      ], 14, t3)) : g(\"\", !0)\n    ]));\n  }\n}), p3 = {\n  class: \"fe-tzdialog\",\n  \"data-testid\": \"fe-tz-dialog\"\n}, v3 = { class: \"fe-tzdialog__hint\" }, h3 = [\"data-tier\"], m3 = /* @__PURE__ */ qe({\n  __name: \"TimeZoneDialog\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    theme: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = `fe-tzdialog-${Math.random().toString(36).slice(2, 9)}`, v = Ws(Xs, void 0), p = k(() => Mi({ ...Wu(v), viewer: \"\" })), h = k(() => qu(v)), b = k(() => h.value.zone ?? qs()), y = m(\"\");\n    let A;\n    function D() {\n      y.value = Ha(\n        /* @__PURE__ */ new Date(),\n        n.locale,\n        {\n          hour: \"2-digit\",\n          minute: \"2-digit\",\n          second: \"2-digit\"\n        },\n        v\n      );\n    }\n    return He(\n      () => n.open,\n      (C) => {\n        A && clearInterval(A), A = void 0, C && (D(), A = setInterval(D, 1e3));\n      },\n      { immediate: !0 }\n    ), He(h, D), it(() => {\n      A && clearInterval(A);\n    }), (C, B) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"tz.title\"),\n      size: \"md\",\n      theme: e.theme,\n      onClose: B[0] || (B[0] = (I) => r(\"close\"))\n    }, {\n      default: st(() => [\n        o(\"div\", p3, [\n          o(\"label\", {\n            class: \"fe-tzdialog__label\",\n            for: u\n          }, f(s(a)(\"tz.label\")), 1),\n          Ge(f3, {\n            \"input-id\": u,\n            locale: e.locale,\n            \"model-value\": s(Uv)(),\n            fallback: p.value,\n            label: s(a)(\"tz.label\"),\n            testid: \"fe-tz\",\n            \"onUpdate:modelValue\": s(Vv)\n          }, null, 8, [\"locale\", \"model-value\", \"fallback\", \"label\", \"onUpdate:modelValue\"]),\n          o(\"p\", v3, f(s(a)(\"tz.hint\")), 1),\n          o(\"p\", {\n            class: \"fe-tzdialog__now\",\n            \"data-testid\": \"fe-tz-now\",\n            \"data-tier\": h.value.tier\n          }, f(s(a)(\"tz.now\", { zone: b.value, time: y.value })), 9, h3)\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\", \"theme\"]));\n  }\n});\nfunction y3(e) {\n  const t = Symbol(\"filex-explorer\");\n  Fu(Xs, t), He(\n    () => e.config().timeZone,\n    (a) => jv(t, a),\n    { immediate: !0 }\n  );\n  const n = () => {\n    var a;\n    return e.config().callerKind ?? ((a = e.capabilities.value) == null ? void 0 : a.caller_kind);\n  };\n  let r = !1;\n  return He(\n    n,\n    (a) => {\n      if (a !== \"user\") {\n        Wr(t, null);\n        return;\n      }\n      r || (r = !0, e.fetchMe().then((u) => {\n        var p;\n        if (n() !== \"user\") return;\n        const v = (p = u == null ? void 0 : u.user) == null ? void 0 : p.timezone;\n        Wr(t, typeof v == \"string\" ? v : null);\n      }).catch(() => Wr(t, null)));\n    },\n    { immediate: !0 }\n  ), it(() => Yv(t)), t;\n}\nconst b3 = { class: \"fe-shortset\" }, g3 = { class: \"fe-shortset__topbar\" }, k3 = { class: \"fe-shortset__hint\" }, _3 = [\"disabled\"], w3 = [\"innerHTML\"], $3 = { class: \"fe-shortcuts__heading\" }, x3 = { class: \"fe-shortset__row\" }, S3 = { class: \"fe-shortset__label\" }, C3 = [\"title\"], T3 = { class: \"fe-shortset__keys\" }, M3 = {\n  key: 0,\n  class: \"fe-shortset__capture\",\n  role: \"status\"\n}, E3 = {\n  key: 0,\n  class: \"fe-shortcuts__unbound\"\n}, z3 = { class: \"fe-kbd\" }, A3 = [\"title\"], P3 = {\n  key: 1,\n  class: \"fe-shortcuts__or\",\n  \"aria-hidden\": \"true\"\n}, L3 = { class: \"fe-shortset__actions\" }, D3 = [\"onClick\"], O3 = [\"title\", \"aria-label\", \"onClick\"], B3 = [\"innerHTML\"], I3 = {\n  key: 1,\n  class: \"fe-shortset__fixed\"\n}, H3 = {\n  key: 0,\n  class: \"fe-shortset__conflict\",\n  role: \"alert\"\n}, F3 = { class: \"fe-shortset__conflict-msg\" }, N3 = { class: \"fe-kbd\" }, K3 = { class: \"fe-shortset__conflict-actions\" }, R3 = {\n  key: 1,\n  class: \"fe-shortset__conflict\",\n  role: \"alert\"\n}, U3 = { class: \"fe-shortset__conflict-msg\" }, V3 = { class: \"fe-kbd\" }, j3 = { class: \"fe-shortset__conflict-actions\" }, Y3 = /* @__PURE__ */ qe({\n  __name: \"ShortcutSettings\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    theme: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = Uu(), v = k(() => {\n      const T = [], Y = /* @__PURE__ */ new Map();\n      for (const O of u.value)\n        Y.has(O.groupKey) || (Y.set(O.groupKey, []), T.push(O.groupKey)), Y.get(O.groupKey).push(O);\n      return T.map((O) => ({ key: O, items: Y.get(O) }));\n    }), p = k(() => u.value.some((T) => T.overridden)), h = m(null), b = m(null), y = m(null);\n    function A(T) {\n      const Y = oa.find((O) => O.id === T);\n      return Y ? a(Y.labelKey) : T;\n    }\n    function D(T) {\n      b.value = null, y.value = null, h.value = T;\n    }\n    function C() {\n      h.value = null;\n    }\n    function B(T, Y) {\n      if (h.value = null, Y === Wa(T)) return;\n      if (Bc(Y)) {\n        y.value = { id: T, combo: Y };\n        return;\n      }\n      const O = Mv(Y, T);\n      if (O) {\n        b.value = { id: T, combo: Y, conflictId: O.id, fixed: O.fixed };\n        return;\n      }\n      Yr(T, Y);\n    }\n    function I() {\n      const T = b.value;\n      !T || T.fixed || (Yr(T.conflictId, \"\"), Yr(T.id, T.combo), b.value = null);\n    }\n    function U() {\n      b.value = null;\n    }\n    function x() {\n      y.value = null;\n    }\n    function E(T) {\n      b.value = null, y.value = null, Cv(T);\n    }\n    function $() {\n      b.value = null, y.value = null, h.value = null, Tv();\n    }\n    function M(T) {\n      if (h.value) {\n        if (T.preventDefault(), T.stopPropagation(), T.key === \"Escape\") {\n          C();\n          return;\n        }\n        const Y = Ti(T);\n        if (!Y) return;\n        B(h.value, Y);\n        return;\n      }\n      T.key === \"Escape\" || T.key === \"Tab\" || T.stopPropagation();\n    }\n    He(\n      () => n.open,\n      (T) => {\n        T ? window.addEventListener(\"keydown\", M, !0) : (window.removeEventListener(\"keydown\", M, !0), h.value = null, b.value = null, y.value = null);\n      }\n    ), it(() => window.removeEventListener(\"keydown\", M, !0));\n    function z() {\n      if (h.value) {\n        C();\n        return;\n      }\n      r(\"close\");\n    }\n    return (T, Y) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"shortcuts.settings.title\"),\n      size: \"lg\",\n      theme: e.theme,\n      onClose: z\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: z\n        }, f(s(a)(\"viewer.close\")), 1)\n      ]),\n      default: st(() => [\n        o(\"div\", b3, [\n          o(\"div\", g3, [\n            o(\"p\", k3, f(s(a)(\"shortcuts.settings.hint\")), 1),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-shortset__reset-all\",\n              disabled: !p.value,\n              onClick: $\n            }, [\n              o(\"span\", {\n                class: \"fe-icon\",\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"restore\")\n              }, null, 8, w3),\n              Je(\" \" + f(s(a)(\"shortcuts.settings.reset_all\")), 1)\n            ], 8, _3)\n          ]),\n          (c(!0), d(ae, null, Te(v.value, (O) => (c(), d(\"section\", {\n            key: O.key,\n            class: \"fe-shortset__group\"\n          }, [\n            o(\"h3\", $3, f(s(a)(O.key)), 1),\n            (c(!0), d(ae, null, Te(O.items, (J) => {\n              var G;\n              return c(), d(\"div\", {\n                key: J.id,\n                class: we([\"fe-shortset__item\", {\n                  \"is-capturing\": h.value === J.id,\n                  \"is-conflict\": ((G = b.value) == null ? void 0 : G.id) === J.id\n                }])\n              }, [\n                o(\"div\", x3, [\n                  o(\"span\", S3, [\n                    Je(f(s(a)(J.labelKey)) + \" \", 1),\n                    J.overridden ? (c(), d(\"span\", {\n                      key: 0,\n                      class: \"fe-shortcuts__custom\",\n                      title: s(a)(\"shortcuts.settings.customized\")\n                    }, \"●\", 8, C3)) : g(\"\", !0)\n                  ]),\n                  o(\"span\", T3, [\n                    h.value === J.id ? (c(), d(\"span\", M3, f(s(a)(\"shortcuts.settings.capture\")), 1)) : (c(), d(ae, { key: 1 }, [\n                      J.keys.length === 0 ? (c(), d(\"span\", E3, f(s(a)(\"shortcuts.settings.unbound\")), 1)) : (c(!0), d(ae, { key: 1 }, Te(J.keys, (N, P) => (c(), d(ae, { key: N }, [\n                        o(\"kbd\", z3, f(N), 1),\n                        s(Bc)(N) ? (c(), d(\"span\", {\n                          key: 0,\n                          class: \"fe-shortset__reserved\",\n                          title: s(a)(\"shortcuts.settings.reserved_title\")\n                        }, f(s(a)(\"shortcuts.settings.reserved_badge\")), 9, A3)) : g(\"\", !0),\n                        P < J.keys.length - 1 ? (c(), d(\"span\", P3, \"/\")) : g(\"\", !0)\n                      ], 64))), 128))\n                    ], 64))\n                  ]),\n                  o(\"span\", L3, [\n                    J.customizable ? (c(), d(ae, { key: 0 }, [\n                      h.value !== J.id ? (c(), d(\"button\", {\n                        key: 0,\n                        type: \"button\",\n                        class: \"fe-btn fe-shortset__btn\",\n                        onClick: (N) => D(J.id)\n                      }, f(s(a)(\"shortcuts.settings.change\")), 9, D3)) : (c(), d(\"button\", {\n                        key: 1,\n                        type: \"button\",\n                        class: \"fe-btn fe-shortset__btn\",\n                        onClick: C\n                      }, f(s(a)(\"shortcuts.settings.conflict_cancel\")), 1)),\n                      J.overridden ? (c(), d(\"button\", {\n                        key: 2,\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--icon-only fe-shortset__btn\",\n                        title: s(a)(\"shortcuts.settings.reset\"),\n                        \"aria-label\": s(a)(\"shortcuts.settings.reset\"),\n                        onClick: (N) => E(J.id)\n                      }, [\n                        o(\"span\", {\n                          class: \"fe-icon\",\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"restore\")\n                        }, null, 8, B3)\n                      ], 8, O3)) : g(\"\", !0)\n                    ], 64)) : (c(), d(\"span\", I3, f(s(a)(\"shortcuts.settings.fixed\")), 1))\n                  ])\n                ]),\n                b.value && b.value.id === J.id ? (c(), d(\"div\", H3, [\n                  o(\"span\", F3, [\n                    o(\"kbd\", N3, f(b.value.combo), 1),\n                    Je(\" \" + f(b.value.fixed ? s(a)(\"shortcuts.settings.conflict_fixed\", { name: A(b.value.conflictId) }) : s(a)(\"shortcuts.settings.conflict\", { name: A(b.value.conflictId) })), 1)\n                  ]),\n                  o(\"span\", K3, [\n                    b.value.fixed ? g(\"\", !0) : (c(), d(\"button\", {\n                      key: 0,\n                      type: \"button\",\n                      class: \"fe-btn fe-btn--danger fe-shortset__btn\",\n                      onClick: I\n                    }, f(s(a)(\"shortcuts.settings.conflict_take\")), 1)),\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-btn fe-shortset__btn\",\n                      onClick: U\n                    }, f(s(a)(\"shortcuts.settings.conflict_cancel\")), 1)\n                  ])\n                ])) : g(\"\", !0),\n                y.value && y.value.id === J.id ? (c(), d(\"div\", R3, [\n                  o(\"span\", U3, [\n                    o(\"kbd\", V3, f(y.value.combo), 1),\n                    Je(\" \" + f(s(a)(\"shortcuts.settings.reserved\")), 1)\n                  ]),\n                  o(\"span\", j3, [\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-btn fe-shortset__btn\",\n                      onClick: x\n                    }, f(s(a)(\"shortcuts.settings.conflict_cancel\")), 1)\n                  ])\n                ])) : g(\"\", !0)\n              ], 2);\n            }), 128))\n          ]))), 128))\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\", \"theme\"]));\n  }\n}), W3 = \"/web-apps/apps/api/documents/api.js\", q3 = \"/?embed=1&proto=json\", G3 = 1e4;\nfunction X3(e) {\n  return e.trim().replace(/\\/+$/, \"\");\n}\nfunction J3(e, t) {\n  return new Promise((n) => {\n    const r = document.createElement(\"script\");\n    let a = !1;\n    const u = (p) => {\n      a || (a = !0, clearTimeout(v), r.remove(), n(p));\n    }, v = setTimeout(() => u(\"timeout\"), t);\n    r.async = !0, r.src = e, r.onload = () => u(\"load\"), r.onerror = () => u(\"error\"), document.head.appendChild(r);\n  });\n}\nfunction Z3(e, t) {\n  return new Promise((n) => {\n    let r = null;\n    try {\n      r = new URL(e, window.location.href).origin;\n    } catch {\n      r = null;\n    }\n    const a = document.createElement(\"iframe\");\n    a.setAttribute(\"aria-hidden\", \"true\"), a.style.cssText = \"position:absolute;left:-9999px;width:1px;height:1px;border:0\";\n    let u = !1;\n    const v = (b) => {\n      u || (u = !0, clearTimeout(h), window.removeEventListener(\"message\", p), a.remove(), n(b));\n    }, p = (b) => {\n      if (r && b.origin !== r) return;\n      let y = b.data;\n      if (typeof y == \"string\")\n        try {\n          y = JSON.parse(y);\n        } catch {\n          return;\n        }\n      y && typeof y == \"object\" && y.event === \"init\" && v(\"ready\");\n    };\n    window.addEventListener(\"message\", p);\n    const h = setTimeout(() => v(\"timeout\"), t);\n    a.src = e, document.body.appendChild(a);\n  });\n}\nasync function Q3(e) {\n  try {\n    return await fetch(e, { mode: \"no-cors\", cache: \"no-store\" }), !0;\n  } catch {\n    return !1;\n  }\n}\nconst eT = {\n  loadScript: J3,\n  loadFramed: Z3,\n  reachable: Q3,\n  hasDocsAPI: () => {\n    var e;\n    return !!((e = window.DocsAPI) != null && e.DocEditor);\n  },\n  pageProtocol: () => window.location.protocol,\n  now: () => typeof performance < \"u\" ? performance.now() : Date.now()\n};\nfunction Fd(e, t) {\n  const n = X3(t);\n  return n ? e === \"onlyoffice\" ? n + W3 : e === \"drawio\" ? n + q3 : \"\" : \"\";\n}\nasync function jD(e, t, n = {}) {\n  const r = { ...eT, ...n.deps ?? {} }, a = n.timeoutMs ?? G3, u = Fd(e, t ?? \"\"), v = e === \"onlyoffice\" ? \"script\" : e === \"drawio\" ? \"iframe\" : \"none\";\n  if (!u)\n    return { service: e, state: \"skipped\", url: \"\", ms: 0, mechanism: v };\n  if (r.pageProtocol() === \"https:\" && u.startsWith(\"http://\"))\n    return { service: e, state: \"blocked-mixed-content\", url: u, ms: 0, mechanism: v };\n  const p = r.now(), h = () => Math.round(r.now() - p);\n  if (v === \"script\") {\n    const b = await r.loadScript(u, a);\n    if (b === \"timeout\") return { service: e, state: \"timeout\", url: u, ms: h(), mechanism: v };\n    if (b === \"load\")\n      return {\n        service: e,\n        state: r.hasDocsAPI() ? \"ok\" : \"wrong-content\",\n        url: u,\n        ms: h(),\n        mechanism: v\n      };\n    const y = await r.reachable(u);\n    return {\n      service: e,\n      state: y ? \"wrong-content\" : \"unreachable\",\n      url: u,\n      ms: h(),\n      mechanism: v\n    };\n  }\n  if (v === \"iframe\") {\n    if (await r.loadFramed(u, a) === \"ready\") return { service: e, state: \"ok\", url: u, ms: h(), mechanism: v };\n    const y = await r.reachable(u);\n    return {\n      service: e,\n      state: y ? \"wrong-content\" : \"unreachable\",\n      url: u,\n      ms: h(),\n      mechanism: v\n    };\n  }\n  return { service: e, state: \"skipped\", url: \"\", ms: 0, mechanism: v };\n}\nconst tT = {\n  key: 0,\n  class: \"fe-viewer__bar\"\n}, nT = { class: \"fe-viewer__ident\" }, aT = [\"innerHTML\"], oT = { class: \"fe-viewer__idcol\" }, sT = [\"title\"], rT = {\n  key: 0,\n  class: \"fe-viewer__meta\"\n}, iT = { class: \"fe-viewer__acts\" }, lT = [\"href\", \"title\", \"aria-label\"], cT = [\"innerHTML\"], uT = [\"title\", \"aria-label\"], dT = [\"innerHTML\"], fT = [\"title\", \"aria-label\"], pT = [\"innerHTML\"], vT = [\"title\", \"aria-label\"], hT = [\"innerHTML\"], mT = { class: \"fe-viewer__tail\" }, yT = [\"title\", \"aria-label\"], bT = [\"innerHTML\"], gT = [\"src\", \"alt\"], kT = [\"src\"], _T = [\"src\"], wT = [\"data\"], $T = { class: \"fe-preview__fallback\" }, xT = [\"innerHTML\"], ST = [\"href\"], CT = {\n  key: 0,\n  class: \"fe-preview__fallback\"\n}, TT = {\n  key: 1,\n  class: \"fe-preview__fallback\"\n}, MT = [\"href\"], ET = {\n  key: 2,\n  class: \"fe-preview__md-split\"\n}, zT = { class: \"fe-preview__md-split-bar\" }, AT = {\n  key: 0,\n  class: \"fe-preview__md-split-error\"\n}, PT = [\"disabled\"], LT = { class: \"fe-preview__md-split-body\" }, DT = [\"onKeydown\", \"placeholder\"], OT = {\n  key: 0,\n  class: \"fe-preview__md-split-output fe-preview__md\"\n}, BT = [\"innerHTML\"], IT = {\n  key: 3,\n  class: \"fe-preview__fallback\"\n}, HT = [\"href\"], FT = [\"innerHTML\"], NT = {\n  key: 5,\n  class: \"fe-preview__pre\"\n}, KT = {\n  key: 0,\n  class: \"fe-preview__fallback\"\n}, RT = [\"innerHTML\"], UT = [\"href\"], VT = {\n  key: 1,\n  class: \"fe-preview__fallback\"\n}, jT = [\"innerHTML\"], YT = {\n  key: 0,\n  class: \"fe-preview__fallback\"\n}, WT = {\n  key: 1,\n  class: \"fe-preview__fallback\"\n}, qT = [\"href\"], GT = {\n  key: 2,\n  class: \"fe-preview__fallback\"\n}, XT = [\"href\"], JT = {\n  key: 3,\n  class: \"fe-preview__code-wrap\"\n}, ZT = { class: \"fe-preview__code-toolbar\" }, QT = {\n  class: \"fe-preview__code-lang\",\n  lang: \"en\"\n}, e4 = {\n  key: 0,\n  class: \"fe-preview__code-status\"\n}, t4 = {\n  key: 1,\n  class: \"fe-preview__code-status fe-preview__code-status--ok\"\n}, n4 = [\"innerHTML\"], a4 = [\"title\"], o4 = [\"innerHTML\"], s4 = {\n  key: 3,\n  class: \"fe-preview__code-status\"\n}, r4 = [\"disabled\"], i4 = {\n  key: 0,\n  class: \"fe-preview__pre fe-preview__code hljs\"\n}, l4 = [\"innerHTML\"], c4 = [\"data-lang\"], u4 = {\n  key: 0,\n  class: \"fe-preview__fallback\",\n  \"data-testid\": \"office-fallback\"\n}, d4 = [\"innerHTML\"], f4 = [\"href\"], p4 = {\n  key: 8,\n  class: \"fe-preview__fallback\"\n}, v4 = [\"innerHTML\"], h4 = [\"href\"], m4 = [\"title\", \"aria-label\"], y4 = [\"title\", \"aria-label\"], b4 = {\n  key: 3,\n  class: \"fe-viewer__zoom\"\n}, g4 = [\"disabled\", \"title\", \"aria-label\"], k4 = [\"title\", \"aria-label\"], _4 = [\"disabled\", \"title\", \"aria-label\"], w4 = [\"title\", \"aria-label\"], $4 = {\n  viewBox: \"0 0 24 24\",\n  width: \"16\",\n  height: \"16\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.7\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, Qr = 1e6, Cu = \"fe-onlyoffice-api-js\", Nd = /* @__PURE__ */ qe({\n  __name: \"PreviewModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    file: {},\n    previewUrl: { type: Function },\n    downloadUrl: { type: Function },\n    onlyOfficeBase: {},\n    onlyOfficeConfigEndpoint: {},\n    saveTextEndpoint: {},\n    archiveListEndpoint: {},\n    openMode: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    drawioUrl: {},\n    pdfWorkerUrl: {},\n    pdfSaveUrl: {},\n    viewerBaseUrl: {},\n    newTabEnabled: { type: Boolean },\n    chromeless: { type: Boolean },\n    theme: {},\n    index: {},\n    total: {},\n    navEnabled: { type: Boolean },\n    apiBase: {},\n    shareEnabled: { type: Boolean }\n  },\n  emits: [\"close\", \"nav\", \"share\", \"starred\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u, formatDate: v, nodeDisplayName: p } = tt(() => n.locale);\n    function h(xe) {\n      return ((xe == null ? void 0 : xe.extension) || \"\").toLowerCase();\n    }\n    const b = [\"jpg\", \"jpeg\", \"png\", \"webp\", \"gif\", \"bmp\", \"avif\", \"svg\", \"heic\"], y = [\"mp4\", \"webm\", \"mov\", \"mkv\", \"m4v\", \"ogv\"], A = [\"mp3\", \"wav\", \"ogg\", \"flac\", \"m4a\", \"aac\", \"opus\"], D = {\n      md: \"markdown\",\n      markdown: \"markdown\",\n      txt: \"plaintext\",\n      log: \"plaintext\",\n      js: \"javascript\",\n      mjs: \"javascript\",\n      cjs: \"javascript\",\n      ts: \"typescript\",\n      tsx: \"typescript\",\n      jsx: \"javascript\",\n      vue: \"xml\",\n      svelte: \"xml\",\n      html: \"xml\",\n      htm: \"xml\",\n      xml: \"xml\",\n      svg: \"xml\",\n      css: \"css\",\n      scss: \"scss\",\n      sass: \"scss\",\n      less: \"less\",\n      json: \"json\",\n      jsonc: \"json\",\n      yml: \"yaml\",\n      yaml: \"yaml\",\n      php: \"php\",\n      py: \"python\",\n      rb: \"ruby\",\n      go: \"go\",\n      rs: \"rust\",\n      java: \"java\",\n      kt: \"kotlin\",\n      swift: \"swift\",\n      cpp: \"cpp\",\n      c: \"c\",\n      h: \"cpp\",\n      hpp: \"cpp\",\n      cs: \"csharp\",\n      dart: \"dart\",\n      sh: \"bash\",\n      bash: \"bash\",\n      zsh: \"bash\",\n      fish: \"bash\",\n      sql: \"sql\",\n      toml: \"ini\",\n      ini: \"ini\",\n      conf: \"ini\",\n      env: \"bash\",\n      cfg: \"ini\",\n      dockerfile: \"dockerfile\",\n      graphql: \"graphql\",\n      gql: \"graphql\",\n      diff: \"diff\",\n      patch: \"diff\"\n    }, C = [\"txt\", \"log\"], B = [\"docx\", \"doc\", \"xlsx\", \"xls\", \"pptx\", \"ppt\", \"odt\", \"ods\", \"odp\", \"rtf\"], I = {\n      glb: () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      gltf: () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      obj: () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      stl: () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      fbx: () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      \"3ds\": () => import(\"./Viewer3D-CdZeK4j4.js\"),\n      epub: () => import(\"./EpubViewer-CAoTSXTO.js\"),\n      mmd: () => import(\"./MermaidViewer-DGwAvRZg.js\"),\n      mermaid: () => import(\"./MermaidViewer-DGwAvRZg.js\"),\n      drawio: () => import(\"./DrawioViewer-CC6rJXeP.js\"),\n      dio: () => import(\"./DrawioViewer-CC6rJXeP.js\"),\n      tif: () => import(\"./TiffViewer-D0AurvAh.js\"),\n      tiff: () => import(\"./TiffViewer-D0AurvAh.js\"),\n      psd: () => import(\"./PsdViewer-DhGweA0m.js\"),\n      // PDF deliberately uses the native browser viewer (`kind === 'pdf'`\n      // branch in the template). PdfViewer.vue still exists for callers\n      // that want the rich custom UI but the SFC default keeps things\n      // minimal — the browser already paints search/zoom/page UI for free.\n      ipynb: () => import(\"./IpynbViewer-D0GwGpnE.js\"),\n      csv: () => import(\"./CsvViewer-Bg2_aqzc.js\"),\n      tsv: () => import(\"./CsvViewer-Bg2_aqzc.js\"),\n      zip: () => import(\"./ArchiveViewer-BUQWLhwX.js\")\n    }, U = k(() => {\n      const xe = h(n.file);\n      if (!xe) return \"other\";\n      if (b.includes(xe)) return \"image\";\n      if (y.includes(xe)) return \"video\";\n      if (A.includes(xe)) return \"audio\";\n      if (xe === \"pdf\") return \"pdf\";\n      const de = n.openMode !== \"view\";\n      return xe === \"md\" || xe === \"markdown\" ? \"markdown\" : xe in D ? \"code\" : xe in I ? \"viewer\" : B.includes(xe) ? \"office\" : C.includes(xe) ? de ? \"code\" : \"text\" : \"other\";\n    }), x = wn(null), E = m(null), $ = m(!1);\n    async function M(xe) {\n      x.value = null, E.value = null;\n      const de = I[xe];\n      if (de)\n        try {\n          const Le = await de();\n          x.value = Le.default ?? Le;\n        } catch (Le) {\n          E.value = Le instanceof Error ? Le.message : \"viewer load failed\", xe === \"pdf\" && ($.value = !0);\n        }\n    }\n    function z() {\n      $.value = !0;\n    }\n    const T = k(() => {\n      var Le;\n      const xe = h(n.file), de = {\n        url: P.value,\n        ext: xe,\n        mime: (Le = n.file) == null ? void 0 : Le.mime_type,\n        t: a,\n        authHeaders: n.authHeaders,\n        authCredentials: n.authCredentials\n      };\n      return n.file && (de.filePath = ve(n.file.path), (xe === \"zip\" || xe === \"rar\" || xe === \"7z\" || xe === \"tar\" || xe === \"gz\" || xe === \"tgz\") && (de.filePath = n.file.path, n.archiveListEndpoint && (de.archiveListUrl = n.archiveListEndpoint))), (xe === \"drawio\" || xe === \"dio\") && (de.drawioUrl = n.drawioUrl ?? void 0, de.saveUrl = n.saveTextEndpoint ?? void 0, de.readOnly = n.openMode === \"view\"), xe === \"pdf\" && (de.pdfWorkerUrl = n.pdfWorkerUrl ?? void 0, de.pdfSaveUrl = n.pdfSaveUrl ?? void 0), de;\n    });\n    function Y() {\n      J(n.openMode || \"edit\");\n    }\n    function O() {\n      J(\"edit\");\n    }\n    function J(xe) {\n      if (!n.file) return;\n      const de = h(n.file), Le = n.viewerBaseUrl || \"/files/edit\", q = Le.includes(\"?\") ? \"&\" : \"?\", ne = `${Le}${q}path=${encodeURIComponent(n.file.path)}&type=${encodeURIComponent(de)}&mode=${encodeURIComponent(xe)}`;\n      window.open(ne, \"_blank\", \"noopener\");\n    }\n    const G = /* @__PURE__ */ new Set([\n      // OnlyOffice — open the in-page office editor (or new tab) with\n      // edit permissions.\n      \"docx\",\n      \"doc\",\n      \"xlsx\",\n      \"xls\",\n      \"pptx\",\n      \"ppt\",\n      \"odt\",\n      \"ods\",\n      \"odp\",\n      \"rtf\",\n      // Drawio / mermaid round-trip via the new-tab route.\n      \"drawio\",\n      \"dio\",\n      \"mmd\",\n      \"mermaid\",\n      // Code / text / markdown — Monaco / split editor.\n      \"md\",\n      \"markdown\",\n      \"txt\",\n      \"log\",\n      \"json\",\n      \"jsonc\",\n      \"yaml\",\n      \"yml\",\n      \"xml\",\n      \"svg\",\n      \"html\",\n      \"htm\",\n      \"js\",\n      \"mjs\",\n      \"cjs\",\n      \"ts\",\n      \"tsx\",\n      \"jsx\",\n      \"vue\",\n      \"svelte\",\n      \"css\",\n      \"scss\",\n      \"sass\",\n      \"less\",\n      \"php\",\n      \"py\",\n      \"rb\",\n      \"go\",\n      \"rs\",\n      \"java\",\n      \"kt\",\n      \"swift\",\n      \"cpp\",\n      \"c\",\n      \"h\",\n      \"hpp\",\n      \"cs\",\n      \"dart\",\n      \"sh\",\n      \"bash\",\n      \"sql\",\n      \"toml\",\n      \"ini\",\n      \"conf\",\n      \"cfg\",\n      \"env\",\n      \"dockerfile\",\n      \"graphql\",\n      \"gql\"\n    ]), N = k(\n      () => !!n.file && G.has(h(n.file))\n    ), P = k(() => n.file ? n.previewUrl(n.file.path) : \"\"), le = k(() => n.file ? n.downloadUrl(n.file.path) : \"\");\n    function ve(xe) {\n      const de = xe.indexOf(\"://\");\n      return de === -1 ? xe : xe.slice(de + 3);\n    }\n    const he = k(() => !n.chromeless), oe = m(null), ue = k(() => n.file ? fn(n.file) : \"\"), Q = k(() => n.file ? p(n.file) : \"\"), pe = k(() => {\n      const xe = n.index, de = n.total;\n      return !xe || !de || de < 1 || xe < 1 ? \"\" : a(\"viewer.counter\", { i: xe, n: de });\n    }), re = k(() => {\n      const xe = n.file;\n      if (!xe) return \"\";\n      const de = [];\n      typeof xe.size == \"number\" && xe.type === \"file\" && de.push(u(xe.size));\n      const Le = v(xe.last_modified);\n      return Le && de.push(Le), pe.value && de.push(pe.value), de.join(\" • \");\n    }), S = k(\n      () => he.value && (n.navEnabled === !0 || (n.total ?? 0) > 1)\n    ), w = k(\n      () => {\n        var xe;\n        return typeof ((xe = n.file) == null ? void 0 : xe.id) == \"number\" ? n.file.id : null;\n      }\n    ), j = /* @__PURE__ */ new Set([\"pdf\", \"markdown\", \"code\", \"text\", \"office\", \"viewer\"]), K = k(\n      () => j.has(U.value) ? \"fe-preview--fill\" : \"fe-preview--center\"\n    ), Z = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4], W = m(1), $e = m(null), Se = m(0), ze = k(() => he.value && U.value === \"image\");\n    function Ne() {\n      if (W.value !== 1 || !$e.value) return;\n      const xe = $e.value.getBoundingClientRect().width;\n      xe > 0 && (Se.value = xe);\n    }\n    const be = k(() => {\n      if (!(W.value === 1 || !Se.value))\n        return {\n          width: `${Math.round(Se.value * W.value)}px`,\n          height: \"auto\",\n          maxWidth: \"none\",\n          maxHeight: \"none\"\n        };\n    });\n    function De(xe) {\n      const de = W.value;\n      if (xe > 0)\n        W.value = Z.find((Le) => Le > de + 1e-6) ?? Z[Z.length - 1];\n      else {\n        const Le = Z.filter((q) => q < de - 1e-6);\n        W.value = Le.length ? Le[Le.length - 1] : Z[0];\n      }\n    }\n    function ie() {\n      W.value = 1, gt(Ne);\n    }\n    const ce = k(() => `${Math.round(W.value * 100)}%`), L = k(() => W.value < Z[Z.length - 1] - 1e-6), se = k(() => W.value > Z[0] + 1e-6), Ce = m(!1);\n    function We() {\n      Ce.value = !!document.fullscreenElement;\n    }\n    function Ie() {\n      var xe, de, Le;\n      try {\n        document.fullscreenElement ? (xe = document.exitFullscreen) == null || xe.call(document) : (Le = (de = oe.value) == null ? void 0 : de.requestFullscreen) == null || Le.call(de);\n      } catch {\n      }\n    }\n    function Ze() {\n      he.value && r(\"close\");\n    }\n    const vt = m(!1), Xe = m(null), Ae = m(\"\"), V = m(!1), R = m(!1), X = m(!1);\n    let ye, je;\n    function Qe() {\n      R.value = !0, ye && clearTimeout(ye), ye = setTimeout(() => {\n        Be(Ae.value);\n      }, 250), je && clearTimeout(je), je = setTimeout(() => {\n        at();\n      }, 1500);\n    }\n    async function at() {\n      if (!(!n.saveTextEndpoint || !n.file || X.value)) {\n        X.value = !0, Xe.value = null;\n        try {\n          const xe = {\n            \"Content-Type\": \"application/json\",\n            ...await (n.authHeaders ?? (() => ({})))()\n          }, de = await fetch(n.saveTextEndpoint, {\n            method: \"POST\",\n            headers: xe,\n            credentials: n.authCredentials || \"same-origin\",\n            body: JSON.stringify({ path: ve(n.file.path), content: Ae.value })\n          });\n          if (!de.ok)\n            throw new Error(`save failed: ${de.status} ${await de.text()}`);\n          R.value = !1;\n        } catch (xe) {\n          Xe.value = xe instanceof Error ? xe.message : String(xe);\n        } finally {\n          X.value = !1;\n        }\n      }\n    }\n    async function Ye(xe) {\n      vt.value = !0, Xe.value = null, Ae.value = \"\", V.value = !1;\n      try {\n        const de = {};\n        n.authHeaders && Object.assign(de, await n.authHeaders());\n        const Le = await fetch(xe, {\n          credentials: n.authCredentials || \"same-origin\",\n          headers: de\n        });\n        if (!Le.ok)\n          throw new Error(`${Le.status} ${Le.statusText}`);\n        if (Number(Le.headers.get(\"content-length\") || \"0\") > Qr) {\n          V.value = !0;\n          return;\n        }\n        const ne = await Le.text();\n        ne.length > Qr ? (V.value = !0, Ae.value = ne.slice(0, Qr)) : Ae.value = ne;\n      } catch (de) {\n        Xe.value = de instanceof Error ? de.message : String(de);\n      } finally {\n        vt.value = !1;\n      }\n    }\n    const lt = m(\"\"), fe = m(null), Pe = m(!1);\n    async function Be(xe) {\n      try {\n        const de = await import(\n          /* @vite-ignore */\n          \"markdown-it\"\n        ).catch(() => null);\n        if (!de) {\n          lt.value = \"\", Pe.value = !0;\n          return;\n        }\n        Pe.value = !1;\n        const Le = de.default ?? de, ne = new Le({\n          html: !0,\n          linkify: !0,\n          breaks: !0,\n          typographer: !0\n        }).render(xe);\n        lt.value = ht(ne), await new Promise((H) => setTimeout(H, 0)), await Ft();\n      } catch (de) {\n        lt.value = \"\", Xe.value = de instanceof Error ? de.message : String(de);\n      }\n    }\n    function ht(xe) {\n      return xe.replace(/<\\s*script\\b[^<]*(?:(?!<\\s*\\/\\s*script\\s*>)<[^<]*)*<\\s*\\/\\s*script\\s*>/gi, \"\").replace(/<\\s*iframe\\b[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi, \"\").replace(/<\\s*object\\b[\\s\\S]*?<\\s*\\/\\s*object\\s*>/gi, \"\").replace(/<\\s*embed\\b[^>]*>/gi, \"\").replace(/\\son\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\").replace(/(href|src|action|formaction|xlink:href)\\s*=\\s*(?:\"\\s*javascript:[^\"]*\"|'\\s*javascript:[^']*')/gi, '$1=\"#\"');\n    }\n    async function Ft() {\n      var ne, H, te;\n      if (!fe.value) return;\n      const xe = fe.value, de = Array.from(xe.querySelectorAll(\"pre > code\"));\n      if (de.length === 0) return;\n      let Le, q;\n      for (const _e of de) {\n        const Me = _e.className || \"\", ge = /\\blanguage-mermaid\\b/.test(Me) || /\\blanguage-mmd\\b/.test(Me), Oe = /\\blanguage-math\\b/.test(Me) || /\\blanguage-latex\\b/.test(Me) || /\\blanguage-tex\\b/.test(Me);\n        if (ge) {\n          if (Le === void 0)\n            try {\n              const mt = await import(\n                /* @vite-ignore */\n                \"mermaid\"\n              );\n              Le = mt.default ?? mt, (ne = Le.initialize) == null || ne.call(Le, {\n                startOnLoad: !1,\n                securityLevel: \"strict\"\n              });\n            } catch {\n              Le = null;\n            }\n          if (!Le) continue;\n          try {\n            const mt = `filex-md-mermaid-${Math.random().toString(36).slice(2)}`, { svg: Xt } = await Le.render(mt, _e.textContent || \"\"), sa = document.createElement(\"div\");\n            sa.className = \"fe-preview__md-mermaid\", sa.innerHTML = Xt, (H = _e.parentElement) == null || H.replaceWith(sa);\n          } catch {\n          }\n        } else if (Oe) {\n          if (q === void 0)\n            try {\n              const mt = await import(\n                /* @vite-ignore */\n                \"./katex-yuB6V-q6.js\"\n              );\n              q = mt.default ?? mt;\n            } catch {\n              q = null;\n            }\n          if (!q) continue;\n          try {\n            const mt = q.renderToString(_e.textContent || \"\", {\n              displayMode: !0,\n              throwOnError: !1\n            }), Xt = document.createElement(\"div\");\n            Xt.className = \"fe-preview__md-math\", Xt.innerHTML = mt, (te = _e.parentElement) == null || te.replaceWith(Xt);\n          } catch {\n          }\n        }\n      }\n    }\n    const ft = m(\"\");\n    async function qt(xe, de) {\n      try {\n        const Le = await Zu();\n        if (!Le) {\n          ft.value = \"\";\n          return;\n        }\n        const q = Le.default ?? Le;\n        if (q.getLanguage(de)) {\n          const ne = q.highlight(xe, { language: de, ignoreIllegals: !0 });\n          ft.value = ne.value;\n        } else {\n          const ne = q.highlightAuto(xe);\n          ft.value = ne.value;\n        }\n      } catch (Le) {\n        ft.value = \"\", Xe.value = Le instanceof Error ? Le.message : String(Le);\n      }\n    }\n    const Gt = m(null);\n    let wt = null, en;\n    const $t = m(!1), kt = m(!1), Dt = m(!1), At = m(!1), Ot = m(null);\n    function Bt() {\n      if (wt) {\n        try {\n          wt.dispose();\n        } catch {\n        }\n        wt = null;\n      }\n      $t.value = !1, At.value = !1, Ot.value = null;\n    }\n    function un(xe) {\n      return {\n        js: \"javascript\",\n        mjs: \"javascript\",\n        cjs: \"javascript\",\n        ts: \"typescript\",\n        tsx: \"typescript\",\n        jsx: \"javascript\",\n        json: \"json\",\n        jsonc: \"json\",\n        css: \"css\",\n        scss: \"scss\",\n        sass: \"scss\",\n        less: \"less\",\n        html: \"html\",\n        htm: \"html\",\n        vue: \"html\",\n        svelte: \"html\",\n        xml: \"xml\",\n        svg: \"xml\",\n        md: \"markdown\",\n        markdown: \"markdown\",\n        php: \"php\",\n        py: \"python\",\n        yml: \"yaml\",\n        yaml: \"yaml\",\n        go: \"go\",\n        rs: \"rust\",\n        sql: \"sql\",\n        cpp: \"cpp\",\n        c: \"c\",\n        h: \"cpp\",\n        hpp: \"cpp\",\n        sh: \"shell\",\n        bash: \"shell\",\n        dockerfile: \"dockerfile\",\n        toml: \"ini\",\n        ini: \"ini\",\n        conf: \"ini\",\n        cfg: \"ini\"\n      }[xe] ?? \"plaintext\";\n    }\n    async function pt(xe, de) {\n      var q;\n      const Le = await ri();\n      if (Le || (kt.value = !0), !Le || !Gt.value) return !1;\n      try {\n        Bt();\n        const ne = !!n.saveTextEndpoint && n.openMode !== \"view\", H = n.theme === \"dark\" ? !0 : n.theme === \"light\" ? !1 : (q = window.matchMedia) == null ? void 0 : q.call(window, \"(prefers-color-scheme: dark)\").matches;\n        return wt = Le.editor.create(Gt.value, {\n          value: xe,\n          language: un(de),\n          readOnly: !ne,\n          theme: H ? \"vs-dark\" : \"vs\",\n          automaticLayout: !0,\n          minimap: { enabled: !1 },\n          fontSize: 13\n        }), ne && (wt.addCommand(\n          Le.KeyMod.CtrlCmd | Le.KeyCode.KeyS,\n          () => void tn()\n        ), wt.onDidChangeModelContent(() => {\n          en && clearTimeout(en), en = setTimeout(() => {\n            tn();\n          }, 1500);\n        })), $t.value = !0, !0;\n      } catch (ne) {\n        return Xe.value = `Monaco mount fail: ${ne.message}`, !1;\n      }\n    }\n    async function tn() {\n      if (!(!n.saveTextEndpoint || !n.file) && n.openMode !== \"view\" && !Dt.value) {\n        Dt.value = !0, At.value = !1, Ot.value = null;\n        try {\n          const xe = wt ? wt.getValue() : \"\", de = { \"Content-Type\": \"application/json\" };\n          n.authHeaders && Object.assign(de, await n.authHeaders());\n          const Le = await fetch(n.saveTextEndpoint, {\n            method: \"POST\",\n            headers: de,\n            credentials: n.authCredentials || \"same-origin\",\n            body: JSON.stringify({\n              path: ve(n.file.path),\n              content: xe\n            })\n          });\n          if (!Le.ok) {\n            const q = await Le.text().catch(() => \"\");\n            throw new Error(`${Le.status} ${Le.statusText}${q ? \" — \" + q.slice(0, 150) : \"\"}`);\n          }\n          At.value = !0, setTimeout(() => {\n            At.value = !1;\n          }, 2500);\n        } catch (xe) {\n          Ot.value = xe.message;\n        } finally {\n          Dt.value = !1;\n        }\n      }\n    }\n    async function xt(xe, de, Le) {\n      if (Ae.value = \"\", lt.value = \"\", ft.value = \"\", Xe.value = null, _t.value = null, x.value = null, E.value = null, $.value = !1, W.value = 1, Se.value = 0, Nt(), Bt(), !(!xe || !de)) {\n        if (Le === \"viewer\") {\n          await M(h(n.file));\n          return;\n        }\n        if (Le === \"markdown\" || Le === \"code\" || Le === \"text\") {\n          if (await Ye(de), V.value) return;\n          if (Le === \"markdown\") {\n            await Be(Ae.value);\n            return;\n          }\n          const q = D[h(n.file)] || \"\";\n          Qu() ? (await new Promise((te) => setTimeout(te, 0)), await pt(Ae.value, h(n.file)) || await qt(Ae.value, q)) : (Le === \"code\" && await qt(Ae.value, q), ri().then(async (H) => {\n            if (!H) {\n              kt.value = !0;\n              return;\n            }\n            n.open && (await new Promise((te) => setTimeout(te, 0)), await pt(Ae.value, h(n.file)));\n          }));\n        } else Le === \"office\" && (await new Promise((q) => setTimeout(q, 0)), await sn());\n      }\n    }\n    He(\n      () => [n.open, P.value, U.value, n.openMode],\n      ([xe, de, Le]) => {\n        xt(xe, de, Le);\n      }\n    ), dt(() => {\n      document.addEventListener(\"fullscreenchange\", We), gt(() => {\n        n.open && xt(n.open, P.value, U.value);\n      });\n    });\n    const jt = k(() => D[h(n.file)] || \"plaintext\"), Pt = m(null), _t = m(null);\n    let St = null;\n    async function sn() {\n      if (_t.value = null, !(!n.file || U.value !== \"office\")) {\n        if (!n.onlyOfficeConfigEndpoint) {\n          _t.value = a(\"viewer.office_unconfigured\");\n          return;\n        }\n        if (Pt.value)\n          try {\n            const xe = { \"Content-Type\": \"application/json\" };\n            n.authHeaders && Object.assign(xe, await n.authHeaders());\n            const de = await fetch(n.onlyOfficeConfigEndpoint, {\n              method: \"POST\",\n              headers: xe,\n              credentials: n.authCredentials || \"same-origin\",\n              body: JSON.stringify({\n                // Send the FULL adapter-qualified path. The backend resolves\n                // `<adapter>://<rel>` against ListEnabledStorages; passing the\n                // bare relative path falls back to storages[0] which 404s for\n                // anything sitting on a non-primary storage (e.g. s3-test).\n                path: n.file.path,\n                mode: n.openMode || \"edit\"\n              })\n            });\n            if (!de.ok)\n              throw new Error(`Config fetch ${de.status}: ${(await de.text()).slice(0, 200)}`);\n            const { config: Le, documentServerUrl: q } = await de.json();\n            await mn(q), Nt();\n            const ne = \"fe-onlyoffice-mount\";\n            Pt.value.id = ne, Le.events = {\n              onError: (te) => {\n                _t.value = nn(te);\n              }\n            };\n            const H = window;\n            if (!H.DocsAPI || !H.DocsAPI.DocEditor)\n              throw new Error(\"DocsAPI not available after script load\");\n            St = new H.DocsAPI.DocEditor(ne, Le);\n          } catch (xe) {\n            _t.value = xe instanceof Error ? xe.message : String(xe);\n          }\n      }\n    }\n    function Nt() {\n      var xe;\n      try {\n        (xe = St == null ? void 0 : St.destroyEditor) == null || xe.call(St);\n      } catch {\n      }\n      St = null;\n    }\n    it(() => {\n      document.removeEventListener(\"fullscreenchange\", We), Nt(), Bt();\n    });\n    function nn(xe) {\n      if (typeof xe == \"string\") return xe;\n      const de = xe;\n      if (de != null && de.data && typeof de.data == \"object\") {\n        const Le = de.data;\n        if (typeof Le.errorDescription == \"string\") return Le.errorDescription;\n        if (typeof Le.message == \"string\") return Le.message;\n        if (Le.errorCode !== void 0) return `OnlyOffice error ${Le.errorCode}`;\n      }\n      if (typeof (de == null ? void 0 : de.data) == \"string\") return de.data;\n      if (typeof (de == null ? void 0 : de.errorDescription) == \"string\") return de.errorDescription;\n      if (typeof (de == null ? void 0 : de.message) == \"string\") return de.message;\n      try {\n        return JSON.stringify(xe);\n      } catch {\n        return \"OnlyOffice error\";\n      }\n    }\n    function mn(xe) {\n      return new Promise((de, Le) => {\n        var H;\n        if ((H = window.DocsAPI) != null && H.DocEditor) {\n          de();\n          return;\n        }\n        const q = document.getElementById(Cu);\n        if (q) {\n          q.addEventListener(\"load\", () => de()), q.addEventListener(\"error\", () => Le(new Error(\"OnlyOffice api.js load failed\")));\n          return;\n        }\n        const ne = document.createElement(\"script\");\n        ne.id = Cu, ne.src = Fd(\"onlyoffice\", xe), ne.async = !0, ne.onload = () => de(), ne.onerror = () => Le(new Error(\"OnlyOffice api.js load failed\")), document.head.appendChild(ne);\n      });\n    }\n    return (xe, de) => {\n      var Le;\n      return c(), et(an, {\n        open: e.open,\n        size: \"xl\",\n        title: ((Le = e.file) == null ? void 0 : Le.basename) || \"\",\n        chromeless: e.chromeless,\n        fullbleed: !e.chromeless,\n        theme: e.theme,\n        onClose: de[8] || (de[8] = (q) => r(\"close\"))\n      }, {\n        default: st(() => [\n          o(\"div\", {\n            ref_key: \"viewerEl\",\n            ref: oe,\n            class: we([\"fe-viewer\", { \"fe-viewer--bare\": e.chromeless }])\n          }, [\n            he.value && e.file ? (c(), d(\"header\", tT, [\n              o(\"div\", nT, [\n                o(\"span\", {\n                  class: \"fe-viewer__tile\",\n                  \"aria-hidden\": \"true\",\n                  innerHTML: ue.value\n                }, null, 8, aT),\n                o(\"span\", oT, [\n                  o(\"span\", {\n                    class: \"fe-viewer__name\",\n                    title: e.file.path\n                  }, f(Q.value), 9, sT),\n                  re.value ? (c(), d(\"span\", rT, f(re.value), 1)) : g(\"\", !0)\n                ])\n              ]),\n              o(\"div\", iT, [\n                o(\"a\", {\n                  href: le.value,\n                  class: \"fe-viewer__act\",\n                  title: s(a)(\"viewer.download\"),\n                  \"aria-label\": s(a)(\"viewer.download\")\n                }, [\n                  o(\"span\", {\n                    class: \"fe-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"download\")\n                  }, null, 8, cT)\n                ], 8, lT),\n                e.shareEnabled ? (c(), d(\"button\", {\n                  key: 0,\n                  type: \"button\",\n                  class: \"fe-viewer__act\",\n                  title: s(a)(\"viewer.share\"),\n                  \"aria-label\": s(a)(\"viewer.share\"),\n                  onClick: de[0] || (de[0] = (q) => r(\"share\"))\n                }, [\n                  o(\"span\", {\n                    class: \"fe-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"access\")\n                  }, null, 8, dT)\n                ], 8, uT)) : g(\"\", !0),\n                w.value !== null ? (c(), et(er, {\n                  key: 1,\n                  class: \"fe-viewer__act fe-viewer__act--star\",\n                  starred: e.file.starred === !0,\n                  \"node-id\": w.value,\n                  \"api-base\": e.apiBase,\n                  \"auth-headers\": e.authHeaders,\n                  \"auth-credentials\": e.authCredentials,\n                  locale: e.locale,\n                  compact: \"\",\n                  onChange: de[1] || (de[1] = (q) => r(\"starred\", q))\n                }, null, 8, [\"starred\", \"node-id\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"locale\"])) : g(\"\", !0),\n                e.openMode === \"view\" && N.value && e.newTabEnabled !== !1 ? (c(), d(\"button\", {\n                  key: 2,\n                  type: \"button\",\n                  class: \"fe-viewer__act\",\n                  title: s(a)(\"viewer.edit\"),\n                  \"aria-label\": s(a)(\"viewer.edit\"),\n                  onClick: O\n                }, [\n                  o(\"span\", {\n                    class: \"fe-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"rename\")\n                  }, null, 8, pT)\n                ], 8, fT)) : g(\"\", !0),\n                e.newTabEnabled !== !1 ? (c(), d(\"button\", {\n                  key: 3,\n                  type: \"button\",\n                  class: \"fe-viewer__act\",\n                  title: s(a)(\"viewer.open_in_new_tab\"),\n                  \"aria-label\": s(a)(\"viewer.open_in_new_tab\"),\n                  onClick: Y\n                }, [\n                  o(\"span\", {\n                    class: \"fe-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"open-tab\")\n                  }, null, 8, hT)\n                ], 8, vT)) : g(\"\", !0)\n              ]),\n              o(\"div\", mT, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-viewer__act fe-viewer__close\",\n                  title: s(a)(\"viewer.close\"),\n                  \"aria-label\": s(a)(\"viewer.close\"),\n                  onClick: de[2] || (de[2] = (q) => r(\"close\"))\n                }, [\n                  o(\"span\", {\n                    class: \"fe-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(Ue)(\"close\")\n                  }, null, 8, bT)\n                ], 8, yT)\n              ])\n            ])) : g(\"\", !0),\n            o(\"div\", {\n              class: \"fe-viewer__stage\",\n              onClick: Re(Ze, [\"self\"])\n            }, [\n              e.file ? (c(), d(\"div\", {\n                key: 0,\n                class: we([\"fe-preview\", K.value]),\n                onClick: Re(Ze, [\"self\"])\n              }, [\n                U.value === \"image\" ? (c(), d(\"img\", {\n                  key: 0,\n                  ref_key: \"imgEl\",\n                  ref: $e,\n                  src: P.value,\n                  alt: e.file.basename,\n                  class: \"fe-preview__image\",\n                  style: Ct(be.value),\n                  onLoad: Ne\n                }, null, 44, gT)) : U.value === \"video\" ? (c(), d(\"video\", {\n                  key: 1,\n                  src: P.value,\n                  controls: \"\",\n                  preload: \"metadata\",\n                  class: \"fe-preview__video\"\n                }, null, 8, kT)) : U.value === \"audio\" ? (c(), d(\"audio\", {\n                  key: 2,\n                  src: P.value,\n                  controls: \"\",\n                  class: \"fe-preview__audio\"\n                }, null, 8, _T)) : U.value === \"pdf\" ? (c(), d(\"object\", {\n                  key: 3,\n                  data: P.value,\n                  type: \"application/pdf\",\n                  class: \"fe-preview__iframe\"\n                }, [\n                  o(\"div\", $T, [\n                    o(\"span\", {\n                      class: \"fe-preview__fallback-icon\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: ue.value\n                    }, null, 8, xT),\n                    o(\"p\", null, f(s(a)(\"viewer.pdf_inline_failed\")), 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn fe-btn--primary\",\n                      target: \"_blank\",\n                      rel: \"noopener\"\n                    }, f(s(a)(\"viewer.open_in_new_tab\")), 9, ST)\n                  ])\n                ], 8, wT)) : U.value === \"markdown\" ? (c(), d(ae, { key: 4 }, [\n                  vt.value ? (c(), d(\"div\", CT, f(s(a)(\"viewer.loading\")), 1)) : V.value ? (c(), d(\"div\", TT, [\n                    Je(f(s(a)(\"viewer.too_large\")) + \" \", 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn\"\n                    }, f(s(a)(\"viewer.download\")), 9, MT)\n                  ])) : e.openMode === \"edit\" && e.saveTextEndpoint ? (c(), d(\"div\", ET, [\n                    o(\"div\", zT, [\n                      de[9] || (de[9] = o(\"span\", { class: \"fe-preview__md-split-label\" }, \"MARKDOWN\", -1)),\n                      Xe.value ? (c(), d(\"span\", AT, f(Xe.value), 1)) : g(\"\", !0),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--primary\",\n                        disabled: !R.value || X.value,\n                        onClick: at\n                      }, f(X.value ? s(a)(\"viewer.saving\") : R.value ? s(a)(\"viewer.save\") : s(a)(\"viewer.saved\")), 9, PT)\n                    ]),\n                    o(\"div\", LT, [\n                      Ve(o(\"textarea\", {\n                        class: \"fe-preview__md-split-input\",\n                        \"onUpdate:modelValue\": de[3] || (de[3] = (q) => Ae.value = q),\n                        onInput: Qe,\n                        onKeydown: [\n                          Ut(Re(at, [\"ctrl\", \"prevent\"]), [\"s\"]),\n                          Ut(Re(at, [\"meta\", \"prevent\"]), [\"s\"])\n                        ],\n                        spellcheck: \"false\",\n                        placeholder: s(a)(\"viewer.md_placeholder\")\n                      }, null, 40, DT), [\n                        [rt, Ae.value]\n                      ]),\n                      Pe.value ? (c(), d(\"div\", OT, f(s(a)(\"viewer.peer_not_installed\")), 1)) : (c(), d(\"div\", {\n                        key: 1,\n                        ref_key: \"markdownEl\",\n                        ref: fe,\n                        class: \"fe-preview__md-split-output fe-preview__md\",\n                        innerHTML: lt.value\n                      }, null, 8, BT))\n                    ])\n                  ])) : Xe.value ? (c(), d(\"div\", IT, [\n                    o(\"p\", null, f(Xe.value), 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn fe-btn--primary\"\n                    }, f(s(a)(\"viewer.download\")), 9, HT)\n                  ])) : lt.value ? (c(), d(\"div\", {\n                    key: 4,\n                    ref_key: \"markdownEl\",\n                    ref: fe,\n                    class: \"fe-preview__md\",\n                    innerHTML: lt.value\n                  }, null, 8, FT)) : (c(), d(\"pre\", NT, f(Ae.value), 1))\n                ], 64)) : U.value === \"viewer\" ? (c(), d(ae, { key: 5 }, [\n                  E.value && !$.value ? (c(), d(\"div\", KT, [\n                    o(\"span\", {\n                      class: \"fe-preview__fallback-icon fe-preview__fallback-icon--alert\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"alert\")\n                    }, null, 8, RT),\n                    o(\"p\", null, f(E.value), 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn fe-btn--primary\"\n                    }, f(s(a)(\"viewer.download\")), 9, UT)\n                  ])) : x.value ? (c(), et(rv(x.value), iv({ key: 2 }, T.value, {\n                    class: \"fe-preview__viewer\",\n                    onFallback: z\n                  }), null, 16)) : (c(), d(\"div\", VT, [\n                    o(\"span\", {\n                      class: \"fe-preview__fallback-icon fe-preview__fallback-icon--spin\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"progress\")\n                    }, null, 8, jT),\n                    o(\"p\", null, f(s(a)(\"viewer.loading\")), 1)\n                  ]))\n                ], 64)) : U.value === \"code\" || U.value === \"text\" ? (c(), d(ae, { key: 6 }, [\n                  vt.value ? (c(), d(\"div\", YT, f(s(a)(\"viewer.loading\")), 1)) : V.value ? (c(), d(\"div\", WT, [\n                    Je(f(s(a)(\"viewer.too_large\")) + \" \", 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn\"\n                    }, f(s(a)(\"viewer.download\")), 9, qT)\n                  ])) : Xe.value ? (c(), d(\"div\", GT, [\n                    o(\"p\", null, f(Xe.value), 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn fe-btn--primary\"\n                    }, f(s(a)(\"viewer.download\")), 9, XT)\n                  ])) : (c(), d(\"div\", JT, [\n                    o(\"div\", ZT, [\n                      o(\"span\", QT, f(jt.value), 1),\n                      !$t.value && ft.value ? (c(), d(\"span\", e4, f(e.saveTextEndpoint && !kt.value ? s(a)(\"viewer.editor_loading\") : s(a)(\"viewer.read_only\")), 1)) : g(\"\", !0),\n                      At.value ? (c(), d(\"span\", t4, [\n                        o(\"span\", {\n                          class: \"fe-icon\",\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"check\")\n                        }, null, 8, n4),\n                        Je(\" \" + f(s(a)(\"viewer.saved\")), 1)\n                      ])) : g(\"\", !0),\n                      Ot.value ? (c(), d(\"span\", {\n                        key: 2,\n                        class: \"fe-preview__code-status fe-preview__code-status--err\",\n                        title: Ot.value\n                      }, [\n                        o(\"span\", {\n                          class: \"fe-icon\",\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"close\")\n                        }, null, 8, o4),\n                        Je(\" \" + f(s(a)(\"viewer.save_error\")), 1)\n                      ], 8, a4)) : g(\"\", !0),\n                      e.openMode === \"view\" ? (c(), d(\"span\", s4, f(s(a)(\"viewer.read_only\")), 1)) : e.saveTextEndpoint && $t.value ? (c(), d(\"button\", {\n                        key: 4,\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--primary\",\n                        disabled: Dt.value,\n                        onClick: tn\n                      }, f(Dt.value ? s(a)(\"viewer.saving\") : s(a)(\"viewer.save\")), 9, r4)) : g(\"\", !0)\n                    ]),\n                    o(\"div\", {\n                      ref_key: \"monacoEl\",\n                      ref: Gt,\n                      class: we([\"fe-preview__code-editor\", { \"is-hidden\": !$t.value }])\n                    }, null, 2),\n                    !$t.value && ft.value ? (c(), d(\"pre\", i4, [\n                      o(\"code\", {\n                        class: we(`language-${jt.value}`),\n                        innerHTML: ft.value\n                      }, null, 10, l4)\n                    ])) : !$t.value && !ft.value ? (c(), d(\"pre\", {\n                      key: 1,\n                      class: \"fe-preview__pre\",\n                      \"data-lang\": jt.value\n                    }, f(Ae.value), 9, c4)) : g(\"\", !0)\n                  ]))\n                ], 64)) : U.value === \"office\" ? (c(), d(ae, { key: 7 }, [\n                  _t.value ? (c(), d(\"div\", u4, [\n                    o(\"span\", {\n                      class: \"fe-preview__fallback-icon\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: ue.value\n                    }, null, 8, d4),\n                    o(\"p\", null, f(_t.value), 1),\n                    o(\"a\", {\n                      href: le.value,\n                      class: \"fe-btn fe-btn--primary\"\n                    }, f(s(a)(\"viewer.download\")), 9, f4)\n                  ])) : (c(), d(\"div\", {\n                    key: 1,\n                    ref_key: \"officeEl\",\n                    ref: Pt,\n                    class: \"fe-preview__office\"\n                  }, null, 512))\n                ], 64)) : (c(), d(\"div\", p4, [\n                  o(\"span\", {\n                    class: \"fe-preview__fallback-icon\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: ue.value\n                  }, null, 8, v4),\n                  o(\"p\", null, f(s(a)(\"viewer.no_preview\")), 1),\n                  o(\"a\", {\n                    href: le.value,\n                    class: \"fe-btn fe-btn--primary\"\n                  }, f(s(a)(\"viewer.download\")), 9, h4)\n                ]))\n              ], 2)) : g(\"\", !0)\n            ]),\n            S.value ? (c(), d(\"button\", {\n              key: 1,\n              type: \"button\",\n              class: \"fe-viewer__chev fe-viewer__chev--prev\",\n              title: s(a)(\"viewer.nav_prev\"),\n              \"aria-label\": s(a)(\"viewer.nav_prev\"),\n              onClick: de[4] || (de[4] = (q) => r(\"nav\", -1))\n            }, [...de[10] || (de[10] = [\n              o(\"svg\", {\n                viewBox: \"0 0 24 24\",\n                width: \"22\",\n                height: \"22\",\n                fill: \"none\",\n                stroke: \"currentColor\",\n                \"stroke-width\": \"1.8\",\n                \"stroke-linecap\": \"round\",\n                \"stroke-linejoin\": \"round\",\n                \"aria-hidden\": \"true\",\n                focusable: \"false\"\n              }, [\n                o(\"path\", { d: \"M15 4.5L7.5 12 15 19.5\" })\n              ], -1)\n            ])], 8, m4)) : g(\"\", !0),\n            S.value ? (c(), d(\"button\", {\n              key: 2,\n              type: \"button\",\n              class: \"fe-viewer__chev fe-viewer__chev--next\",\n              title: s(a)(\"viewer.nav_next\"),\n              \"aria-label\": s(a)(\"viewer.nav_next\"),\n              onClick: de[5] || (de[5] = (q) => r(\"nav\", 1))\n            }, [...de[11] || (de[11] = [\n              o(\"svg\", {\n                viewBox: \"0 0 24 24\",\n                width: \"22\",\n                height: \"22\",\n                fill: \"none\",\n                stroke: \"currentColor\",\n                \"stroke-width\": \"1.8\",\n                \"stroke-linecap\": \"round\",\n                \"stroke-linejoin\": \"round\",\n                \"aria-hidden\": \"true\",\n                focusable: \"false\"\n              }, [\n                o(\"path\", { d: \"M9 4.5L16.5 12 9 19.5\" })\n              ], -1)\n            ])], 8, y4)) : g(\"\", !0),\n            ze.value ? (c(), d(\"div\", b4, [\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-viewer__zoom-btn\",\n                disabled: !se.value,\n                title: s(a)(\"viewer.zoom_out\"),\n                \"aria-label\": s(a)(\"viewer.zoom_out\"),\n                onClick: de[6] || (de[6] = (q) => De(-1))\n              }, \"−\", 8, g4),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-viewer__zoom-level\",\n                title: s(a)(\"viewer.zoom_reset\"),\n                \"aria-label\": s(a)(\"viewer.zoom_reset\"),\n                onClick: ie\n              }, f(ce.value), 9, k4),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-viewer__zoom-btn\",\n                disabled: !L.value,\n                title: s(a)(\"viewer.zoom_in\"),\n                \"aria-label\": s(a)(\"viewer.zoom_in\"),\n                onClick: de[7] || (de[7] = (q) => De(1))\n              }, \"+\", 8, _4),\n              de[20] || (de[20] = o(\"span\", {\n                class: \"fe-viewer__zoom-sep\",\n                \"aria-hidden\": \"true\"\n              }, null, -1)),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-viewer__zoom-btn\",\n                title: Ce.value ? s(a)(\"viewer.exit_fullscreen\") : s(a)(\"viewer.fullscreen\"),\n                \"aria-label\": Ce.value ? s(a)(\"viewer.exit_fullscreen\") : s(a)(\"viewer.fullscreen\"),\n                onClick: Ie\n              }, [\n                (c(), d(\"svg\", $4, [\n                  Ce.value ? (c(), d(ae, { key: 0 }, [\n                    de[12] || (de[12] = o(\"path\", { d: \"M9.5 4.5v5h-5\" }, null, -1)),\n                    de[13] || (de[13] = o(\"path\", { d: \"M14.5 4.5v5h5\" }, null, -1)),\n                    de[14] || (de[14] = o(\"path\", { d: \"M9.5 19.5v-5h-5\" }, null, -1)),\n                    de[15] || (de[15] = o(\"path\", { d: \"M14.5 19.5v-5h5\" }, null, -1))\n                  ], 64)) : (c(), d(ae, { key: 1 }, [\n                    de[16] || (de[16] = o(\"path\", { d: \"M4.5 9.5v-5h5\" }, null, -1)),\n                    de[17] || (de[17] = o(\"path\", { d: \"M19.5 9.5v-5h-5\" }, null, -1)),\n                    de[18] || (de[18] = o(\"path\", { d: \"M4.5 14.5v5h5\" }, null, -1)),\n                    de[19] || (de[19] = o(\"path\", { d: \"M19.5 14.5v5h-5\" }, null, -1))\n                  ], 64))\n                ]))\n              ], 8, w4)\n            ])) : g(\"\", !0)\n          ], 2)\n        ]),\n        _: 1\n      }, 8, [\"open\", \"title\", \"chromeless\", \"fullbleed\", \"theme\"]);\n    };\n  }\n}), x4 = {\n  key: 0,\n  class: \"fe-ql-hint__sep\"\n}, S4 = { class: \"fe-ql-hint__seg\" }, C4 = /* @__PURE__ */ qe({\n  __name: \"QuickLook\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    file: {},\n    previewUrl: { type: Function },\n    downloadUrl: { type: Function },\n    onlyOfficeBase: {},\n    onlyOfficeConfigEndpoint: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    drawioUrl: {},\n    pdfWorkerUrl: {},\n    viewerBaseUrl: {},\n    theme: {},\n    index: {},\n    total: {},\n    apiBase: {},\n    shareEnabled: { type: Boolean }\n  },\n  emits: [\"close\", \"nav\", \"open-full\", \"share\", \"starred\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale);\n    function u(b) {\n      const y = b;\n      return !!(y && (y.tagName === \"INPUT\" || y.tagName === \"TEXTAREA\" || y.tagName === \"SELECT\" || y.isContentEditable));\n    }\n    const v = [\"↑\", \"↓\"];\n    function p(b) {\n      if (n.open && !u(b.target)) {\n        if (si(b, \"quicklook\")) {\n          b.preventDefault(), b.stopPropagation(), r(\"close\");\n          return;\n        }\n        if (si(b, \"open\")) {\n          b.preventDefault(), b.stopPropagation(), r(\"open-full\");\n          return;\n        }\n        if (!(b.ctrlKey || b.metaKey || b.altKey))\n          switch (b.key) {\n            case \"ArrowRight\":\n            case \"ArrowDown\":\n              b.preventDefault(), b.stopPropagation(), r(\"nav\", 1);\n              break;\n            case \"ArrowLeft\":\n            case \"ArrowUp\":\n              b.preventDefault(), b.stopPropagation(), r(\"nav\", -1);\n              break;\n          }\n      }\n    }\n    const h = k(() => {\n      const b = [], y = Na(\"quicklook\");\n      y && b.push({ id: \"quicklook\", keys: [y], label: a(\"quicklook.hint_close\") }), b.push({ id: \"nav\", keys: [...v], label: a(\"quicklook.hint_nav\") });\n      const A = Na(\"open\");\n      return A && b.push({ id: \"open\", keys: [A], label: a(\"quicklook.hint_open\") }), b;\n    });\n    return He(\n      () => n.open,\n      (b) => {\n        b ? window.addEventListener(\"keydown\", p, !0) : window.removeEventListener(\"keydown\", p, !0);\n      },\n      { immediate: !0 }\n    ), it(() => window.removeEventListener(\"keydown\", p, !0)), (b, y) => (c(), d(ae, null, [\n      Ge(Nd, {\n        class: \"fe-quicklook\",\n        open: e.open,\n        locale: e.locale,\n        file: e.file,\n        theme: e.theme,\n        \"preview-url\": e.previewUrl,\n        \"download-url\": e.downloadUrl,\n        \"only-office-base\": e.onlyOfficeBase,\n        \"only-office-config-endpoint\": e.onlyOfficeConfigEndpoint,\n        \"open-mode\": \"view\",\n        \"auth-headers\": e.authHeaders,\n        \"auth-credentials\": e.authCredentials,\n        \"drawio-url\": e.drawioUrl,\n        \"pdf-worker-url\": e.pdfWorkerUrl,\n        \"viewer-base-url\": e.viewerBaseUrl,\n        index: e.index,\n        total: e.total,\n        \"api-base\": e.apiBase,\n        \"share-enabled\": e.shareEnabled,\n        \"nav-enabled\": !0,\n        onClose: y[0] || (y[0] = (A) => r(\"close\")),\n        onNav: y[1] || (y[1] = (A) => r(\"nav\", A)),\n        onShare: y[2] || (y[2] = (A) => r(\"share\")),\n        onStarred: y[3] || (y[3] = (A) => r(\"starred\", A))\n      }, null, 8, [\"open\", \"locale\", \"file\", \"theme\", \"preview-url\", \"download-url\", \"only-office-base\", \"only-office-config-endpoint\", \"auth-headers\", \"auth-credentials\", \"drawio-url\", \"pdf-worker-url\", \"viewer-base-url\", \"index\", \"total\", \"api-base\", \"share-enabled\"]),\n      (c(), et(ja, { to: \"body\" }, [\n        Ge(Rn, { name: \"fe-toast\" }, {\n          default: st(() => [\n            e.open ? (c(), d(\"div\", {\n              key: 0,\n              class: we([\"fe fe-ql-hint\", {\n                \"fe--theme-light\": e.theme === \"light\",\n                \"fe--theme-dark\": e.theme === \"dark\"\n              }]),\n              \"aria-hidden\": \"true\"\n            }, [\n              (c(!0), d(ae, null, Te(h.value, (A, D) => (c(), d(ae, {\n                key: A.id\n              }, [\n                D > 0 ? (c(), d(\"span\", x4, \"·\")) : g(\"\", !0),\n                o(\"span\", S4, [\n                  (c(!0), d(ae, null, Te(A.keys, (C) => (c(), d(\"kbd\", {\n                    key: C,\n                    class: \"fe-kbd\"\n                  }, f(C), 1))), 128)),\n                  Je(\" \" + f(A.label), 1)\n                ])\n              ], 64))), 128))\n            ], 2)) : g(\"\", !0)\n          ]),\n          _: 1\n        })\n      ]))\n    ], 64));\n  }\n}), T4 = [\"aria-label\"], M4 = { class: \"fe-opc__head\" }, E4 = [\"aria-label\"], z4 = { class: \"fe-opc__body\" }, A4 = {\n  key: 0,\n  class: \"fe-opc__section\",\n  \"aria-live\": \"polite\"\n}, P4 = { class: \"fe-opc__section-title\" }, L4 = { class: \"fe-opc__list\" }, D4 = {\n  class: \"fe-opc__kicon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.8\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, O4 = [\"d\"], B4 = { class: \"fe-opc__mid\" }, I4 = [\"title\"], H4 = { class: \"fe-opc__sub\" }, F4 = { class: \"fe-opc__kind\" }, N4 = { class: \"fe-opc__state\" }, K4 = [\"aria-valuenow\"], R4 = {\n  key: 0,\n  class: \"fe-opc__spin\",\n  \"aria-hidden\": \"true\"\n}, U4 = { class: \"fe-opc__acts\" }, V4 = [\"onClick\"], j4 = [\"onClick\"], Y4 = [\"aria-label\", \"onClick\"], W4 = {\n  key: 1,\n  class: \"fe-opc__section\"\n}, q4 = { class: \"fe-opc__section-title\" }, G4 = { class: \"fe-opc__list fe-opc__list--history\" }, X4 = {\n  class: \"fe-opc__kicon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.8\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, J4 = [\"d\"], Z4 = { class: \"fe-opc__mid\" }, Q4 = [\"title\"], e5 = {\n  key: 0,\n  class: \"fe-opc__sub fe-opc__sub--err\"\n}, t5 = {\n  key: 2,\n  class: \"fe-opc__empty\"\n}, n5 = [\"aria-expanded\", \"aria-label\"], a5 = [\"stroke-dashoffset\"], o5 = { class: \"fe-opc__count\" }, s5 = {\n  key: 0,\n  class: \"fe-opc__pct\"\n}, ei = 8.5, r5 = /* @__PURE__ */ qe({\n  __name: \"OperationsCenter\",\n  props: {\n    center: {},\n    locale: {},\n    narrow: { type: Boolean }\n  },\n  setup(e) {\n    const t = e, { t: n, formatSize: r } = tt(() => t.locale), a = m(!1), u = m(null), v = k(() => t.center.active.value), p = k(() => t.center.history.value), h = k(() => t.center.hasError.value), b = k(() => t.center.overallPercent.value), y = k(() => t.center.runningCount.value), A = k(() => v.value.length > 0 || a.value && p.value.length > 0);\n    He(A, (O) => {\n      O || (a.value = !1);\n    });\n    const D = 2 * Math.PI * ei, C = k(() => {\n      const O = b.value;\n      return O === null ? D * 0.72 : D * (1 - Math.min(100, Math.max(0, O)) / 100);\n    }), B = k(() => b.value === null && y.value > 0), I = k(() => y.value === 0 || b.value === null ? \"\" : n(\"opc.percent\", { n: b.value })), U = k(() => n(\"opc.aria_badge\", { n: v.value.length })), x = {\n      upload: \"M12 16V5M7 9.5 12 5l5 4.5M5 19h14\",\n      copy: \"M9 9h11v11H9zM5 15V4h11\",\n      move: \"M4 12h13M12 6l6 6-6 6\",\n      delete: \"M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13\",\n      convert: \"M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5\",\n      archive: \"M4 8V5h16v3zM5 8h14v12H5zM10 12h4\"\n    };\n    function E(O) {\n      return n(`opc.kind.${O.kind}`);\n    }\n    function $(O) {\n      return O.name || E(O);\n    }\n    function M(O) {\n      return O.status === \"running\" ? O.queued ? n(\"opc.queued\") : O.totalBytes && O.totalBytes > 0 ? `${r(O.uploadedBytes ?? 0)} / ${r(O.totalBytes)}` : O.totalCount && O.totalCount > 0 ? `${O.doneCount ?? 0}/${O.totalCount}` : n(\"opc.status.running\") : O.status === \"done\" ? n(\"opc.status.done\") : O.status === \"aborted\" ? n(\"opc.status.aborted\") : O.error || n(\"opc.status.error\");\n    }\n    function z(O) {\n      return n(`opc.status.${O.status === \"running\" ? \"running\" : O.status}`);\n    }\n    function T(O) {\n      if (!a.value) return;\n      const J = u.value;\n      J && O.target instanceof Node && !J.contains(O.target) && (a.value = !1);\n    }\n    function Y(O) {\n      a.value && O.key === \"Escape\" && (a.value = !1);\n    }\n    return dt(() => {\n      document.addEventListener(\"mousedown\", T), document.addEventListener(\"keydown\", Y);\n    }), it(() => {\n      document.removeEventListener(\"mousedown\", T), document.removeEventListener(\"keydown\", Y);\n    }), (O, J) => A.value ? (c(), d(\"div\", {\n      key: 0,\n      ref_key: \"rootEl\",\n      ref: u,\n      class: we([\"fe-opc\", { \"fe-opc--narrow\": e.narrow, \"fe-opc--open\": a.value }])\n    }, [\n      Ge(Rn, { name: \"fe-opc-pop\" }, {\n        default: st(() => [\n          a.value ? (c(), d(\"section\", {\n            key: 0,\n            class: \"fe-opc__panel\",\n            role: \"dialog\",\n            \"aria-label\": s(n)(\"opc.title\")\n          }, [\n            o(\"header\", M4, [\n              o(\"strong\", null, f(s(n)(\"opc.title\")), 1),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-opc__x\",\n                \"aria-label\": s(n)(\"opc.close\"),\n                onClick: J[0] || (J[0] = (G) => a.value = !1)\n              }, \"×\", 8, E4)\n            ]),\n            o(\"div\", z4, [\n              v.value.length > 0 ? (c(), d(\"div\", A4, [\n                o(\"h3\", P4, f(s(n)(\"opc.active\")), 1),\n                o(\"ul\", L4, [\n                  (c(!0), d(ae, null, Te(v.value, (G) => (c(), d(\"li\", {\n                    key: G.key,\n                    class: we([\"fe-opc__item\", `is-${G.status}`])\n                  }, [\n                    (c(), d(\"svg\", D4, [\n                      o(\"path\", {\n                        d: x[G.kind]\n                      }, null, 8, O4)\n                    ])),\n                    o(\"div\", B4, [\n                      o(\"div\", {\n                        class: \"fe-opc__name\",\n                        title: $(G)\n                      }, f($(G)), 9, I4),\n                      o(\"div\", H4, [\n                        o(\"span\", F4, f(E(G)), 1),\n                        J[3] || (J[3] = o(\"span\", {\n                          class: \"fe-opc__dot\",\n                          \"aria-hidden\": \"true\"\n                        }, \"·\", -1)),\n                        o(\"span\", N4, f(M(G)), 1)\n                      ]),\n                      G.status === \"running\" && G.percent !== null ? (c(), d(\"div\", {\n                        key: 0,\n                        class: \"fe-opc__bar\",\n                        role: \"progressbar\",\n                        \"aria-valuenow\": G.percent,\n                        \"aria-valuemin\": \"0\",\n                        \"aria-valuemax\": \"100\"\n                      }, [\n                        o(\"div\", {\n                          class: \"fe-opc__bar-fill\",\n                          style: Ct({ width: G.percent + \"%\" })\n                        }, null, 4)\n                      ], 8, K4)) : g(\"\", !0)\n                    ]),\n                    G.status === \"running\" && G.percent === null && !G.queued ? (c(), d(\"span\", R4)) : g(\"\", !0),\n                    o(\"div\", U4, [\n                      G.status === \"running\" && G.cancellable ? (c(), d(\"button\", {\n                        key: 0,\n                        type: \"button\",\n                        class: \"fe-opc__act\",\n                        onClick: (N) => e.center.cancel(G.key)\n                      }, f(s(n)(\"opc.cancel\")), 9, V4)) : g(\"\", !0),\n                      G.status === \"error\" && G.retryable ? (c(), d(\"button\", {\n                        key: 1,\n                        type: \"button\",\n                        class: \"fe-opc__act fe-opc__act--retry\",\n                        onClick: (N) => e.center.retry(G.key)\n                      }, f(s(n)(\"opc.retry\")), 9, j4)) : g(\"\", !0),\n                      G.status !== \"running\" ? (c(), d(\"button\", {\n                        key: 2,\n                        type: \"button\",\n                        class: \"fe-opc__x\",\n                        \"aria-label\": s(n)(\"opc.dismiss\"),\n                        onClick: (N) => e.center.dismiss(G.key)\n                      }, \"×\", 8, Y4)) : g(\"\", !0)\n                    ])\n                  ], 2))), 128))\n                ])\n              ])) : g(\"\", !0),\n              p.value.length > 0 ? (c(), d(\"div\", W4, [\n                o(\"h3\", q4, [\n                  Je(f(s(n)(\"opc.history\")) + \" \", 1),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-opc__act\",\n                    onClick: J[1] || (J[1] = (G) => e.center.clearHistory())\n                  }, f(s(n)(\"opc.clear\")), 1)\n                ]),\n                o(\"ul\", G4, [\n                  (c(!0), d(ae, null, Te(p.value, (G) => (c(), d(\"li\", {\n                    key: \"h-\" + G.key,\n                    class: we([\"fe-opc__item fe-opc__item--history\", `is-${G.status}`])\n                  }, [\n                    (c(), d(\"svg\", X4, [\n                      o(\"path\", {\n                        d: x[G.kind]\n                      }, null, 8, J4)\n                    ])),\n                    o(\"div\", Z4, [\n                      o(\"div\", {\n                        class: \"fe-opc__name\",\n                        title: $(G)\n                      }, f($(G)), 9, Q4),\n                      G.status === \"error\" && G.error ? (c(), d(\"div\", e5, f(G.error), 1)) : g(\"\", !0)\n                    ]),\n                    o(\"span\", {\n                      class: we([\"fe-opc__chip\", `is-${G.status}`])\n                    }, f(z(G)), 3)\n                  ], 2))), 128))\n                ])\n              ])) : g(\"\", !0),\n              v.value.length === 0 && p.value.length === 0 ? (c(), d(\"p\", t5, f(s(n)(\"opc.empty\")), 1)) : g(\"\", !0)\n            ])\n          ], 8, T4)) : g(\"\", !0)\n        ]),\n        _: 1\n      }),\n      o(\"button\", {\n        type: \"button\",\n        class: we([\"fe-opc__badge\", { \"is-error\": h.value }]),\n        \"aria-expanded\": a.value,\n        \"aria-label\": U.value,\n        onClick: J[2] || (J[2] = (G) => a.value = !a.value)\n      }, [\n        (c(), d(\"svg\", {\n          class: we([\"fe-opc__ring\", { \"fe-opc__ring--spin\": B.value }]),\n          viewBox: \"0 0 22 22\",\n          \"aria-hidden\": \"true\",\n          focusable: \"false\"\n        }, [\n          o(\"circle\", {\n            class: \"fe-opc__ring-track\",\n            cx: \"11\",\n            cy: \"11\",\n            r: ei,\n            fill: \"none\",\n            \"stroke-width\": \"2.5\"\n          }),\n          o(\"circle\", {\n            class: \"fe-opc__ring-fill\",\n            cx: \"11\",\n            cy: \"11\",\n            r: ei,\n            fill: \"none\",\n            \"stroke-width\": \"2.5\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-dasharray\": D,\n            \"stroke-dashoffset\": C.value,\n            transform: \"rotate(-90 11 11)\"\n          }, null, 8, a5)\n        ], 2)),\n        o(\"span\", o5, f(v.value.length), 1),\n        I.value ? (c(), d(\"span\", s5, f(I.value), 1)) : g(\"\", !0)\n      ], 10, n5)\n    ], 2)) : g(\"\", !0);\n  }\n}), i5 = 4e3, Tu = 50;\nfunction l5(e, t, n) {\n  const r = t.status !== \"running\";\n  return {\n    key: e,\n    kind: t.kind,\n    name: t.name,\n    percent: t.percent,\n    status: t.status,\n    error: t.error ?? null,\n    queued: t.queued ?? !1,\n    doneCount: t.doneCount ?? null,\n    totalCount: t.totalCount ?? null,\n    uploadedBytes: t.uploadedBytes ?? null,\n    totalBytes: t.totalBytes ?? null,\n    cancellable: t.cancellable ?? !1,\n    retryable: t.retryable ?? !1,\n    startedAt: (n == null ? void 0 : n.startedAt) ?? Date.now(),\n    settledAt: (n == null ? void 0 : n.settledAt) ?? (r ? Date.now() : null)\n  };\n}\nfunction c5() {\n  const e = m([]), t = m([]), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Map();\n  function u(x) {\n    const E = a.get(x);\n    E !== void 0 && (clearTimeout(E), a.delete(x));\n  }\n  function v(x, E = {}) {\n    u(x);\n    const $ = e.value.findIndex((z) => z.key === x);\n    if ($ === -1) return;\n    const [M] = e.value.splice($, 1);\n    e.value = [...e.value], r.add(x), E.toHistory !== !1 && (t.value = [{ ...M, settledAt: M.settledAt ?? Date.now() }, ...t.value].slice(\n      0,\n      Tu\n    ));\n  }\n  function p(x) {\n    a.has(x) || a.set(\n      x,\n      setTimeout(() => {\n        var $;\n        a.delete(x);\n        const E = n.get(x);\n        v(x), ($ = E == null ? void 0 : E.dismiss) == null || $.call(E);\n      }, i5)\n    );\n  }\n  function h(x, E) {\n    const $ = `${x}:`, M = /* @__PURE__ */ new Set();\n    let z = [...e.value], T = !1;\n    for (const Y of E) {\n      const O = `${x}:${Y.input.id}`;\n      if (M.add(O), Y.actions && n.set(O, Y.actions), r.has(O)) continue;\n      const J = z.findIndex((N) => N.key === O), G = l5(O, Y.input, J === -1 ? void 0 : z[J]);\n      J === -1 ? (z = [G, ...z], T = !0) : JSON.stringify(z[J]) !== JSON.stringify(G) && (z[J] = G, T = !0), (G.status === \"done\" || G.status === \"aborted\") && p(O);\n    }\n    for (const Y of [...z])\n      !Y.key.startsWith($) || M.has(Y.key) || Y.status !== \"error\" && (u(Y.key), z = z.filter((O) => O.key !== Y.key), T = !0, Y.status !== \"running\" && (r.add(Y.key), t.value = [{ ...Y, settledAt: Y.settledAt ?? Date.now() }, ...t.value].slice(\n        0,\n        Tu\n      )));\n    for (const Y of [...r])\n      Y.startsWith($) && !M.has(Y) && r.delete(Y);\n    for (const Y of [...n.keys()])\n      Y.startsWith($) && !M.has(Y) && !e.value.some((O) => O.key === Y) && (z.some((O) => O.key === Y) || n.delete(Y));\n    T && (e.value = z);\n  }\n  function b(x) {\n    var E, $;\n    ($ = (E = n.get(x)) == null ? void 0 : E.cancel) == null || $.call(E);\n  }\n  function y(x) {\n    var $, M;\n    const E = n.get(x);\n    v(x), ($ = E == null ? void 0 : E.dismiss) == null || $.call(E), (M = E == null ? void 0 : E.retry) == null || M.call(E);\n  }\n  function A(x) {\n    var $;\n    const E = n.get(x);\n    v(x), ($ = E == null ? void 0 : E.dismiss) == null || $.call(E);\n  }\n  function D() {\n    t.value = [];\n  }\n  const C = k(\n    () => e.value.filter((x) => x.status === \"running\").length\n  ), B = k(() => e.value.filter((x) => x.status === \"error\").length), I = k(() => B.value > 0), U = k(() => {\n    const x = e.value.filter((M) => M.status === \"running\");\n    let E = 0, $ = 0;\n    for (const M of x) {\n      let z = null;\n      M.totalBytes && M.totalBytes > 0 ? z = Math.min(1, (M.uploadedBytes ?? 0) / M.totalBytes) : M.totalCount && M.totalCount > 0 ? z = Math.min(1, (M.doneCount ?? 0) / M.totalCount) : M.percent !== null && (z = Math.min(1, M.percent / 100)), z !== null && (E += z, $ += 1);\n    }\n    return $ === 0 ? null : Math.round(E / $ * 100);\n  });\n  return lv() && cv(() => {\n    for (const x of a.values()) clearTimeout(x);\n    a.clear();\n  }), {\n    active: e,\n    history: t,\n    runningCount: C,\n    errorCount: B,\n    hasError: I,\n    overallPercent: U,\n    sync: h,\n    cancel: b,\n    retry: y,\n    dismiss: A,\n    clearHistory: D\n  };\n}\nconst u5 = [\"data-prefers-dark\", \"aria-label\"], d5 = {\n  key: 1,\n  class: \"fe-tour__dim\",\n  \"aria-hidden\": \"true\"\n}, f5 = {\n  class: \"fe-tour__progress\",\n  \"aria-hidden\": \"true\"\n}, p5 = { class: \"fe-tour__title\" }, v5 = { class: \"fe-tour__desc\" }, h5 = {\n  class: \"fe-tour__dots\",\n  \"aria-hidden\": \"true\"\n}, m5 = { class: \"fe-tour__actions\" }, ta = 6, Nn = 12, y5 = /* @__PURE__ */ qe({\n  __name: \"OnboardingTour\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    root: {},\n    theme: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = k(() => ({\n      palette: Na(\"palette\"),\n      help: Na(\"help\")\n    })), v = [\n      {\n        // The navigation panel: the standard views, then STORAGES, then\n        // CONNECTIONS. At 390px it is a drawer that starts closed, so there is\n        // nothing to spotlight and the button that opens it is the target.\n        id: \"nav\",\n        titleKey: \"tour.step.nav.title\",\n        descKey: (P) => (P == null ? void 0 : P.dataset.testid) === \"sidenav\" ? \"tour.step.nav.desc\" : \"tour.step.nav.desc_closed\",\n        target: (P) => P.querySelector('[data-testid=\"sidenav\"]') || P.querySelector('[data-testid=\"toolbar-nav\"]')\n      },\n      {\n        // \"+ New\" — the menu that replaced the Upload / New folder pair. The\n        // narrow shell has no panel on screen and draws the upload FAB instead,\n        // which does ONE of the three things the menu offers, so it gets a\n        // sentence that promises only that one.\n        id: \"new\",\n        titleKey: \"tour.step.new.title\",\n        descKey: (P) => (P == null ? void 0 : P.dataset.testid) === \"sidenav-new\" ? \"tour.step.new.desc\" : \"tour.step.new.desc_fab\",\n        target: (P) => P.querySelector('[data-testid=\"sidenav-new\"]') || P.querySelector(\".fe-fab\")\n      },\n      {\n        // ⚠ The FIELD, not `.fe-search__input`. The wide header's input carries\n        // both class names and the narrow one carries only `fe-drivesearch__input`\n        // — so the old selector resolved at 1440px and matched nothing at 390px,\n        // where the field is the widest thing on the row. The testid is on the\n        // wrapper in both layouts, and spotlighting the wrapper also takes in the\n        // advanced-search and palette buttons the copy now names.\n        id: \"search\",\n        titleKey: \"tour.step.search.title\",\n        descKey: \"tour.step.search.desc\",\n        target: (P) => P.querySelector('[data-testid=\"drive-search\"]')\n      },\n      {\n        // The breadcrumb — this was the old first step's target while its title\n        // said \"Storages & folders\", which is the panel. Now it has its own step\n        // and its own title. Absent on Home, which has no address; the step drops\n        // itself there rather than pointing at the heading that takes its place.\n        id: \"crumb\",\n        titleKey: \"tour.step.crumb.title\",\n        descKey: \"tour.step.crumb.desc\",\n        target: (P) => P.querySelector(\".fe-breadcrumb\")\n      },\n      {\n        // The filter row. Unconditional in the shell now, but only drawn where\n        // there is a listing to filter — not at the multi-storage virtual root,\n        // which is where a first run usually starts, so this step is often the\n        // one that drops itself.\n        id: \"filters\",\n        titleKey: \"tour.step.filters.title\",\n        descKey: \"tour.step.filters.desc\",\n        target: (P) => P.querySelector('[data-testid=\"filterbar\"]')\n      },\n      {\n        id: \"view\",\n        titleKey: \"tour.step.view.title\",\n        descKey: \"tour.step.view.desc\",\n        // Still `.fe-toolbar__view`: ViewSwitcher kept its class when it moved\n        // from the header to the breadcrumb row.\n        target: (P) => P.querySelector(\".fe-toolbar__view\")\n      },\n      {\n        // Sharing used to spotlight `.fe__body` — the whole listing, which is to\n        // say nothing in particular — while talking about a context menu. The\n        // details panel is where a share link is actually minted, so the step\n        // points at the control that opens it and names the context menu too.\n        id: \"details\",\n        titleKey: \"tour.step.details.title\",\n        descKey: \"tour.step.details.desc\",\n        target: (P) => P.querySelector('[data-testid=\"subhead-inspector\"]')\n      },\n      {\n        id: \"help\",\n        titleKey: \"tour.step.help.title\",\n        descKey: \"tour.step.help.desc\",\n        target: () => null\n      }\n    ], p = m([]), h = m(0), b = k(() => p.value[h.value] ?? null), y = k(() => p.value.length);\n    function A() {\n      const P = n.root;\n      p.value = v.filter((le) => {\n        if (le.id === \"help\") return !0;\n        if (!P) return !1;\n        const ve = le.target(P);\n        if (!ve) return !1;\n        const he = ve.getBoundingClientRect();\n        return he.width > 0 && he.height > 0;\n      });\n    }\n    const D = m(null), C = m({}), B = m(null), I = m(null), U = k(() => {\n      const P = b.value;\n      if (!P) return \"\";\n      const le = typeof P.descKey == \"function\" ? P.descKey(I.value) : P.descKey;\n      return a(le, u.value);\n    });\n    async function x() {\n      var Ne;\n      const P = b.value, le = n.root;\n      if (!P) return;\n      const ve = le ? P.target(le) : null;\n      if (I.value = ve, !ve) {\n        D.value = null, C.value = {};\n        return;\n      }\n      const he = ve.getBoundingClientRect();\n      if (he.width <= 0 && he.height <= 0) {\n        D.value = null, C.value = {};\n        return;\n      }\n      D.value = {\n        top: he.top - ta,\n        left: he.left - ta,\n        width: he.width + ta * 2,\n        height: he.height + ta * 2\n      }, await gt();\n      const oe = window.innerWidth, ue = window.innerHeight, Q = Math.min(340, oe - 24), pe = ((Ne = B.value) == null ? void 0 : Ne.offsetHeight) ?? 160, re = he.top - ta, S = he.bottom + ta, w = he.left - ta, j = he.right + ta, K = (be) => Math.min(Math.max(12, be), Math.max(12, oe - Q - 12)), Z = (be) => Math.min(Math.max(12, be), Math.max(12, ue - pe - 12)), W = K(he.left + he.width / 2 - Q / 2), $e = Z(he.top + he.height / 2 - pe / 2);\n      let Se, ze;\n      S + Nn + pe <= ue - 12 ? (Se = S + Nn, ze = W) : re - Nn - pe >= 12 ? (Se = re - Nn - pe, ze = W) : j + Nn + Q <= oe - 12 ? (ze = j + Nn, Se = $e) : w - Nn - Q >= 12 ? (ze = w - Nn - Q, Se = $e) : (Se = Z(S + Nn), ze = W), C.value = {\n        top: `${Math.round(Se)}px`,\n        left: `${Math.round(ze)}px`,\n        width: `${Q}px`\n      };\n    }\n    let E = 0;\n    function $() {\n      n.open && (E && cancelAnimationFrame(E), E = requestAnimationFrame(() => {\n        E = requestAnimationFrame(() => {\n          E = 0, gt().then(x);\n        });\n      }));\n    }\n    function M() {\n      if (h.value >= y.value - 1) {\n        r(\"close\");\n        return;\n      }\n      h.value += 1;\n    }\n    function z() {\n      h.value > 0 && (h.value -= 1);\n    }\n    function T() {\n      r(\"close\");\n    }\n    function Y(P) {\n      n.open && (P.key === \"Escape\" ? (P.stopPropagation(), T()) : P.key === \"ArrowRight\" || P.key === \"Enter\" ? (P.preventDefault(), M()) : P.key === \"ArrowLeft\" && (P.preventDefault(), z()));\n    }\n    He(\n      () => n.open,\n      async (P) => {\n        var le;\n        P && (h.value = 0, A(), await gt(), await x(), (le = B.value) == null || le.focus());\n      }\n    ), He(h, async () => {\n      var P;\n      await x(), (P = B.value) == null || P.focus();\n    }), dt(() => {\n      window.addEventListener(\"resize\", $), window.addEventListener(\"scroll\", $, !0);\n    }), it(() => {\n      window.removeEventListener(\"resize\", $), window.removeEventListener(\"scroll\", $, !0), E && cancelAnimationFrame(E);\n    });\n    const O = m(!1);\n    let J;\n    function G(P) {\n      O.value = !!(P && \"matches\" in P && P.matches);\n    }\n    dt(() => {\n      var P;\n      typeof window > \"u\" || (J = window.matchMedia(\"(prefers-color-scheme: dark)\"), G(J), (P = J.addEventListener) == null || P.call(J, \"change\", G));\n    }), it(() => {\n      var P;\n      (P = J == null ? void 0 : J.removeEventListener) == null || P.call(J, \"change\", G);\n    });\n    const N = k(() => `fe-ctx-backdrop--theme-${n.theme || \"auto\"}`);\n    return (P, le) => (c(), et(ja, { to: \"body\" }, [\n      Ge(Rn, { name: \"fe-tour\" }, {\n        default: st(() => [\n          e.open && b.value ? (c(), d(\"div\", {\n            key: 0,\n            class: we([\"fe-tour\", N.value]),\n            \"data-prefers-dark\": O.value ? \"1\" : \"0\",\n            role: \"dialog\",\n            \"aria-modal\": \"true\",\n            \"aria-label\": s(a)(\"tour.aria\"),\n            onKeydown: Y\n          }, [\n            D.value ? (c(), d(\"div\", {\n              key: 0,\n              class: \"fe-tour__spot\",\n              style: Ct({\n                top: D.value.top + \"px\",\n                left: D.value.left + \"px\",\n                width: D.value.width + \"px\",\n                height: D.value.height + \"px\"\n              }),\n              \"aria-hidden\": \"true\"\n            }, null, 4)) : (c(), d(\"div\", d5)),\n            o(\"div\", {\n              ref_key: \"cardEl\",\n              ref: B,\n              class: we([\"fe-tour__card\", { \"fe-tour__card--center\": !D.value }]),\n              style: Ct(D.value ? C.value : {}),\n              tabindex: \"-1\"\n            }, [\n              o(\"p\", f5, f(s(a)(\"tour.progress\", { n: h.value + 1, m: y.value })), 1),\n              o(\"h3\", p5, f(s(a)(b.value.titleKey)), 1),\n              o(\"p\", v5, f(U.value), 1),\n              o(\"div\", h5, [\n                (c(!0), d(ae, null, Te(p.value, (ve, he) => (c(), d(\"span\", {\n                  key: ve.id,\n                  class: we([\"fe-tour__dot\", { \"is-active\": he === h.value }])\n                }, null, 2))), 128))\n              ]),\n              o(\"div\", m5, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-btn fe-tour__skip\",\n                  onClick: T\n                }, f(s(a)(\"tour.skip\")), 1),\n                le[0] || (le[0] = o(\"span\", { class: \"fe-tour__actions-spacer\" }, null, -1)),\n                h.value > 0 ? (c(), d(\"button\", {\n                  key: 0,\n                  type: \"button\",\n                  class: \"fe-btn\",\n                  onClick: z\n                }, f(s(a)(\"tour.back\")), 1)) : g(\"\", !0),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-btn fe-btn--primary\",\n                  onClick: M\n                }, f(h.value >= y.value - 1 ? s(a)(\"tour.done\") : s(a)(\"tour.next\")), 1)\n              ])\n            ], 6)\n          ], 42, u5)) : g(\"\", !0)\n        ]),\n        _: 1\n      })\n    ]));\n  }\n}), b5 = [\"aria-label\"], g5 = {\n  key: 0,\n  class: \"fe-tabs__scroll\"\n}, k5 = [\"aria-selected\", \"title\", \"onClick\", \"onKeydown\", \"onAuxclick\", \"onDragstart\", \"onDragover\", \"onDragleave\", \"onDrop\"], _5 = {\n  key: 0,\n  class: \"fe-tabs__splitdot\",\n  \"aria-hidden\": \"true\"\n}, w5 = { class: \"fe-tabs__label\" }, $5 = [\"aria-label\", \"title\", \"onClick\"], x5 = [\"aria-label\", \"title\"], S5 = [\"aria-label\", \"title\", \"aria-pressed\"], C5 = [\"aria-pressed\", \"title\", \"aria-label\"], T5 = /* @__PURE__ */ qe({\n  __name: \"TabBar\",\n  props: {\n    tabs: {},\n    activeId: {},\n    locale: {},\n    splitEnabled: { type: Boolean },\n    splitActive: { type: Boolean },\n    inspectorEnabled: { type: Boolean },\n    inspectorOpen: { type: Boolean },\n    hideTabs: { type: Boolean }\n  },\n  emits: [\"select\", \"close\", \"new\", \"reorder\", \"toggle-split\", \"toggle-inspector\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(null), v = m(null);\n    function p(B, I) {\n      var U;\n      u.value = B, I.dataTransfer && (I.dataTransfer.effectAllowed = \"move\", I.dataTransfer.setData(\"text/plain\", ((U = n.tabs[B]) == null ? void 0 : U.id) ?? \"\"));\n    }\n    function h(B, I) {\n      u.value !== null && (I.preventDefault(), I.stopPropagation(), I.dataTransfer && (I.dataTransfer.dropEffect = \"move\"), v.value = B);\n    }\n    function b(B) {\n      v.value === B && (v.value = null);\n    }\n    function y(B, I) {\n      u.value !== null && (I.preventDefault(), I.stopPropagation(), u.value !== B && r(\"reorder\", u.value, B), u.value = null, v.value = null);\n    }\n    function A() {\n      u.value = null, v.value = null;\n    }\n    function D(B) {\n      B.button === 1 && B.preventDefault();\n    }\n    function C(B, I) {\n      I.button === 1 && (I.preventDefault(), I.stopPropagation(), !(n.tabs.length <= 1) && r(\"close\", B));\n    }\n    return (B, I) => (c(), d(\"div\", {\n      class: \"fe-tabs\",\n      role: \"tablist\",\n      \"aria-label\": s(a)(\"tabs.strip\")\n    }, [\n      e.hideTabs ? g(\"\", !0) : (c(), d(\"div\", g5, [\n        (c(!0), d(ae, null, Te(e.tabs, (U, x) => (c(), d(\"div\", {\n          key: U.id,\n          class: we([\"fe-tabs__tab\", {\n            \"is-active\": U.id === e.activeId,\n            \"is-dragover\": v.value === x && u.value !== null && u.value !== x\n          }]),\n          role: \"tab\",\n          \"aria-selected\": U.id === e.activeId ? \"true\" : \"false\",\n          tabindex: \"0\",\n          draggable: \"true\",\n          title: U.label,\n          onClick: (E) => r(\"select\", U.id),\n          onKeydown: Ut(Re((E) => r(\"select\", U.id), [\"prevent\"]), [\"enter\"]),\n          onMousedown: I[0] || (I[0] = (E) => D(E)),\n          onAuxclick: (E) => C(U.id, E),\n          onDragstart: (E) => p(x, E),\n          onDragover: (E) => h(x, E),\n          onDragleave: (E) => b(x),\n          onDrop: (E) => y(x, E),\n          onDragend: A\n        }, [\n          U.split ? (c(), d(\"span\", _5)) : g(\"\", !0),\n          o(\"span\", w5, f(U.label), 1),\n          e.tabs.length > 1 ? (c(), d(\"button\", {\n            key: 1,\n            type: \"button\",\n            class: \"fe-tabs__close\",\n            \"aria-label\": s(a)(\"tabs.close\"),\n            title: s(a)(\"tabs.close\"),\n            onClick: Re((E) => r(\"close\", U.id), [\"stop\"])\n          }, \"×\", 8, $5)) : g(\"\", !0)\n        ], 42, k5))), 128))\n      ])),\n      e.hideTabs ? g(\"\", !0) : (c(), d(\"button\", {\n        key: 1,\n        type: \"button\",\n        class: \"fe-tabs__new\",\n        \"aria-label\": s(a)(\"tabs.new\"),\n        title: s(a)(\"tabs.new\"),\n        onClick: I[1] || (I[1] = (U) => r(\"new\"))\n      }, \"+\", 8, x5)),\n      e.splitEnabled !== !1 ? (c(), d(\"button\", {\n        key: 2,\n        type: \"button\",\n        class: we([\"fe-tabs__split\", { \"is-active\": e.splitActive }]),\n        \"aria-label\": e.splitActive ? s(a)(\"tabs.split_off\") : s(a)(\"tabs.split\"),\n        title: e.splitActive ? s(a)(\"tabs.split_off\") : s(a)(\"tabs.split\"),\n        \"aria-pressed\": e.splitActive ? \"true\" : \"false\",\n        \"data-testid\": \"tabs-split\",\n        onClick: I[2] || (I[2] = (U) => r(\"toggle-split\"))\n      }, [...I[4] || (I[4] = [\n        o(\"svg\", {\n          class: \"fe-ficon\",\n          viewBox: \"0 0 24 24\",\n          fill: \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"1.8\",\n          \"stroke-linecap\": \"round\",\n          \"stroke-linejoin\": \"round\",\n          \"aria-hidden\": \"true\",\n          focusable: \"false\"\n        }, [\n          o(\"rect\", {\n            x: \"3\",\n            y: \"4\",\n            width: \"18\",\n            height: \"16\",\n            rx: \"2\"\n          }),\n          o(\"path\", { d: \"M12 4v16\" })\n        ], -1)\n      ])], 10, S5)) : g(\"\", !0),\n      e.inspectorEnabled ? (c(), d(\"button\", {\n        key: 3,\n        type: \"button\",\n        class: we([\"fe-tabs__inspector\", { \"is-active\": e.inspectorOpen }]),\n        \"aria-pressed\": e.inspectorOpen ? \"true\" : \"false\",\n        title: s(a)(\"toolbar.inspector\"),\n        \"aria-label\": s(a)(\"toolbar.inspector\"),\n        \"data-testid\": \"tabs-inspector\",\n        onClick: I[3] || (I[3] = (U) => r(\"toggle-inspector\"))\n      }, [...I[5] || (I[5] = [\n        o(\"svg\", {\n          class: \"fe-ficon\",\n          viewBox: \"0 0 24 24\",\n          fill: \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"1.8\",\n          \"stroke-linecap\": \"round\",\n          \"aria-hidden\": \"true\",\n          focusable: \"false\"\n        }, [\n          o(\"circle\", {\n            cx: \"12\",\n            cy: \"12\",\n            r: \"9\"\n          }),\n          o(\"path\", { d: \"M12 11v5\" }),\n          o(\"circle\", {\n            cx: \"12\",\n            cy: \"7.6\",\n            r: \"1\",\n            fill: \"currentColor\",\n            stroke: \"none\"\n          })\n        ], -1)\n      ])], 10, C5)) : g(\"\", !0)\n    ], 8, b5));\n  }\n}), M5 = {\n  class: \"fe-breadcrumb\",\n  \"aria-label\": \"Breadcrumb\"\n}, E5 = [\"aria-current\", \"title\", \"aria-label\"], z5 = [\"innerHTML\"], A5 = {\n  key: 0,\n  class: \"fe-breadcrumb__sep\",\n  \"aria-hidden\": \"true\"\n}, P5 = [\"aria-current\", \"onClick\", \"onContextmenu\", \"onDrop\"], L5 = {\n  key: 0,\n  class: \"fe-breadcrumb__sep\",\n  \"aria-hidden\": \"true\"\n}, D5 = [\"aria-expanded\", \"aria-label\", \"title\"], O5 = {\n  key: 0,\n  class: \"fe-breadcrumb__menu\",\n  role: \"menu\"\n}, B5 = [\"onClick\"], I5 = [\"aria-current\", \"onClick\", \"onContextmenu\", \"onDrop\"], H5 = {\n  key: 0,\n  class: \"fe-breadcrumb__sep\",\n  \"aria-hidden\": \"true\"\n}, F5 = [\"aria-expanded\", \"title\", \"aria-label\"], N5 = [\"innerHTML\"], K5 = {\n  key: 0,\n  class: \"fe-breadcrumb__menu\",\n  role: \"menu\"\n}, R5 = [\"onClick\"], U5 = {\n  key: 0,\n  class: \"fe-breadcrumb__menu-empty\"\n}, V5 = [\"title\", \"aria-label\"], j5 = [\"innerHTML\"], Y5 = [\"placeholder\", \"onKeydown\"], W5 = 4, q5 = /* @__PURE__ */ qe({\n  __name: \"Breadcrumb\",\n  props: {\n    dirname: {},\n    adapter: {},\n    rootLabel: {},\n    locale: {},\n    multiStorageRoot: { type: Boolean },\n    rootPath: {},\n    subfolders: {}\n  },\n  emits: [\"navigate\", \"copy-path\", \"crumb-context\", \"crumb-drop\"],\n  setup(e, { emit: t }) {\n    const n = e, r = k(() => {\n      if (!n.rootPath) return \"\";\n      const w = n.rootPath, j = w.indexOf(\"://\");\n      return (j >= 0 ? w.slice(j + 3) : w).replace(/^\\/+|\\/+$/g, \"\");\n    }), a = k(() => {\n      const w = r.value;\n      if (!w) return n.rootLabel || n.adapter;\n      const j = w.split(\"/\");\n      return j[j.length - 1] || n.rootLabel || n.adapter;\n    }), { t: u } = tt(() => n.locale), v = t, p = k(() => {\n      const w = n.adapter ? `${n.adapter}://` : \"\", j = w && n.dirname.startsWith(w) ? n.dirname.slice(w.length) : n.dirname, K = j.split(\"/\").filter(Boolean), Z = [];\n      if (n.rootPath) {\n        const $e = r.value, Se = j.replace(/^\\/+|\\/+$/g, \"\"), ze = $e && (Se === $e || Se.startsWith($e + \"/\")) ? Se.slice($e.length).replace(/^\\/+/, \"\") : \"\";\n        Z.push({ label: a.value, adapterPath: n.rootPath });\n        let Ne = $e;\n        for (const be of ze.split(\"/\").filter(Boolean))\n          Ne = Ne ? `${Ne}/${be}` : be, Z.push({ label: Fs(be, u) || be, adapterPath: `${w}${Ne}` });\n        return Z;\n      }\n      n.multiStorageRoot ? (Z.push({ label: \"/\", adapterPath: \"\" }), n.adapter && Z.push({ label: n.rootLabel || n.adapter, adapterPath: w })) : (n.adapter || n.rootLabel) && Z.push({\n        label: n.rootLabel || n.adapter,\n        adapterPath: w\n      });\n      let W = \"\";\n      for (const $e of K) {\n        W = W ? `${W}/${$e}` : $e;\n        const Se = Fs($e, u) || $e;\n        Z.push({ label: Se, adapterPath: `${w}${W}` });\n      }\n      return Z;\n    }), h = k(() => {\n      const w = p.value[0];\n      return w && n.multiStorageRoot && w.adapterPath === \"\" ? w : null;\n    }), b = k(\n      () => h.value ? p.value.slice(1) : p.value\n    ), y = k(() => !!h.value && b.value.length === 0), A = k(() => b.value.length > W5), D = k(\n      () => A.value ? b.value.slice(0, 1) : b.value\n    ), C = k(\n      () => A.value ? b.value.slice(1, -2) : []\n    ), B = k(\n      () => A.value ? b.value.slice(-2) : []\n    ), I = m(!1), U = m(null), x = m(!1), E = m(null), $ = k(() => I.value || x.value);\n    function M() {\n      I.value = !1, x.value = !1;\n    }\n    function z(w) {\n      M(), v(\"navigate\", w.adapterPath);\n    }\n    function T() {\n      I.value = !1, x.value = !x.value;\n    }\n    function Y(w) {\n      var K, Z;\n      const j = w.target;\n      if (!(j instanceof Node)) {\n        M();\n        return;\n      }\n      (K = U.value) != null && K.contains(j) || (Z = E.value) != null && Z.contains(j) || M();\n    }\n    function O(w) {\n      w.key === \"Escape\" && (w.stopPropagation(), M());\n    }\n    He($, (w) => {\n      w ? (document.addEventListener(\"click\", Y, !0), document.addEventListener(\"keydown\", O, !0)) : (document.removeEventListener(\"click\", Y, !0), document.removeEventListener(\"keydown\", O, !0));\n    }), He(p, M), it(() => {\n      document.removeEventListener(\"click\", Y, !0), document.removeEventListener(\"keydown\", O, !0);\n    });\n    function J(w) {\n      v(\"navigate\", w.adapterPath);\n    }\n    function G() {\n      h.value && J(h.value);\n    }\n    function N(w) {\n      h.value && le(w, h.value);\n    }\n    function P(w) {\n      h.value && he(w, h.value);\n    }\n    function le(w, j) {\n      w.preventDefault(), w.stopPropagation(), v(\"crumb-context\", {\n        x: w.clientX,\n        y: w.clientY,\n        adapterPath: j.adapterPath,\n        label: j.label\n      });\n    }\n    function ve(w) {\n      vn(w) && (w.preventDefault(), w.stopPropagation(), w.dataTransfer && (w.dataTransfer.dropEffect = \"move\"));\n    }\n    function he(w, j) {\n      vn(w) && (w.preventDefault(), w.stopPropagation(), v(\"crumb-drop\", j.adapterPath, w));\n    }\n    const oe = m(!1), ue = m(\"\"), Q = m(null);\n    function pe() {\n      const w = `${n.adapter}://`, j = n.dirname.startsWith(w) ? n.dirname.slice(w.length) : n.dirname;\n      if (n.rootPath) {\n        const K = r.value, Z = j.replace(/^\\/+|\\/+$/g, \"\"), W = K && (Z === K || Z.startsWith(K + \"/\")) ? Z.slice(K.length).replace(/^\\/+/, \"\") : \"\";\n        ue.value = W ? `/${W}` : \"/\", oe.value = !0, gt(() => {\n          var $e, Se;\n          ($e = Q.value) == null || $e.focus(), (Se = Q.value) == null || Se.select();\n        });\n        return;\n      }\n      if (n.multiStorageRoot)\n        if (!n.adapter)\n          ue.value = \"/\";\n        else {\n          const K = j.replace(/^\\/+|\\/+$/g, \"\");\n          ue.value = K ? `/${n.adapter}/${K}` : `/${n.adapter}`;\n        }\n      else\n        ue.value = j;\n      oe.value = !0, gt(() => {\n        var K, Z;\n        (K = Q.value) == null || K.focus(), (Z = Q.value) == null || Z.select();\n      });\n    }\n    function re() {\n      const w = ue.value.trim();\n      if (oe.value = !1, n.rootPath) {\n        const K = w.replace(/^\\/+|\\/+$/g, \"\"), Z = r.value, W = K ? Z ? `${Z}/${K}` : K : Z;\n        v(\"navigate\", W ? `${n.adapter}://${W}` : `${n.adapter}://`);\n        return;\n      }\n      if (n.multiStorageRoot) {\n        const K = w.replace(/^\\/+|\\/+$/g, \"\");\n        if (!K) {\n          v(\"navigate\", \"\");\n          return;\n        }\n        const Z = K.indexOf(\"/\"), W = Z === -1 ? K : K.slice(0, Z), $e = Z === -1 ? \"\" : K.slice(Z + 1);\n        v(\"navigate\", $e ? `${W}://${$e}` : `${W}://`);\n        return;\n      }\n      const j = w.replace(/^\\/+|\\/+$/g, \"\");\n      j && v(\"navigate\", `${n.adapter}://${j}`);\n    }\n    function S() {\n      oe.value = !1;\n    }\n    return (w, j) => (c(), d(\"nav\", M5, [\n      oe.value ? Ve((c(), d(\"input\", {\n        key: 1,\n        ref_key: \"pathInput\",\n        ref: Q,\n        \"onUpdate:modelValue\": j[1] || (j[1] = (K) => ue.value = K),\n        type: \"text\",\n        class: \"fe-breadcrumb__input\",\n        placeholder: s(u)(\"breadcrumb.path_placeholder\"),\n        spellcheck: \"false\",\n        autocomplete: \"off\",\n        onKeydown: [\n          Ut(Re(re, [\"prevent\"]), [\"enter\"]),\n          Ut(Re(S, [\"prevent\"]), [\"escape\"])\n        ],\n        onBlur: S\n      }, null, 40, Y5)), [\n        [rt, ue.value]\n      ]) : (c(), d(ae, { key: 0 }, [\n        h.value ? (c(), d(\"button\", {\n          key: 0,\n          type: \"button\",\n          class: we([\"fe-breadcrumb__crumb fe-breadcrumb__home\", { \"is-last\": y.value }]),\n          \"aria-current\": y.value ? \"page\" : void 0,\n          title: s(u)(\"breadcrumb.root\"),\n          \"aria-label\": s(u)(\"breadcrumb.root\"),\n          \"data-testid\": \"breadcrumb-home\",\n          onClick: G,\n          onContextmenu: N,\n          onDragover: ve,\n          onDrop: P\n        }, [\n          o(\"span\", {\n            class: \"fe-icon\",\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"home\")\n          }, null, 8, z5),\n          y.value ? g(\"\", !0) : (c(), d(\"span\", A5, \"›\"))\n        ], 42, E5)) : g(\"\", !0),\n        (c(!0), d(ae, null, Te(D.value, (K, Z) => (c(), d(\"button\", {\n          key: K.adapterPath,\n          class: we([\"fe-breadcrumb__crumb\", { \"is-last\": !A.value && Z === D.value.length - 1 }]),\n          type: \"button\",\n          \"aria-current\": !A.value && Z === D.value.length - 1 ? \"page\" : void 0,\n          onClick: (W) => J(K),\n          onContextmenu: (W) => le(W, K),\n          onDragover: ve,\n          onDrop: (W) => he(W, K)\n        }, [\n          o(\"span\", null, f(K.label), 1),\n          A.value || Z < D.value.length - 1 ? (c(), d(\"span\", L5, \"›\")) : g(\"\", !0)\n        ], 42, P5))), 128)),\n        C.value.length ? (c(), d(\"span\", {\n          key: 1,\n          ref_key: \"moreWrapEl\",\n          ref: U,\n          class: \"fe-breadcrumb__more-wrap\"\n        }, [\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-breadcrumb__more\",\n            \"aria-haspopup\": \"menu\",\n            \"aria-expanded\": I.value,\n            \"aria-label\": s(u)(\"breadcrumb.more\"),\n            title: s(u)(\"breadcrumb.more\"),\n            onClick: j[0] || (j[0] = (K) => I.value = !I.value)\n          }, \"…\", 8, D5),\n          j[2] || (j[2] = o(\"span\", {\n            class: \"fe-breadcrumb__sep\",\n            \"aria-hidden\": \"true\"\n          }, \"›\", -1)),\n          I.value ? (c(), d(\"div\", O5, [\n            (c(!0), d(ae, null, Te(C.value, (K) => (c(), d(\"button\", {\n              key: K.adapterPath,\n              type: \"button\",\n              class: \"fe-breadcrumb__menu-item\",\n              role: \"menuitem\",\n              onClick: (Z) => z(K)\n            }, f(K.label), 9, B5))), 128))\n          ])) : g(\"\", !0)\n        ], 512)) : g(\"\", !0),\n        (c(!0), d(ae, null, Te(B.value, (K, Z) => (c(), d(\"button\", {\n          key: K.adapterPath,\n          class: we([\"fe-breadcrumb__crumb\", { \"is-last\": Z === B.value.length - 1 }]),\n          type: \"button\",\n          \"aria-current\": Z === B.value.length - 1 ? \"page\" : void 0,\n          onClick: (W) => J(K),\n          onContextmenu: (W) => le(W, K),\n          onDragover: ve,\n          onDrop: (W) => he(W, K)\n        }, [\n          o(\"span\", null, f(K.label), 1),\n          Z < B.value.length - 1 ? (c(), d(\"span\", H5, \"›\")) : g(\"\", !0)\n        ], 42, I5))), 128)),\n        e.subfolders ? (c(), d(\"span\", {\n          key: 2,\n          ref_key: \"subWrapEl\",\n          ref: E,\n          class: \"fe-breadcrumb__sub-wrap\"\n        }, [\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-breadcrumb__sub\",\n            \"aria-haspopup\": \"menu\",\n            \"aria-expanded\": x.value,\n            title: s(u)(\"breadcrumb.subfolders\"),\n            \"aria-label\": s(u)(\"breadcrumb.subfolders\"),\n            \"data-testid\": \"breadcrumb-subfolders\",\n            onClick: T\n          }, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"subfolders\")\n            }, null, 8, N5)\n          ], 8, F5),\n          x.value ? (c(), d(\"div\", K5, [\n            (c(!0), d(ae, null, Te(e.subfolders, (K) => (c(), d(\"button\", {\n              key: K.adapterPath,\n              type: \"button\",\n              class: \"fe-breadcrumb__menu-item\",\n              role: \"menuitem\",\n              onClick: (Z) => z(K)\n            }, f(K.label), 9, R5))), 128)),\n            e.subfolders.length ? g(\"\", !0) : (c(), d(\"p\", U5, f(s(u)(\"breadcrumb.subfolders.empty\")), 1))\n          ])) : g(\"\", !0)\n        ], 512)) : g(\"\", !0),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-breadcrumb__edit\",\n          title: s(u)(\"breadcrumb.go_to_path\"),\n          \"aria-label\": s(u)(\"breadcrumb.go_to_path\"),\n          \"data-testid\": \"breadcrumb-edit-path\",\n          onClick: pe\n        }, [\n          o(\"span\", {\n            class: \"fe-icon\",\n            \"aria-hidden\": \"true\",\n            innerHTML: s(Ue)(\"edit-path\")\n          }, null, 8, j5)\n        ], 8, V5)\n      ], 64))\n    ]));\n  }\n}), G5 = [\"data-mode\"], X5 = [\"aria-label\"], J5 = [\"aria-expanded\", \"data-testid\", \"onClick\"], Z5 = { class: \"fe-filterbar__label\" }, Q5 = { class: \"fe-filterbar__find\" }, eM = [\"placeholder\", \"aria-label\", \"value\", \"onKeydown\"], tM = {\n  key: 2,\n  class: \"fe-filterbar__count\",\n  role: \"status\",\n  \"data-testid\": \"filter-count\"\n}, nM = {\n  key: 3,\n  class: \"fe-filterbar__sort\"\n}, aM = [\"disabled\", \"title\"], oM = { class: \"fe-sr-only\" }, sM = {\n  key: 0,\n  class: \"fe-ficon fe-filterbar__sortarrow\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"2\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\",\n  focusable: \"false\"\n}, rM = [\"aria-label\", \"title\", \"disabled\", \"aria-expanded\"], iM = [\"aria-label\", \"title\", \"aria-expanded\"], lM = [\"role\", \"aria-label\"], cM = {\n  key: 0,\n  class: \"fe-filterpop__rule\",\n  \"aria-hidden\": \"true\"\n}, uM = [\"disabled\", \"aria-disabled\", \"data-testid\", \"onClick\"], dM = [\"data-active\", \"data-testid\", \"onClick\"], fM = [\"aria-selected\", \"data-checked\", \"data-active\", \"data-testid\", \"onClick\"], pM = {\n  class: \"fe-filterpop__tick\",\n  \"aria-hidden\": \"true\"\n}, vM = /* @__PURE__ */ qe({\n  __name: \"FilterBar\",\n  props: {\n    value: {},\n    locale: {},\n    theme: {},\n    shown: {},\n    total: {},\n    files: {},\n    canPaste: { type: Boolean },\n    canWrite: { type: Boolean },\n    order: {},\n    mode: {},\n    findLabel: {}\n  },\n  emits: [\"update:value\", \"new-folder\", \"upload\", \"paste\", \"select-all\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = k(() => (n.mode ?? \"full\") === \"full\"), v = k(() => n.findLabel || a(\"filter.find\")), p = [\"type\", \"people\", \"modified\", \"size\"], h = [\n      \"any\",\n      \"folder\",\n      \"document\",\n      \"spreadsheet\",\n      \"presentation\",\n      \"pdf\",\n      \"image\",\n      \"video\",\n      \"audio\",\n      \"archive\",\n      \"code\"\n    ], b = [\"any\", \"today\", \"7d\", \"30d\", \"year\"], y = [\"any\", \"lt1\", \"1to10\", \"10to100\", \"gt100\"], A = k(() => $b(n.files ?? []));\n    function D(ie) {\n      return ie === \"people\" ? A.value.map((ce) => ce.value) : ie === \"type\" ? h : ie === \"modified\" ? b : y;\n    }\n    function C(ie, ce) {\n      var L;\n      return ie === \"people\" && ce.startsWith(\"u:\") ? ((L = A.value.find((se) => se.value === ce)) == null ? void 0 : L.name) || ce.slice(2) : a(`filter.${ie}.${ce}`);\n    }\n    function B(ie) {\n      const ce = ie === \"people\" ? n.value.people ?? \"any\" : n.value[ie];\n      return ce === \"any\" ? a(`filter.${ie}`) : C(ie, ce);\n    }\n    function I(ie) {\n      return ie === \"people\" ? n.value.people ?? \"any\" : n.value[ie];\n    }\n    const U = k(() => fb(n.value)), x = Ao(), E = k(() => x.key.value), $ = k(() => x.dir.value === \"asc\"), M = k(() => n.order === \"relevance\"), z = k(() => M.value ? a(\"sort.relevance\") : a(`col.${E.value}`)), T = k(\n      () => M.value ? a(\"sort.relevance_why\") : a($.value ? \"sort.asc\" : \"sort.desc\")\n    );\n    He(() => n.locale, (ie) => Hi(ie), { immediate: !0 });\n    function Y(ie) {\n      x.setSort(ie), K(!0);\n    }\n    function O() {\n      M.value || x.toggleSortDir();\n    }\n    function J() {\n      M.value || j(\"sort\");\n    }\n    const G = k(() => [\n      { key: \"new-folder\", label: a(\"toolbar.new_folder\"), disabled: n.canWrite === !1 },\n      { key: \"upload\", label: a(\"toolbar.upload\"), disabled: n.canWrite === !1 },\n      { key: \"paste\", label: a(\"ctx.paste\"), disabled: !n.canPaste || n.canWrite === !1 },\n      { key: \"sep\", label: \"\", divider: !0, disabled: !0 },\n      { key: \"select-all\", label: a(\"shortcuts.select_all\"), disabled: !1 }\n    ]);\n    function N(ie) {\n      K(!0), ie === \"new-folder\" ? r(\"new-folder\") : ie === \"upload\" ? r(\"upload\") : ie === \"paste\" ? r(\"paste\") : ie === \"select-all\" && r(\"select-all\");\n    }\n    const P = m(null), le = m({ x: 0, y: 0 }), ve = m(null), he = m({});\n    function oe(ie, ce) {\n      he.value[ie] = ce ?? null;\n    }\n    const ue = k(\n      () => P.value && P.value !== \"sort\" && P.value !== \"actions\" ? P.value : null\n    ), Q = k(() => ue.value ? D(ue.value) : []), pe = k(\n      () => ue.value ? a(`filter.${ue.value}`) : P.value === \"actions\" ? a(\"filter.actions\") : a(\"sort.by\")\n    );\n    function re(ie) {\n      return !!ue.value && I(ue.value) === ie;\n    }\n    function S(ie) {\n      return ue.value ? C(ue.value, ie) : ie;\n    }\n    function w(ie) {\n      ue.value && Z(ue.value, ie);\n    }\n    async function j(ie) {\n      var se, Ce, We;\n      if (P.value === ie) {\n        K();\n        return;\n      }\n      const ce = (se = he.value[ie]) == null ? void 0 : se.getBoundingClientRect();\n      le.value = { x: ce ? ce.left : 8, y: ce ? ce.bottom + 6 : 8 }, P.value = ie, await gt();\n      const L = ve.value;\n      if (L) {\n        const Ie = L.getBoundingClientRect();\n        if (Ie.right > window.innerWidth - 8 && (le.value = { ...le.value, x: Math.max(8, window.innerWidth - 8 - Ie.width) }), Ie.bottom > window.innerHeight - 8) {\n          const Ze = (Ce = he.value[ie]) == null ? void 0 : Ce.getBoundingClientRect();\n          le.value = { ...le.value, y: Math.max(8, (Ze ? Ze.top : 0) - Ie.height - 6) };\n        }\n        (We = L.querySelector('[data-active=\"true\"]')) == null || We.focus();\n      }\n    }\n    function K(ie = !1) {\n      var L;\n      const ce = P.value;\n      P.value = null, ie && ce && ((L = he.value[ce]) == null || L.focus());\n    }\n    He(\n      () => n.order,\n      (ie) => {\n        ie === \"relevance\" && P.value === \"sort\" && K();\n      }\n    );\n    function Z(ie, ce) {\n      r(\"update:value\", { ...n.value, [ie]: ce }), K(!0);\n    }\n    function W() {\n      $e.value = \"\", r(\"update:value\", {\n        ...n.value,\n        type: \"any\",\n        modified: \"any\",\n        size: \"any\",\n        name: \"\",\n        people: \"any\"\n      });\n    }\n    const $e = m(n.value.name ?? \"\");\n    He(\n      () => n.value.name ?? \"\",\n      (ie) => {\n        ie !== $e.value.trim() && ($e.value = ie);\n      }\n    );\n    let Se;\n    function ze(ie) {\n      $e.value = ie.target.value, Se && clearTimeout(Se), Se = setTimeout(() => {\n        r(\"update:value\", { ...n.value, name: $e.value.trim() });\n      }, 140);\n    }\n    function Ne() {\n      Se && clearTimeout(Se), $e.value = \"\", r(\"update:value\", { ...n.value, name: \"\" });\n    }\n    it(() => {\n      Se && clearTimeout(Se);\n    });\n    function be(ie) {\n      var L;\n      if (!P.value) return;\n      const ce = ie.target;\n      (L = ve.value) != null && L.contains(ce) || Object.values(he.value).some((se) => se == null ? void 0 : se.contains(ce)) || K();\n    }\n    function De(ie) {\n      ie.key === \"Escape\" && P.value && (ie.stopPropagation(), K(!0));\n    }\n    return dt(() => {\n      document.addEventListener(\"pointerdown\", be, !0), document.addEventListener(\"keydown\", De, !0);\n    }), it(() => {\n      document.removeEventListener(\"pointerdown\", be, !0), document.removeEventListener(\"keydown\", De, !0);\n    }), (ie, ce) => (c(), d(\"div\", {\n      class: \"fe-filterbar\",\n      \"data-mode\": u.value ? \"full\" : \"find\",\n      \"data-testid\": \"filterbar\"\n    }, [\n      u.value ? (c(), d(\"div\", {\n        key: 0,\n        class: \"fe-filterbar__chips\",\n        role: \"group\",\n        \"aria-label\": s(a)(\"filter.aria\")\n      }, [\n        (c(), d(ae, null, Te(p, (L) => o(\"button\", {\n          key: L,\n          ref_for: !0,\n          ref: (se) => oe(L, se),\n          type: \"button\",\n          class: we([\"fe-filterbar__chip\", { \"is-set\": I(L) !== \"any\", \"is-open\": P.value === L }]),\n          \"aria-expanded\": P.value === L,\n          \"aria-haspopup\": \"listbox\",\n          \"data-testid\": `filter-${L}`,\n          onClick: (se) => j(L)\n        }, [\n          o(\"span\", Z5, f(B(L)), 1),\n          ce[3] || (ce[3] = o(\"svg\", {\n            class: \"fe-ficon fe-filterbar__caret\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"path\", { d: \"M7 10l5 5 5-5\" })\n          ], -1))\n        ], 10, J5)), 64))\n      ], 8, X5)) : g(\"\", !0),\n      o(\"div\", Q5, [\n        ce[4] || (ce[4] = o(\"svg\", {\n          class: \"fe-ficon fe-filterbar__find-glass\",\n          viewBox: \"0 0 24 24\",\n          fill: \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"1.9\",\n          \"stroke-linecap\": \"round\",\n          \"aria-hidden\": \"true\",\n          focusable: \"false\"\n        }, [\n          o(\"circle\", {\n            cx: \"11\",\n            cy: \"11\",\n            r: \"6.5\"\n          }),\n          o(\"path\", { d: \"M16 16l4.5 4.5\" })\n        ], -1)),\n        o(\"input\", {\n          type: \"search\",\n          class: \"fe-filterbar__find-input\",\n          placeholder: v.value,\n          \"aria-label\": v.value,\n          value: $e.value,\n          \"data-testid\": \"filter-find\",\n          onInput: ze,\n          onKeydown: Ut(Re(Ne, [\"stop\", \"prevent\"]), [\"esc\"])\n        }, null, 40, eM)\n      ]),\n      u.value && U.value > 0 ? (c(), d(\"button\", {\n        key: 1,\n        type: \"button\",\n        class: \"fe-filterbar__clear\",\n        \"data-testid\": \"filter-clear\",\n        onClick: W\n      }, f(s(a)(\"filter.clear\")), 1)) : g(\"\", !0),\n      u.value && U.value > 0 && typeof e.shown == \"number\" && typeof e.total == \"number\" ? (c(), d(\"span\", tM, f(s(a)(\"filter.count\", { shown: String(e.shown), total: String(e.total) })), 1)) : g(\"\", !0),\n      u.value ? (c(), d(\"div\", nM, [\n        o(\"button\", {\n          ref: (L) => oe(\"sort\", L),\n          type: \"button\",\n          class: we([\"fe-filterbar__sortdir\", { \"is-ranked\": M.value }]),\n          disabled: M.value,\n          title: M.value ? T.value : void 0,\n          \"data-testid\": \"sort-dir\",\n          onClick: ce[0] || (ce[0] = (L) => O())\n        }, [\n          o(\"span\", null, f(z.value), 1),\n          o(\"span\", oM, \", \" + f(T.value), 1),\n          M.value ? g(\"\", !0) : (c(), d(\"svg\", sM, [\n            $.value ? (c(), d(ae, { key: 0 }, [\n              ce[5] || (ce[5] = o(\"path\", { d: \"M12 19V5\" }, null, -1)),\n              ce[6] || (ce[6] = o(\"path\", { d: \"M5 12l7-7 7 7\" }, null, -1))\n            ], 64)) : (c(), d(ae, { key: 1 }, [\n              ce[7] || (ce[7] = o(\"path\", { d: \"M12 5v14\" }, null, -1)),\n              ce[8] || (ce[8] = o(\"path\", { d: \"M19 12l-7 7-7-7\" }, null, -1))\n            ], 64))\n          ]))\n        ], 10, aM),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-filterbar__sortpick\",\n          \"aria-label\": M.value ? T.value : s(a)(\"sort.by\"),\n          title: M.value ? T.value : s(a)(\"sort.by\"),\n          disabled: M.value,\n          \"aria-haspopup\": \"menu\",\n          \"aria-expanded\": P.value === \"sort\",\n          \"data-testid\": \"sort-menu\",\n          onClick: ce[1] || (ce[1] = (L) => J())\n        }, [...ce[9] || (ce[9] = [\n          o(\"svg\", {\n            class: \"fe-ficon fe-filterbar__caret\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"path\", { d: \"M7 10l5 5 5-5\" })\n          ], -1)\n        ])], 8, rM)\n      ])) : g(\"\", !0),\n      u.value ? (c(), d(\"button\", {\n        key: 4,\n        ref: (L) => oe(\"actions\", L),\n        type: \"button\",\n        class: \"fe-filterbar__actions\",\n        \"aria-label\": s(a)(\"filter.actions\"),\n        title: s(a)(\"filter.actions\"),\n        \"aria-haspopup\": \"menu\",\n        \"aria-expanded\": P.value === \"actions\",\n        \"data-testid\": \"listing-actions\",\n        onClick: ce[2] || (ce[2] = (L) => j(\"actions\"))\n      }, [...ce[10] || (ce[10] = [\n        o(\"svg\", {\n          class: \"fe-ficon\",\n          viewBox: \"0 0 24 24\",\n          fill: \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"2\",\n          \"stroke-linecap\": \"round\",\n          \"aria-hidden\": \"true\",\n          focusable: \"false\"\n        }, [\n          o(\"circle\", {\n            cx: \"12\",\n            cy: \"5.5\",\n            r: \"1.2\",\n            fill: \"currentColor\",\n            stroke: \"none\"\n          }),\n          o(\"circle\", {\n            cx: \"12\",\n            cy: \"12\",\n            r: \"1.2\",\n            fill: \"currentColor\",\n            stroke: \"none\"\n          }),\n          o(\"circle\", {\n            cx: \"12\",\n            cy: \"18.5\",\n            r: \"1.2\",\n            fill: \"currentColor\",\n            stroke: \"none\"\n          })\n        ], -1)\n      ])], 8, iM)) : g(\"\", !0),\n      (c(), et(ja, { to: \"body\" }, [\n        P.value ? (c(), d(\"div\", {\n          key: 0,\n          ref_key: \"panelEl\",\n          ref: ve,\n          class: we([\"fe-filterpop\", {\n            \"fe--theme-light\": e.theme === \"light\",\n            \"fe--theme-dark\": e.theme === \"dark\",\n            \"fe-filterpop--sort\": P.value === \"sort\",\n            \"fe-filterpop--actions\": P.value === \"actions\"\n          }]),\n          role: P.value === \"sort\" || P.value === \"actions\" ? \"menu\" : \"listbox\",\n          \"aria-label\": pe.value,\n          style: Ct({ left: le.value.x + \"px\", top: le.value.y + \"px\" })\n        }, [\n          P.value === \"actions\" ? (c(!0), d(ae, { key: 0 }, Te(G.value, (L) => (c(), d(ae, {\n            key: L.key\n          }, [\n            L.divider ? (c(), d(\"hr\", cM)) : (c(), d(\"button\", {\n              key: 1,\n              type: \"button\",\n              class: \"fe-filterpop__item\",\n              role: \"menuitem\",\n              disabled: L.disabled,\n              \"aria-disabled\": L.disabled,\n              \"data-active\": \"false\",\n              \"data-testid\": `listing-action-${L.key}`,\n              onClick: (se) => N(L.key)\n            }, [\n              o(\"span\", null, f(L.label), 1)\n            ], 8, uM))\n          ], 64))), 128)) : P.value === \"sort\" ? (c(!0), d(ae, { key: 1 }, Te(s(gd), (L) => (c(), d(\"button\", {\n            key: L,\n            type: \"button\",\n            class: \"fe-filterpop__item\",\n            role: \"menuitem\",\n            \"data-active\": E.value === L ? \"true\" : \"false\",\n            \"data-testid\": `sort-opt-${L}`,\n            onClick: (se) => Y(L)\n          }, [\n            o(\"span\", null, f(s(a)(`col.${L}`)), 1)\n          ], 8, dM))), 128)) : (c(!0), d(ae, { key: 2 }, Te(Q.value, (L) => (c(), d(\"button\", {\n            key: L,\n            type: \"button\",\n            class: \"fe-filterpop__item\",\n            role: \"option\",\n            \"aria-selected\": re(L),\n            \"data-checked\": re(L) ? \"true\" : \"false\",\n            \"data-active\": re(L) ? \"true\" : \"false\",\n            \"data-testid\": `filter-opt-${L}`,\n            onClick: (se) => w(L)\n          }, [\n            o(\"span\", pM, f(re(L) ? \"✓\" : \"\"), 1),\n            o(\"span\", null, f(S(L)), 1)\n          ], 8, fM))), 128))\n        ], 14, lM)) : g(\"\", !0)\n      ]))\n    ], 8, G5));\n  }\n}), hM = [\"aria-label\"], mM = [\"aria-selected\", \"title\", \"aria-label\"], yM = [\"innerHTML\"], bM = [\"aria-selected\", \"title\", \"aria-label\"], gM = [\"innerHTML\"], kM = [\"aria-selected\", \"title\", \"aria-label\"], _M = [\"innerHTML\"], wM = /* @__PURE__ */ qe({\n  __name: \"ViewSwitcher\",\n  props: {\n    viewMode: {},\n    locale: {},\n    modes: {}\n  },\n  emits: [\"update:viewMode\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale);\n    function u(v) {\n      return !n.modes || n.modes.includes(v);\n    }\n    return (v, p) => (c(), d(\"div\", {\n      class: \"fe-toolbar__view\",\n      role: \"tablist\",\n      \"aria-label\": s(a)(\"toolbar.view_label\")\n    }, [\n      u(\"list\") ? (c(), d(\"button\", {\n        key: 0,\n        type: \"button\",\n        class: we([\"fe-btn fe-btn--icon-only\", { \"is-active\": e.viewMode === \"list\" }]),\n        role: \"tab\",\n        \"aria-selected\": e.viewMode === \"list\",\n        title: s(a)(\"toolbar.view.list\"),\n        \"aria-label\": s(a)(\"toolbar.view.list\"),\n        \"data-testid\": \"view-list\",\n        onClick: p[0] || (p[0] = (h) => r(\"update:viewMode\", \"list\"))\n      }, [\n        o(\"span\", {\n          class: \"fe-icon\",\n          \"aria-hidden\": \"true\",\n          innerHTML: s(Ue)(\"view-list\")\n        }, null, 8, yM)\n      ], 10, mM)) : g(\"\", !0),\n      u(\"grid\") ? (c(), d(\"button\", {\n        key: 1,\n        type: \"button\",\n        class: we([\"fe-btn fe-btn--icon-only\", { \"is-active\": e.viewMode === \"grid\" }]),\n        role: \"tab\",\n        \"aria-selected\": e.viewMode === \"grid\",\n        title: s(a)(\"toolbar.view.grid\"),\n        \"aria-label\": s(a)(\"toolbar.view.grid\"),\n        \"data-testid\": \"view-grid\",\n        onClick: p[1] || (p[1] = (h) => r(\"update:viewMode\", \"grid\"))\n      }, [\n        o(\"span\", {\n          class: \"fe-icon\",\n          \"aria-hidden\": \"true\",\n          innerHTML: s(Ue)(\"view-grid\")\n        }, null, 8, gM)\n      ], 10, bM)) : g(\"\", !0),\n      u(\"gallery\") ? (c(), d(\"button\", {\n        key: 2,\n        type: \"button\",\n        class: we([\"fe-btn fe-btn--icon-only\", { \"is-active\": e.viewMode === \"gallery\" }]),\n        role: \"tab\",\n        \"aria-selected\": e.viewMode === \"gallery\",\n        title: s(a)(\"toolbar.view.gallery\"),\n        \"aria-label\": s(a)(\"toolbar.view.gallery\"),\n        \"data-testid\": \"view-gallery\",\n        onClick: p[2] || (p[2] = (h) => r(\"update:viewMode\", \"gallery\"))\n      }, [\n        o(\"span\", {\n          class: \"fe-icon\",\n          \"aria-hidden\": \"true\",\n          innerHTML: s(Ue)(\"view-gallery\")\n        }, null, 8, _M)\n      ], 10, kM)) : g(\"\", !0)\n    ], 8, hM));\n  }\n}), $M = [\"aria-label\", \"aria-busy\"], xM = [\"aria-sort\"], SM = [\"disabled\", \"title\"], CM = {\n  key: 0,\n  class: \"fe-list__sort-arrow\",\n  \"aria-hidden\": \"true\"\n}, TM = [\"aria-label\", \"title\"], MM = [\"aria-sort\", \"aria-label\", \"onPointerdown\"], EM = [\"disabled\", \"title\", \"onClick\"], zM = {\n  key: 0,\n  class: \"fe-list__sort-arrow\",\n  \"aria-hidden\": \"true\"\n}, AM = {\n  key: 1,\n  class: \"fe-list__head-label\"\n}, PM = [\"aria-label\", \"title\", \"onPointerdown\", \"onDblclick\", \"onKeydown\"], LM = {\n  class: \"fe-list__col fe-list__col--menu\",\n  role: \"columnheader\"\n}, DM = [\"title\", \"aria-label\", \"aria-expanded\"], OM = {\n  class: \"fe-list__body\",\n  role: \"rowgroup\"\n}, BM = {\n  key: 0,\n  class: \"fe-list__group\",\n  role: \"presentation\"\n}, IM = [\"aria-selected\", \"aria-label\", \"data-fe-path\", \"onClick\", \"onDblclick\", \"onContextmenu\", \"onDragstart\", \"onDragover\", \"onDragleave\", \"onDrop\", \"onTouchstartPassive\"], HM = [\"onClick\"], FM = [\"aria-label\", \"innerHTML\"], NM = [\"src\"], KM = [\"innerHTML\"], RM = { class: \"fe-list__name-wrap\" }, UM = [\"title\"], VM = {\n  key: 0,\n  class: \"fe-list__badge\"\n}, jM = [\"title\", \"aria-label\"], YM = {\n  key: 0,\n  class: \"fe-list__snippet\"\n}, WM = {\n  key: 0,\n  class: \"fe-list__mark\"\n}, qM = {\n  key: 3,\n  class: \"fe-list__kind\"\n}, GM = [\"title\"], XM = [\"title\", \"aria-label\", \"onClick\"], JM = {\n  key: 0,\n  class: \"fe-list__empty\"\n}, ZM = [\"data-prefers-dark\"], QM = [\"aria-label\", \"onKeydown\"], eE = { class: \"fe-colmenu__title\" }, tE = [\"aria-checked\", \"onClick\"], nE = { class: \"fe-colmenu__label\" }, aE = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], oE = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], sE = {\n  key: 0,\n  class: \"fe-colmenu__sep\",\n  role: \"separator\"\n}, rE = { class: \"fe-colmenu__label\" }, iE = {\n  key: 2,\n  class: \"fe-colmenu__sep\",\n  role: \"separator\"\n}, lE = {\n  key: 3,\n  class: \"fe-colmenu__title\"\n}, cE = {\n  key: 4,\n  class: \"fe-colmenu__hint\"\n}, uE = { class: \"fe-colmenu__label\" }, dE = { class: \"fe-colmenu__label\" }, fE = 5, pE = 300, vE = /* @__PURE__ */ qe({\n  __name: \"ListView\",\n  props: {\n    files: {},\n    selected: {},\n    clipped: {},\n    showParentPath: { type: Boolean },\n    locale: {},\n    loading: { type: Boolean },\n    starredIds: {},\n    starEnabled: { type: Boolean },\n    apiBase: {},\n    authHeaders: { type: Function },\n    authCredentials: {},\n    keepBadgeFor: { type: Function },\n    order: {},\n    folderKey: {},\n    theme: {},\n    thumbSrc: { type: Function }\n  },\n  emits: [\"click-row\", \"dbl-row\", \"context-row\", \"item-drag-start\", \"item-drop-into\", \"star-change\", \"display-order\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, {\n      t: a,\n      formatSize: u,\n      formatDate: v,\n      formatDateFull: p,\n      formatMonthYear: h,\n      zonedYearMonth: b,\n      toDate: y,\n      nodeDisplayName: A\n    } = tt(() => n.locale);\n    function D(H) {\n      return n.selected.has(H.path);\n    }\n    function C(H, te) {\n      r(\"click-row\", H, Ui(te, Y.isTap(te)));\n    }\n    function B(H) {\n      r(\"dbl-row\", H);\n    }\n    function I(H, te) {\n      te.preventDefault(), te.stopPropagation(), r(\"context-row\", H, te);\n    }\n    function U(H, te) {\n      const _e = te.currentTarget, Me = _e == null ? void 0 : _e.getBoundingClientRect();\n      r(\"context-row\", H, {\n        clientX: Me ? Me.left : te.clientX,\n        clientY: Me ? Me.bottom : te.clientY,\n        preventDefault: () => {\n        },\n        stopPropagation: () => {\n        }\n      });\n    }\n    function x(H, te) {\n      r(\"click-row\", H, Vi(te));\n    }\n    function E(H, te) {\n      Xi(\n        te,\n        A(H),\n        n.selected.has(H.path) ? n.selected.size : 1\n      ), r(\"item-drag-start\", H, te);\n    }\n    const $ = m(null);\n    function M(H, te) {\n      H.type === \"dir\" && vn(te) && (te.preventDefault(), te.stopPropagation(), te.dataTransfer && (te.dataTransfer.dropEffect = \"move\"), $.value = H.path);\n    }\n    function z(H) {\n      $.value === H.path && ($.value = null);\n    }\n    function T(H, te) {\n      $.value = null, H.type === \"dir\" && vn(te) && (te.preventDefault(), te.stopPropagation(), r(\"item-drop-into\", H, te));\n    }\n    const Y = ji(\n      (H, te) => r(\"context-row\", H, { ...te, preventDefault: () => {\n      }, stopPropagation: () => {\n      } }),\n      {\n        // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n        onTap: (H) => r(\"click-row\", H, { ctrl: !1, shift: !1, touch: !0 })\n      }\n    );\n    function O(H) {\n      return H === \"kept\" ? \"✓\" : H === \"syncing\" ? \"⟳\" : H === \"partial\" ? \"◐\" : \"☁\";\n    }\n    function J(H) {\n      return H.basename === \".trash\" || Pi(H);\n    }\n    function G(H) {\n      return v(H, { time: !0 }) || \"—\";\n    }\n    function N(H) {\n      return p(H);\n    }\n    function P(H) {\n      return J(H) ? \"—\" : Os(H, a);\n    }\n    function le(H) {\n      return H.type === \"dir\" || yi(H) ? null : n.thumbSrc ? n.thumbSrc(H) : H.thumb_url ?? null;\n    }\n    const ve = k(() => ie.value.includes(\"type\"));\n    function he(H) {\n      return H.type === \"dir\" && !J(H);\n    }\n    function oe(H) {\n      const te = ya(H.path);\n      return [String(H.storage ?? \"\").trim(), te].filter(Boolean).join(\"/\");\n    }\n    function ue(H) {\n      const te = H.snippet;\n      return typeof te == \"string\" ? te : \"\";\n    }\n    function Q(H) {\n      return Od(H.matched);\n    }\n    const pe = Ao(), re = k(() => pe.key.value), S = k(() => pe.dir.value), w = k(() => n.order === \"relevance\");\n    He(() => n.locale, (H) => Hi(H), { immediate: !0 });\n    function j(H) {\n      w.value || pe.chooseSortKey(H);\n    }\n    const K = k(() => a(w.value ? \"sort.relevance_why\" : \"col.sort\"));\n    function Z(H) {\n      return w.value || re.value !== H ? \"none\" : S.value === \"asc\" ? \"ascending\" : \"descending\";\n    }\n    const W = k(() => {\n      const H = [\"type\"];\n      return n.showParentPath && H.push(\"location\"), H.push(\"owner\", \"modified\", \"size\"), n.starEnabled !== !1 && (n.apiBase || n.apiBase === \"\") && H.push(\"star\"), H;\n    }), $e = m(null), Se = m(0);\n    let ze = null;\n    const Ne = m(!1);\n    function be(H) {\n      const te = H.currentTarget, _e = ((te == null ? void 0 : te.scrollLeft) ?? 0) > 0;\n      _e !== Ne.value && (Ne.value = _e);\n    }\n    dt(() => {\n      !$e.value || typeof ResizeObserver > \"u\" || (ze = new ResizeObserver((H) => {\n        var _e, Me;\n        const te = ((Me = (_e = H[0]) == null ? void 0 : _e.contentRect) == null ? void 0 : Me.width) ?? 0;\n        Math.abs(te - Se.value) >= 1 && (Se.value = te);\n      }), ze.observe($e.value));\n    }), it(() => {\n      ze == null || ze.disconnect(), ze = null, window.removeEventListener(\"pointermove\", ye), window.removeEventListener(\"pointerup\", je);\n    });\n    const De = k(() => Zy(Se.value, W.value)), ie = k(() => De.value.visible), ce = k(() => ({ width: `${De.value.total}px` }));\n    function L(H) {\n      return { flex: `0 0 ${De.value.widths[H] ?? wo(H)}px` };\n    }\n    function se(H) {\n      return `fe-list__col fe-list__col--${H === \"modified\" ? \"mod\" : H}`;\n    }\n    const Ce = {\n      type: \"type\",\n      modified: \"modified\",\n      size: \"size\"\n    }, We = {\n      name: \"col.name\",\n      type: \"col.type\",\n      location: \"col.location\",\n      owner: \"col.owner\",\n      modified: \"col.modified\",\n      size: \"col.size\",\n      star: \"col.star\"\n    };\n    function Ie(H) {\n      return a(We[H]);\n    }\n    function Ze(H, te) {\n      switch (H) {\n        case \"type\":\n          return P(te);\n        case \"location\":\n          return oe(te);\n        case \"owner\":\n          return Le(te);\n        case \"modified\":\n          return G(te.last_modified);\n        case \"size\":\n          return u(te.size);\n        default:\n          return \"\";\n      }\n    }\n    function vt(H, te) {\n      if (H === \"owner\") return q(te);\n      if (H === \"modified\") return N(te.last_modified);\n      if (H === \"location\") return oe(te) || void 0;\n    }\n    function Xe(H) {\n      if (!n.showParentPath || ie.value.includes(\"location\")) return H.basename;\n      const te = oe(H);\n      return te ? `${H.basename} · ${te}` : H.basename;\n    }\n    function Ae(H) {\n      var te;\n      return ((te = ma.find((_e) => _e.id === H)) == null ? void 0 : te.resizable) === !0;\n    }\n    let V = null;\n    function R() {\n      Td() && Vy(De.value.widths);\n    }\n    function X(H, te) {\n      Ae(H) && (te.preventDefault(), te.stopPropagation(), R(), V = { id: H, startX: te.clientX, startW: wo(H) }, window.addEventListener(\"pointermove\", ye), window.addEventListener(\"pointerup\", je));\n    }\n    function ye(H) {\n      V && Jr(V.id, V.startW + (H.clientX - V.startX));\n    }\n    function je() {\n      V = null, window.removeEventListener(\"pointermove\", ye), window.removeEventListener(\"pointerup\", je);\n    }\n    function Qe(H, te) {\n      const _e = te.key === \"ArrowLeft\" ? -16 : te.key === \"ArrowRight\" ? 16 : 0;\n      _e && (te.preventDefault(), R(), Jr(H, wo(H) + _e));\n    }\n    function at(H) {\n      const te = ma.find((_e) => _e.id === H);\n      te && (R(), Jr(H, te.width));\n    }\n    let Ye = null;\n    const lt = m(null), fe = m(null);\n    let Pe = 0, Be = !1;\n    function ht(H) {\n      var te;\n      return ((te = ma.find((_e) => _e.id === H)) == null ? void 0 : te.hideable) === !0;\n    }\n    function Ft(H, te) {\n      te.button !== 0 || !ht(H) || (Ye = { id: H, startX: te.clientX, armed: !1 }, window.addEventListener(\"pointermove\", ft), window.addEventListener(\"pointerup\", qt), window.addEventListener(\"keydown\", Gt, !0));\n    }\n    function ft(H) {\n      var Oe;\n      if (!Ye) return;\n      if (!Ye.armed) {\n        if (Math.abs(H.clientX - Ye.startX) < fE) return;\n        Ye.armed = !0, lt.value = Ye.id;\n      }\n      const te = (Oe = $e.value) == null ? void 0 : Oe.querySelector(\".fe-list__head\");\n      if (!te) return;\n      const Me = [...te.querySelectorAll(\".fe-list__col\")].slice(2, 2 + ie.value.length);\n      let ge = Me.length;\n      for (let mt = 0; mt < Me.length; mt++) {\n        const Xt = Me[mt].getBoundingClientRect();\n        if (H.clientX < Xt.left + Xt.width / 2) {\n          ge = mt;\n          break;\n        }\n      }\n      fe.value = ge;\n    }\n    function qt() {\n      const H = Ye, te = fe.value;\n      if (wt(), !(H != null && H.armed) || Be) {\n        Be = !1;\n        return;\n      }\n      if (Pe = Date.now(), te == null) return;\n      const _e = ie.value.filter((Oe) => Oe !== H.id), Me = _e[Math.min(te, _e.length)], ge = ga();\n      Cd(H.id, Me ? ge.indexOf(Me) : ge.length);\n    }\n    function Gt(H) {\n      if (H.key !== \"Escape\") return;\n      H.stopPropagation();\n      const te = (Ye == null ? void 0 : Ye.armed) === !0;\n      wt(), te && (Be = !0, Pe = Date.now());\n    }\n    function wt() {\n      Ye = null, lt.value = null, fe.value = null, window.removeEventListener(\"pointermove\", ft), window.removeEventListener(\"pointerup\", qt), window.removeEventListener(\"keydown\", Gt, !0);\n    }\n    function en(H) {\n      Date.now() - Pe > pE || (Pe = 0, H.preventDefault(), H.stopPropagation());\n    }\n    const $t = m(!1), kt = m(0), Dt = m(0), At = m(null), Ot = m(!1);\n    dt(() => {\n      var H;\n      try {\n        Ot.value = ((H = window.matchMedia) == null ? void 0 : H.call(window, \"(prefers-color-scheme: dark)\").matches) ?? !1;\n      } catch {\n      }\n    });\n    const Bt = k(\n      () => `fe-ctx-backdrop--theme-${n.theme || \"auto\"}`\n    ), un = k(\n      () => (\n        /* In the person's OWN order, so this list reads as the list on screen — a\n           settings panel that disagrees with the thing it configures is how someone\n           ends up nudging the wrong column left. */\n        ga().filter((H) => {\n          var te;\n          return ((te = ma.find((_e) => _e.id === H)) == null ? void 0 : te.hideable) && W.value.includes(H);\n        }).map((H) => ({\n          id: H,\n          label: Ie(H),\n          on: !Ks(H),\n          canLeft: pu(H, -1),\n          canRight: pu(H, 1)\n        }))\n      )\n    );\n    function pt(H, te) {\n      Uy(H, te);\n    }\n    const tn = k(() => Wy()), xt = k(() => Hy()), jt = k(() => !!n.folderKey && Iy(n.folderKey));\n    async function Pt(H) {\n      var Me;\n      H.preventDefault(), H.stopPropagation();\n      const te = H.currentTarget, _e = te == null ? void 0 : te.getBoundingClientRect();\n      kt.value = H.clientX || (_e ? _e.left : 0), Dt.value = H.clientY || (_e ? _e.bottom : 0), $t.value = !0, await gt(), _t(), (Me = At.value) == null || Me.focus();\n    }\n    function _t() {\n      const H = At.value;\n      if (!H) return;\n      const te = H.getBoundingClientRect(), _e = 8;\n      te.right > window.innerWidth - _e && (kt.value = Math.max(_e, window.innerWidth - _e - te.width)), te.bottom > window.innerHeight - _e && (Dt.value = Math.max(_e, window.innerHeight - _e - te.height));\n    }\n    function St() {\n      $t.value = !1;\n    }\n    function sn(H) {\n      jy(H, !Ks(H));\n    }\n    function Nt() {\n      Yy();\n    }\n    function nn() {\n      Ry(), St();\n    }\n    function mn() {\n      n.folderKey && Ky(n.folderKey), St();\n    }\n    const xe = k(() => {\n      const H = [], te = [];\n      for (const _e of n.files) (J(_e) ? H : te).push(_e);\n      return [...H, ...te.sort(pe.compareInOrder(n.order ?? \"sort\"))];\n    }), de = k(() => ({ t: a, formatMonthYear: h, zonedYearMonth: b }));\n    He(\n      xe,\n      (H) => r(\"display-order\", H),\n      { immediate: !0 }\n    );\n    function Le(H) {\n      return Ri(H) ? a(\"owner.you\") : So(H) === null ? a(\"owner.system\") : zd(H) || a(\"owner.unknown\");\n    }\n    function q(H) {\n      const te = [Le(H)];\n      wb(H) && te.push(a(\"owner.external\"));\n      const _e = H.last_actor_name, Me = H.last_actor_self === !0, ge = H.last_actor_id;\n      if (Me || typeof _e == \"string\" && _e) {\n        const Oe = Me ? a(\"owner.you\") : String(_e);\n        Oe !== te[0] && te.push(a(\"owner.last_actor\", { who: Oe }));\n      } else ge === void 0 && So(H) !== null && te.push(a(\"owner.last_actor\", { who: a(\"owner.system\") }));\n      return te.join(\" · \");\n    }\n    const ne = k(\n      () => Gi(xe.value, {\n        /* ⚠ `ranked` is half of this and not a detail: over a search's ranked\n         * answer the key is still `modified` (nothing cleared it), the listing\n         * just is not obeying it — see `lib/dateGroups.groupingActive`. */\n        active: qi(re.value, n.order),\n        dateOf: (H) => y(H.last_modified),\n        /* ⚠ Folders are their OWN run, above the first date heading, and that is\n         * what lets \"folders before files\" hold while sorted by date. The rule\n         * used to be softened instead — rows sorted by date, folders floating to\n         * the top of each bucket — because hoisting them all would have split a\n         * bucket in two and drawn \"Today\" twice, once over the folders and once\n         * over the files. A run of their own removes that reason, and a folder has\n         * no meaningful modification date to file under anyway. */\n        aside: (H) => J(H) ? { id: \"pinned\" } : H.type === \"dir\" ? { id: \"dirs\" } : null,\n        labels: de.value\n      }).runs\n    );\n    return (H, te) => (c(), d(ae, null, [\n      o(\"div\", {\n        ref_key: \"listEl\",\n        ref: $e,\n        class: we([\"fe-list\", {\n          \"is-loading\": e.loading,\n          \"has-star-col\": !!e.apiBase || e.apiBase === \"\",\n          \"is-scrolled-x\": Ne.value\n        }]),\n        role: \"grid\",\n        \"aria-label\": s(a)(\"list.aria\"),\n        \"aria-busy\": e.loading ? \"true\" : void 0,\n        onScrollPassive: be\n      }, [\n        o(\"div\", {\n          class: we([\"fe-list__head\", { \"is-dragging-col\": !!lt.value }]),\n          role: \"row\",\n          style: Ct(ce.value),\n          onContextmenu: Pt,\n          onClickCapture: en\n        }, [\n          te[13] || (te[13] = o(\"div\", {\n            class: \"fe-list__col fe-list__col--check\",\n            role: \"columnheader\"\n          }, null, -1)),\n          o(\"div\", {\n            class: \"fe-list__col fe-list__col--name\",\n            role: \"columnheader\",\n            style: Ct(L(\"name\")),\n            \"aria-sort\": Z(\"name\")\n          }, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-list__sort\",\n              disabled: w.value,\n              title: K.value,\n              onClick: te[0] || (te[0] = (_e) => j(\"name\"))\n            }, [\n              Je(f(s(a)(\"col.name\")) + \" \", 1),\n              !w.value && re.value === \"name\" ? (c(), d(\"span\", CM, f(S.value === \"asc\" ? \"↑\" : \"↓\"), 1)) : g(\"\", !0)\n            ], 8, SM),\n            o(\"span\", {\n              class: \"fe-list__resize\",\n              role: \"separator\",\n              \"aria-orientation\": \"vertical\",\n              tabindex: \"0\",\n              \"aria-label\": s(a)(\"cols.resize\", { col: s(a)(\"col.name\") }),\n              title: s(a)(\"cols.resize\", { col: s(a)(\"col.name\") }),\n              onPointerdown: te[1] || (te[1] = (_e) => X(\"name\", _e)),\n              onDblclick: te[2] || (te[2] = Re((_e) => at(\"name\"), [\"stop\"])),\n              onKeydown: te[3] || (te[3] = (_e) => Qe(\"name\", _e))\n            }, null, 40, TM)\n          ], 12, xM),\n          (c(!0), d(ae, null, Te(ie.value, (_e, Me) => (c(), d(\"div\", {\n            key: _e,\n            class: we([\n              se(_e),\n              {\n                \"is-col-dragging\": lt.value === _e,\n                \"is-drop-before\": fe.value === Me && !!lt.value && lt.value !== _e,\n                \"is-drop-after\": fe.value === ie.value.length && Me === ie.value.length - 1 && !!lt.value,\n                \"is-movable\": ht(_e)\n              }\n            ]),\n            role: \"columnheader\",\n            style: Ct(L(_e)),\n            \"aria-sort\": Ce[_e] ? Z(Ce[_e]) : void 0,\n            \"aria-label\": _e === \"star\" ? s(a)(\"col.star\") : void 0,\n            onPointerdown: (ge) => Ft(_e, ge)\n          }, [\n            Ce[_e] ? (c(), d(\"button\", {\n              key: 0,\n              type: \"button\",\n              class: \"fe-list__sort\",\n              disabled: w.value,\n              title: K.value,\n              onClick: (ge) => j(Ce[_e])\n            }, [\n              Je(f(Ie(_e)) + \" \", 1),\n              !w.value && re.value === Ce[_e] ? (c(), d(\"span\", zM, f(S.value === \"asc\" ? \"↑\" : \"↓\"), 1)) : g(\"\", !0)\n            ], 8, EM)) : _e !== \"star\" ? (c(), d(\"span\", AM, f(Ie(_e)), 1)) : g(\"\", !0),\n            Ae(_e) ? (c(), d(\"span\", {\n              key: 2,\n              class: \"fe-list__resize\",\n              role: \"separator\",\n              \"aria-orientation\": \"vertical\",\n              tabindex: \"0\",\n              \"aria-label\": s(a)(\"cols.resize\", { col: Ie(_e) }),\n              title: s(a)(\"cols.resize\", { col: Ie(_e) }),\n              onPointerdown: (ge) => X(_e, ge),\n              onDblclick: Re((ge) => at(_e), [\"stop\"]),\n              onKeydown: (ge) => Qe(_e, ge)\n            }, null, 40, PM)) : g(\"\", !0)\n          ], 46, MM))), 128)),\n          o(\"div\", LM, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-list__menu fe-list__colmenu-btn\",\n              title: s(a)(\"cols.menu\"),\n              \"aria-label\": s(a)(\"cols.menu\"),\n              \"aria-haspopup\": \"dialog\",\n              \"aria-expanded\": $t.value ? \"true\" : \"false\",\n              onClick: Pt\n            }, [...te[12] || (te[12] = [\n              o(\"span\", { \"aria-hidden\": \"true\" }, \"⋮\", -1)\n            ])], 8, DM)\n          ])\n        ], 38),\n        o(\"div\", OM, [\n          (c(!0), d(ae, null, Te(ne.value, (_e) => (c(), d(ae, {\n            key: _e.id\n          }, [\n            _e.label ? (c(), d(\"div\", BM, f(_e.label), 1)) : g(\"\", !0),\n            (c(!0), d(ae, null, Te(_e.items, (Me) => {\n              var ge;\n              return c(), d(\"div\", {\n                key: Me.path,\n                class: we([\"fe-list__row\", {\n                  \"is-selected\": D(Me),\n                  \"is-dir\": Me.type === \"dir\",\n                  \"is-trash\": Me.trashed,\n                  \"is-clipped\": (ge = e.clipped) == null ? void 0 : ge.has(Me.path),\n                  \"is-droptarget\": $.value === Me.path\n                }]),\n                role: \"row\",\n                tabindex: \"0\",\n                style: Ct(\n                  ce.value\n                  /* tablo:t2 — the head's own width, so the two cannot drift */\n                ),\n                \"aria-selected\": D(Me) ? \"true\" : \"false\",\n                \"aria-label\": s(A)(Me),\n                \"data-fe-path\": Me.path,\n                draggable: \"true\",\n                onClick: (Oe) => C(Me, Oe),\n                onDblclick: (Oe) => B(Me),\n                onContextmenu: (Oe) => I(Me, Oe),\n                onDragstart: (Oe) => E(Me, Oe),\n                onDragover: (Oe) => M(Me, Oe),\n                onDragleave: (Oe) => z(Me),\n                onDrop: (Oe) => T(Me, Oe),\n                onTouchstartPassive: (Oe) => s(Y).onTouchStart(Me, Oe),\n                onTouchend: te[9] || (te[9] = //@ts-ignore\n                (...Oe) => s(Y).onTouchEnd && s(Y).onTouchEnd(...Oe)),\n                onTouchmovePassive: te[10] || (te[10] = //@ts-ignore\n                (...Oe) => s(Y).onTouchMove && s(Y).onTouchMove(...Oe))\n              }, [\n                o(\"div\", {\n                  class: \"fe-list__col fe-list__col--check\",\n                  role: \"gridcell\",\n                  \"data-fe-control\": \"\",\n                  onClick: Re((Oe) => x(Me, Oe), [\"stop\"]),\n                  onDblclick: te[4] || (te[4] = Re(() => {\n                  }, [\"stop\"]))\n                }, [\n                  Ge(Yi, {\n                    on: D(Me),\n                    label: s(A)(Me)\n                  }, null, 8, [\"on\", \"label\"])\n                ], 40, HM),\n                o(\"div\", {\n                  class: \"fe-list__col fe-list__col--name\",\n                  role: \"gridcell\",\n                  style: Ct(L(\"name\"))\n                }, [\n                  s(Ls)(Me) ? (c(), d(\"span\", {\n                    key: 0,\n                    class: \"fe-list__icon fe-list__icon--svg\",\n                    role: \"img\",\n                    \"aria-label\": s(a)(\"e2e.badge\"),\n                    innerHTML: s(Ds)()\n                  }, null, 8, FM)) : le(Me) ? (c(), d(\"img\", {\n                    key: 1,\n                    class: we([\"fe-list__icon fe-list__icon--img\", { \"fe-thumb--page\": s(Wi)(Me) }]),\n                    src: le(Me),\n                    alt: \"\",\n                    \"aria-hidden\": \"true\",\n                    loading: \"lazy\",\n                    draggable: \"false\"\n                  }, null, 10, NM)) : (c(), d(\"span\", {\n                    key: 2,\n                    class: \"fe-list__icon fe-list__icon--svg\",\n                    \"aria-hidden\": \"true\",\n                    innerHTML: s(fn)(Me)\n                  }, null, 8, KM)),\n                  o(\"div\", RM, [\n                    o(\"span\", {\n                      class: \"fe-list__name\",\n                      title: Xe(Me)\n                    }, [\n                      Je(f(s(A)(Me)) + \" \", 1),\n                      Q(Me) ? (c(), d(\"span\", VM, f(s(a)(\"search.in_content\")), 1)) : g(\"\", !0),\n                      e.keepBadgeFor && e.keepBadgeFor(Me) ? (c(), d(\"span\", {\n                        key: 1,\n                        class: we([\"fe-keepbadge\", \"fe-keepbadge--\" + e.keepBadgeFor(Me)]),\n                        title: s(a)(\"keep.badge_\" + e.keepBadgeFor(Me)),\n                        role: \"img\",\n                        \"aria-label\": s(a)(\"keep.badge_\" + e.keepBadgeFor(Me))\n                      }, f(O(e.keepBadgeFor(Me))), 11, jM)) : g(\"\", !0)\n                    ], 8, UM),\n                    ue(Me) ? (c(), d(\"span\", YM, [\n                      (c(!0), d(ae, null, Te(s(Vs)(ue(Me)), (Oe, mt) => (c(), d(ae, { key: mt }, [\n                        Oe.match ? (c(), d(\"mark\", WM, f(Oe.text), 1)) : (c(), d(ae, { key: 1 }, [\n                          Je(f(Oe.text), 1)\n                        ], 64))\n                      ], 64))), 128))\n                    ])) : g(\"\", !0)\n                  ]),\n                  he(Me) && !ve.value ? (c(), d(\"span\", qM, f(s(a)(\"node.folder\")), 1)) : g(\"\", !0)\n                ], 4),\n                (c(!0), d(ae, null, Te(ie.value, (Oe) => {\n                  var mt;\n                  return c(), d(ae, { key: Oe }, [\n                    Oe === \"star\" ? (c(), d(\"div\", {\n                      key: 0,\n                      class: \"fe-list__col fe-list__col--star\",\n                      role: \"gridcell\",\n                      style: Ct(L(Oe))\n                    }, [\n                      e.starEnabled !== !1 && typeof Me.id == \"number\" && Me.type === \"file\" ? (c(), d(\"span\", {\n                        key: 0,\n                        class: \"fe-list__star-hit\",\n                        \"data-fe-control\": \"\",\n                        onClick: te[5] || (te[5] = Re(() => {\n                        }, [\"stop\"])),\n                        onDblclick: te[6] || (te[6] = Re(() => {\n                        }, [\"stop\"]))\n                      }, [\n                        Ge(er, {\n                          starred: !!((mt = e.starredIds) != null && mt.has(Me.id)),\n                          \"node-id\": Me.id,\n                          \"api-base\": e.apiBase,\n                          \"auth-headers\": e.authHeaders,\n                          \"auth-credentials\": e.authCredentials,\n                          locale: e.locale,\n                          compact: \"\",\n                          onChange: (Xt) => r(\"star-change\", Me, Xt)\n                        }, null, 8, [\"starred\", \"node-id\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"locale\", \"onChange\"])\n                      ], 32)) : g(\"\", !0)\n                    ], 4)) : (c(), d(\"div\", {\n                      key: 1,\n                      class: we(se(Oe)),\n                      role: \"gridcell\",\n                      style: Ct(L(Oe)),\n                      title: vt(Oe, Me)\n                    }, f(Ze(Oe, Me)), 15, GM))\n                  ], 64);\n                }), 128)),\n                o(\"div\", {\n                  class: \"fe-list__col fe-list__col--menu\",\n                  role: \"gridcell\",\n                  \"data-fe-control\": \"\",\n                  onClick: te[7] || (te[7] = Re(() => {\n                  }, [\"stop\"])),\n                  onDblclick: te[8] || (te[8] = Re(() => {\n                  }, [\"stop\"]))\n                }, [\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-list__menu\",\n                    title: s(a)(\"toolbar.more\"),\n                    \"aria-label\": s(a)(\"toolbar.more\"),\n                    onClick: (Oe) => U(Me, Oe)\n                  }, [...te[14] || (te[14] = [\n                    o(\"span\", { \"aria-hidden\": \"true\" }, \"⋮\", -1)\n                  ])], 8, XM)\n                ], 32)\n              ], 46, IM);\n            }), 128))\n          ], 64))), 128)),\n          !e.loading && xe.value.length === 0 ? (c(), d(\"div\", JM, f(s(a)(\"empty.folder\")), 1)) : g(\"\", !0)\n        ])\n      ], 42, $M),\n      (c(), et(ja, { to: \"body\" }, [\n        $t.value ? (c(), d(\"div\", {\n          key: 0,\n          class: we([\"fe-colmenu__backdrop\", Bt.value]),\n          \"data-prefers-dark\": Ot.value ? \"1\" : \"0\",\n          onClick: St,\n          onContextmenu: Re(St, [\"prevent\"])\n        }, [\n          o(\"div\", {\n            ref_key: \"colMenuEl\",\n            ref: At,\n            class: \"fe-colmenu\",\n            role: \"dialog\",\n            tabindex: \"-1\",\n            \"aria-label\": s(a)(\"cols.menu\"),\n            style: Ct({ top: Dt.value + \"px\", left: kt.value + \"px\" }),\n            onClick: te[11] || (te[11] = Re(() => {\n            }, [\"stop\"])),\n            onKeydown: Ut(Re(St, [\"stop\"]), [\"esc\"])\n          }, [\n            o(\"p\", eE, f(s(a)(\"cols.title\")), 1),\n            (c(!0), d(ae, null, Te(un.value, (_e) => (c(), d(\"div\", {\n              key: _e.id,\n              class: \"fe-colmenu__line\"\n            }, [\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-colmenu__row\",\n                role: \"checkbox\",\n                \"aria-checked\": _e.on ? \"true\" : \"false\",\n                onClick: (Me) => sn(_e.id)\n              }, [\n                o(\"span\", {\n                  class: we([\"fe-list__check fe-colmenu__tick\", { \"is-on\": _e.on }]),\n                  \"aria-hidden\": \"true\"\n                }, null, 2),\n                o(\"span\", nE, f(_e.label), 1)\n              ], 8, tE),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-colmenu__nudge\",\n                disabled: !_e.canLeft,\n                title: s(a)(\"cols.move_left\", { col: _e.label }),\n                \"aria-label\": s(a)(\"cols.move_left\", { col: _e.label }),\n                onClick: (Me) => pt(_e.id, -1)\n              }, [...te[15] || (te[15] = [\n                o(\"span\", { \"aria-hidden\": \"true\" }, \"←\", -1)\n              ])], 8, aE),\n              o(\"button\", {\n                type: \"button\",\n                class: \"fe-colmenu__nudge\",\n                disabled: !_e.canRight,\n                title: s(a)(\"cols.move_right\", { col: _e.label }),\n                \"aria-label\": s(a)(\"cols.move_right\", { col: _e.label }),\n                onClick: (Me) => pt(_e.id, 1)\n              }, [...te[16] || (te[16] = [\n                o(\"span\", { \"aria-hidden\": \"true\" }, \"→\", -1)\n              ])], 8, oE)\n            ]))), 128)),\n            tn.value ? (c(), d(\"div\", sE)) : g(\"\", !0),\n            tn.value ? (c(), d(\"button\", {\n              key: 1,\n              type: \"button\",\n              class: \"fe-colmenu__row\",\n              onClick: Nt\n            }, [\n              o(\"span\", rE, f(s(a)(\"cols.reset\")), 1)\n            ])) : g(\"\", !0),\n            jt.value || xt.value > 0 ? (c(), d(\"div\", iE)) : g(\"\", !0),\n            jt.value || xt.value > 0 ? (c(), d(\"p\", lE, f(s(a)(\"cols.folder_title\")), 1)) : g(\"\", !0),\n            jt.value || xt.value > 0 ? (c(), d(\"p\", cE, f(s(a)(\"cols.folder_hint\")), 1)) : g(\"\", !0),\n            jt.value ? (c(), d(\"button\", {\n              key: 5,\n              type: \"button\",\n              class: \"fe-colmenu__row\",\n              onClick: mn\n            }, [\n              o(\"span\", uE, f(s(a)(\"cols.forget_folder\")), 1)\n            ])) : g(\"\", !0),\n            xt.value > 0 ? (c(), d(\"button\", {\n              key: 6,\n              type: \"button\",\n              class: \"fe-colmenu__row\",\n              onClick: nn\n            }, [\n              o(\"span\", dE, f(s(a)(\"cols.apply_all\", { count: xt.value })), 1)\n            ])) : g(\"\", !0)\n          ], 44, QM)\n        ], 42, ZM)) : g(\"\", !0)\n      ]))\n    ], 64));\n  }\n}), hE = [\"aria-label\", \"aria-busy\"], mE = {\n  key: 0,\n  class: \"fe-gal__heading\",\n  \"aria-hidden\": \"true\"\n}, yE = [\"aria-selected\", \"aria-label\", \"data-fe-path\", \"onClick\", \"onDblclick\", \"onContextmenu\", \"onDragstart\", \"onDragover\", \"onDragleave\", \"onDrop\", \"onTouchstartPassive\"], bE = {\n  key: 0,\n  class: \"fe-fprev__tint\"\n}, gE = [\"innerHTML\"], kE = [\"src\", \"alt\"], _E = [\"aria-label\", \"innerHTML\"], wE = [\"innerHTML\"], $E = {\n  key: 4,\n  class: \"fe-thumb__play\",\n  \"aria-hidden\": \"true\"\n}, xE = [\"onClick\"], SE = {\n  class: \"fe-gal__meta\",\n  \"aria-hidden\": \"true\"\n}, CE = {\n  key: 0,\n  class: \"fe-gal__meta-line\"\n}, TE = [\"title\"], ME = [\"title\"], EE = {\n  key: 0,\n  class: \"fe-gal__empty\"\n}, zE = /* @__PURE__ */ qe({\n  __name: \"GalleryView\",\n  props: {\n    files: {},\n    selected: {},\n    clipped: {},\n    showParentPath: { type: Boolean },\n    locale: {},\n    loading: { type: Boolean },\n    thumbSrc: {},\n    starredIds: {},\n    starEnabled: { type: Boolean },\n    apiBase: {},\n    authHeaders: {},\n    authCredentials: {},\n    e2eActive: { type: Boolean },\n    order: {},\n    selectable: { type: Boolean, default: !0 }\n  },\n  emits: [\"click-card\", \"dbl-card\", \"context-card\", \"item-drag-start\", \"item-drop-into\", \"star-change\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a, formatSize: u, nodeDisplayName: v, formatDate: p, formatMonthYear: h, zonedYearMonth: b, toDate: y } = tt(() => n.locale), A = Ao(), D = k(\n      () => Gi(n.files, {\n        active: qi(A.key.value, n.order),\n        dateOf: (oe) => y(oe.last_modified),\n        aside: (oe) => oe.type === \"dir\" ? { id: \"dirs\" } : null,\n        labels: { t: a, formatMonthYear: h, zonedYearMonth: b }\n      })\n    );\n    function C(oe) {\n      return n.thumbSrc ? n.thumbSrc(oe) : oe.thumb_url ?? null;\n    }\n    const B = Ld({\n      apiBase: n.apiBase,\n      authHeaders: n.authHeaders ? () => n.authHeaders() : void 0,\n      credentials: n.authCredentials,\n      disabled: () => n.e2eActive === !0\n    });\n    it(() => B.dispose());\n    function I(oe) {\n      return B.kindFor(oe);\n    }\n    function U(oe) {\n      const ue = B.get(oe);\n      return ue ? [ue] : [];\n    }\n    function x(oe, ue) {\n      B.bind(oe instanceof Element ? oe : null, ue);\n    }\n    function E(oe) {\n      return n.starEnabled === !1 ? !1 : n.apiBase !== void 0 && typeof oe.id == \"number\" && oe.type === \"file\";\n    }\n    function $(oe) {\n      return n.selected.has(oe.path);\n    }\n    function M(oe, ue) {\n      r(\"click-card\", oe, Vi(ue));\n    }\n    function z(oe, ue) {\n      r(\"click-card\", oe, Ui(ue, le.isTap(ue)));\n    }\n    function T(oe) {\n      r(\"dbl-card\", oe);\n    }\n    function Y(oe, ue) {\n      ue.preventDefault(), ue.stopPropagation(), r(\"context-card\", oe, ue);\n    }\n    function O(oe, ue) {\n      Xi(\n        ue,\n        v(oe),\n        n.selected.has(oe.path) ? n.selected.size : 1\n      ), r(\"item-drag-start\", oe, ue);\n    }\n    const J = m(null);\n    function G(oe, ue) {\n      oe.type === \"dir\" && vn(ue) && (ue.preventDefault(), ue.stopPropagation(), ue.dataTransfer && (ue.dataTransfer.dropEffect = \"move\"), J.value = oe.path);\n    }\n    function N(oe) {\n      J.value === oe.path && (J.value = null);\n    }\n    function P(oe, ue) {\n      J.value = null, oe.type === \"dir\" && vn(ue) && (ue.preventDefault(), ue.stopPropagation(), r(\"item-drop-into\", oe, ue));\n    }\n    const le = ji(\n      (oe, ue) => r(\"context-card\", oe, { ...ue, preventDefault: () => {\n      }, stopPropagation: () => {\n      } }),\n      {\n        // A finger lifted on the item, off its controls, opens at touchend — see useRowTouch.\n        onTap: (oe) => r(\"click-card\", oe, { ctrl: !1, shift: !1, touch: !0 })\n      }\n    );\n    function ve(oe) {\n      return p(oe, { time: !0 });\n    }\n    function he(oe) {\n      const ue = ve(oe.last_modified);\n      return [oe.type === \"dir\" ? \"\" : u(oe.size), ue].filter((pe) => !!pe).join(\" · \");\n    }\n    return (oe, ue) => (c(), d(\"div\", {\n      class: we([\"fe-gal\", { \"is-loading\": e.loading, \"has-selection\": e.selectable && e.selected.size > 0 }]),\n      role: \"listbox\",\n      \"aria-multiselectable\": \"true\",\n      \"aria-label\": s(a)(\"gallery.aria\"),\n      \"aria-busy\": e.loading ? \"true\" : void 0\n    }, [\n      (c(!0), d(ae, null, Te(e.files, (Q) => {\n        var pe, re;\n        return c(), d(ae, {\n          key: Q.path\n        }, [\n          D.value.headingBefore(Q) ? (c(), d(\"p\", mE, f(D.value.headingBefore(Q)), 1)) : g(\"\", !0),\n          o(\"div\", {\n            class: we([\"fe-gal__card\", {\n              \"is-selected\": $(Q),\n              \"is-dir\": Q.type === \"dir\",\n              \"is-trash\": Q.trashed,\n              \"is-clipped\": (pe = e.clipped) == null ? void 0 : pe.has(Q.path),\n              \"is-droptarget\": J.value === Q.path\n            }]),\n            tabindex: \"0\",\n            role: \"option\",\n            \"aria-selected\": $(Q) ? \"true\" : \"false\",\n            \"aria-label\": s(v)(Q),\n            \"data-fe-path\": Q.path,\n            draggable: \"true\",\n            onClick: (S) => z(Q, S),\n            onDblclick: (S) => T(Q),\n            onContextmenu: (S) => Y(Q, S),\n            onDragstart: (S) => O(Q, S),\n            onDragover: (S) => G(Q, S),\n            onDragleave: (S) => N(Q),\n            onDrop: (S) => P(Q, S),\n            onTouchstartPassive: (S) => s(le).onTouchStart(Q, S),\n            onTouchend: ue[3] || (ue[3] = //@ts-ignore\n            (...S) => s(le).onTouchEnd && s(le).onTouchEnd(...S)),\n            onTouchmovePassive: ue[4] || (ue[4] = //@ts-ignore\n            (...S) => s(le).onTouchMove && s(le).onTouchMove(...S))\n          }, [\n            o(\"div\", {\n              class: \"fe-gal__thumb\",\n              ref_for: !0,\n              ref: (S) => x(S, Q)\n            }, [\n              I(Q) ? (c(), d(ae, { key: 0 }, [\n                (c(!0), d(ae, null, Te(U(Q), (S) => (c(), d(\"div\", {\n                  key: \"fprev\",\n                  class: we([\"fe-fprev\", \"fe-fprev--\" + S.kind]),\n                  style: Ct(S.kind === \"table\" ? { \"--fprev-cols\": String(S.cols) } : void 0),\n                  \"aria-hidden\": \"true\"\n                }, [\n                  S.kind === \"table\" ? (c(!0), d(ae, { key: 0 }, Te(S.rows, (w, j) => (c(), d(ae, { key: j }, [\n                    (c(!0), d(ae, null, Te(w, (K, Z) => (c(), d(\"span\", {\n                      key: Z,\n                      class: we([\"fe-fprev__cell\", { \"is-head\": j === 0 }])\n                    }, f(K), 3))), 128))\n                  ], 64))), 128)) : (c(!0), d(ae, { key: 1 }, Te(S.lines, (w, j) => (c(), d(\"div\", {\n                    key: j,\n                    class: \"fe-fprev__line\"\n                  }, [\n                    w.tint ? (c(), d(\"span\", bE, f(w.indent) + f(w.tint), 1)) : g(\"\", !0),\n                    Je(f(w.text), 1)\n                  ]))), 128))\n                ], 6))), 128)),\n                U(Q).length === 0 ? (c(), d(\"span\", {\n                  key: 0,\n                  class: \"fe-gal__icon fe-gal__icon--svg\",\n                  innerHTML: s(fn)(Q)\n                }, null, 8, gE)) : g(\"\", !0)\n              ], 64)) : C(Q) ? (c(), d(\"img\", {\n                key: 1,\n                src: C(Q),\n                alt: Q.basename,\n                class: we({\n                  \"fe-thumb--page\": s(Wi)(Q)\n                  /* gorunum:v1-preview — crop a page from its TOP */\n                }),\n                loading: \"lazy\",\n                draggable: \"false\"\n              }, null, 10, kE)) : s(Ls)(Q) ? (c(), d(\"span\", {\n                key: 2,\n                class: \"fe-gal__icon fe-gal__icon--svg\",\n                role: \"img\",\n                \"aria-label\": s(a)(\"e2e.badge\"),\n                innerHTML: s(Ds)()\n              }, null, 8, _E)) : (c(), d(\"span\", {\n                key: 3,\n                class: \"fe-gal__icon fe-gal__icon--svg\",\n                innerHTML: s(fn)(Q)\n              }, null, 8, wE)),\n              !I(Q) && C(Q) && s(Pd)(Q) ? (c(), d(\"span\", $E)) : g(\"\", !0),\n              e.selectable ? (c(), d(\"span\", {\n                key: 5,\n                class: \"fe-item-check fe-gal__check\",\n                \"data-fe-control\": \"\",\n                onClick: Re((S) => M(Q, S), [\"stop\"]),\n                onDblclick: ue[0] || (ue[0] = Re(() => {\n                }, [\"stop\"]))\n              }, [\n                Ge(Yi, {\n                  on: $(Q),\n                  label: s(v)(Q)\n                }, null, 8, [\"on\", \"label\"])\n              ], 40, xE)) : g(\"\", !0),\n              E(Q) ? (c(), d(\"div\", {\n                key: 6,\n                class: \"fe-gal__star\",\n                onClick: ue[1] || (ue[1] = Re(() => {\n                }, [\"stop\"])),\n                onDblclick: ue[2] || (ue[2] = Re(() => {\n                }, [\"stop\"]))\n              }, [\n                Ge(er, {\n                  starred: !!((re = e.starredIds) != null && re.has(Q.id)),\n                  \"node-id\": Q.id,\n                  \"api-base\": e.apiBase,\n                  \"auth-headers\": e.authHeaders,\n                  \"auth-credentials\": e.authCredentials,\n                  locale: e.locale,\n                  compact: \"\",\n                  card: \"\",\n                  onChange: (S) => r(\"star-change\", Q, S)\n                }, null, 8, [\"starred\", \"node-id\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"locale\", \"onChange\"])\n              ], 32)) : g(\"\", !0),\n              o(\"div\", SE, [\n                he(Q) ? (c(), d(\"span\", CE, f(he(Q)), 1)) : g(\"\", !0),\n                e.showParentPath && s(ya)(Q.path) ? (c(), d(\"span\", {\n                  key: 1,\n                  class: \"fe-gal__meta-line fe-gal__meta-line--path\",\n                  title: s(ya)(Q.path)\n                }, f(s(ya)(Q.path)), 9, TE)) : g(\"\", !0)\n              ])\n            ], 512),\n            o(\"div\", {\n              class: \"fe-gal__label\",\n              title: Q.basename\n            }, f(s(v)(Q)), 9, ME)\n          ], 42, yE)\n        ], 64);\n      }), 128)),\n      !e.loading && e.files.length === 0 ? (c(), d(\"div\", EE, f(s(a)(\"empty.folder\")), 1)) : g(\"\", !0)\n    ], 10, hE));\n  }\n}), AE = [\"data-pane\", \"data-testid\", \"aria-label\"], PE = {\n  key: 0,\n  class: \"fe-subhead\"\n}, LE = { class: \"fe-subhead__actions\" }, DE = [\"title\", \"aria-label\"], OE = {\n  key: 1,\n  class: \"fe__skeleton\",\n  role: \"status\"\n}, BE = { class: \"fe-sr-only\" }, IE = {\n  key: 0,\n  class: \"fe-skel-grid\",\n  \"aria-hidden\": \"true\"\n}, HE = {\n  key: 1,\n  class: \"fe-skel-list\",\n  \"aria-hidden\": \"true\"\n}, FE = {\n  key: 2,\n  class: \"fe-state\"\n}, NE = { class: \"fe-state__title\" }, KE = { class: \"fe-state__hint\" }, RE = { class: \"fe-state__actions\" }, UE = { class: \"fe-state__details\" }, VE = { class: \"fe-state__details-summary\" }, jE = { class: \"fe-state__details-pre\" }, YE = {\n  key: 3,\n  class: \"fe-state\",\n  \"data-testid\": \"empty-filtered\"\n}, WE = { class: \"fe-state__title\" }, qE = { class: \"fe-state__hint\" }, GE = { class: \"fe-state__actions\" }, XE = { class: \"fe-state\" }, JE = { class: \"fe-state__title\" }, ZE = \"application/x-brf-files\", QE = \"application/x-brf-files-src\", e8 = 500, Mu = /* @__PURE__ */ qe({\n  __name: \"FilePane\",\n  props: {\n    paneId: {},\n    api: {},\n    locale: {},\n    theme: {},\n    focused: { type: Boolean },\n    closable: { type: Boolean },\n    path: {},\n    selfDriven: { type: Boolean },\n    qualify: {},\n    toUser: {},\n    clamp: {},\n    rootLabel: {},\n    rootPath: {},\n    floor: {},\n    multiRoot: { type: Boolean },\n    virtualRows: {},\n    trashVisible: { type: Boolean, default: !0 },\n    navOffersTrash: { type: Boolean },\n    rows: {},\n    loading: { type: Boolean },\n    error: {},\n    order: {},\n    viewMode: {},\n    viewModes: {},\n    showCrumbs: { type: Boolean, default: !0 },\n    showFilterBar: { type: Boolean, default: !0 },\n    filterMode: {},\n    findLabel: {},\n    showViewSwitcher: { type: Boolean, default: !0 },\n    crumbSubfolders: {},\n    folderKey: {},\n    showParentPath: { type: Boolean },\n    clipped: {},\n    extraFilters: {},\n    canWrite: { type: Boolean },\n    canPaste: { type: Boolean },\n    selected: {},\n    filters: {},\n    thumbSrc: {},\n    keepBadgeFor: {},\n    starredIds: {},\n    starEnabled: { type: Boolean },\n    apiBase: {},\n    authHeaders: {},\n    authCredentials: {},\n    e2eActive: { type: Boolean },\n    bodyOverride: { type: Boolean },\n    openTrigger: { default: \"double\" }\n  },\n  emits: [\"activate\", \"close\", \"navigate\", \"open\", \"open-trash\", \"click-row\", \"context\", \"clear-selection\", \"display-order\", \"item-drag-start\", \"item-drop-into\", \"transfer\", \"update:viewMode\", \"update:filters\", \"crumb-context\", \"copy-path\", \"crumb-drop\", \"new-folder\", \"upload\", \"paste\", \"select-all\", \"clear-filters\", \"star-change\", \"retry\"],\n  setup(e, { expose: t, emit: n }) {\n    const r = e, a = n, { t: u } = tt(() => r.locale), v = r.paneId === \"main\" ? Ao() : $d();\n    Fu(xd, v);\n    const p = m(\"\"), h = m([]), b = m(!1), y = m(\"\"), A = m(\"\");\n    function D(L) {\n      return jn(L) === \"storage\";\n    }\n    const C = k(() => r.selfDriven ? p.value : r.path ?? \"\"), B = k(\n      () => r.selfDriven ? h.value : r.rows ?? []\n    ), I = k(() => r.selfDriven ? b.value : !!r.loading), U = k(() => r.selfDriven ? y.value : r.error ?? \"\"), x = k(\n      () => !!r.multiRoot && !(C.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\")\n    );\n    async function E(L) {\n      const se = r.clamp(L ?? p.value ?? \"\");\n      b.value = !0, y.value = \"\";\n      try {\n        if (r.multiRoot && !se) {\n          h.value = r.virtualRows ? r.virtualRows() : [], A.value = \"\", p.value = \"\", a(\"navigate\", \"\");\n          return;\n        }\n        const Ce = await r.api.index(r.qualify(se));\n        A.value = Ce.perm || \"\", h.value = $s(Ce.files), hd(h.value, Ce.adapter, Ce.dirname, r.trashVisible !== !1, {\n          navOffersTrash: r.navOffersTrash\n        }) && md(h.value, Ce.adapter, r.api), p.value = r.toUser(Ce.dirname), a(\"navigate\", p.value);\n      } catch (Ce) {\n        y.value = Ce instanceof Error ? Ce.message : String(Ce);\n      } finally {\n        b.value = !1;\n      }\n    }\n    r.selfDriven && E(r.path ?? \"\");\n    function $(L) {\n      a(\"activate\"), r.selfDriven ? E(L) : a(\"navigate\", L);\n    }\n    const M = k(\n      () => bd(C.value) ? C.value : r.qualify(C.value)\n    ), z = k(() => {\n      const L = M.value, se = L.indexOf(\"://\");\n      return se === -1 ? \"\" : L.slice(0, se);\n    });\n    function T(L) {\n      if (a(\"activate\"), !r.selfDriven) {\n        a(\"navigate\", L);\n        return;\n      }\n      if (r.multiRoot && !L) {\n        E(\"\");\n        return;\n      }\n      E(r.toUser(L));\n    }\n    const Y = k(() => {\n      const L = hi(B.value, r.filters);\n      return v.sortListing(\n        r.extraFilters ? hi(L, r.extraFilters) : L,\n        r.order ?? \"sort\"\n      );\n    }), O = k(() => $o(r.filters) || !!r.extraFilters), J = k(\n      () => x.value ? \"find\" : r.filterMode ?? \"full\"\n    ), G = k(\n      () => x.value ? u(\"filter.find.storages\") : r.findLabel ?? \"\"\n    ), N = k(\n      () => B.value.filter((L) => L.type === \"dir\").map((L) => ({ label: L.basename, adapterPath: L.path }))\n    );\n    let P = 0;\n    function le() {\n      return Date.now() - P < e8;\n    }\n    function ve(L, se) {\n      if (!le()) {\n        if (se.check) {\n          a(\"activate\"), a(\"click-row\", L, { ctrl: !0, shift: se.shift });\n          return;\n        }\n        if (se.touch || r.openTrigger === \"single\") {\n          P = Date.now(), pe(L);\n          return;\n        }\n        a(\"activate\"), a(\"click-row\", L, { ctrl: se.ctrl, shift: se.shift });\n      }\n    }\n    function he(L) {\n      le() || (P = Date.now(), pe(L));\n    }\n    function oe(L, se) {\n      se.preventDefault(), se.stopPropagation(), a(\"activate\"), a(\"context\", L, se);\n    }\n    function ue(L) {\n      L.preventDefault(), L.stopPropagation(), a(\"activate\"), a(\"clear-selection\"), a(\"context\", null, L);\n    }\n    function Q() {\n      a(\"clear-selection\");\n    }\n    function pe(L) {\n      if (a(\"activate\"), L.basename === \".trash\") {\n        a(\"open-trash\");\n        return;\n      }\n      if (L.type === \"dir\" && r.selfDriven) {\n        E(D(L) ? L.path : r.toUser(L.path));\n        return;\n      }\n      a(\"open\", L);\n    }\n    function re(L, se) {\n      if (!se.dataTransfer) return;\n      if (D(L) || x.value || L.basename === \".trash\") {\n        se.preventDefault();\n        return;\n      }\n      const Ce = B.value.filter((Ie) => r.selected.has(Ie.path) && !D(Ie)).filter((Ie) => {\n        var Ze;\n        return !((Ze = r.clipped) != null && Ze.has(Ie.path));\n      }).map((Ie) => ({ path: Ie.path, basename: Ie.basename, type: Ie.type })), We = Ce.length > 0 ? Ce : [{ path: L.path, basename: L.basename, type: L.type }];\n      se.dataTransfer.setData(ZE, JSON.stringify(We)), se.dataTransfer.setData(QE, M.value), se.dataTransfer.setData(\"text/plain\", We.map((Ie) => Ie.path).join(`\n`)), se.dataTransfer.effectAllowed = \"move\", a(\"item-drag-start\", L, se);\n    }\n    const S = m(!1);\n    function w(L) {\n      return vn(L);\n    }\n    function j(L, se) {\n      const Ce = Cs(L);\n      if (!Ce || !se) return;\n      const We = mi(L), Ie = Ce.map((Ze) => Ze.path).filter((Ze) => Ze && Ze !== se && !se.startsWith(Ze + \"/\"));\n      Ie.length !== 0 && (L.preventDefault(), L.stopPropagation(), a(\"transfer\", { sources: Ie, targetWire: se, originWire: We }));\n    }\n    function K(L, se) {\n      S.value = !1, !(L.type !== \"dir\" || D(L)) && w(se) && a(\"item-drop-into\", L, se);\n    }\n    function Z(L) {\n      !w(L) || x.value || (L.preventDefault(), L.stopPropagation(), L.dataTransfer && (L.dataTransfer.dropEffect = \"move\"), S.value = !0);\n    }\n    function W() {\n      S.value = !1;\n    }\n    function $e(L) {\n      S.value = !1, !(!w(L) || x.value) && j(L, M.value);\n    }\n    function Se() {\n      return r.selfDriven ? E() : Promise.resolve();\n    }\n    function ze() {\n      const L = (C.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\"), se = (r.floor || \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!L || L === se) return;\n      const Ce = L.lastIndexOf(\"/\");\n      $(Ce === -1 ? \"\" : L.slice(0, Ce));\n    }\n    function Ne() {\n      return C.value;\n    }\n    function be() {\n      return Y.value.filter((L) => !D(L));\n    }\n    function De() {\n      return B.value.length;\n    }\n    function ie() {\n      return B.value.map((L) => L.path);\n    }\n    function ce() {\n      return r.selfDriven ? A.value : \"\";\n    }\n    return t({ reload: Se, goUp: ze, getPath: Ne, visibleNodes: be, loadFolder: E, rowCount: De, rowPaths: ie, dirPerm: ce }), He(C, () => {\n      S.value = !1;\n    }), (L, se) => (c(), d(\"section\", {\n      class: we([\"fe__primary fe-pane\", {\n        \"fe-pane--focus\": e.focused,\n        \"fe-pane--split\": e.paneId === \"split\",\n        \"fe-pane--dropover\": S.value\n      }]),\n      \"data-pane\": e.paneId,\n      \"data-testid\": `pane-${e.paneId}`,\n      role: \"region\",\n      \"aria-label\": e.paneId === \"split\" ? s(u)(\"split.pane\") : s(u)(\"toolbar.view_label\"),\n      onPointerdownCapture: se[17] || (se[17] = (Ce) => a(\"activate\"))\n    }, [\n      e.showCrumbs || L.$slots.heading || e.showViewSwitcher || e.closable ? (c(), d(\"div\", PE, [\n        _n(L.$slots, \"heading\", {}, () => [\n          e.showCrumbs ? (c(), et(q5, {\n            key: 0,\n            dirname: M.value,\n            adapter: z.value,\n            \"root-label\": e.rootLabel || z.value,\n            locale: e.locale,\n            \"multi-storage-root\": e.multiRoot,\n            \"root-path\": e.rootPath,\n            subfolders: e.crumbSubfolders ?? N.value,\n            onNavigate: T,\n            onCopyPath: se[0] || (se[0] = (Ce) => a(\"copy-path\", Ce)),\n            onCrumbContext: se[1] || (se[1] = (Ce) => a(\"crumb-context\", Ce)),\n            onCrumbDrop: se[2] || (se[2] = (Ce, We) => a(\"crumb-drop\", Ce, We))\n          }, null, 8, [\"dirname\", \"adapter\", \"root-label\", \"locale\", \"multi-storage-root\", \"root-path\", \"subfolders\"])) : g(\"\", !0)\n        ]),\n        o(\"div\", LE, [\n          e.showViewSwitcher ? (c(), et(wM, {\n            key: 0,\n            \"view-mode\": e.viewMode,\n            locale: e.locale,\n            modes: e.viewModes,\n            \"onUpdate:viewMode\": se[3] || (se[3] = (Ce) => {\n              a(\"activate\"), a(\"update:viewMode\", Ce);\n            })\n          }, null, 8, [\"view-mode\", \"locale\", \"modes\"])) : g(\"\", !0),\n          e.closable ? (c(), d(\"button\", {\n            key: 1,\n            type: \"button\",\n            class: \"fe-btn fe-btn--icon-only fe-pane__close\",\n            title: s(u)(\"split.close\"),\n            \"aria-label\": s(u)(\"split.close\"),\n            \"data-testid\": \"pane-close\",\n            onClick: se[4] || (se[4] = (Ce) => a(\"close\"))\n          }, [...se[18] || (se[18] = [\n            o(\"svg\", {\n              class: \"fe-ficon\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"1.8\",\n              \"stroke-linecap\": \"round\",\n              \"aria-hidden\": \"true\",\n              focusable: \"false\"\n            }, [\n              o(\"path\", { d: \"M6 6l12 12M18 6L6 18\" })\n            ], -1)\n          ])], 8, DE)) : g(\"\", !0)\n        ])\n      ])) : g(\"\", !0),\n      se[24] || (se[24] = o(\"div\", { class: \"fe-selbar-slot\" }, null, -1)),\n      e.showFilterBar ? (c(), et(vM, {\n        key: 1,\n        value: e.filters,\n        locale: e.locale,\n        theme: e.theme,\n        mode: J.value,\n        \"find-label\": G.value,\n        order: e.order,\n        shown: Y.value.length,\n        total: B.value.length,\n        files: B.value,\n        \"can-paste\": e.canPaste,\n        \"can-write\": e.canWrite,\n        \"onUpdate:value\": se[5] || (se[5] = (Ce) => {\n          a(\"activate\"), a(\"update:filters\", Ce);\n        }),\n        onNewFolder: se[6] || (se[6] = (Ce) => {\n          a(\"activate\"), a(\"new-folder\");\n        }),\n        onUpload: se[7] || (se[7] = (Ce) => {\n          a(\"activate\"), a(\"upload\");\n        }),\n        onPaste: se[8] || (se[8] = (Ce) => {\n          a(\"activate\"), a(\"paste\");\n        }),\n        onSelectAll: se[9] || (se[9] = (Ce) => {\n          a(\"activate\"), a(\"select-all\");\n        })\n      }, null, 8, [\"value\", \"locale\", \"theme\", \"mode\", \"find-label\", \"order\", \"shown\", \"total\", \"files\", \"can-paste\", \"can-write\"])) : g(\"\", !0),\n      _n(L.$slots, \"banners\"),\n      o(\"div\", {\n        class: we([\"fe__body\", { \"is-dropover\": S.value }]),\n        onClick: Re(Q, [\"self\"]),\n        onContextmenu: ue,\n        onDragover: Z,\n        onDragleave: W,\n        onDrop: $e\n      }, [\n        e.bodyOverride ? _n(L.$slots, \"body\", { key: 0 }) : I.value && B.value.length === 0 ? (c(), d(\"div\", OE, [\n          o(\"span\", BE, f(s(u)(\"loading\")), 1),\n          e.viewMode !== \"list\" ? (c(), d(\"div\", IE, [\n            (c(), d(ae, null, Te(8, (Ce) => o(\"div\", {\n              key: Ce,\n              class: \"fe-skel-card\"\n            }, [...se[19] || (se[19] = [\n              o(\"div\", { class: \"fe-skel fe-skel--thumb\" }, null, -1),\n              o(\"div\", { class: \"fe-skel fe-skel--label\" }, null, -1)\n            ])])), 64))\n          ])) : (c(), d(\"div\", HE, [\n            (c(), d(ae, null, Te(8, (Ce) => o(\"div\", {\n              key: Ce,\n              class: \"fe-skel-row\"\n            }, [...se[20] || (se[20] = [\n              o(\"div\", { class: \"fe-skel fe-skel--icon\" }, null, -1),\n              o(\"div\", { class: \"fe-skel fe-skel--name\" }, null, -1),\n              o(\"div\", { class: \"fe-skel fe-skel--size\" }, null, -1),\n              o(\"div\", { class: \"fe-skel fe-skel--date\" }, null, -1)\n            ])])), 64))\n          ]))\n        ])) : U.value && B.value.length === 0 ? (c(), d(\"div\", FE, [\n          se[21] || (se[21] = Hu('<svg class=\"fe-state__art\" viewBox=\"0 0 120 100\" width=\"110\" height=\"92\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"60\" cy=\"50\" r=\"28\"></circle><path d=\"M60 36v18\"></path><circle cx=\"60\" cy=\"63\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\"></circle><path d=\"M24 88h72\" stroke-dasharray=\"3 5\"></path></svg>', 1)),\n          o(\"p\", NE, f(s(u)(\"error.title\")), 1),\n          o(\"p\", KE, f(s(u)(\"error.hint\")), 1),\n          o(\"div\", RE, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--primary\",\n              onClick: se[10] || (se[10] = (Ce) => e.selfDriven ? E() : a(\"retry\"))\n            }, f(s(u)(\"error.retry\")), 1)\n          ]),\n          o(\"details\", UE, [\n            o(\"summary\", VE, f(s(u)(\"error.details\")), 1),\n            o(\"pre\", jE, f(U.value), 1)\n          ])\n        ])) : !I.value && O.value && Y.value.length === 0 && B.value.length > 0 ? (c(), d(\"div\", YE, [\n          se[22] || (se[22] = o(\"svg\", {\n            class: \"fe-state__art\",\n            viewBox: \"0 0 120 100\",\n            width: \"110\",\n            height: \"92\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2\",\n            \"stroke-linecap\": \"round\",\n            \"stroke-linejoin\": \"round\",\n            \"aria-hidden\": \"true\"\n          }, [\n            o(\"path\", { d: \"M26 28h68L68 58v24l-16 8V58z\" })\n          ], -1)),\n          o(\"p\", WE, f(s(u)(\"filter.empty.title\")), 1),\n          o(\"p\", qE, f(s(u)(\"filter.empty.hint\")), 1),\n          o(\"div\", GE, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn\",\n              onClick: se[11] || (se[11] = (Ce) => a(\"clear-filters\"))\n            }, f(s(u)(\"filter.clear\")), 1)\n          ])\n        ])) : !I.value && B.value.length === 0 ? _n(L.$slots, \"empty\", { key: 4 }, () => [\n          o(\"div\", XE, [\n            se[23] || (se[23] = o(\"svg\", {\n              class: \"fe-state__art\",\n              viewBox: \"0 0 120 100\",\n              width: \"110\",\n              height: \"92\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"2\",\n              \"stroke-linecap\": \"round\",\n              \"stroke-linejoin\": \"round\",\n              \"aria-hidden\": \"true\"\n            }, [\n              o(\"path\", { d: \"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" })\n            ], -1)),\n            o(\"p\", JE, f(s(u)(\"empty.folder\")), 1)\n          ])\n        ]) : e.viewMode === \"list\" ? (c(), et(vE, {\n          key: 5,\n          files: Y.value,\n          order: e.order,\n          selected: e.selected,\n          clipped: e.clipped,\n          \"show-parent-path\": e.showParentPath,\n          locale: e.locale,\n          loading: I.value,\n          \"folder-key\": e.folderKey,\n          theme: e.theme,\n          \"thumb-src\": e.thumbSrc,\n          \"keep-badge-for\": e.keepBadgeFor,\n          \"starred-ids\": e.starredIds,\n          \"star-enabled\": e.starEnabled,\n          \"api-base\": e.apiBase,\n          \"auth-headers\": e.authHeaders,\n          \"auth-credentials\": e.authCredentials,\n          onClickRow: ve,\n          onDisplayOrder: se[12] || (se[12] = (Ce) => a(\"display-order\", Ce)),\n          onDblRow: he,\n          onContextRow: oe,\n          onItemDragStart: re,\n          onItemDropInto: K,\n          onStarChange: se[13] || (se[13] = (Ce, We) => a(\"star-change\", Ce, We))\n        }, null, 8, [\"files\", \"order\", \"selected\", \"clipped\", \"show-parent-path\", \"locale\", \"loading\", \"folder-key\", \"theme\", \"thumb-src\", \"keep-badge-for\", \"starred-ids\", \"star-enabled\", \"api-base\", \"auth-headers\", \"auth-credentials\"])) : e.viewMode === \"grid\" ? (c(), et(bi, {\n          key: 6,\n          files: Y.value,\n          order: e.order,\n          sections: !0,\n          selected: e.selected,\n          clipped: e.clipped,\n          \"show-parent-path\": e.showParentPath,\n          locale: e.locale,\n          loading: I.value,\n          \"keep-badge-for\": e.keepBadgeFor,\n          \"thumb-src\": e.thumbSrc,\n          \"e2e-active\": e.e2eActive,\n          \"starred-ids\": e.starredIds,\n          \"star-enabled\": e.starEnabled,\n          \"api-base\": e.apiBase,\n          \"auth-headers\": e.authHeaders,\n          \"auth-credentials\": e.authCredentials,\n          onClickCard: ve,\n          onDisplayOrder: se[14] || (se[14] = (Ce) => a(\"display-order\", Ce)),\n          onDblCard: he,\n          onContextCard: oe,\n          onItemDragStart: re,\n          onItemDropInto: K,\n          onStarChange: se[15] || (se[15] = (Ce, We) => a(\"star-change\", Ce, We))\n        }, null, 8, [\"files\", \"order\", \"selected\", \"clipped\", \"show-parent-path\", \"locale\", \"loading\", \"keep-badge-for\", \"thumb-src\", \"e2e-active\", \"starred-ids\", \"star-enabled\", \"api-base\", \"auth-headers\", \"auth-credentials\"])) : (c(), et(zE, {\n          key: 7,\n          files: Y.value,\n          order: e.order,\n          selected: e.selected,\n          clipped: e.clipped,\n          \"show-parent-path\": e.showParentPath,\n          locale: e.locale,\n          loading: I.value,\n          \"thumb-src\": e.thumbSrc,\n          \"e2e-active\": e.e2eActive,\n          \"starred-ids\": e.starredIds,\n          \"star-enabled\": e.starEnabled,\n          \"api-base\": e.apiBase,\n          \"auth-headers\": e.authHeaders,\n          \"auth-credentials\": e.authCredentials,\n          onClickCard: ve,\n          onDblCard: he,\n          onContextCard: oe,\n          onItemDragStart: re,\n          onItemDropInto: K,\n          onStarChange: se[16] || (se[16] = (Ce, We) => a(\"star-change\", Ce, We))\n        }, null, 8, [\"files\", \"order\", \"selected\", \"clipped\", \"show-parent-path\", \"locale\", \"loading\", \"thumb-src\", \"e2e-active\", \"starred-ids\", \"star-enabled\", \"api-base\", \"auth-headers\", \"auth-credentials\"]))\n      ], 34)\n    ], 42, AE));\n  }\n});\nfunction ti() {\n  try {\n    return crypto.randomUUID();\n  } catch {\n    return `t${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n  }\n}\nfunction t8(e) {\n  const t = m([]), n = m(\"\"), r = k(\n    () => t.value.find((U) => U.id === n.value) ?? null\n  ), a = k(() => t.value.findIndex((U) => U.id === n.value)), u = k(() => t.value.length > 1);\n  function v() {\n    if (!e.storageKey) return !1;\n    try {\n      const U = localStorage.getItem(e.storageKey);\n      if (!U) return !1;\n      const x = JSON.parse(U);\n      if (!x || !Array.isArray(x.tabs) || x.tabs.length === 0) return !1;\n      const E = [];\n      for (const $ of x.tabs) {\n        if (!$ || typeof $.path != \"string\") continue;\n        const M = typeof $.viewMode == \"string\" && $.viewMode ? $.viewMode : \"list\", z = $.split, T = z && typeof z == \"object\" && typeof z.path == \"string\" ? {\n          path: z.path,\n          viewMode: typeof z.viewMode == \"string\" && z.viewMode ? z.viewMode : void 0\n        } : null;\n        E.push({\n          id: typeof $.id == \"string\" && $.id ? $.id : ti(),\n          path: $.path,\n          viewMode: M,\n          split: T\n        });\n      }\n      return E.length === 0 ? !1 : (t.value = E, n.value = E.some(($) => $.id === x.active) ? String(x.active) : E[0].id, !0);\n    } catch {\n      return !1;\n    }\n  }\n  function p() {\n    if (e.storageKey)\n      try {\n        localStorage.setItem(\n          e.storageKey,\n          JSON.stringify({ v: 1, active: n.value, tabs: t.value })\n        );\n      } catch {\n      }\n  }\n  He([t, n], p, { deep: !0 });\n  function h(U, x) {\n    if (t.value.length > 0) return;\n    const E = { id: ti(), path: U, viewMode: x, split: null };\n    t.value = [E], n.value = E.id;\n  }\n  function b(U) {\n    const x = r.value;\n    x && (U.path !== void 0 && (x.path = U.path), U.viewMode !== void 0 && (x.viewMode = U.viewMode));\n  }\n  function y(U, x) {\n    const E = { id: ti(), path: U, viewMode: x.viewMode, split: x.split ?? null }, $ = a.value;\n    return t.value.splice($ === -1 ? t.value.length : $ + 1, 0, E), x.background || (n.value = E.id), E;\n  }\n  function A(U) {\n    if (t.value.length <= 1) return null;\n    const x = t.value.findIndex((M) => M.id === U);\n    if (x === -1) return null;\n    const E = t.value[x].id === n.value;\n    if (t.value.splice(x, 1), !E) return null;\n    const $ = t.value[Math.min(x, t.value.length - 1)];\n    return n.value = $.id, $;\n  }\n  function D(U) {\n    const x = t.value.find((E) => E.id === U);\n    return !x || x.id === n.value ? null : (n.value = x.id, x);\n  }\n  function C(U) {\n    if (t.value.length < 2) return null;\n    const x = a.value === -1 ? 0 : a.value, E = t.value[(x + U + t.value.length) % t.value.length];\n    return D(E.id);\n  }\n  function B(U, x) {\n    if (U === x || U < 0 || x < 0 || U >= t.value.length || x >= t.value.length) return;\n    const E = [...t.value], [$] = E.splice(U, 1);\n    E.splice(x, 0, $), t.value = E;\n  }\n  function I(U) {\n    const x = r.value;\n    x && (x.split = U);\n  }\n  return {\n    tabs: t,\n    activeId: n,\n    activeTab: r,\n    activeIndex: a,\n    hasMultiple: u,\n    restore: v,\n    seed: h,\n    syncActive: b,\n    openTab: y,\n    closeTab: A,\n    activate: D,\n    step: C,\n    move: B,\n    setSplit: I\n  };\n}\nconst n8 = { class: \"fe-field\" }, a8 = { class: \"fe-field__label\" }, o8 = [\"disabled\"], s8 = { class: \"fe-field\" }, r8 = { class: \"fe-field__label\" }, i8 = [\"placeholder\", \"disabled\"], l8 = { class: \"fe-field\" }, c8 = { class: \"fe-field__label\" }, u8 = [\"disabled\", \"onKeydown\"], d8 = {\n  class: \"fe-e2e-warn\",\n  role: \"alert\"\n}, f8 = {\n  key: 0,\n  class: \"fe-e2e-rk__escrow\",\n  role: \"note\"\n}, p8 = { class: \"fe-e2e-ack\" }, v8 = [\"disabled\"], h8 = {\n  key: 1,\n  class: \"fe-form__error\"\n}, m8 = [\"disabled\"], y8 = [\"disabled\"], b8 = /* @__PURE__ */ qe({\n  __name: \"EncryptedFolderModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    busy: { type: Boolean },\n    escrowKid: {}\n  },\n  emits: [\"close\", \"submit\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(\"\"), v = m(\"\"), p = m(\"\"), h = m(!1), b = m(null);\n    He(\n      () => n.open,\n      (A) => {\n        A && (u.value = \"\", v.value = \"\", p.value = \"\", h.value = !1, b.value = null);\n      }\n    );\n    function y() {\n      if (n.busy) return;\n      const A = u.value.trim();\n      if (!A) {\n        b.value = a(\"modal.newfolder.placeholder\");\n        return;\n      }\n      if (/[\\\\/]/.test(A) || A === \".\" || A === \"..\" || A.startsWith(\".filex\")) {\n        b.value = a(\"e2e.create.bad_name\");\n        return;\n      }\n      if (v.value.length < Xm) {\n        b.value = a(\"e2e.create.pw_short\");\n        return;\n      }\n      if (v.value !== p.value) {\n        b.value = a(\"e2e.create.pw_mismatch\");\n        return;\n      }\n      if (!h.value) {\n        b.value = a(\"e2e.create.ack_required\");\n        return;\n      }\n      b.value = null, r(\"submit\", { name: A, password: v.value });\n    }\n    return (A, D) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"e2e.create.title\"),\n      size: \"sm\",\n      onClose: D[5] || (D[5] = (C) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          disabled: e.busy,\n          onClick: D[4] || (D[4] = (C) => r(\"close\"))\n        }, f(s(a)(\"modal.newfolder.cancel\")), 9, m8),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          disabled: e.busy,\n          onClick: y\n        }, f(e.busy ? s(a)(\"e2e.create.busy\") : s(a)(\"e2e.create.create\")), 9, y8)\n      ]),\n      default: st(() => [\n        o(\"form\", {\n          class: \"fe-e2e-form\",\n          onSubmit: Re(y, [\"prevent\"])\n        }, [\n          o(\"label\", n8, [\n            o(\"span\", a8, f(s(a)(\"modal.newfolder.placeholder\")), 1),\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": D[0] || (D[0] = (C) => u.value = C),\n              type: \"text\",\n              class: \"fe-input\",\n              autocomplete: \"off\",\n              disabled: e.busy\n            }, null, 8, o8), [\n              [rt, u.value]\n            ])\n          ]),\n          o(\"label\", s8, [\n            o(\"span\", r8, f(s(a)(\"e2e.create.pw_label\")), 1),\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": D[1] || (D[1] = (C) => v.value = C),\n              type: \"password\",\n              class: \"fe-input\",\n              placeholder: s(a)(\"e2e.create.pw_placeholder\"),\n              autocomplete: \"new-password\",\n              disabled: e.busy\n            }, null, 8, i8), [\n              [rt, v.value]\n            ])\n          ]),\n          o(\"label\", l8, [\n            o(\"span\", c8, f(s(a)(\"e2e.create.pw2_label\")), 1),\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": D[2] || (D[2] = (C) => p.value = C),\n              type: \"password\",\n              class: \"fe-input\",\n              autocomplete: \"new-password\",\n              disabled: e.busy,\n              onKeydown: Ut(Re(y, [\"prevent\"]), [\"enter\"])\n            }, null, 40, u8), [\n              [rt, p.value]\n            ])\n          ]),\n          o(\"div\", d8, [\n            o(\"strong\", null, f(s(a)(\"e2e.create.warn_title\")), 1),\n            o(\"p\", null, f(s(a)(\"e2e.create.warn_body\")), 1)\n          ]),\n          e.escrowKid ? (c(), d(\"div\", f8, [\n            o(\"strong\", null, f(s(a)(\"e2e.create.escrow_title\")), 1),\n            o(\"p\", null, f(s(a)(\"e2e.create.escrow_body\")), 1)\n          ])) : g(\"\", !0),\n          o(\"label\", p8, [\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": D[3] || (D[3] = (C) => h.value = C),\n              type: \"checkbox\",\n              disabled: e.busy\n            }, null, 8, v8), [\n              [An, h.value]\n            ]),\n            o(\"span\", null, f(s(a)(\"e2e.create.ack\")), 1)\n          ]),\n          b.value ? (c(), d(\"p\", h8, f(b.value), 1)) : g(\"\", !0)\n        ], 32)\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), g8 = { class: \"fe-e2e-rk\" }, k8 = { class: \"fe-e2e-rk__lead\" }, _8 = {\n  class: \"fe-e2e-rk__key\",\n  \"aria-label\": \"recovery key\"\n}, w8 = { class: \"fe-e2e-rk__actions\" }, $8 = {\n  class: \"fe-e2e-warn\",\n  role: \"alert\"\n}, x8 = {\n  key: 0,\n  class: \"fe-e2e-rk__escrow\",\n  role: \"note\"\n}, S8 = { class: \"fe-e2e-rk__kid\" }, C8 = { class: \"fe-e2e-ack\" }, T8 = [\"disabled\"], M8 = /* @__PURE__ */ qe({\n  __name: \"RecoveryKeyModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    recoveryKey: {},\n    folderName: {},\n    escrowKid: {},\n    variant: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(!1), v = m(!1);\n    He(\n      () => n.open,\n      (A) => {\n        A && (u.value = !1, v.value = !1);\n      }\n    );\n    const p = k(\n      () => n.variant === \"upgraded\" ? a(\"e2e.recovery.title_upgraded\") : a(\"e2e.recovery.title\")\n    );\n    async function h() {\n      try {\n        await navigator.clipboard.writeText(n.recoveryKey), v.value = !0, window.setTimeout(() => v.value = !1, 2e3);\n      } catch {\n        v.value = !1;\n      }\n    }\n    function b() {\n      const A = n.folderName || \"folder\", D = `filex recovery key\nfolder: ${A}\n\n${n.recoveryKey}\n\nThis key opens the encrypted folder without its password.\nAnyone holding it can read the folder. Store it like a password.\nfilex does not keep a copy and cannot show it again.\n`, C = URL.createObjectURL(new Blob([D], { type: \"text/plain\" })), B = document.createElement(\"a\");\n      B.href = C, B.download = `filex-recovery-${A}.txt`, document.body.appendChild(B), B.click(), B.remove(), window.setTimeout(() => URL.revokeObjectURL(C), 3e4);\n    }\n    function y() {\n      u.value && r(\"close\");\n    }\n    return (A, D) => (c(), et(an, {\n      open: e.open,\n      title: p.value,\n      size: \"sm\",\n      \"close-on-backdrop\": !1,\n      onClose: y\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          disabled: !u.value,\n          onClick: y\n        }, f(s(a)(\"e2e.recovery.done\")), 9, T8)\n      ]),\n      default: st(() => [\n        o(\"div\", g8, [\n          o(\"p\", k8, f(e.variant === \"upgraded\" ? s(a)(\"e2e.recovery.lead_upgraded\") : s(a)(\"e2e.recovery.lead\")), 1),\n          o(\"output\", _8, f(e.recoveryKey), 1),\n          o(\"div\", w8, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn\",\n              onClick: h\n            }, f(v.value ? s(a)(\"e2e.recovery.copied\") : s(a)(\"e2e.recovery.copy\")), 1),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn\",\n              onClick: b\n            }, f(s(a)(\"e2e.recovery.download\")), 1)\n          ]),\n          o(\"div\", $8, [\n            o(\"strong\", null, f(s(a)(\"e2e.recovery.warn_title\")), 1),\n            o(\"p\", null, f(s(a)(\"e2e.recovery.warn_body\")), 1)\n          ]),\n          e.escrowKid ? (c(), d(\"div\", x8, [\n            o(\"strong\", null, f(s(a)(\"e2e.recovery.escrow_title\")), 1),\n            o(\"p\", null, f(s(a)(\"e2e.recovery.escrow_body\")), 1),\n            o(\"p\", S8, [\n              Je(f(s(a)(\"e2e.recovery.escrow_kid\")) + \": \", 1),\n              o(\"code\", null, f(e.escrowKid), 1)\n            ])\n          ])) : g(\"\", !0),\n          o(\"label\", C8, [\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": D[0] || (D[0] = (C) => u.value = C),\n              type: \"checkbox\"\n            }, null, 512), [\n              [An, u.value]\n            ]),\n            o(\"span\", null, f(s(a)(\"e2e.recovery.ack\")), 1)\n          ])\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), E8 = { class: \"fe-e2e-recover\" }, z8 = {\n  key: 0,\n  class: \"fe-e2e-recover__none\"\n}, A8 = {\n  key: 0,\n  class: \"fe-e2e-recover__tabs\",\n  role: \"tablist\"\n}, P8 = [\"aria-selected\"], L8 = [\"aria-selected\"], D8 = { class: \"fe-e2e-recover__hint\" }, O8 = [\"placeholder\", \"disabled\"], B8 = {\n  class: \"fe-e2e-warn\",\n  role: \"alert\"\n}, I8 = {\n  key: 0,\n  class: \"fe-e2e-recover__hint\"\n}, H8 = [\"placeholder\", \"disabled\"], F8 = {\n  key: 2,\n  class: \"fe-e2e-recover__note\"\n}, N8 = {\n  key: 3,\n  class: \"fe-form__error\"\n}, K8 = [\"disabled\"], R8 = [\"disabled\"], U8 = /* @__PURE__ */ qe({\n  __name: \"E2eRecoveryUnlockModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    hasRecovery: { type: Boolean },\n    escrowState: {},\n    escrowKid: {},\n    busy: { type: Boolean },\n    error: {}\n  },\n  emits: [\"close\", \"submit\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = k(() => n.escrowState === \"available\"), v = k(() => n.escrowState === \"predates\" ? a(\"e2e.recover.escrow_predates\") : n.escrowState === \"other-key\" ? a(\"e2e.recover.escrow_other_key\") : null), p = m(\"recovery\"), h = m(\"\"), b = m(\"\"), y = m(null);\n    He(\n      () => n.open,\n      (B) => {\n        B && (p.value = n.hasRecovery ? \"recovery\" : \"escrow\", h.value = \"\", b.value = \"\", y.value = null);\n      }\n    );\n    const A = k(() => !n.hasRecovery && !u.value), D = k(() => y.value || n.error || null);\n    function C() {\n      if (!(n.busy || A.value)) {\n        if (y.value = null, p.value === \"recovery\") {\n          if (!Di(h.value)) {\n            y.value = a(\"e2e.recover.bad_format\");\n            return;\n          }\n          r(\"submit\", { mode: \"recovery\", value: h.value });\n          return;\n        }\n        if (!b.value.trim()) {\n          y.value = a(\"e2e.recover.escrow_required\");\n          return;\n        }\n        r(\"submit\", { mode: \"escrow\", value: b.value });\n      }\n    }\n    return (B, I) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"e2e.recover.title\"),\n      size: \"sm\",\n      onClose: I[5] || (I[5] = (U) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          disabled: e.busy,\n          onClick: I[4] || (I[4] = (U) => r(\"close\"))\n        }, f(s(a)(\"modal.newfolder.cancel\")), 9, K8),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          disabled: e.busy || A.value,\n          onClick: C\n        }, f(e.busy ? s(a)(\"e2e.recover.busy\") : s(a)(\"e2e.recover.unlock\")), 9, R8)\n      ]),\n      default: st(() => [\n        o(\"div\", E8, [\n          A.value ? (c(), d(\"p\", z8, f(s(a)(\"e2e.recover.none\")), 1)) : (c(), d(ae, { key: 1 }, [\n            e.hasRecovery && u.value ? (c(), d(\"div\", A8, [\n              o(\"button\", {\n                type: \"button\",\n                role: \"tab\",\n                class: we([\"fe-e2e-recover__tab\", { \"fe-e2e-recover__tab--on\": p.value === \"recovery\" }]),\n                \"aria-selected\": p.value === \"recovery\",\n                onClick: I[0] || (I[0] = (U) => p.value = \"recovery\")\n              }, f(s(a)(\"e2e.recover.tab_recovery\")), 11, P8),\n              o(\"button\", {\n                type: \"button\",\n                role: \"tab\",\n                class: we([\"fe-e2e-recover__tab\", { \"fe-e2e-recover__tab--on\": p.value === \"escrow\" }]),\n                \"aria-selected\": p.value === \"escrow\",\n                onClick: I[1] || (I[1] = (U) => p.value = \"escrow\")\n              }, f(s(a)(\"e2e.recover.tab_escrow\")), 11, L8)\n            ])) : g(\"\", !0),\n            p.value === \"recovery\" ? (c(), d(\"form\", {\n              key: 1,\n              class: \"fe-e2e-form\",\n              onSubmit: Re(C, [\"prevent\"])\n            }, [\n              o(\"p\", D8, f(s(a)(\"e2e.recover.recovery_hint\")), 1),\n              Ve(o(\"input\", {\n                \"onUpdate:modelValue\": I[2] || (I[2] = (U) => h.value = U),\n                type: \"text\",\n                class: \"fe-input fe-e2e-recover__key\",\n                placeholder: s(a)(\"e2e.recover.recovery_placeholder\"),\n                autocomplete: \"off\",\n                spellcheck: \"false\",\n                disabled: e.busy\n              }, null, 8, O8), [\n                [rt, h.value]\n              ])\n            ], 32)) : (c(), d(\"form\", {\n              key: 2,\n              class: \"fe-e2e-form\",\n              onSubmit: Re(C, [\"prevent\"])\n            }, [\n              o(\"div\", B8, [\n                o(\"strong\", null, f(s(a)(\"e2e.recover.escrow_warn_title\")), 1),\n                o(\"p\", null, f(s(a)(\"e2e.recover.escrow_warn_body\")), 1)\n              ]),\n              e.escrowKid ? (c(), d(\"p\", I8, [\n                Je(f(s(a)(\"e2e.recover.escrow_kid\")) + \": \", 1),\n                o(\"code\", null, f(e.escrowKid), 1)\n              ])) : g(\"\", !0),\n              Ve(o(\"textarea\", {\n                \"onUpdate:modelValue\": I[3] || (I[3] = (U) => b.value = U),\n                class: \"fe-input fe-e2e-recover__escrow\",\n                rows: \"5\",\n                placeholder: s(a)(\"e2e.recover.escrow_placeholder\"),\n                autocomplete: \"off\",\n                spellcheck: \"false\",\n                disabled: e.busy\n              }, null, 8, H8), [\n                [rt, b.value]\n              ])\n            ], 32))\n          ], 64)),\n          v.value ? (c(), d(\"p\", F8, f(v.value), 1)) : g(\"\", !0),\n          D.value ? (c(), d(\"p\", N8, f(D.value), 1)) : g(\"\", !0)\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), V8 = /* @__PURE__ */ new Set([\"none\", \"viewer\", \"editor\", \"owner\"]);\nfunction Eu(e) {\n  if (typeof e != \"string\" || !e) return;\n  const t = Date.parse(e);\n  return Number.isFinite(t) ? t : void 0;\n}\nfunction j8(e, t) {\n  var D;\n  const n = String((e == null ? void 0 : e.path) ?? \"\").replace(/^\\/+/, \"\");\n  if (!n) return null;\n  const r = t.storages ?? [], a = typeof e.storage == \"string\" && e.storage ? e.storage : r.length === 1 ? r[0].name : \"\";\n  if (t.multiStorageRoot && !a) return null;\n  const u = String(e.name ?? n.split(\"/\").pop() ?? \"\"), v = e.type === \"dir\", p = typeof e.size == \"number\" ? e.size : 0, h = typeof e.id == \"number\" ? e.id : void 0, b = typeof e.perm == \"string\" && V8.has(e.perm) ? e.perm : void 0, y = ((D = r.find((C) => C.name === a)) == null ? void 0 : D.readOnly) === !0, A = typeof e.read_only == \"boolean\" ? e.read_only : y;\n  return {\n    type: v ? \"dir\" : \"file\",\n    id: h,\n    /* tablo:t1 — ⚠⚠ THE DATE. A node row carries `backend_mtime` (what the\n       storage says) and `db_mtime` (what our last scan recorded) as RFC3339\n       strings; `FileNode.last_modified` is unix MILLISECONDS. Nothing mapped\n       between the two, so every row from Recent, Starred and a tag view\n       arrived with no date at all — measured on Recent: eleven rows, eleven em\n       dashes in the Modified column, and a Modified column header you could\n       click that then sorted nothing. It also made the date grouping this view\n       is supposed to show impossible, because every row fell in the \"No date\"\n       bucket. Storage first: `backend_mtime` is the file's own truth and\n       `db_mtime` only says when we last looked at it. */\n    last_modified: Eu(e.backend_mtime) ?? Eu(e.db_mtime),\n    path: a ? `${a}://${n}` : n,\n    basename: u,\n    extension: v ? \"\" : u.includes(\".\") ? (u.split(\".\").pop() || \"\").toLowerCase() : \"\",\n    storage: a,\n    visibility: \"private\",\n    size: p,\n    file_size: p,\n    mime_type: typeof e.mime == \"string\" ? e.mime : \"\",\n    ...b ? { perm: b } : {},\n    read_only: A,\n    // Keyed by node id. A file with no rendered thumbnail 404s here and the\n    // view falls back to its icon — the contract the ordinary listing has too.\n    thumb_url: !v && h !== void 0 ? `/api/files/thumb/${h}` : void 0,\n    extra_metadata: {}\n  };\n}\nconst Y8 = 6e4, gi = /* @__PURE__ */ new Map(), Ts = /* @__PURE__ */ new Map();\nfunction W8() {\n  gi.clear(), Ts.clear();\n}\nasync function q8(e = {}) {\n  const t = e.apiBase ?? \"\", n = t || \"(same-origin)\";\n  if (!e.force) {\n    const a = gi.get(n);\n    if (a && Date.now() - a.at < Y8) return a.tags;\n    const u = Ts.get(n);\n    if (u) return u;\n  }\n  const r = (async () => {\n    try {\n      const a = await fetch(`${t}/api/files/manager/tags/all`, {\n        headers: await (e.authHeaders ?? (() => ({})))(),\n        credentials: e.authCredentials ?? \"same-origin\"\n      });\n      if (!a.ok) return [];\n      const u = await a.json(), v = Array.isArray(u == null ? void 0 : u.tags) ? u.tags.filter((p) => typeof p == \"string\" && p !== \"\") : [];\n      return gi.set(n, { at: Date.now(), tags: v }), v;\n    } catch {\n      return [];\n    } finally {\n      Ts.delete(n);\n    }\n  })();\n  return Ts.set(n, r), r;\n}\nasync function G8(e, t = {}, n = 200) {\n  const r = t.apiBase ?? \"\", a = await fetch(\n    `${r}/api/files/manager/tagged?tag=${encodeURIComponent(e)}&limit=${n}`,\n    {\n      headers: await (t.authHeaders ?? (() => ({})))(),\n      credentials: t.authCredentials ?? \"same-origin\"\n    }\n  );\n  if (!a.ok) throw new Error(String(a.status));\n  const u = await a.json();\n  return Array.isArray(u == null ? void 0 : u.nodes) ? u.nodes : [];\n}\nfunction zu(e) {\n  const t = String(e ?? \"\").indexOf(\"://\");\n  return t === -1 ? \"\" : e.slice(0, t);\n}\nfunction Au(e, t, n = \"auto\") {\n  const r = zu(t), a = e.some((u) => {\n    const v = zu(u);\n    return v !== \"\" && r !== \"\" && v !== r;\n  });\n  return n === \"copy\" ? { kind: \"copy\", cross: a } : n === \"move\" ? { kind: \"move\", cross: a } : { kind: a ? \"copy\" : \"move\", cross: a };\n}\nfunction X8(e) {\n  return e.split(\"?\")[0].replace(/\\/manager$/, \"/archive/download\");\n}\nfunction J8(e, t) {\n  if (/^https?:\\/\\//i.test(t)) return t;\n  const n = e.split(\"?\")[0], r = /^(https?:\\/\\/[^/]+)/i.exec(n);\n  return r ? r[1] + t : t;\n}\nasync function Z8(e, t, n) {\n  const r = X8(e.endpoints.manager);\n  return e.jsonFetch(r, {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify(n ? { paths: t, name: n } : { paths: t })\n  });\n}\nconst Q8 = 6e4;\nfunction ez(e, t = document) {\n  const n = t.createElement(\"iframe\");\n  n.hidden = !0, n.setAttribute(\"aria-hidden\", \"true\"), n.style.display = \"none\", n.src = e, t.body.appendChild(n), setTimeout(() => n.remove(), Q8);\n}\nasync function tz(e, t, n = {}) {\n  const r = await Z8(e, t, n.name);\n  return ez(\n    J8(e.endpoints.manager, r.url),\n    n.doc ?? document\n  ), r;\n}\nconst Wt = \"@@drives\";\nfunction _a(e) {\n  const t = e.indexOf(\"://\");\n  return t < 0 ? [\"\", ki(e)] : [e.slice(0, t), ki(e.slice(t + 3))];\n}\nfunction Va(e, t) {\n  const n = ki(t);\n  return n ? `${e}://${n}` : `${e}://`;\n}\nfunction ki(e) {\n  return e.replace(/^\\/+|\\/+$/g, \"\");\n}\nfunction nz(e, t) {\n  if (e === Wt) return null;\n  const [n, r] = _a(e);\n  if (!n) return null;\n  if (!r) return t ? Wt : null;\n  const a = r.split(\"/\");\n  return a.pop(), Va(n, a.join(\"/\"));\n}\nfunction _i(e, t) {\n  if (e === Wt) return t;\n  const [n, r] = _a(e);\n  if (!r) return n || t;\n  const a = r.split(\"/\");\n  return a[a.length - 1] || n;\n}\nfunction Kd(e) {\n  if (e === Wt || !e) return [];\n  const [t, n] = _a(e);\n  if (!t) return [];\n  const r = [{ label: t, path: Va(t, \"\") }];\n  if (!n) return r;\n  let a = \"\";\n  for (const u of n.split(\"/\"))\n    a = a ? `${a}/${u}` : u, r.push({ label: u, path: Va(t, a) });\n  return r;\n}\nfunction al(e) {\n  return e == null || e === \"\" || e === \"editor\" || e === \"owner\";\n}\nfunction az(e, t) {\n  if (e === Wt || t === Wt) return !1;\n  const [n, r] = _a(e), [a, u] = _a(t);\n  return n !== a ? !1 : u === \"\" ? !0 : r === u || r.startsWith(u + \"/\");\n}\nfunction ol(e, t) {\n  if (!t || t.length === 0 || e === Wt) return null;\n  const n = (a) => {\n    const [u, v] = _a(a);\n    return Va(u, v);\n  }, r = n(e);\n  for (const a of t)\n    if (a) {\n      if (r === n(a)) return \"self\";\n      if (az(e, a)) return \"descendant\";\n    }\n  return null;\n}\nfunction oz(e, t) {\n  const n = [];\n  for (const r of e ?? [])\n    r.type === \"dir\" && n.push({\n      path: r.path,\n      label: r.basename,\n      writable: al(r.perm),\n      blocked: ol(r.path, t)\n    });\n  return n;\n}\nfunction sz(e, t) {\n  return (e ?? []).map((n) => {\n    const r = Va(n, \"\");\n    return {\n      path: r,\n      label: n,\n      // A storage root's own writability is not knowable from the drive list;\n      // it is answered by the listing when the user opens it. Offering it as\n      // writable here and letting the listing correct that is the honest\n      // order — the alternative greys out every drive until each is opened.\n      writable: !0,\n      blocked: ol(r, t)\n    };\n  });\n}\nfunction rz(e, t) {\n  const n = ((t == null ? void 0 : t.length) ?? 0) > 1;\n  if (e && e.includes(\"://\")) return e;\n  if (n) return Wt;\n  const r = t == null ? void 0 : t[0];\n  return r ? Va(r, \"\") : Wt;\n}\nconst iz = { class: \"fe-field\" }, lz = { class: \"fe-field__label\" }, cz = [\"onKeydown\"], uz = {\n  key: 0,\n  class: \"fe-form__error\"\n}, dz = [\"innerHTML\"], fz = /* @__PURE__ */ qe({\n  __name: \"NewFolderModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    encryptedOption: { type: Boolean }\n  },\n  emits: [\"close\", \"submit\", \"encrypted\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(\"\"), v = m(null);\n    He(() => n.open, (h) => {\n      h && (u.value = \"\", v.value = null);\n    });\n    function p() {\n      const h = u.value.trim();\n      if (!h) {\n        v.value = a(\"modal.newfolder.placeholder\");\n        return;\n      }\n      if (/[\\\\/]/.test(h) || h === \".\" || h === \"..\") {\n        v.value = a(\"modal.newfolder.invalid\");\n        return;\n      }\n      r(\"submit\", h);\n    }\n    return (h, b) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"modal.newfolder.title\"),\n      size: \"sm\",\n      onClose: b[3] || (b[3] = (y) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: b[2] || (b[2] = (y) => r(\"close\"))\n        }, f(s(a)(\"modal.newfolder.cancel\")), 1),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          onClick: p\n        }, f(s(a)(\"modal.newfolder.create\")), 1)\n      ]),\n      default: st(() => [\n        o(\"form\", {\n          onSubmit: Re(p, [\"prevent\"])\n        }, [\n          o(\"label\", iz, [\n            o(\"span\", lz, f(s(a)(\"modal.newfolder.placeholder\")), 1),\n            Ve(o(\"input\", {\n              \"onUpdate:modelValue\": b[0] || (b[0] = (y) => u.value = y),\n              type: \"text\",\n              class: \"fe-input\",\n              autocomplete: \"off\",\n              onKeydown: Ut(Re(p, [\"prevent\"]), [\"enter\"])\n            }, null, 40, cz), [\n              [rt, u.value]\n            ])\n          ]),\n          v.value ? (c(), d(\"p\", uz, f(v.value), 1)) : g(\"\", !0),\n          e.encryptedOption !== !1 ? (c(), d(\"button\", {\n            key: 1,\n            type: \"button\",\n            class: \"fe-e2e-optlink\",\n            onClick: b[1] || (b[1] = (y) => r(\"encrypted\"))\n          }, [\n            o(\"span\", {\n              class: \"fe-e2e-optlink__icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"lock\")\n            }, null, 8, dz),\n            Je(\" \" + f(s(a)(\"e2e.create.option\")), 1)\n          ])) : g(\"\", !0)\n        ], 32)\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), pz = {\n  class: \"fe-destpick\",\n  \"data-testid\": \"destpicker\"\n}, vz = { class: \"fe-destpick__bar\" }, hz = [\"disabled\", \"title\", \"aria-label\"], mz = [\"aria-label\"], yz = [\"onClick\"], bz = {\n  key: 1,\n  class: \"fe-destpick__crumb is-current\"\n}, gz = {\n  class: \"fe-destpick__rows\",\n  \"data-testid\": \"destpicker-rows\"\n}, kz = {\n  key: 0,\n  class: \"fe-destpick__note\"\n}, _z = {\n  key: 1,\n  class: \"fe-destpick__note\"\n}, wz = {\n  key: 2,\n  class: \"fe-destpick__note\"\n}, $z = [\"disabled\", \"title\", \"data-testid\", \"onClick\"], xz = [\"innerHTML\"], Sz = { class: \"fe-destpick__rowname\" }, Cz = {\n  key: 0,\n  class: \"fe-destpick__rowtag\"\n}, Tz = {\n  key: 1,\n  class: \"fe-destpick__rowtag\"\n}, Mz = {\n  key: 1,\n  class: \"fe-destpick__target\",\n  \"data-testid\": \"destpicker-target\"\n}, Ez = [\"disabled\"], Rd = /* @__PURE__ */ qe({\n  __name: \"DestinationPickerModal\",\n  props: {\n    open: { type: Boolean },\n    api: {},\n    locale: {},\n    storages: {},\n    startAt: {},\n    moving: {},\n    mode: {},\n    busy: { type: Boolean }\n  },\n  emits: [\"close\", \"pick\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(Wt), v = m([]), p = m(!1), h = m(void 0), b = m(!1), y = k(() => {\n      var N;\n      return (((N = n.storages) == null ? void 0 : N.length) ?? 0) > 1;\n    });\n    let A = /* @__PURE__ */ new Map();\n    He(\n      () => n.open,\n      (N) => {\n        N && (A = /* @__PURE__ */ new Map(), C(rz(n.startAt, n.storages)));\n      },\n      { immediate: !0 }\n    );\n    async function D(N) {\n      const P = A.get(N);\n      if (P) return P;\n      try {\n        const le = await n.api.index(N);\n        return A.set(N, le), le;\n      } catch {\n        return;\n      }\n    }\n    async function C(N) {\n      if (u.value = N, b.value = !1, N === Wt) {\n        h.value = void 0, v.value = sz(n.storages, n.moving);\n        return;\n      }\n      p.value = !0;\n      const P = await D(N);\n      u.value === N && (p.value = !1, h.value = P, b.value = !P, v.value = oz(P == null ? void 0 : P.files, n.moving));\n    }\n    const B = k(() => nz(u.value, y.value)), I = k(() => Kd(u.value)), U = k(() => ol(u.value, n.moving)), x = k(() => u.value === Wt || !h.value || h.value.read_only ? !1 : al(h.value.perm)), E = k(\n      () => !n.busy && u.value !== Wt && x.value && U.value === null\n    ), $ = k(() => u.value !== Wt), M = k(() => u.value === Wt ? a(\"destpicker.pick_a_drive\") : U.value === \"self\" ? a(\"destpicker.blocked.self\") : U.value === \"descendant\" ? a(\"destpicker.blocked.descendant\") : b.value ? a(\"destpicker.unreadable\") : h.value && !x.value ? a(\"destpicker.readonly_here\") : \"\"), z = k(() => n.mode === \"move\" ? a(\"destpicker.title.move\") : n.mode === \"copy\" ? a(\"destpicker.title.copy\") : a(\"destpicker.title.choose\")), T = k(() => n.mode === \"move\" ? a(\"destpicker.confirm.move\") : n.mode === \"copy\" ? a(\"destpicker.confirm.copy\") : a(\"destpicker.confirm.choose\"));\n    function Y(N) {\n      return N.blocked === \"self\" ? a(\"destpicker.blocked.self\") : N.blocked === \"descendant\" ? a(\"destpicker.blocked.descendant\") : N.writable ? N.label : a(\"destpicker.readonly\");\n    }\n    function O(N) {\n      N.blocked || C(N.path);\n    }\n    function J() {\n      E.value && r(\"pick\", u.value);\n    }\n    const G = k(() => a(\"destpicker.drives\"));\n    return (N, P) => (c(), et(an, {\n      open: e.open,\n      title: z.value,\n      size: \"md\",\n      onClose: P[3] || (P[3] = (le) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: P[2] || (P[2] = (le) => r(\"close\"))\n        }, f(s(a)(\"destpicker.cancel\")), 1),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          disabled: !E.value,\n          \"data-testid\": \"destpicker-confirm\",\n          onClick: J\n        }, f(T.value), 9, Ez)\n      ]),\n      default: st(() => [\n        o(\"div\", pz, [\n          o(\"div\", vz, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-destpick__up\",\n              disabled: !B.value,\n              title: s(a)(\"destpicker.up\"),\n              \"aria-label\": s(a)(\"destpicker.up\"),\n              \"data-testid\": \"destpicker-up\",\n              onClick: P[0] || (P[0] = (le) => C(B.value))\n            }, [...P[4] || (P[4] = [\n              o(\"svg\", {\n                class: \"fe-ficon\",\n                viewBox: \"0 0 24 24\",\n                fill: \"none\",\n                stroke: \"currentColor\",\n                \"stroke-width\": \"2\",\n                \"stroke-linecap\": \"round\",\n                \"stroke-linejoin\": \"round\",\n                \"aria-hidden\": \"true\",\n                focusable: \"false\"\n              }, [\n                o(\"path\", { d: \"M12 19V5M5 12l7-7 7 7\" })\n              ], -1)\n            ])], 8, hz),\n            o(\"nav\", {\n              class: \"fe-destpick__crumbs\",\n              \"aria-label\": s(a)(\"destpicker.crumbs\")\n            }, [\n              y.value ? (c(), d(\"button\", {\n                key: 0,\n                type: \"button\",\n                class: we([\"fe-destpick__crumb\", { \"is-current\": u.value === s(Wt) }]),\n                onClick: P[1] || (P[1] = (le) => C(s(Wt)))\n              }, f(G.value), 3)) : g(\"\", !0),\n              (c(!0), d(ae, null, Te(I.value, (le) => (c(), d(ae, {\n                key: le.path\n              }, [\n                P[5] || (P[5] = o(\"span\", {\n                  class: \"fe-destpick__sep\",\n                  \"aria-hidden\": \"true\"\n                }, \"/\", -1)),\n                o(\"button\", {\n                  type: \"button\",\n                  class: we([\"fe-destpick__crumb\", { \"is-current\": le.path === u.value }]),\n                  onClick: (ve) => C(le.path)\n                }, f(le.label), 11, yz)\n              ], 64))), 128)),\n              !y.value && !I.value.length ? (c(), d(\"span\", bz, f(s(_i)(u.value, G.value)), 1)) : g(\"\", !0)\n            ], 8, mz)\n          ]),\n          o(\"ul\", gz, [\n            p.value ? (c(), d(\"li\", kz, f(s(a)(\"destpicker.loading\")), 1)) : b.value ? (c(), d(\"li\", _z, f(s(a)(\"destpicker.unreadable\")), 1)) : v.value.length ? g(\"\", !0) : (c(), d(\"li\", wz, f(s(a)(\"destpicker.empty\")), 1)),\n            (c(!0), d(ae, null, Te(v.value, (le) => (c(), d(\"li\", {\n              key: le.path\n            }, [\n              o(\"button\", {\n                type: \"button\",\n                class: we([\"fe-destpick__row\", { \"is-locked\": !le.writable, \"is-blocked\": !!le.blocked }]),\n                disabled: !!le.blocked,\n                title: Y(le),\n                \"data-testid\": \"destpicker-row-\" + le.label,\n                onClick: (ve) => O(le)\n              }, [\n                o(\"span\", {\n                  class: \"fe-destpick__rowicon\",\n                  \"aria-hidden\": \"true\",\n                  innerHTML: s(Li)(\"folder\")\n                }, null, 8, xz),\n                o(\"span\", Sz, f(le.label), 1),\n                le.blocked ? (c(), d(\"span\", Cz, f(s(a)(\"destpicker.tag.blocked\")), 1)) : le.writable ? g(\"\", !0) : (c(), d(\"span\", Tz, f(s(a)(\"destpicker.readonly\")), 1)),\n                P[6] || (P[6] = o(\"svg\", {\n                  class: \"fe-destpick__rowinto\",\n                  viewBox: \"0 0 24 24\",\n                  fill: \"none\",\n                  stroke: \"currentColor\",\n                  \"stroke-width\": \"2\",\n                  \"stroke-linecap\": \"round\",\n                  \"stroke-linejoin\": \"round\",\n                  \"aria-hidden\": \"true\",\n                  focusable: \"false\"\n                }, [\n                  o(\"path\", { d: \"M9 5l7 7-7 7\" })\n                ], -1))\n              ], 10, $z)\n            ]))), 128))\n          ]),\n          M.value ? (c(), d(\"p\", {\n            key: 0,\n            class: we([\"fe-destpick__reason\", { \"is-hint\": !$.value }]),\n            \"data-testid\": \"destpicker-reason\"\n          }, f(M.value), 3)) : (c(), d(\"p\", Mz, f(s(a)(\"destpicker.target\", { name: s(_i)(u.value, G.value) })), 1))\n        ])\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), zz = {\n  class: \"fe-newdoc\",\n  \"data-testid\": \"newdoc-modal\"\n}, Az = {\n  key: 0,\n  class: \"fe-newdoc__empty\",\n  \"data-testid\": \"newdoc-empty\"\n}, Pz = { class: \"fe-newdoc__empty-title\" }, Lz = { class: \"fe-newdoc__empty-body\" }, Dz = [\"aria-label\"], Oz = { class: \"fe-newdoc__grouplabel\" }, Bz = { class: \"fe-newdoc__grid\" }, Iz = [\"aria-checked\", \"tabindex\", \"data-newdoc-ext\", \"data-testid\", \"onClick\", \"onKeydown\"], Hz = [\"innerHTML\"], Fz = { class: \"fe-newdoc__ext\" }, Nz = { class: \"fe-newdoc__kind\" }, Kz = {\n  key: 0,\n  class: \"fe-newdoc__withheld\",\n  \"data-testid\": \"newdoc-withheld\"\n}, Rz = { class: \"fe-newdoc__field\" }, Uz = {\n  class: \"fe-newdoc__label\",\n  for: \"fe-newdoc-name\"\n}, Vz = { class: \"fe-newdoc__nameline\" }, jz = [\"placeholder\", \"onKeydown\"], Yz = {\n  key: 0,\n  class: \"fe-newdoc__suffix\"\n}, Wz = {\n  key: 0,\n  class: \"fe-form__error\"\n}, qz = {\n  key: 1,\n  class: \"fe-form__error\",\n  \"data-testid\": \"newdoc-collision\"\n}, Gz = { class: \"fe-newdoc__field\" }, Xz = { class: \"fe-newdoc__label\" }, Jz = { class: \"fe-newdoc__dest\" }, Zz = {\n  class: \"fe-newdoc__destpath\",\n  \"data-testid\": \"newdoc-dest\"\n}, Qz = {\n  key: 0,\n  class: \"fe-form__error\",\n  \"data-testid\": \"newdoc-noaccess\"\n}, e6 = {\n  key: 0,\n  class: \"fe-form__error\",\n  \"data-testid\": \"newdoc-failure\"\n}, t6 = [\"disabled\"], n6 = /* @__PURE__ */ qe({\n  __name: \"NewDocumentModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    theme: {},\n    api: {},\n    types: {},\n    currentPath: {},\n    storages: {},\n    onlyOfficeReady: { type: Boolean },\n    drawioReady: { type: Boolean }\n  },\n  emits: [\"close\", \"created\", \"error\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale);\n    function u(W) {\n      return W.requires === \"onlyoffice\" ? !!n.onlyOfficeReady : W.requires === \"drawio\" ? !!n.drawioReady : !0;\n    }\n    const v = k(() => (n.types ?? []).filter(u)), p = k(() => {\n      const W = [];\n      for (const $e of n.types ?? [])\n        !u($e) && $e.requires && !W.includes($e.requires) && W.push($e.requires);\n      return W;\n    }), h = k(\n      () => p.value.map((W) => a(\"newdoc.withheld.\" + W)).join(\" \")\n    ), b = k(() => {\n      const W = [], $e = /* @__PURE__ */ new Map();\n      for (const Se of v.value)\n        $e.has(Se.group) || ($e.set(Se.group, []), W.push(Se.group)), $e.get(Se.group).push(Se);\n      return W.map((Se) => ({ group: Se, types: $e.get(Se) }));\n    }), y = m(\"\"), A = k(() => v.value.find((W) => W.ext === y.value) ?? null);\n    function D(W) {\n      return Os({ type: \"file\", extension: W }, a);\n    }\n    function C(W) {\n      return Li(jn({ type: \"file\", extension: W, basename: \"x.\" + W }));\n    }\n    const B = m(\"\"), I = m(!1), U = /* @__PURE__ */ new Map();\n    function x(W) {\n      return !W || W.read_only ? !1 : al(W.perm);\n    }\n    async function E(W) {\n      if (U.has(W)) return U.get(W);\n      try {\n        const $e = await n.api.index(W);\n        return U.set(W, $e), $e;\n      } catch {\n        return;\n      }\n    }\n    const $ = k(\n      () => B.value ? Kd(B.value).map((W) => W.label).join(\" / \") : \"\"\n    ), M = m(!0), z = m(!1), T = m(\"\"), Y = m(!1), O = m(!1), J = m(!1), G = m(null), N = k(() => {\n      var Se;\n      const W = T.value.trim(), $e = ((Se = A.value) == null ? void 0 : Se.ext) ?? \"\";\n      return !W || !$e || W.toLowerCase().endsWith(\".\" + $e) ? W : W + \".\" + $e;\n    }), P = k(() => /[\\\\/]/.test(T.value));\n    function le(W, $e) {\n      const Se = a(\"newdoc.untitled\");\n      if (!W.has((Se + \".\" + $e).toLowerCase())) return Se;\n      for (let ze = 2; ze < 100; ze++) {\n        const Ne = `${Se} (${ze})`;\n        if (!W.has((Ne + \".\" + $e).toLowerCase())) return Ne;\n      }\n      return Se;\n    }\n    function ve(W) {\n      const $e = /* @__PURE__ */ new Set();\n      for (const Se of (W == null ? void 0 : W.files) ?? []) $e.add(Se.basename.toLowerCase());\n      return $e;\n    }\n    let he = 0, oe = null;\n    async function ue(W = {}) {\n      var De;\n      const $e = ++he, Se = B.value;\n      if (!Se) {\n        z.value = !1, O.value = !1;\n        return;\n      }\n      const ze = await E(Se);\n      if ($e !== he || Se !== B.value) return;\n      M.value = x(ze), z.value = !0;\n      const Ne = ve(ze), be = ((De = A.value) == null ? void 0 : De.ext) ?? \"\";\n      W.suggest && !Y.value && be && (T.value = le(Ne, be)), O.value = !!N.value && Ne.has(N.value.toLowerCase());\n    }\n    function Q() {\n      oe && clearTimeout(oe), oe = setTimeout(() => void ue(), 220);\n    }\n    function pe() {\n      const W = (n.currentPath || \"\").trim(), [$e] = _a(W);\n      if ($e) return W;\n      const Se = n.storages ?? [];\n      return Se.length === 1 ? Se[0] + \"://\" : \"\";\n    }\n    He(\n      () => n.open,\n      async (W) => {\n        var $e;\n        W && (U.clear(), G.value = null, O.value = !1, Y.value = !1, J.value = !1, T.value = \"\", y.value = (($e = v.value[0]) == null ? void 0 : $e.ext) ?? \"\", B.value = pe(), z.value = !1, M.value = !0, I.value = !B.value, await ue({ suggest: !0 }));\n      }\n    ), He(y, () => {\n      ue({ suggest: !0 });\n    }), He(T, () => {\n      O.value = !1, Q();\n    }), He(B, () => {\n      ue({ suggest: !0 });\n    });\n    function re(W) {\n      y.value = W;\n    }\n    function S(W, $e) {\n      const Se = v.value.map((be) => be.ext), ze = Se.indexOf($e);\n      let Ne = -1;\n      W.key === \"ArrowRight\" || W.key === \"ArrowDown\" ? Ne = (ze + 1) % Se.length : W.key === \"ArrowLeft\" || W.key === \"ArrowUp\" ? Ne = (ze - 1 + Se.length) % Se.length : W.key === \"Home\" ? Ne = 0 : W.key === \"End\" && (Ne = Se.length - 1), !(Ne < 0) && (W.preventDefault(), y.value = Se[Ne], gt(() => {\n        const be = document.querySelector(`[data-newdoc-ext=\"${Se[Ne]}\"]`);\n        be == null || be.focus();\n      }));\n    }\n    function w(W) {\n      B.value = W, I.value = !1;\n    }\n    function j() {\n      if (I.value) {\n        I.value = !1;\n        return;\n      }\n      r(\"close\");\n    }\n    const K = k(\n      () => !J.value && !!A.value && !!B.value && !I.value && !!T.value.trim() && !P.value && !O.value && (!z.value || M.value)\n    );\n    async function Z() {\n      if (!(!K.value || !A.value)) {\n        J.value = !0, G.value = null;\n        try {\n          const W = await n.api.newFile(B.value, T.value.trim(), A.value.ext);\n          r(\"created\", W);\n        } catch (W) {\n          const $e = W;\n          $e.status === 409 ? O.value = !0 : (G.value = $e.message || String(W), r(\"error\", { message: G.value }));\n        } finally {\n          J.value = !1;\n        }\n      }\n    }\n    return (W, $e) => (c(), d(ae, null, [\n      Ge(an, {\n        open: e.open,\n        title: s(a)(\"newdoc.title\"),\n        size: \"lg\",\n        theme: e.theme,\n        onClose: j\n      }, {\n        actions: st(() => [\n          o(\"button\", {\n            type: \"button\",\n            class: \"fe-btn\",\n            onClick: j\n          }, f(s(a)(\"newdoc.cancel\")), 1),\n          v.value.length ? (c(), d(\"button\", {\n            key: 0,\n            type: \"button\",\n            class: \"fe-btn fe-btn--primary\",\n            disabled: !K.value,\n            \"data-testid\": \"newdoc-create\",\n            onClick: Z\n          }, f(J.value ? s(a)(\"newdoc.creating\") : s(a)(\"newdoc.create\")), 9, t6)) : g(\"\", !0)\n        ]),\n        default: st(() => [\n          o(\"div\", zz, [\n            v.value.length ? (c(), d(ae, { key: 1 }, [\n              o(\"div\", {\n                class: \"fe-newdoc__types\",\n                role: \"radiogroup\",\n                \"aria-label\": s(a)(\"newdoc.type.label\")\n              }, [\n                (c(!0), d(ae, null, Te(b.value, (Se) => (c(), d(\"section\", {\n                  key: Se.group,\n                  class: \"fe-newdoc__group\"\n                }, [\n                  o(\"h3\", Oz, f(s(a)(\"newdoc.group.\" + Se.group)), 1),\n                  o(\"div\", Bz, [\n                    (c(!0), d(ae, null, Te(Se.types, (ze) => (c(), d(\"button\", {\n                      key: ze.ext,\n                      type: \"button\",\n                      role: \"radio\",\n                      class: we([\"fe-newdoc__type\", { \"is-selected\": y.value === ze.ext }]),\n                      \"aria-checked\": y.value === ze.ext,\n                      tabindex: y.value === ze.ext ? 0 : -1,\n                      \"data-newdoc-ext\": ze.ext,\n                      \"data-testid\": \"newdoc-type-\" + ze.ext,\n                      onClick: (Ne) => re(ze.ext),\n                      onKeydown: (Ne) => S(Ne, ze.ext)\n                    }, [\n                      o(\"span\", {\n                        class: \"fe-newdoc__tile\",\n                        \"aria-hidden\": \"true\",\n                        innerHTML: C(ze.ext)\n                      }, null, 8, Hz),\n                      o(\"span\", Fz, \".\" + f(ze.ext), 1),\n                      o(\"span\", Nz, f(D(ze.ext)), 1)\n                    ], 42, Iz))), 128))\n                  ])\n                ]))), 128)),\n                h.value ? (c(), d(\"p\", Kz, f(h.value), 1)) : g(\"\", !0)\n              ], 8, Dz),\n              o(\"div\", Rz, [\n                o(\"label\", Uz, f(s(a)(\"newdoc.name\")), 1),\n                o(\"div\", Vz, [\n                  Ve(o(\"input\", {\n                    id: \"fe-newdoc-name\",\n                    \"onUpdate:modelValue\": $e[0] || ($e[0] = (Se) => T.value = Se),\n                    type: \"text\",\n                    class: \"fe-input fe-newdoc__name\",\n                    autocomplete: \"off\",\n                    spellcheck: \"false\",\n                    \"data-testid\": \"newdoc-name\",\n                    placeholder: s(a)(\"newdoc.name.placeholder\"),\n                    onInput: $e[1] || ($e[1] = (Se) => Y.value = !0),\n                    onKeydown: Ut(Re(Z, [\"prevent\"]), [\"enter\"])\n                  }, null, 40, jz), [\n                    [rt, T.value]\n                  ]),\n                  A.value ? (c(), d(\"span\", Yz, \".\" + f(A.value.ext), 1)) : g(\"\", !0)\n                ]),\n                P.value ? (c(), d(\"p\", Wz, f(s(a)(\"newdoc.err.slash\")), 1)) : O.value ? (c(), d(\"p\", qz, f(s(a)(\"newdoc.err.exists\", { name: N.value })), 1)) : g(\"\", !0)\n              ]),\n              o(\"div\", Gz, [\n                o(\"span\", Xz, f(s(a)(\"newdoc.location\")), 1),\n                o(\"div\", Jz, [\n                  o(\"span\", Zz, f(B.value ? $.value : s(a)(\"newdoc.location.none\")), 1),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-newdoc__changebtn\",\n                    \"data-testid\": \"newdoc-change\",\n                    onClick: $e[2] || ($e[2] = (Se) => I.value = !0)\n                  }, f(s(a)(\"newdoc.location.change\")), 1)\n                ]),\n                z.value && !M.value ? (c(), d(\"p\", Qz, f(s(a)(\"newdoc.location.noaccess\")), 1)) : g(\"\", !0)\n              ]),\n              G.value ? (c(), d(\"p\", e6, f(G.value), 1)) : g(\"\", !0)\n            ], 64)) : (c(), d(\"div\", Az, [\n              o(\"p\", Pz, f(s(a)(\"newdoc.empty.title\")), 1),\n              o(\"p\", Lz, f(p.value.length ? s(a)(\"newdoc.empty.blocked\") : s(a)(\"newdoc.empty.body\")), 1)\n            ]))\n          ])\n        ]),\n        _: 1\n      }, 8, [\"open\", \"title\", \"theme\"]),\n      Ge(Rd, {\n        open: I.value,\n        api: e.api,\n        locale: e.locale,\n        mode: \"choose\",\n        storages: e.storages,\n        \"start-at\": B.value || e.currentPath,\n        onClose: $e[3] || ($e[3] = (Se) => I.value = !1),\n        onPick: w\n      }, null, 8, [\"open\", \"api\", \"locale\", \"storages\", \"start-at\"])\n    ], 64));\n  }\n}), a6 = [\"onKeydown\"], o6 = /* @__PURE__ */ qe({\n  __name: \"RenameModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    currentName: {}\n  },\n  emits: [\"close\", \"submit\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale), u = m(\"\");\n    He(\n      () => [n.open, n.currentName],\n      ([p, h]) => {\n        p && (u.value = h);\n      }\n    );\n    function v() {\n      const p = u.value.trim();\n      p && (/[\\\\/]/.test(p) || p === \".\" || p === \"..\" || r(\"submit\", p));\n    }\n    return (p, h) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"modal.rename.title\"),\n      size: \"sm\",\n      onClose: h[2] || (h[2] = (b) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: h[1] || (h[1] = (b) => r(\"close\"))\n        }, f(s(a)(\"modal.rename.cancel\")), 1),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--primary\",\n          onClick: v\n        }, f(s(a)(\"modal.rename.save\")), 1)\n      ]),\n      default: st(() => [\n        o(\"form\", {\n          onSubmit: Re(v, [\"prevent\"])\n        }, [\n          Ve(o(\"input\", {\n            \"onUpdate:modelValue\": h[0] || (h[0] = (b) => u.value = b),\n            type: \"text\",\n            class: \"fe-input\",\n            autocomplete: \"off\",\n            onKeydown: Ut(Re(v, [\"prevent\"]), [\"enter\"])\n          }, null, 40, a6), [\n            [rt, u.value]\n          ])\n        ], 32)\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), s6 = /* @__PURE__ */ qe({\n  __name: \"DeleteConfirmModal\",\n  props: {\n    open: { type: Boolean },\n    locale: {},\n    count: {}\n  },\n  emits: [\"close\", \"confirm\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, { t: a } = tt(() => n.locale);\n    return (u, v) => (c(), et(an, {\n      open: e.open,\n      title: s(a)(\"modal.delete.title\"),\n      size: \"sm\",\n      onClose: v[2] || (v[2] = (p) => r(\"close\"))\n    }, {\n      actions: st(() => [\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn\",\n          onClick: v[0] || (v[0] = (p) => r(\"close\"))\n        }, f(s(a)(\"modal.delete.cancel\")), 1),\n        o(\"button\", {\n          type: \"button\",\n          class: \"fe-btn fe-btn--danger\",\n          onClick: v[1] || (v[1] = (p) => r(\"confirm\"))\n        }, f(s(a)(\"modal.delete.confirm\")), 1)\n      ]),\n      default: st(() => [\n        o(\"p\", null, f(s(a)(\"modal.delete.message\", { count: e.count })), 1)\n      ]),\n      _: 1\n    }, 8, [\"open\", \"title\"]));\n  }\n}), r6 = { class: \"filex-cv\" }, i6 = { class: \"filex-cv__head\" }, l6 = [\"title\", \"aria-label\"], c6 = [\"innerHTML\"], u6 = {\n  key: 0,\n  class: \"filex-cv__msg\"\n}, d6 = {\n  key: 1,\n  class: \"filex-cv__msg filex-cv__ok\"\n}, f6 = [\"innerHTML\"], p6 = { class: \"filex-cv__src\" }, v6 = [\"placeholder\"], h6 = { class: \"filex-cv__list\" }, m6 = [\"onClick\"], y6 = {\n  key: 0,\n  class: \"filex-cv__empty\"\n}, b6 = {\n  key: 0,\n  class: \"filex-cv__err\"\n}, g6 = { class: \"filex-cv__foot\" }, k6 = [\"disabled\"], _6 = [\"src\"], w6 = /* @__PURE__ */ qe({\n  __name: \"ConvertModal\",\n  props: {\n    convertUrl: {},\n    fileName: {},\n    fetchBytes: { type: Function },\n    upload: { type: Function },\n    locale: {}\n  },\n  emits: [\"close\", \"done\"],\n  setup(e, { emit: t }) {\n    const n = e, { t: r } = tt(() => n.locale), a = t, u = m(null), v = m(\"loading\"), p = m(null), h = m([]), b = m(\"\"), y = m(null), A = k(() => (n.fileName.split(\".\").pop() || \"\").toLowerCase()), D = k(() => {\n      const z = h.value.filter((T) => T.from);\n      return z.find((T) => (T.ext || \"\").toLowerCase() === A.value) || z.find((T) => (T.format || \"\").toLowerCase() === A.value) || null;\n    }), C = k(() => {\n      const z = b.value.trim().toLowerCase(), T = /* @__PURE__ */ new Set(), Y = [];\n      for (const O of h.value) {\n        if (!O.to) continue;\n        const J = (O.ext || O.format || \"\").toLowerCase();\n        !J || T.has(J) || (T.add(J), Y.push(O));\n      }\n      return Y.sort((O, J) => (O.ext || O.format).localeCompare(J.ext || J.format)), z ? Y.filter(\n        (O) => (O.ext || \"\").toLowerCase().includes(z) || (O.format || \"\").toLowerCase().includes(z) || (O.name || \"\").toLowerCase().includes(z) || (O.mime || \"\").toLowerCase().includes(z)\n      ) : Y;\n    }), B = k(() => `${n.convertUrl.replace(/\\/$/, \"\")}/?embed=1`);\n    let I = 0;\n    const U = /* @__PURE__ */ new Map();\n    function x(z, T = {}, Y = []) {\n      const O = ++I;\n      return new Promise((J, G) => {\n        var N, P;\n        U.set(O, { resolve: J, reject: G }), (P = (N = u.value) == null ? void 0 : N.contentWindow) == null || P.postMessage({ target: \"convert-embed\", id: O, cmd: z, ...T }, \"*\", Y), setTimeout(() => {\n          U.has(O) && (U.delete(O), G(new Error(\"convert timeout\")));\n        }, 18e4);\n      });\n    }\n    function E(z) {\n      const T = z.data;\n      if (!T || T.source !== \"convert-embed\") return;\n      if (T.event === \"ready\") {\n        $();\n        return;\n      }\n      const Y = U.get(T.id);\n      Y && (U.delete(T.id), T.ok ? Y.resolve(T) : Y.reject(new Error(T.error || \"convert error\")));\n    }\n    async function $() {\n      try {\n        const z = await x(\"listFormats\");\n        h.value = z.formats || [], v.value = \"ready\", D.value || (p.value = r(\"convert.unsupported_input\"));\n      } catch (z) {\n        p.value = z.message, v.value = \"error\";\n      }\n    }\n    async function M() {\n      if (!(!y.value || !D.value)) {\n        v.value = \"converting\", p.value = null;\n        try {\n          const z = await n.fetchBytes(), T = await x(\n            \"convert\",\n            { name: n.fileName, bytes: z, fromIndex: D.value.index, toIndex: y.value.index },\n            [z]\n          ), Y = n.fileName.replace(/\\.[^.]+$/, \"\"), O = T.ext || y.value.ext || y.value.format, J = `${Y}.${O}`, G = new File([T.bytes], J, { type: y.value.mime || \"application/octet-stream\" });\n          await n.upload(G), v.value = \"done\", a(\"done\", J);\n        } catch (z) {\n          p.value = z.message, v.value = \"error\";\n        }\n      }\n    }\n    return dt(() => window.addEventListener(\"message\", E)), it(() => window.removeEventListener(\"message\", E)), (z, T) => (c(), d(\"div\", {\n      class: \"filex-cv__bg\",\n      onClick: T[3] || (T[3] = Re((Y) => a(\"close\"), [\"self\"]))\n    }, [\n      o(\"div\", r6, [\n        o(\"header\", i6, [\n          o(\"h3\", null, f(s(r)(\"convert.title\")) + \" — \" + f(e.fileName), 1),\n          o(\"button\", {\n            class: \"filex-cv__x\",\n            type: \"button\",\n            title: s(r)(\"convert.close\"),\n            \"aria-label\": s(r)(\"convert.close\"),\n            onClick: T[0] || (T[0] = (Y) => a(\"close\"))\n          }, [\n            o(\"span\", {\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"close\")\n            }, null, 8, c6)\n          ], 8, l6)\n        ]),\n        v.value === \"loading\" ? (c(), d(\"div\", u6, f(s(r)(\"convert.loading\")), 1)) : v.value === \"done\" ? (c(), d(\"div\", d6, [\n          o(\"p\", null, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"check\")\n            }, null, 8, f6),\n            Je(\" \" + f(s(r)(\"convert.done\")), 1)\n          ]),\n          o(\"button\", {\n            class: \"filex-cv__convert\",\n            onClick: T[1] || (T[1] = (Y) => a(\"close\"))\n          }, f(s(r)(\"convert.close\")), 1)\n        ])) : (c(), d(ae, { key: 2 }, [\n          o(\"p\", p6, [\n            Je(f(s(r)(\"convert.from\")) + \": \", 1),\n            o(\"b\", null, f(A.value || \"?\"), 1)\n          ]),\n          Ve(o(\"input\", {\n            \"onUpdate:modelValue\": T[2] || (T[2] = (Y) => b.value = Y),\n            class: \"filex-cv__search\",\n            placeholder: s(r)(\"convert.search_format\")\n          }, null, 8, v6), [\n            [rt, b.value]\n          ]),\n          o(\"div\", h6, [\n            (c(!0), d(ae, null, Te(C.value, (Y) => {\n              var O;\n              return c(), d(\"button\", {\n                key: Y.index,\n                class: we([\"filex-cv__fmt\", { \"is-sel\": ((O = y.value) == null ? void 0 : O.index) === Y.index }]),\n                onClick: (J) => y.value = Y\n              }, [\n                o(\"b\", null, f((Y.ext || Y.format).toUpperCase()), 1),\n                o(\"small\", null, f(Y.name), 1)\n              ], 10, m6);\n            }), 128)),\n            C.value.length === 0 ? (c(), d(\"div\", y6, f(s(r)(\"convert.no_format\")), 1)) : g(\"\", !0)\n          ]),\n          p.value ? (c(), d(\"div\", b6, f(p.value), 1)) : g(\"\", !0),\n          o(\"footer\", g6, [\n            o(\"button\", {\n              class: \"filex-cv__convert\",\n              disabled: !y.value || !D.value || v.value === \"converting\",\n              onClick: M\n            }, f(v.value === \"converting\" ? s(r)(\"convert.converting\") : s(r)(\"convert.convert\")), 9, k6)\n          ])\n        ], 64)),\n        o(\"iframe\", {\n          ref_key: \"iframeRef\",\n          ref: u,\n          src: B.value,\n          class: \"filex-cv__frame\",\n          title: \"converter\"\n        }, null, 8, _6)\n      ])\n    ]));\n  }\n});\nfunction Pu(e) {\n  return `'${e.replace(/'/g, \"'\\\\''\")}'`;\n}\nfunction $6(e) {\n  if (!(e != null && e.url)) return \"\";\n  let t = e.url;\n  const n = [];\n  e.isDir && n.push(\"zip=wait\"), e.pin && n.push(\"pin=\" + encodeURIComponent(e.pin)), n.length && (t += (t.includes(\"?\") ? \"&\" : \"?\") + n.join(\"&\"));\n  let r = \"-OJ \";\n  return e.filename && (r = `-o ${Pu(e.isDir ? `${e.filename}.zip` : e.filename)} `), `curl -fSL ${r}${Pu(t)}`;\n}\nconst x6 = [0, 1, 7, 30];\nfunction S6(e, t, n) {\n  const r = t && t > 0 ? Math.floor(t) : 0;\n  let a = r ? e.filter((u) => u > 0 && u <= r) : e.slice();\n  return r && !a.includes(r) && a.push(r), a = Array.from(new Set(a)).sort((u, v) => u === 0 ? -1 : v === 0 ? 1 : u - v), a.map((u) => ({ v: u, l: n(u) }));\n}\nfunction bs(e) {\n  return e && e > 0 ? Math.floor(e) : 0;\n}\nfunction C6(e, t, n) {\n  if (!e) return t === \"tr\" ? \"Bu bağlantının süresi yoktur.\" : \"This link does not expire.\";\n  const r = new Date(e), a = Number.isNaN(r.getTime()) ? e : Ha(r, t, { dateStyle: \"medium\", timeStyle: \"short\" }, n);\n  return t === \"tr\" ? `Bu bağlantı ${a} tarihine kadar geçerli.` : `This link is valid until ${a}.`;\n}\nfunction T6(e, t) {\n  const n = e && e > 0 ? Math.floor(e) : 0;\n  return n ? t === \"tr\" ? `Bağlantılar en fazla ${n} gün geçerli olabilir (sunucu ayarı).` : `Links can be valid for at most ${n} day${n === 1 ? \"\" : \"s\"} (server setting).` : \"\";\n}\nfunction M6(e) {\n  const t = e.filter((n) => !!n);\n  return t.map((n, r) => r < t.length - 1 ? n.replace(/\\.\\s*$/, \"\") : n).join(\" · \");\n}\nconst E6 = [\"aria-label\"], z6 = { class: \"fe-share__head\" }, A6 = [\"innerHTML\"], P6 = { class: \"fe-share__headtext\" }, L6 = { class: \"fe-share__title\" }, D6 = [\"title\"], O6 = [\"aria-label\", \"title\"], B6 = [\"innerHTML\"], I6 = { class: \"fe-share__body\" }, H6 = { class: \"fe-share__lead\" }, F6 = { class: \"fe-share__switchrow\" }, N6 = [\"innerHTML\"], K6 = { class: \"fe-share__leadlabel\" }, R6 = [\"aria-checked\", \"aria-label\", \"disabled\"], U6 = {\n  class: \"fe-share__who\",\n  \"data-testid\": \"share-who\"\n}, V6 = { class: \"fe-share__linkrow\" }, j6 = [\"href\", \"title\"], Y6 = [\"innerHTML\"], W6 = {\n  key: 0,\n  class: \"fe-share__detail\",\n  \"data-testid\": \"share-valid-until\"\n}, q6 = {\n  key: 1,\n  class: \"fe-share__pinrow\"\n}, G6 = { class: \"fe-share__pin\" }, X6 = {\n  key: 1,\n  class: \"fe-share__warn\"\n}, J6 = { class: \"fe-share__sections\" }, Z6 = { class: \"fe-share__section\" }, Q6 = [\"aria-expanded\"], eA = { class: \"fe-share__seclabel\" }, tA = { class: \"fe-share__secmeta\" }, nA = {\n  key: 0,\n  class: \"fe-share__panel\"\n}, aA = { class: \"fe-share__opts\" }, oA = { class: \"fe-share__check\" }, sA = { class: \"fe-share__field\" }, rA = { class: \"fe-share__fieldlabel\" }, iA = [\"value\"], lA = { class: \"fe-share__field\" }, cA = { class: \"fe-share__fieldlabel\" }, uA = [\"value\"], dA = {\n  key: 0,\n  class: \"fe-share__hint\",\n  \"data-testid\": \"share-ttl-hint\"\n}, fA = [\"disabled\"], pA = {\n  key: 1,\n  class: \"fe-share__hint\"\n}, vA = { class: \"fx-perm-cli fe-share__cli\" }, hA = { class: \"fe-share__fieldlabel\" }, mA = { class: \"fe-share__clirow\" }, yA = [\"title\"], bA = { class: \"fe-share__mailrow\" }, gA = [\"placeholder\"], kA = [\"disabled\"], _A = {\n  key: 0,\n  class: \"fe-share__notice\"\n}, wA = [\"innerHTML\"], $A = { class: \"fe-share__list\" }, xA = { class: \"fe-share__listhead\" }, SA = {\n  key: 0,\n  class: \"fe-share__empty\"\n}, CA = [\"title\"], TA = [\"onClick\"], MA = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], EA = [\"innerHTML\"], zA = {\n  key: 0,\n  class: \"fe-share__section\"\n}, AA = [\"aria-expanded\"], PA = { class: \"fe-share__seclabel\" }, LA = { class: \"fe-share__secmeta\" }, DA = {\n  key: 0,\n  class: \"fe-share__panel\"\n}, OA = {\n  key: 0,\n  class: \"fe-share__warn\"\n}, BA = {\n  key: 1,\n  class: \"fe-share__warn\"\n}, IA = {\n  key: 2,\n  class: \"fe-share__hint\"\n}, HA = { class: \"fe-share__add\" }, FA = { class: \"fe-share__emailwrap\" }, NA = [\"placeholder\"], KA = {\n  key: 0,\n  class: \"fe-share__suggest\"\n}, RA = [\"onMousedown\"], UA = { class: \"fe-share__av fe-share__av--sm\" }, VA = { class: \"fe-share__suggesttxt\" }, jA = { class: \"fe-share__suggestname\" }, YA = { class: \"fe-share__suggestmeta\" }, WA = [\"title\"], qA = [\"value\"], GA = [\"disabled\"], XA = {\n  key: 0,\n  class: \"fe-share__invite\"\n}, JA = { class: \"fe-share__hint\" }, ZA = { class: \"fe-share__inviterow\" }, QA = { value: \"user\" }, eP = { value: \"viewer\" }, tP = [\"disabled\"], nP = [\"disabled\"], aP = {\n  key: 1,\n  class: \"fe-share__notice\"\n}, oP = {\n  key: 2,\n  class: \"fe-share__notice\"\n}, sP = { class: \"fe-share__pin\" }, rP = { class: \"fe-share__list\" }, iP = { class: \"fe-share__listhead\" }, lP = {\n  key: 0,\n  class: \"fe-share__empty\"\n}, cP = { class: \"fe-share__av\" }, uP = [\"title\"], dP = [\"value\", \"onChange\"], fP = [\"value\"], pP = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], vP = [\"innerHTML\"], hP = { class: \"fe-share__av fe-share__av--dim\" }, mP = [\"title\"], yP = { class: \"fe-share__badge\" }, bP = [\"title\"], gP = {\n  key: 1,\n  class: \"fe-share__section\"\n}, kP = [\"aria-expanded\"], _P = { class: \"fe-share__seclabel\" }, wP = { class: \"fe-share__secmeta\" }, $P = {\n  key: 0,\n  class: \"fe-share__panel\"\n}, xP = { class: \"fe-share__hint\" }, SP = { class: \"fe-share__opts\" }, CP = { class: \"fe-share__check\" }, TP = { class: \"fe-share__field\" }, MP = { class: \"fe-share__fieldlabel\" }, EP = [\"value\"], zP = {\n  key: 0,\n  class: \"fe-share__hint\"\n}, AP = [\"disabled\"], PP = [\"aria-expanded\"], LP = {\n  key: 1,\n  class: \"fe-share__adv\"\n}, DP = { class: \"fe-share__advrow\" }, OP = { class: \"fe-share__fieldlabel\" }, BP = { class: \"fe-share__advrow\" }, IP = { class: \"fe-share__fieldlabel\" }, HP = { class: \"fe-share__advrow\" }, FP = { class: \"fe-share__fieldlabel\" }, NP = [\"placeholder\"], KP = { class: \"fe-share__check\" }, RP = {\n  key: 2,\n  class: \"fe-share__warn\"\n}, UP = { class: \"fe-share__linkrow\" }, VP = [\"href\", \"title\"], jP = [\"innerHTML\"], YP = { class: \"fe-share__detail\" }, WP = { key: 0 }, qP = {\n  key: 0,\n  class: \"fe-share__pinrow\"\n}, GP = { class: \"fe-share__pin\" }, XP = { class: \"fe-share__mailrow\" }, JP = [\"placeholder\"], ZP = [\"disabled\"], QP = {\n  key: 1,\n  class: \"fe-share__notice\"\n}, eL = [\"innerHTML\"], tL = { class: \"fe-share__list\" }, nL = { class: \"fe-share__listhead\" }, aL = {\n  key: 0,\n  class: \"fe-share__empty\"\n}, oL = [\"title\"], sL = [\"onClick\"], rL = [\"disabled\", \"title\", \"aria-label\", \"onClick\"], iL = [\"innerHTML\"], lL = { class: \"fe-share__foot\" }, cL = /* @__PURE__ */ qe({\n  __name: \"PermissionsModal\",\n  props: {\n    api: {},\n    path: {},\n    isDir: { type: Boolean },\n    size: {},\n    locale: {},\n    shareMaxTtlDays: {},\n    initialTab: {}\n  },\n  emits: [\"close\"],\n  setup(e, { emit: t }) {\n    const n = e, r = t, a = k(() => cn(n.locale)), { t: u } = tt(() => a.value), v = k(() => a.value !== \"en\");\n    function p(q, ne) {\n      return v.value ? q : ne;\n    }\n    const h = k(() => {\n      const q = /^([^:]+):\\/\\/(.*)$/.exec(n.path), ne = q ? q[1] : \"\", H = q ? q[2] : n.path, te = H.split(\"/\").filter(Boolean);\n      return { adapter: ne, name: te.length ? te[te.length - 1] : ne, rel: H };\n    }), b = k(() => {\n      const q = h.value.name, ne = q.lastIndexOf(\".\");\n      return fn({\n        type: n.isDir ? \"dir\" : \"file\",\n        extension: !n.isDir && ne > 0 ? q.slice(ne + 1) : \"\"\n      });\n    }), y = m({ link: !1, people: !1, drop: !1 });\n    function A(q) {\n      y.value = { ...y.value, [q]: !y.value[q] };\n    }\n    const D = m(!1), C = m(!0), B = m(\"\"), I = m([]), U = m([]), x = m(!0), E = m(\"\"), $ = m(\"viewer\"), M = m(!1), z = m(\"\"), T = m(!1), Y = m(\"user\"), O = m(null), J = m([]), G = m(!1);\n    let N;\n    const P = [\n      { v: \"viewer\", l: p(\"Görüntüleyen\", \"Viewer\"), d: p(\"görüntüle + indir\", \"view + download\") },\n      { v: \"editor\", l: p(\"Düzenleyen\", \"Editor\"), d: p(\"oku + yaz + sil\", \"read + write + delete\") },\n      { v: \"owner\", l: p(\"Sahip\", \"Owner\"), d: p(\"düzenle + izin yönet\", \"edit + manage access\") }\n    ];\n    function le(q) {\n      var ne;\n      return ((ne = P.find((H) => H.v === q)) == null ? void 0 : ne.l) ?? q;\n    }\n    const ve = m([]), he = m(!1), oe = m(!1), ue = m(bs(n.shareMaxTtlDays)), Q = m(null), pe = m(\"\"), re = m(\"\"), S = m(\"\"), w = m(!1), j = m(\"\");\n    function K(q) {\n      return q.kind ?? \"download\";\n    }\n    const Z = k(() => ve.value.filter((q) => K(q) !== \"drop\")), W = k(() => ve.value.filter((q) => K(q) === \"drop\"));\n    function $e(q) {\n      return q === 0 ? p(\"Süresiz\", \"Never\") : v.value ? `${q} gün` : `${q} day${q === 1 ? \"\" : \"s\"}`;\n    }\n    const Se = k(() => S6(x6, n.shareMaxTtlDays, $e)), ze = k(() => T6(n.shareMaxTtlDays, v.value ? \"tr\" : \"en\"));\n    He(\n      () => n.shareMaxTtlDays,\n      () => {\n        const q = Se.value.map((ne) => ne.v);\n        q.includes(ue.value) || (ue.value = bs(n.shareMaxTtlDays)), q.includes(ce.value) || (ce.value = bs(n.shareMaxTtlDays));\n      }\n    );\n    const Ne = m(0), be = [\n      { v: 0, l: p(\"Sınırsız\", \"Unlimited\") },\n      { v: 1, l: p(\"1 indirme\", \"1 download\") },\n      { v: 3, l: p(\"3 indirme\", \"3 downloads\") },\n      { v: 5, l: p(\"5 indirme\", \"5 downloads\") },\n      { v: 10, l: p(\"10 indirme\", \"10 downloads\") },\n      { v: 25, l: p(\"25 indirme\", \"25 downloads\") }\n    ], De = k(\n      () => $6(\n        Q.value ? {\n          url: Q.value.url,\n          pin: Q.value.pin,\n          filename: h.value.name,\n          isDir: !!n.isDir\n        } : null\n      )\n    ), ie = m(!1), ce = m(bs(n.shareMaxTtlDays)), L = m(!1), se = m(\"\"), Ce = m(\"\"), We = m(\"\"), Ie = m(!0), Ze = m(!1), vt = m(\"\"), Xe = m(null), Ae = m(\"\"), V = m(!1), R = m(\"\");\n    function X(q) {\n      const ne = /* @__PURE__ */ new Set(), H = [];\n      for (const te of q.split(/[,;\\s]+/)) {\n        const _e = te.trim().toLowerCase();\n        _e && _e.includes(\"@\") && !ne.has(_e) && (ne.add(_e), H.push(_e));\n      }\n      return H;\n    }\n    function ye(q) {\n      var te, _e;\n      const ne = ((te = q.sent) == null ? void 0 : te.length) ?? 0, H = ((_e = q.failed) == null ? void 0 : _e.length) ?? 0;\n      return H === 0 ? p(`E-posta gönderildi ✓ (${ne})`, `Email sent ✓ (${ne})`) : p(`${ne} gönderildi, ${H} başarısız`, `${ne} sent, ${H} failed`);\n    }\n    async function je() {\n      C.value = !0, B.value = \"\";\n      try {\n        const q = await n.api.listPermissions(n.path);\n        I.value = q.direct ?? [], U.value = q.inherited ?? [], x.value = q.storage_rbac, D.value = !0;\n      } catch (q) {\n        q.status === 403 ? (D.value = !1, y.value = { ...y.value, people: !1 }) : B.value = q instanceof Error ? q.message : String(q);\n      } finally {\n        C.value = !1;\n      }\n    }\n    async function Qe() {\n      try {\n        const q = await n.api.listShares(n.path);\n        ve.value = q.shares ?? [];\n      } catch {\n        ve.value = [];\n      }\n    }\n    function at(q) {\n      q.key === \"Escape\" && r(\"close\");\n    }\n    dt(async () => {\n      n.initialTab === \"drop\" ? y.value = { ...y.value, drop: !0 } : n.initialTab === \"perms\" && (y.value = { ...y.value, people: !0 }), document.addEventListener(\"keydown\", at), await je(), await Qe();\n    }), it(() => {\n      N && clearTimeout(N), document.removeEventListener(\"keydown\", at);\n    });\n    function Ye() {\n      T.value = !1, O.value = null, z.value = \"\";\n      const q = E.value.trim();\n      if (N && clearTimeout(N), q.length < 1) {\n        J.value = [], G.value = !1;\n        return;\n      }\n      N = setTimeout(async () => {\n        try {\n          const ne = await n.api.searchUsers(q);\n          J.value = ne.users ?? [], G.value = J.value.length > 0;\n        } catch {\n          G.value = !1;\n        }\n      }, 180);\n    }\n    async function lt(q) {\n      G.value = !1, E.value = q.email;\n      let ne = $.value;\n      q.role === \"viewer\" && ne !== \"viewer\" && (ne = \"viewer\"), M.value = !0, z.value = \"\";\n      try {\n        await n.api.addPermission({ path: n.path, user_id: q.id, level: ne, is_dir: !!n.isDir }), E.value = \"\", J.value = [], await je(), z.value = p(\"Yetki verildi.\", \"Access granted.\");\n      } catch (H) {\n        z.value = H instanceof Error ? H.message : String(H);\n      } finally {\n        M.value = !1;\n      }\n    }\n    async function fe() {\n      const q = E.value.trim().toLowerCase();\n      if (!q || !q.includes(\"@\")) {\n        z.value = p(\"Geçerli bir e-posta girin.\", \"Enter a valid email.\");\n        return;\n      }\n      G.value = !1, M.value = !0, z.value = \"\", O.value = null;\n      try {\n        const ne = await n.api.resolveEmail(q);\n        if (ne.found && ne.user) {\n          let H = $.value;\n          ne.user.role === \"viewer\" && H !== \"viewer\" && (H = \"viewer\"), await n.api.addPermission({ path: n.path, user_id: ne.user.id, level: H, is_dir: !!n.isDir }), E.value = \"\", await je(), z.value = p(\"Yetki verildi.\", \"Access granted.\");\n        } else\n          T.value = !0;\n      } catch (ne) {\n        z.value = ne instanceof Error ? ne.message : String(ne);\n      } finally {\n        M.value = !1;\n      }\n    }\n    async function Pe() {\n      M.value = !0, z.value = \"\";\n      try {\n        const q = await n.api.invitePermission({\n          path: n.path,\n          email: E.value.trim().toLowerCase(),\n          level: $.value,\n          create_user: !0,\n          role: Y.value,\n          is_dir: !!n.isDir,\n          locale: cn(n.locale)\n        });\n        O.value = { tempPassword: q.temp_password }, z.value = q.emailed ? p(\"Kullanıcı açıldı, davet e-postası gönderildi.\", \"User created, invite emailed.\") : p(\"Kullanıcı açıldı. Geçici parolayı iletin.\", \"User created. Share the temp password.\"), T.value = !1, E.value = \"\", await je();\n      } catch (q) {\n        z.value = q instanceof Error ? q.message : String(q);\n      } finally {\n        M.value = !1;\n      }\n    }\n    function Be() {\n      S.value = E.value.trim().toLowerCase(), T.value = !1, z.value = \"\", y.value = { ...y.value, link: !0 };\n    }\n    async function ht(q, ne) {\n      if (ne !== q.level) {\n        M.value = !0;\n        try {\n          await n.api.updatePermission(q.id, ne), await je();\n        } catch (H) {\n          z.value = H instanceof Error ? H.message : String(H);\n        } finally {\n          M.value = !1;\n        }\n      }\n    }\n    async function Ft(q) {\n      M.value = !0;\n      try {\n        await n.api.deletePermission(q.id), await je();\n      } catch (ne) {\n        z.value = ne instanceof Error ? ne.message : String(ne);\n      } finally {\n        M.value = !1;\n      }\n    }\n    function ft(q) {\n      return q.user_display_name || q.user_email || `#${q.user_id}`;\n    }\n    function qt(q) {\n      return (q.user_display_name || q.user_email || \"?\").charAt(0).toUpperCase();\n    }\n    function Gt() {\n      return ue.value ? new Date(Date.now() + ue.value * 864e5).toISOString() : null;\n    }\n    async function wt() {\n      he.value = !0, pe.value = \"\", Q.value = null, j.value = \"\";\n      try {\n        const q = await n.api.createShare({\n          path: n.path,\n          password: oe.value,\n          expires_at: Gt(),\n          // null, not 0 — the server reads 0 as \"no cap given\" either way, but a\n          // null says it explicitly and keeps the payload honest.\n          max_downloads: Ne.value || null\n        });\n        Q.value = {\n          url: q.share.url,\n          pin: q.share.password_pin ?? null,\n          expiresAt: q.share.expires_at ?? null,\n          clamped: !!q.share.expiry_clamped\n        }, await Qe();\n      } catch (q) {\n        pe.value = q instanceof Error ? q.message : String(q);\n      } finally {\n        he.value = !1;\n      }\n    }\n    async function en() {\n      if (!he.value) {\n        if (_t.value) {\n          he.value = !0, pe.value = \"\";\n          try {\n            for (const q of Z.value) await n.api.revokeShare(q.uuid);\n            Q.value = null, await Qe();\n          } catch (q) {\n            pe.value = q instanceof Error ? q.message : String(q);\n          } finally {\n            he.value = !1;\n          }\n          return;\n        }\n        await wt();\n      }\n    }\n    async function $t() {\n      var ne;\n      const q = X(S.value);\n      if (!q.length) {\n        j.value = p(\"Geçerli bir e-posta girin.\", \"Enter a valid email.\");\n        return;\n      }\n      if ((ne = Q.value) != null && ne.url) {\n        w.value = !0, j.value = \"\";\n        try {\n          const H = await n.api.shareMail({\n            path: n.path,\n            emails: q,\n            url: Q.value.url,\n            pin: Q.value.pin ?? void 0,\n            expires_days: ue.value || void 0,\n            locale: cn(n.locale),\n            is_dir: !!n.isDir,\n            size: n.size\n          });\n          j.value = ye(H);\n        } catch (H) {\n          const te = H.detail ?? \"\";\n          te.includes(\"not_configured\") ? j.value = p(\"SMTP ayarlı/doğrulanmış değil — linki elle iletin.\", \"SMTP not set up/verified — share the link manually.\") : te.includes(\"send_failed\") ? j.value = p(\"Gönderilemedi (geçici hata) — tekrar deneyin.\", \"Send failed (temporary) — please retry.\") : j.value = H instanceof Error ? H.message : String(H);\n        } finally {\n          w.value = !1;\n        }\n      }\n    }\n    function kt() {\n      return ce.value ? new Date(Date.now() + ce.value * 864e5).toISOString() : null;\n    }\n    async function Dt() {\n      Ze.value = !0, vt.value = \"\", Xe.value = null, R.value = \"\";\n      try {\n        const q = { ask_name: Ie.value };\n        se.value && (q.max_files = Number(se.value)), Ce.value && (q.max_file_size_mb = Number(Ce.value));\n        const ne = We.value.split(/[,\\s]+/).map((te) => te.trim().replace(/^\\./, \"\")).filter(Boolean);\n        ne.length && (q.allowed_ext = ne);\n        const H = await n.api.createShare({\n          path: n.path,\n          kind: \"drop\",\n          password: ie.value,\n          expires_at: kt(),\n          drop_settings: q\n        });\n        Xe.value = {\n          url: H.share.url,\n          pin: H.share.password_pin ?? null,\n          expiresAt: H.share.expires_at ?? null,\n          clamped: !!H.share.expiry_clamped\n        }, await Qe();\n      } catch (q) {\n        vt.value = q instanceof Error ? q.message : String(q);\n      } finally {\n        Ze.value = !1;\n      }\n    }\n    async function At() {\n      var ne;\n      const q = X(Ae.value);\n      if (!q.length) {\n        R.value = p(\"Geçerli bir e-posta girin.\", \"Enter a valid email.\");\n        return;\n      }\n      if ((ne = Xe.value) != null && ne.url) {\n        V.value = !0, R.value = \"\";\n        try {\n          const H = await n.api.shareMail({\n            path: n.path,\n            emails: q,\n            url: Xe.value.url,\n            pin: Xe.value.pin ?? void 0,\n            expires_days: ce.value || void 0,\n            locale: cn(n.locale),\n            is_dir: !0,\n            mode: \"drop\"\n          });\n          R.value = ye(H);\n        } catch (H) {\n          (H.detail ?? \"\").includes(\"not_configured\") ? R.value = p(\"SMTP ayarlı/doğrulanmış değil — linki elle iletin.\", \"SMTP not set up/verified — share the link manually.\") : R.value = H instanceof Error ? H.message : String(H);\n        } finally {\n          V.value = !1;\n        }\n      }\n    }\n    async function Ot(q) {\n      he.value = !0;\n      try {\n        await n.api.revokeShare(q.uuid), Q.value && Q.value.url === q.url && (Q.value = null), await Qe();\n      } catch (ne) {\n        pe.value = ne instanceof Error ? ne.message : String(ne);\n      } finally {\n        he.value = !1;\n      }\n    }\n    function Bt(q, ne = \"url\") {\n      var H;\n      (H = navigator.clipboard) == null || H.writeText(q), re.value = ne, setTimeout(() => {\n        re.value === ne && (re.value = \"\");\n      }, 1400);\n    }\n    const un = k(() => typeof navigator < \"u\" && typeof navigator.share == \"function\");\n    function pt(q) {\n      return !q || q <= 0 ? \"\" : Xu(q, { base: 1024, digits: \"fixed1\", numberLocale: null });\n    }\n    function tn(q) {\n      return q > 0 ? p(`Bu bağlantı ${q} gün geçerlidir.`, `This link is valid for ${q} day(s).`) : p(\"Bu bağlantının süresi yoktur.\", \"This link does not expire.\");\n    }\n    const xt = Ws(Xs, void 0);\n    function jt(q) {\n      return C6((q == null ? void 0 : q.expiresAt) ?? null, v.value ? \"tr\" : \"en\", xt);\n    }\n    const Pt = k(() => {\n      var q, ne;\n      return ((q = Q.value) == null ? void 0 : q.url) ?? ((ne = Z.value[0]) == null ? void 0 : ne.url) ?? \"\";\n    }), _t = k(() => !!Pt.value), St = k(() => _t.value ? Q.value ? Q.value.pin ? u(\"access.who.pin\") : u(\"access.who.link\") : u(\"access.who.existing\", { n: Z.value.length }) : u(\"access.who.private\")), sn = k(() => {\n      var ne, H;\n      const q = [];\n      if (Q.value)\n        q.push(jt(Q.value)), Q.value.clamped && q.push(p(\"(sunucu sınırı uygulandı)\", \"(server limit applied)\")), Ne.value && q.push(((ne = be.find((te) => te.v === Ne.value)) == null ? void 0 : ne.l) ?? \"\");\n      else if (Z.value[0]) {\n        const te = Z.value[0];\n        q.push(jt({ expiresAt: te.expires_at ?? null })), te.max_downloads && q.push(((H = be.find((_e) => _e.v === te.max_downloads)) == null ? void 0 : H.l) ?? String(te.max_downloads));\n      }\n      return M6(q);\n    }), Nt = k(() => {\n      var ne;\n      const q = [];\n      return q.push(oe.value ? u(\"access.sum.pin_on\") : u(\"access.sum.pin_off\")), q.push($e(ue.value)), Ne.value && q.push(((ne = be.find((H) => H.v === Ne.value)) == null ? void 0 : ne.l) ?? \"\"), q.filter(Boolean).join(\" · \");\n    }), nn = k(() => {\n      const q = I.value.length + U.value.length;\n      return q ? u(\"access.sum.people\", { n: q }) : u(\"access.sum.people_none\");\n    }), mn = k(\n      () => W.value.length ? u(\"access.sum.drop\", { n: W.value.length }) : u(\"access.sum.drop_none\")\n    );\n    function xe() {\n      var ge, Oe;\n      const q = h.value.name, ne = ((ge = Q.value) == null ? void 0 : ge.url) ?? \"\", H = ((Oe = Q.value) == null ? void 0 : Oe.pin) ?? \"\", te = n.isDir ? p(\"klasör\", \"folder\") : p(\"dosya\", \"file\"), _e = v.value ? `${q} ${n.isDir ? \"klasörü\" : \"dosyası\"} sizinle paylaşıldı` : `${q} has been shared with you`, Me = [];\n      if (Me.push(p(\"Merhaba,\", \"Hello,\"), \"\"), Me.push(p(`Sizinle bir ${te} paylaşıldı:`, `A ${te} has been shared with you:`), \"\"), n.isDir)\n        Me.push(p(`Klasör: ${q}`, `Folder: ${q}`));\n      else {\n        Me.push(p(`Dosya: ${q}`, `File: ${q}`));\n        const mt = pt(n.size);\n        mt && Me.push(p(`Boyut: ${mt}`, `Size: ${mt}`));\n      }\n      return Me.push(\"\", p(\"İndirmek için:\", \"Download it here:\"), ne), H && Me.push(\"\", p(`PIN (erişim kodu): ${H}`, `PIN (access code): ${H}`)), Me.push(\"\", tn(ue.value)), { title: _e, text: Me.join(`\n`) };\n    }\n    function de() {\n      var mt, Xt;\n      const q = h.value.name, ne = ((mt = Xe.value) == null ? void 0 : mt.url) ?? \"\", H = ((Xt = Xe.value) == null ? void 0 : Xt.pin) ?? \"\", te = Number(se.value) || 20, _e = Number(Ce.value) || 500, Me = We.value.split(/[,\\s]+/).map((sa) => sa.trim().replace(/^\\./, \"\")).filter(Boolean), ge = p(`${q} adlı klasöre dosya eklemeniz istendi`, `You've been asked to add files to ${q}`), Oe = [];\n      return Oe.push(p(\"Merhaba,\", \"Hello,\"), \"\"), Oe.push(p(\"Dosya yüklemeniz istendi.\", \"You've been invited to upload files.\"), \"\"), Oe.push(p(`Klasör: ${q}`, `Folder: ${q}`)), Oe.push(p(`Sınır: en fazla ${te} dosya, dosya başına ${_e} MB.`, `Limit: up to ${te} file(s), ${_e} MB per file.`)), Oe.push(Me.length ? p(`İzinli türler: ${Me.join(\", \")}`, `Allowed types: ${Me.join(\", \")}`) : p(\"İzinli türler: tüm türler\", \"Allowed types: all\")), Oe.push(\"\", p(\"Dosyalarınızı buradan yükleyebilirsiniz:\", \"Upload your files here:\"), ne), H && Oe.push(\"\", p(`PIN (erişim kodu): ${H}`, `PIN (access code): ${H}`)), Oe.push(\"\", tn(ce.value)), { title: ge, text: Oe.join(`\n`) };\n    }\n    async function Le(q) {\n      if (un.value)\n        try {\n          await navigator.share(q);\n        } catch {\n        }\n    }\n    return (q, ne) => {\n      var H, te, _e, Me;\n      return c(), d(\"div\", {\n        class: \"fx-perm-overlay fe-share__scrim\",\n        onClick: ne[27] || (ne[27] = Re((ge) => r(\"close\"), [\"self\"]))\n      }, [\n        o(\"div\", {\n          class: \"fx-perm-modal fe-share\",\n          role: \"dialog\",\n          \"aria-modal\": \"true\",\n          \"aria-label\": s(u)(\"access.title\", { name: h.value.name })\n        }, [\n          o(\"header\", z6, [\n            o(\"span\", {\n              class: \"fe-share__tile\",\n              \"aria-hidden\": \"true\",\n              innerHTML: b.value\n            }, null, 8, A6),\n            o(\"div\", P6, [\n              o(\"h3\", L6, f(s(u)(\"access.title\", { name: h.value.name })), 1),\n              o(\"span\", {\n                class: \"fe-share__path\",\n                title: e.path\n              }, f(h.value.adapter), 9, D6)\n            ]),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-share__close\",\n              \"aria-label\": s(u)(\"access.close\"),\n              title: s(u)(\"access.close\"),\n              onClick: ne[0] || (ne[0] = (ge) => r(\"close\"))\n            }, [\n              o(\"span\", {\n                \"aria-hidden\": \"true\",\n                innerHTML: s(Ue)(\"close\")\n              }, null, 8, B6)\n            ], 8, O6)\n          ]),\n          o(\"div\", I6, [\n            o(\"div\", H6, [\n              o(\"div\", F6, [\n                o(\"span\", {\n                  class: \"fe-share__leadicon\",\n                  \"aria-hidden\": \"true\",\n                  innerHTML: s(Ue)(\"access\")\n                }, null, 8, N6),\n                o(\"span\", K6, f(s(u)(\"access.link.switch\")), 1),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-share__switch\",\n                  role: \"switch\",\n                  \"aria-checked\": _t.value ? \"true\" : \"false\",\n                  \"aria-label\": s(u)(\"access.link.switch\"),\n                  \"data-testid\": \"share-switch\",\n                  disabled: he.value,\n                  onClick: en\n                }, [...ne[28] || (ne[28] = [\n                  o(\"span\", { class: \"fe-share__knob\" }, null, -1)\n                ])], 8, R6)\n              ]),\n              o(\"p\", U6, f(St.value), 1),\n              _t.value ? (c(), d(ae, { key: 0 }, [\n                o(\"div\", V6, [\n                  o(\"a\", {\n                    href: Pt.value,\n                    target: \"_blank\",\n                    rel: \"noopener\",\n                    class: \"fe-share__url\",\n                    title: Pt.value\n                  }, f(Pt.value), 9, j6),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-share__copy\",\n                    \"data-testid\": \"share-copy\",\n                    onClick: ne[1] || (ne[1] = (ge) => Bt(Pt.value, \"new\"))\n                  }, [\n                    o(\"span\", {\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"copy\")\n                    }, null, 8, Y6),\n                    o(\"span\", null, f(re.value === \"new\" ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 1)\n                  ])\n                ]),\n                sn.value ? (c(), d(\"p\", W6, f(sn.value), 1)) : g(\"\", !0),\n                (H = Q.value) != null && H.pin ? (c(), d(\"div\", q6, [\n                  ne[29] || (ne[29] = o(\"span\", { class: \"fe-share__pinlabel\" }, \"PIN\", -1)),\n                  o(\"code\", G6, f((te = Q.value) == null ? void 0 : te.pin), 1),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-share__mini\",\n                    onClick: ne[2] || (ne[2] = (ge) => {\n                      var Oe;\n                      return Bt(((Oe = Q.value) == null ? void 0 : Oe.pin) ?? \"\", \"sharepin\");\n                    })\n                  }, f(re.value === \"sharepin\" ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 1)\n                ])) : g(\"\", !0)\n              ], 64)) : g(\"\", !0),\n              pe.value ? (c(), d(\"div\", X6, f(pe.value), 1)) : g(\"\", !0)\n            ]),\n            o(\"div\", J6, [\n              o(\"section\", Z6, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-share__sechead\",\n                  \"aria-expanded\": y.value.link ? \"true\" : \"false\",\n                  \"data-testid\": \"share-options-toggle\",\n                  onClick: ne[3] || (ne[3] = (ge) => A(\"link\"))\n                }, [\n                  (c(), d(\"svg\", {\n                    class: we([\"fe-share__caret\", { \"is-open\": y.value.link }]),\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.8\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\",\n                    \"aria-hidden\": \"true\",\n                    focusable: \"false\"\n                  }, [...ne[30] || (ne[30] = [\n                    o(\"path\", { d: \"M9 6l6 6-6 6\" }, null, -1)\n                  ])], 2)),\n                  o(\"span\", eA, f(s(u)(\"access.section.link\")), 1),\n                  o(\"span\", tA, f(Nt.value), 1)\n                ], 8, Q6),\n                y.value.link ? (c(), d(\"div\", nA, [\n                  o(\"div\", aA, [\n                    o(\"label\", oA, [\n                      Ve(o(\"input\", {\n                        type: \"checkbox\",\n                        \"onUpdate:modelValue\": ne[4] || (ne[4] = (ge) => oe.value = ge)\n                      }, null, 512), [\n                        [An, oe.value]\n                      ]),\n                      o(\"span\", null, f(p(\"PIN ile koru\", \"Protect with a PIN\")), 1)\n                    ]),\n                    o(\"label\", sA, [\n                      o(\"span\", rA, f(p(\"Süre\", \"Expiry\")), 1),\n                      Ve(o(\"select\", {\n                        \"onUpdate:modelValue\": ne[5] || (ne[5] = (ge) => ue.value = ge),\n                        class: \"fe-share__select\",\n                        \"data-testid\": \"share-expiry\"\n                      }, [\n                        (c(!0), d(ae, null, Te(Se.value, (ge) => (c(), d(\"option\", {\n                          key: ge.v,\n                          value: ge.v\n                        }, f(ge.l), 9, iA))), 128))\n                      ], 512), [\n                        [\n                          on,\n                          ue.value,\n                          void 0,\n                          { number: !0 }\n                        ]\n                      ])\n                    ]),\n                    o(\"label\", lA, [\n                      o(\"span\", cA, f(p(\"İndirme limiti\", \"Download limit\")), 1),\n                      Ve(o(\"select\", {\n                        \"onUpdate:modelValue\": ne[6] || (ne[6] = (ge) => Ne.value = ge),\n                        class: \"fe-share__select\"\n                      }, [\n                        (c(), d(ae, null, Te(be, (ge) => o(\"option\", {\n                          key: ge.v,\n                          value: ge.v\n                        }, f(ge.l), 9, uA)), 64))\n                      ], 512), [\n                        [\n                          on,\n                          Ne.value,\n                          void 0,\n                          { number: !0 }\n                        ]\n                      ])\n                    ])\n                  ]),\n                  ze.value ? (c(), d(\"p\", dA, f(ze.value), 1)) : g(\"\", !0),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fx-perm-create fe-share__btn fe-share__btn--primary fe-share__btn--wide\",\n                    disabled: he.value,\n                    onClick: wt\n                  }, f(p(\"Bağlantı oluştur\", \"Create link\")), 9, fA),\n                  !Q.value && S.value ? (c(), d(\"p\", pA, [\n                    Je(f(p(\"Bir bağlantı oluşturun, ardından\", \"Create a link, then it will be sent to\")) + \" \", 1),\n                    o(\"strong\", null, f(S.value), 1),\n                    Je(\" \" + f(p(\"adresine gönderin.\", \".\")), 1)\n                  ])) : g(\"\", !0),\n                  Q.value ? (c(), d(ae, { key: 2 }, [\n                    o(\"div\", vA, [\n                      o(\"span\", hA, f(p(\"Komut satırı\", \"Command line\")), 1),\n                      o(\"div\", mA, [\n                        o(\"code\", {\n                          class: \"fe-share__clicmd\",\n                          title: De.value\n                        }, f(De.value), 9, yA),\n                        o(\"button\", {\n                          type: \"button\",\n                          class: \"fe-share__mini\",\n                          onClick: ne[7] || (ne[7] = (ge) => Bt(De.value, \"sharecli\"))\n                        }, f(re.value === \"sharecli\" ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 1)\n                      ])\n                    ]),\n                    o(\"div\", bA, [\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": ne[8] || (ne[8] = (ge) => S.value = ge),\n                        type: \"text\",\n                        class: \"fe-share__input\",\n                        autocomplete: \"off\",\n                        placeholder: p(\"e-posta(lar) — virgülle ayırın\", \"email(s) — comma separated\"),\n                        onKeyup: Ut($t, [\"enter\"])\n                      }, null, 40, gA), [\n                        [rt, S.value]\n                      ]),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__btn\",\n                        disabled: w.value,\n                        onClick: $t\n                      }, f(p(\"Gönder\", \"Send\")), 9, kA)\n                    ]),\n                    j.value ? (c(), d(\"div\", _A, f(j.value), 1)) : g(\"\", !0),\n                    un.value ? (c(), d(\"button\", {\n                      key: 1,\n                      type: \"button\",\n                      class: \"fe-share__btn fe-share__btn--wide\",\n                      onClick: ne[9] || (ne[9] = (ge) => Le(xe()))\n                    }, [\n                      o(\"span\", {\n                        \"aria-hidden\": \"true\",\n                        innerHTML: s(Ue)(\"access\")\n                      }, null, 8, wA),\n                      o(\"span\", null, f(p(\"Paylaş\", \"Share\")), 1)\n                    ])) : g(\"\", !0)\n                  ], 64)) : g(\"\", !0),\n                  o(\"div\", $A, [\n                    o(\"h4\", xA, f(p(\"Mevcut bağlantılar\", \"Existing links\")), 1),\n                    Z.value.length ? g(\"\", !0) : (c(), d(\"p\", SA, f(p(\"Yok\", \"None\")), 1)),\n                    (c(!0), d(ae, null, Te(Z.value, (ge) => (c(), d(\"div\", {\n                      key: ge.uuid,\n                      class: \"fe-share__row\"\n                    }, [\n                      o(\"span\", {\n                        class: \"fe-share__url\",\n                        title: ge.url\n                      }, f(ge.url), 9, CA),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__mini\",\n                        onClick: (Oe) => Bt(ge.url, ge.uuid)\n                      }, f(re.value === ge.uuid ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 9, TA),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__del\",\n                        disabled: he.value,\n                        title: p(\"İptal\", \"Revoke\"),\n                        \"aria-label\": p(\"İptal\", \"Revoke\"),\n                        onClick: (Oe) => Ot(ge)\n                      }, [\n                        o(\"span\", {\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"close\")\n                        }, null, 8, EA)\n                      ], 8, MA)\n                    ]))), 128))\n                  ])\n                ])) : g(\"\", !0)\n              ]),\n              D.value ? (c(), d(\"section\", zA, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-share__sechead\",\n                  \"aria-expanded\": y.value.people ? \"true\" : \"false\",\n                  \"data-testid\": \"share-people-toggle\",\n                  onClick: ne[10] || (ne[10] = (ge) => A(\"people\"))\n                }, [\n                  (c(), d(\"svg\", {\n                    class: we([\"fe-share__caret\", { \"is-open\": y.value.people }]),\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.8\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\",\n                    \"aria-hidden\": \"true\",\n                    focusable: \"false\"\n                  }, [...ne[31] || (ne[31] = [\n                    o(\"path\", { d: \"M9 6l6 6-6 6\" }, null, -1)\n                  ])], 2)),\n                  o(\"span\", PA, f(s(u)(\"access.section.people\")), 1),\n                  o(\"span\", LA, f(nn.value), 1)\n                ], 8, AA),\n                y.value.people ? (c(), d(\"div\", DA, [\n                  x.value ? g(\"\", !0) : (c(), d(\"div\", OA, f(p(\"Bu diskte RBAC kapalı — izinler yalnızca RBAC açık disklerde geçerli.\", \"RBAC is off on this storage — grants only apply when RBAC is enabled.\")), 1)),\n                  B.value ? (c(), d(\"div\", BA, f(B.value), 1)) : g(\"\", !0),\n                  C.value ? (c(), d(\"p\", IA, f(p(\"Yükleniyor…\", \"Loading…\")), 1)) : (c(), d(ae, { key: 3 }, [\n                    o(\"div\", HA, [\n                      o(\"div\", FA, [\n                        Ve(o(\"input\", {\n                          \"onUpdate:modelValue\": ne[11] || (ne[11] = (ge) => E.value = ge),\n                          type: \"email\",\n                          class: \"fe-share__input\",\n                          autocomplete: \"off\",\n                          placeholder: p(\"İsim veya e-posta\", \"Name or email\"),\n                          onInput: Ye,\n                          onKeyup: Ut(fe, [\"enter\"]),\n                          onFocus: Ye\n                        }, null, 40, NA), [\n                          [rt, E.value]\n                        ]),\n                        G.value ? (c(), d(\"ul\", KA, [\n                          (c(!0), d(ae, null, Te(J.value, (ge) => (c(), d(\"li\", {\n                            key: ge.id,\n                            onMousedown: Re((Oe) => lt(ge), [\"prevent\"])\n                          }, [\n                            o(\"span\", UA, f((ge.display_name || ge.email).charAt(0).toUpperCase()), 1),\n                            o(\"span\", VA, [\n                              o(\"span\", jA, f(ge.display_name || ge.email), 1),\n                              o(\"span\", YA, f(ge.email) + \" · \" + f(ge.role), 1)\n                            ])\n                          ], 40, RA))), 128))\n                        ])) : g(\"\", !0)\n                      ]),\n                      Ve(o(\"select\", {\n                        \"onUpdate:modelValue\": ne[12] || (ne[12] = (ge) => $.value = ge),\n                        class: \"fe-share__select\",\n                        title: (_e = P.find((ge) => ge.v === $.value)) == null ? void 0 : _e.d\n                      }, [\n                        (c(), d(ae, null, Te(P, (ge) => o(\"option\", {\n                          key: ge.v,\n                          value: ge.v\n                        }, f(ge.l), 9, qA)), 64))\n                      ], 8, WA), [\n                        [on, $.value]\n                      ]),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__btn fe-share__btn--primary\",\n                        disabled: M.value,\n                        onClick: fe\n                      }, f(p(\"Ekle\", \"Add\")), 9, GA)\n                    ]),\n                    T.value ? (c(), d(\"div\", XA, [\n                      o(\"p\", JA, f(p(\"Bu e-postada hesap yok. Ne yapmak istersiniz?\", \"No account for this email — what next?\")), 1),\n                      o(\"div\", ZA, [\n                        Ve(o(\"select\", {\n                          \"onUpdate:modelValue\": ne[13] || (ne[13] = (ge) => Y.value = ge),\n                          class: \"fe-share__select\"\n                        }, [\n                          o(\"option\", QA, f(p(\"Kullanıcı\", \"User\")), 1),\n                          o(\"option\", eP, f(p(\"Görüntüleyen\", \"Viewer\")), 1)\n                        ], 512), [\n                          [on, Y.value]\n                        ]),\n                        o(\"button\", {\n                          type: \"button\",\n                          class: \"fe-share__btn fe-share__btn--primary\",\n                          disabled: M.value,\n                          onClick: Pe\n                        }, f(p(\"Kullanıcı oluştur + yetki ver\", \"Create user + grant\")), 9, tP)\n                      ]),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__linkbtn\",\n                        disabled: M.value,\n                        onClick: Be\n                      }, f(p(\"Sadece paylaşım linki gönder →\", \"Just send a share link →\")), 9, nP)\n                    ])) : g(\"\", !0),\n                    z.value ? (c(), d(\"div\", aP, f(z.value), 1)) : g(\"\", !0),\n                    (Me = O.value) != null && Me.tempPassword ? (c(), d(\"div\", oP, [\n                      Je(f(p(\"Geçici parola:\", \"Temp password:\")) + \" \", 1),\n                      o(\"code\", sP, f(O.value.tempPassword), 1)\n                    ])) : g(\"\", !0),\n                    o(\"div\", rP, [\n                      o(\"h4\", iP, f(p(\"Erişimi olanlar\", \"People with access\")), 1),\n                      !I.value.length && !U.value.length ? (c(), d(\"p\", lP, f(p(\"Henüz kimseyle paylaşılmadı.\", \"Not shared with anyone yet.\")), 1)) : g(\"\", !0),\n                      (c(!0), d(ae, null, Te(I.value, (ge) => (c(), d(\"div\", {\n                        key: \"d\" + ge.id,\n                        class: \"fe-share__row\"\n                      }, [\n                        o(\"span\", cP, f(qt(ge)), 1),\n                        o(\"span\", {\n                          class: \"fe-share__person\",\n                          title: ge.user_email\n                        }, f(ft(ge)), 9, uP),\n                        o(\"select\", {\n                          class: \"fe-share__select fe-share__select--sm\",\n                          value: ge.level,\n                          onChange: (Oe) => ht(ge, Oe.target.value)\n                        }, [\n                          (c(), d(ae, null, Te(P, (Oe) => o(\"option\", {\n                            key: Oe.v,\n                            value: Oe.v\n                          }, f(Oe.l), 9, fP)), 64))\n                        ], 40, dP),\n                        o(\"button\", {\n                          type: \"button\",\n                          class: \"fe-share__del\",\n                          disabled: M.value,\n                          title: p(\"Kaldır\", \"Remove\"),\n                          \"aria-label\": p(\"Kaldır\", \"Remove\"),\n                          onClick: (Oe) => Ft(ge)\n                        }, [\n                          o(\"span\", {\n                            \"aria-hidden\": \"true\",\n                            innerHTML: s(Ue)(\"close\")\n                          }, null, 8, vP)\n                        ], 8, pP)\n                      ]))), 128)),\n                      (c(!0), d(ae, null, Te(U.value, (ge) => (c(), d(\"div\", {\n                        key: \"i\" + ge.id,\n                        class: \"fe-share__row fe-share__row--dim\"\n                      }, [\n                        o(\"span\", hP, f(qt(ge)), 1),\n                        o(\"span\", {\n                          class: \"fe-share__person\",\n                          title: ge.user_email\n                        }, f(ft(ge)), 9, mP),\n                        o(\"span\", yP, f(le(ge.level)), 1),\n                        o(\"span\", {\n                          class: \"fe-share__from\",\n                          title: p(\"Üst klasörden gelir\", \"Inherited from\") + \": \" + (ge.path_prefix || \"/\")\n                        }, f(ge.path_prefix || \"/\"), 9, bP)\n                      ]))), 128))\n                    ])\n                  ], 64))\n                ])) : g(\"\", !0)\n              ])) : g(\"\", !0),\n              e.isDir ? (c(), d(\"section\", gP, [\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-share__sechead\",\n                  \"aria-expanded\": y.value.drop ? \"true\" : \"false\",\n                  \"data-testid\": \"share-drop-toggle\",\n                  onClick: ne[14] || (ne[14] = (ge) => A(\"drop\"))\n                }, [\n                  (c(), d(\"svg\", {\n                    class: we([\"fe-share__caret\", { \"is-open\": y.value.drop }]),\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.8\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\",\n                    \"aria-hidden\": \"true\",\n                    focusable: \"false\"\n                  }, [...ne[32] || (ne[32] = [\n                    o(\"path\", { d: \"M9 6l6 6-6 6\" }, null, -1)\n                  ])], 2)),\n                  o(\"span\", _P, f(s(u)(\"access.section.drop\")), 1),\n                  o(\"span\", wP, f(mn.value), 1)\n                ], 8, kP),\n                y.value.drop ? (c(), d(\"div\", $P, [\n                  o(\"p\", xP, f(p(\"Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.\", \"A public link that lets anyone UPLOAD files into this folder. Uploaders never see the folder's existing files.\")), 1),\n                  o(\"div\", SP, [\n                    o(\"label\", CP, [\n                      Ve(o(\"input\", {\n                        type: \"checkbox\",\n                        \"onUpdate:modelValue\": ne[15] || (ne[15] = (ge) => ie.value = ge)\n                      }, null, 512), [\n                        [An, ie.value]\n                      ]),\n                      o(\"span\", null, f(p(\"PIN ile koru\", \"Protect with a PIN\")), 1)\n                    ]),\n                    o(\"label\", TP, [\n                      o(\"span\", MP, f(p(\"Süre\", \"Expiry\")), 1),\n                      Ve(o(\"select\", {\n                        \"onUpdate:modelValue\": ne[16] || (ne[16] = (ge) => ce.value = ge),\n                        class: \"fe-share__select\",\n                        \"data-testid\": \"drop-expiry\"\n                      }, [\n                        (c(!0), d(ae, null, Te(Se.value, (ge) => (c(), d(\"option\", {\n                          key: ge.v,\n                          value: ge.v\n                        }, f(ge.l), 9, EP))), 128))\n                      ], 512), [\n                        [\n                          on,\n                          ce.value,\n                          void 0,\n                          { number: !0 }\n                        ]\n                      ])\n                    ])\n                  ]),\n                  ze.value ? (c(), d(\"p\", zP, f(ze.value), 1)) : g(\"\", !0),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-share__btn fe-share__btn--primary fe-share__btn--wide\",\n                    \"data-testid\": \"drop-create\",\n                    disabled: Ze.value,\n                    onClick: Dt\n                  }, f(p(\"Bağlantı oluştur\", \"Create link\")), 9, AP),\n                  o(\"button\", {\n                    type: \"button\",\n                    class: \"fe-share__linkbtn\",\n                    \"aria-expanded\": L.value ? \"true\" : \"false\",\n                    onClick: ne[17] || (ne[17] = (ge) => L.value = !L.value)\n                  }, f(L.value ? p(\"Yükleme sınırlarını gizle\", \"Hide upload limits\") : p(\"Yükleme sınırları\", \"Upload limits\")), 9, PP),\n                  L.value ? (c(), d(\"div\", LP, [\n                    o(\"label\", DP, [\n                      o(\"span\", OP, f(p(\"En fazla dosya\", \"Max files\")), 1),\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": ne[18] || (ne[18] = (ge) => se.value = ge),\n                        type: \"number\",\n                        min: \"1\",\n                        class: \"fe-share__input fe-share__input--sm\",\n                        placeholder: \"20\"\n                      }, null, 512), [\n                        [rt, se.value]\n                      ])\n                    ]),\n                    o(\"label\", BP, [\n                      o(\"span\", IP, f(p(\"Dosya başı MB\", \"MB / file\")), 1),\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": ne[19] || (ne[19] = (ge) => Ce.value = ge),\n                        type: \"number\",\n                        min: \"1\",\n                        class: \"fe-share__input fe-share__input--sm\",\n                        placeholder: \"500\"\n                      }, null, 512), [\n                        [rt, Ce.value]\n                      ])\n                    ]),\n                    o(\"label\", HP, [\n                      o(\"span\", FP, f(p(\"İzinli türler\", \"Allowed types\")), 1),\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": ne[20] || (ne[20] = (ge) => We.value = ge),\n                        type: \"text\",\n                        class: \"fe-share__input fe-share__input--sm\",\n                        placeholder: p(\"hepsi (örn. pdf, jpg)\", \"all (e.g. pdf, jpg)\")\n                      }, null, 8, NP), [\n                        [rt, We.value]\n                      ])\n                    ]),\n                    o(\"label\", KP, [\n                      Ve(o(\"input\", {\n                        type: \"checkbox\",\n                        \"onUpdate:modelValue\": ne[21] || (ne[21] = (ge) => Ie.value = ge)\n                      }, null, 512), [\n                        [An, Ie.value]\n                      ]),\n                      o(\"span\", null, f(p(\"Yükleyenin adını sor\", \"Ask uploader name\")), 1)\n                    ])\n                  ])) : g(\"\", !0),\n                  vt.value ? (c(), d(\"div\", RP, f(vt.value), 1)) : g(\"\", !0),\n                  Xe.value ? (c(), d(ae, { key: 3 }, [\n                    o(\"div\", UP, [\n                      o(\"a\", {\n                        href: Xe.value.url,\n                        target: \"_blank\",\n                        rel: \"noopener\",\n                        class: \"fe-share__url\",\n                        title: Xe.value.url\n                      }, f(Xe.value.url), 9, VP),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__copy\",\n                        \"data-testid\": \"drop-copy\",\n                        onClick: ne[22] || (ne[22] = (ge) => Bt(Xe.value.url, \"drop\"))\n                      }, [\n                        o(\"span\", {\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"copy\")\n                        }, null, 8, jP),\n                        o(\"span\", null, f(re.value === \"drop\" ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 1)\n                      ])\n                    ]),\n                    o(\"p\", YP, [\n                      Je(f(jt(Xe.value)) + \" \", 1),\n                      Xe.value.clamped ? (c(), d(\"span\", WP, f(p(\"(sunucu sınırı uygulandı)\", \"(server limit applied)\")), 1)) : g(\"\", !0)\n                    ]),\n                    Xe.value.pin ? (c(), d(\"div\", qP, [\n                      ne[33] || (ne[33] = o(\"span\", { class: \"fe-share__pinlabel\" }, \"PIN\", -1)),\n                      o(\"code\", GP, f(Xe.value.pin), 1),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__mini\",\n                        onClick: ne[23] || (ne[23] = (ge) => Bt(Xe.value.pin, \"droppin\"))\n                      }, f(re.value === \"droppin\" ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 1)\n                    ])) : g(\"\", !0),\n                    o(\"div\", XP, [\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": ne[24] || (ne[24] = (ge) => Ae.value = ge),\n                        type: \"text\",\n                        class: \"fe-share__input\",\n                        autocomplete: \"off\",\n                        placeholder: p(\"e-posta(lar) — virgülle ayırın\", \"email(s) — comma separated\"),\n                        onKeyup: Ut(At, [\"enter\"])\n                      }, null, 40, JP), [\n                        [rt, Ae.value]\n                      ]),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__btn\",\n                        disabled: V.value,\n                        onClick: At\n                      }, f(p(\"Gönder\", \"Send\")), 9, ZP)\n                    ]),\n                    R.value ? (c(), d(\"div\", QP, f(R.value), 1)) : g(\"\", !0),\n                    un.value ? (c(), d(\"button\", {\n                      key: 2,\n                      type: \"button\",\n                      class: \"fe-share__btn fe-share__btn--wide\",\n                      onClick: ne[25] || (ne[25] = (ge) => Le(de()))\n                    }, [\n                      o(\"span\", {\n                        \"aria-hidden\": \"true\",\n                        innerHTML: s(Ue)(\"access\")\n                      }, null, 8, eL),\n                      o(\"span\", null, f(p(\"Paylaş\", \"Share\")), 1)\n                    ])) : g(\"\", !0)\n                  ], 64)) : g(\"\", !0),\n                  o(\"div\", tL, [\n                    o(\"h4\", nL, f(p(\"Mevcut bağlantılar\", \"Existing links\")), 1),\n                    W.value.length ? g(\"\", !0) : (c(), d(\"p\", aL, f(p(\"Yok\", \"None\")), 1)),\n                    (c(!0), d(ae, null, Te(W.value, (ge) => (c(), d(\"div\", {\n                      key: ge.uuid,\n                      class: \"fe-share__row\"\n                    }, [\n                      o(\"span\", {\n                        class: \"fe-share__url\",\n                        title: ge.url\n                      }, f(ge.url), 9, oL),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__mini\",\n                        onClick: (Oe) => Bt(ge.url, ge.uuid)\n                      }, f(re.value === ge.uuid ? s(u)(\"access.copied\") : s(u)(\"access.copy\")), 9, sL),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-share__del\",\n                        disabled: he.value,\n                        title: p(\"İptal\", \"Revoke\"),\n                        \"aria-label\": p(\"İptal\", \"Revoke\"),\n                        onClick: (Oe) => Ot(ge)\n                      }, [\n                        o(\"span\", {\n                          \"aria-hidden\": \"true\",\n                          innerHTML: s(Ue)(\"close\")\n                        }, null, 8, iL)\n                      ], 8, rL)\n                    ]))), 128))\n                  ])\n                ])) : g(\"\", !0)\n              ])) : g(\"\", !0)\n            ])\n          ]),\n          o(\"footer\", lL, [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-share__btn fe-share__btn--primary\",\n              \"data-testid\": \"share-done\",\n              onClick: ne[26] || (ne[26] = (ge) => r(\"close\"))\n            }, f(s(u)(\"access.done\")), 1)\n          ])\n        ], 8, E6)\n      ]);\n    };\n  }\n}), uL = [\"title\", \"aria-label\"], dL = { class: \"fe__stack\" }, fL = { class: \"fe__panes\" }, pL = {\n  key: 0,\n  class: \"fe__presence\"\n}, vL = [\"title\"], hL = {\n  key: 1,\n  class: \"fe-e2e-upgrade\",\n  role: \"alert\"\n}, mL = { class: \"fe-e2e-upgrade__text\" }, yL = {\n  key: 0,\n  class: \"fe-e2e-upgrade__escrow\"\n}, bL = { class: \"fe-e2e-upgrade__actions\" }, gL = [\"disabled\"], kL = [\"disabled\"], _L = {\n  key: 2,\n  class: \"fe-e2e-upgrade fe-e2e-upgrade--escrow\",\n  role: \"alert\"\n}, wL = { class: \"fe-e2e-upgrade__text\" }, $L = { class: \"fe-e2e-upgrade__escrow\" }, xL = {\n  key: 0,\n  class: \"fe-e2e-upgrade__escrow\"\n}, SL = {\n  key: 1,\n  class: \"fe-e2e-upgrade__pw\"\n}, CL = [\"disabled\"], TL = {\n  key: 2,\n  class: \"fe-form__error\",\n  role: \"alert\"\n}, ML = { class: \"fe-e2e-upgrade__actions\" }, EL = [\"disabled\"], zL = [\"disabled\"], AL = {\n  key: 3,\n  class: \"fe-e2e-strip\",\n  role: \"status\"\n}, PL = [\"innerHTML\"], LL = { class: \"fe-e2e-strip__label\" }, DL = {\n  key: 4,\n  class: \"fe-trashbar\"\n}, OL = { class: \"fe-trashbar__text\" }, BL = [\"disabled\"], IL = {\n  key: 1,\n  class: \"fe-state\"\n}, HL = { class: \"fe-state__title\" }, FL = { class: \"fe-state__path\" }, NL = { class: \"fe-state__hint\" }, KL = { class: \"fe-state__actions\" }, RL = {\n  key: 2,\n  class: \"fe-state fe-e2e-lock\"\n}, UL = { class: \"fe-state__title\" }, VL = { class: \"fe-state__hint\" }, jL = [\"placeholder\", \"aria-label\", \"disabled\"], YL = [\"disabled\"], WL = {\n  key: 0,\n  class: \"fe-form__error\",\n  role: \"alert\"\n}, qL = {\n  key: 0,\n  class: \"fe-state\"\n}, GL = { class: \"fe-state__title\" }, XL = { class: \"fe-state__hint\" }, JL = [\"data-testid\"], ZL = {\n  class: \"fe-state__art\",\n  viewBox: \"0 0 120 100\",\n  width: \"110\",\n  height: \"92\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"2\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\"\n}, QL = {\n  key: 1,\n  d: \"M60 26l9 18.6 20.4 3-14.8 14.4 3.5 20.4L60 72.8 41.9 82.4l3.5-20.4L30.6 47.6l20.4-3z\"\n}, eD = { class: \"fe-state__title\" }, tD = { class: \"fe-state__hint\" }, nD = {\n  key: 2,\n  class: \"fe-state\"\n}, aD = { class: \"fe-state__title\" }, oD = { class: \"fe-state__hint\" }, sD = {\n  key: 3,\n  class: \"fe-state\"\n}, rD = {\n  class: \"fe-state__art\",\n  viewBox: \"0 0 120 100\",\n  width: \"110\",\n  height: \"92\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"2\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\"\n}, iD = { key: 0 }, lD = { class: \"fe-state__title\" }, cD = {\n  key: 0,\n  class: \"fe-state__hint\"\n}, uD = {\n  key: 1,\n  class: \"fe-state__actions\"\n}, dD = { class: \"fe-overlay__head\" }, fD = { class: \"fe-overlay__title\" }, pD = [\"title\", \"aria-label\"], vD = {\n  key: 1,\n  class: \"fe__dragover\"\n}, hD = { class: \"fe__dragover-card\" }, mD = [\"innerHTML\"], yD = [\"title\", \"aria-label\"], bD = {\n  key: 3,\n  class: \"fe-keep-strip\",\n  role: \"status\",\n  \"aria-live\": \"polite\"\n}, gD = { class: \"fe-keep-strip__label\" }, kD = {\n  key: 0,\n  class: \"fe-keep-strip__bar\",\n  \"aria-hidden\": \"true\"\n}, _D = { class: \"fe-recents__header\" }, wD = { class: \"fe-modal__head\" }, $D = { class: \"fe-modal__title\" }, xD = { class: \"fe-modal__body\" }, SD = { class: \"fe-toast__msg\" }, ni = \"brf-file-explorer:view-mode\", Lu = \"filex.inspector\", Du = \"filex.sidenav\", Ou = 250, ai = \"brf-file-explorer:path\", CD = \"application/x-brf-files\", TD = 8 * 1024 * 1024, MD = 10, ED = \"/files/edit\", Bu = \"filex.tourDone\", Iu = \"filex.tabs\", zD = \"https://docs.filex.sh/E2E-ENCRYPTION#what-escrow-can-and-cannot-do\", YD = /* @__PURE__ */ qe({\n  __name: \"FileExplorer\",\n  props: {\n    config: {}\n  },\n  emits: [\"share-created\", \"file-opened\", \"error\", \"upload-progress\", \"selection-change\", \"navigate\", \"refresh\"],\n  setup(e, { expose: t, emit: n }) {\n    const r = e, a = n, u = Ya(r.config), v = k(() => cn(r.config.locale));\n    He(v, (i) => Hi(i), { immediate: !0 });\n    const { t: p, formatSize: h } = tt(v), b = lh(u, { reload: () => ot() }), y = b.presenceUsers, A = b.degraded;\n    function D(i) {\n      const l = (i || \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (l === \".trash\" || l.startsWith(\".trash/\")) return null;\n      const _ = ut(l);\n      return !_ || !_.includes(\"://\") || _.startsWith(\"://\") ? null : _;\n    }\n    dt(() => {\n      b.start(), b.subscribe(D(z.value));\n    }), it(() => b.stop());\n    const C = uh(r.config.apiBase, u), B = _v(r.config, u), I = /* @__PURE__ */ new Map(), U = Qv(r.config, u, {\n      onSettled: (i) => {\n        var _;\n        const l = I.get(i.id);\n        if (I.delete(i.id), i.status === \"error\")\n          Ke(i.error_message || p(\"toast.failed\"));\n        else if (l)\n          Ro(`${l.message} (${i.progress_total})`, l.fn);\n        else {\n          const F = i.op_type === \"copy\" ? p(\"toast.copied\") : i.op_type === \"move\" ? p(\"toast.moved\") : p(\"toast.deleted\");\n          Ke(`${F} (${i.progress_total})`);\n        }\n        ot(), (_ = bt.value) == null || _.reload();\n      }\n    }), x = m(!1), E = (r.config.rootPath || \"\").trim(), $ = E.replace(\"://\", \"/\").replace(/^\\/+|\\/+$/g, \"\"), M = $ || r.config.initialPath || \"\", z = m(M), T = m(r.config.defaultAdapter || \"brf\"), Y = m(M), O = m([]), J = m(\"\"), G = m(!1), N = m(\"\"), P = m(\"\");\n    let le;\n    function ve() {\n      ot(le);\n    }\n    let he = !1;\n    const oe = uv((i, l) => {\n      let _ = (() => {\n        try {\n          const F = localStorage.getItem(ni);\n          if (F === \"list\" || F === \"grid\" || F === \"gallery\") return F;\n        } catch {\n        }\n        return r.config.viewMode ?? \"list\";\n      })();\n      return {\n        get() {\n          return i(), _;\n        },\n        set(F) {\n          if (F !== _) {\n            if (_ = F, !he)\n              try {\n                localStorage.setItem(ni, F);\n              } catch {\n              }\n            l();\n          }\n        }\n      };\n    }), ue = m(\"comfortable\"), Q = m(\"\"), pe = m(!1), re = m(\"\"), S = k(() => pe.value), w = m(\"\"), j = m(\"\"), K = k(\n      () => w.value !== \"\" && w.value !== \"trash\" && w.value !== \"home\"\n    ), Z = k(() => r.config.rememberFolderView !== !1), W = k(() => {\n      if (!Z.value) return \"\";\n      const i = String(z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!i) return \"\";\n      const [l, ..._] = i.split(\"/\"), F = (r.config.storages ?? []).find((ee) => ee.name === l);\n      return uu((F == null ? void 0 : F.uid) || l, _.join(\"/\"));\n    });\n    function $e() {\n      try {\n        const i = localStorage.getItem(ni);\n        if (i === \"list\" || i === \"grid\" || i === \"gallery\") return i;\n      } catch {\n      }\n      return r.config.viewMode ?? \"list\";\n    }\n    let Se = \"\";\n    function ze(i) {\n      return `${i}|${oe.value}|${su()}|${ru()}`;\n    }\n    function Ne(i) {\n      if (!i) return;\n      Ny(i);\n      const l = By(i);\n      he = !0;\n      try {\n        const _ = (l == null ? void 0 : l.v) ?? $e();\n        if (_ !== oe.value && (oe.value = _), l != null && l.k) iu(l.k, l.d ?? Ns(l.k));\n        else {\n          const F = zy();\n          iu(F.key, F.dir);\n        }\n      } finally {\n        he = !1;\n      }\n      Se = ze(i);\n    }\n    dt(() => {\n      const l = `${r.config.apiBase ?? \"\"}/api/files/manager/view-prefs`;\n      Jy({\n        async load() {\n          const _ = await fetch(l, {\n            headers: await Rt(),\n            credentials: u.credentialsMode()\n          });\n          if (!_.ok) return null;\n          const F = await _.json();\n          return (F == null ? void 0 : F.prefs) ?? null;\n        },\n        save(_) {\n          (async () => {\n            try {\n              const F = JSON.stringify({ prefs: _ });\n              await fetch(l, {\n                method: \"PUT\",\n                headers: { ...await Rt(), \"Content-Type\": \"application/json\" },\n                credentials: u.credentialsMode(),\n                body: F,\n                /* ⚠ `keepalive` is what lets the save fired on `pagehide` outlive\n                 * the page — but browsers cap a keepalive body at 64 KB and reject\n                 * the request outright above it. The document is capped far below\n                 * that (300 folders ≈ 33 KB), so this only ever guards the\n                 * pathological case; sending it without keepalive is strictly\n                 * better than having it rejected. */\n                keepalive: F.length < 6e4\n              });\n            } catch {\n            }\n          })();\n        }\n      });\n    }), He(\n      [W, () => lu()],\n      ([i, l]) => {\n        l && Ne(i);\n      },\n      { immediate: !0, flush: \"post\" }\n    ), He(\n      () => [W.value, oe.value, su(), ru()],\n      ([i, l, _, F]) => {\n        if (!i || !lu()) return;\n        const ee = ze(i);\n        ee !== Se && (Se = ee, Fy(i, { v: l, k: _, d: F }));\n      },\n      /* ⚠⚠ `post`, and registered AFTER the applier, for a reason that is not\n       * stylistic. A navigation changes `currentFolderKey`, which is a dependency\n       * of BOTH watchers. Left pre-flush this one would run first, while the view\n       * state is still the folder you just LEFT, and write that folder's view mode\n       * and sort against the folder you just arrived in — every walk through the\n       * tree quietly configuring the next folder with the last one's setup. Post\n       * puts the applier first; by the time this runs, `appliedSig` matches and it\n       * correctly does nothing. */\n      { flush: \"post\" }\n    );\n    const be = m(\"\"), De = {\n      home: \".home\",\n      recent: \".recent\",\n      starred: \".starred\",\n      shared: \".shared\"\n    };\n    function ie(i) {\n      if (!bd(i)) return null;\n      const l = String(i ?? \"\").replace(/^\\/+|\\/+$/g, \"\"), _ = Ty(l);\n      return _ ? { kind: \"tag\", tag: _ } : { kind: l.slice(1), tag: \"\" };\n    }\n    const ce = k(() => {\n      if (!Et.value) return \"\";\n      const i = r.config.storages ?? [];\n      return i.length === 1 ? i[0].name : \"\";\n    }), L = k(() => {\n      const i = (z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      return $ && i === $ || ce.value && i === ce.value ? !1 : i.length > 0;\n    }), se = k(() => w.value && w.value !== \"trash\" ? !0 : Et.value ? !(z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\") : !1), Ce = k(\n      () => w.value === \"home\" ? \"find\" : \"full\"\n    );\n    function We() {\n      if (pe.value) {\n        ot(re.value);\n        return;\n      }\n      if (w.value) {\n        ot(j.value);\n        return;\n      }\n      const i = (z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!i || i === $ || ce.value && i === ce.value) return;\n      const l = i.lastIndexOf(\"/\");\n      let _ = l === -1 ? \"\" : i.slice(0, l);\n      $ && !(_ === $ || _.startsWith($ + \"/\")) && (_ = $), ot(_);\n    }\n    const Ie = m([]), Ze = k(\n      () => (Ie.value.length ? Ie.value : O.value).filter((i) => i.type !== \"dir\")\n    ), vt = k(() => {\n      var F;\n      const i = Ze.value, l = (F = nn.value) == null ? void 0 : F.path, _ = l ? i.findIndex((ee) => ee.path === l) : -1;\n      return { index: _ === -1 ? 0 : _ + 1, total: _ === -1 ? 0 : i.length };\n    });\n    function Xe(i) {\n      const l = Ze.value, _ = l.findIndex((ee) => {\n        var me;\n        return ee.path === ((me = nn.value) == null ? void 0 : me.path);\n      });\n      if (_ === -1) return;\n      const F = l[_ + i];\n      F && (nn.value = F);\n    }\n    const Ae = Oc(() => Ie.value.length ? Ie.value : O.value);\n    He(\n      () => [...Ae.selected.value],\n      () => {\n        a(\n          \"selection-change\",\n          Ae.nodes.value.map((l) => ({ path: l.path, basename: l.basename, type: l.type }))\n        );\n        const i = Ae.nodes.value.filter((l) => l.type === \"file\");\n        b.setFocus(i.length === 1 ? i[0].basename : null);\n      }\n    );\n    const V = m({ mode: null, items: [], sourcePath: null }), R = m(null), X = m(!1);\n    y3({\n      config: () => r.config,\n      capabilities: R,\n      fetchMe: () => u.jsonFetch(`${wa(r.config)}/api/auth/me`)\n    });\n    const ye = k(() => {\n      var i;\n      return ((i = R.value) == null ? void 0 : i.share_max_ttl_days) ?? 0;\n    }), je = m(/* @__PURE__ */ new Set()), Qe = m(!1), at = m(!1), Ye = m(null), lt = m(0);\n    async function fe() {\n      try {\n        const i = await Rt(), l = r.config.apiBase ?? \"\", _ = await fetch(`${l}/api/files/manager/star/list?limit=500`, {\n          headers: i,\n          // ⚠ NOT 'include'. With a bearer token the request is cross-origin for\n          // every embedder that serves the UI from a different origin to the API\n          // (the desktop app is one), and a credentialed request may not be\n          // answered with `Access-Control-Allow-Origin: *` — which is what filex\n          // sends. This one line made starred files fail silently in every such\n          // install while the rest of the explorer worked.\n          credentials: u.credentialsMode()\n        });\n        if (!_.ok) return;\n        const F = await _.json(), ee = Array.isArray(F) ? F : Array.isArray(F == null ? void 0 : F.entries) ? F.entries : Array.isArray(F == null ? void 0 : F.nodes) ? F.nodes : [];\n        je.value = new Set(ee.map((me) => me.id).filter((me) => typeof me == \"number\"));\n      } catch {\n      }\n    }\n    function Pe(i, l) {\n      if (typeof i.id != \"number\") return;\n      const _ = new Set(je.value);\n      l ? _.add(i.id) : _.delete(i.id), je.value = _;\n    }\n    function Be(i) {\n      return eo.value ? i.filter((l) => typeof l.id == \"number\" && l.type === \"file\") : [];\n    }\n    function ht(i) {\n      const l = Be(i);\n      return l.length > 0 && l.every((_) => je.value.has(_.id));\n    }\n    async function Ft(i) {\n      const l = Be(i);\n      if (l.length === 0) return;\n      const _ = !ht(l), F = {\n        apiBase: r.config.apiBase ?? \"\",\n        authHeaders: () => Rt(),\n        authCredentials: u.credentialsMode()\n      }, ee = new Set(je.value);\n      for (const Ee of l)\n        _ ? ee.add(Ee.id) : ee.delete(Ee.id);\n      je.value = ee;\n      let me = 0;\n      await Promise.all(\n        l.map(async (Ee) => {\n          try {\n            await Dd(Ee.id, _, F);\n          } catch {\n            me += 1;\n            const Fe = new Set(je.value);\n            _ ? Fe.delete(Ee.id) : Fe.add(Ee.id), je.value = Fe;\n          }\n        })\n      ), me > 0 && Ke(p(\"star.failed\")), w.value === \"starred\" && await ir(\"starred\");\n    }\n    async function ft(i) {\n      if (typeof i.id == \"number\")\n        try {\n          const l = r.config.apiBase ?? \"\";\n          await fetch(`${l}/api/files/manager/recent`, {\n            method: \"POST\",\n            headers: await Rt({ \"Content-Type\": \"application/json\" }),\n            credentials: u.credentialsMode(),\n            body: JSON.stringify({ node_id: i.id })\n          }), lt.value += 1;\n        } catch {\n        }\n    }\n    function qt(i) {\n      typeof i.id == \"number\" && (Ye.value = i, at.value = !0);\n    }\n    function Gt(i) {\n      at.value = !1, oo(i);\n    }\n    function wt() {\n      W8(), cr(!0), w.value === \"tag\" && be.value && oo(be.value);\n    }\n    function en(i) {\n      const l = Fo(i) ?? {\n        type: \"file\",\n        path: i.path,\n        basename: i.name,\n        extension: (i.name.split(\".\").pop() || \"\").toLowerCase(),\n        id: i.id\n      };\n      Qe.value = !1, dn(l);\n    }\n    function $t(i, l) {\n      const _ = Fo(i);\n      _ && (Qe.value = !1, wr(_, l));\n    }\n    const kt = k(() => {\n      var l, _, F;\n      if (r.config.onlyOfficeBase) return r.config.onlyOfficeBase;\n      const i = (_ = (l = R.value) == null ? void 0 : l.external) == null ? void 0 : _.onlyoffice;\n      return i && !Mc(i) ? null : ((F = R.value) == null ? void 0 : F.onlyoffice_url) || null;\n    }), Dt = k(() => kt.value && u.endpoints.onlyOfficeConfig || null), At = k(() => {\n      var _, F, ee;\n      const i = r.config.drawioUrl || r.config.drawioBase;\n      if (i) return i;\n      const l = (F = (_ = R.value) == null ? void 0 : _.external) == null ? void 0 : F.drawio;\n      return l && !Mc(l) ? null : ((ee = R.value) == null ? void 0 : ee.drawio_url) || null;\n    }), Ot = k(\n      () => {\n        var i;\n        return r.config.convertBase || ((i = R.value) == null ? void 0 : i.convert_url) || null;\n      }\n    ), Bt = k(() => {\n      var i;\n      return ((i = R.value) == null ? void 0 : i.newdoc_types) ?? null;\n    }), un = k(() => {\n      const i = Bt.value;\n      return !i || i.length === 0 ? !1 : i.some(\n        (l) => l.requires === \"onlyoffice\" ? !!kt.value : l.requires === \"drawio\" ? !!At.value : !0\n      );\n    }), pt = m([]), tn = m(null), xt = m(!1), jt = m(!1), Pt = m(!1), _t = m(!1), St = m(!1), sn = m(null), Nt = m(!1), nn = m(null), mn = m(\"edit\"), xe = m(!1), de = m(null), Le = m(!1), q = m(null), ne = m(!1), H = m(\"move\"), te = m([]), _e = m(!1), Me = m(\n      (() => {\n        try {\n          return localStorage.getItem(Lu) === \"1\";\n        } catch {\n          return !1;\n        }\n      })()\n    );\n    function ge(i) {\n      try {\n        localStorage.setItem(Lu, i ? \"1\" : \"0\");\n      } catch {\n      }\n    }\n    function Oe() {\n      Me.value = !Me.value, ge(Me.value);\n    }\n    function mt() {\n      Me.value || (Me.value = !0, ge(!0));\n    }\n    function Xt() {\n      Me.value && (Me.value = !1, ge(!1));\n    }\n    const sa = k(() => eb(r.config.uiProfile)), Ja = k(() => sa.value === \"simple\"), sl = k(() => r.config.showInfoPanel !== !1), Za = m(\n      (() => {\n        try {\n          const i = localStorage.getItem(Du);\n          if (i === \"1\") return !0;\n          if (i === \"0\") return !1;\n        } catch {\n        }\n        return !0;\n      })()\n    );\n    function Ud(i) {\n      try {\n        localStorage.setItem(Du, i ? \"1\" : \"0\");\n      } catch {\n      }\n    }\n    const ra = m(!1), Qa = k(() => r.config.sideNav ?? !E), tr = k(\n      () => Qa.value && (rn.value ? ra.value : !0)\n    ), rl = k(\n      () => Qa.value && r.config.trashVisible !== !1\n    ), Vd = k(\n      () => rn.value ? ra.value : Za.value\n    );\n    function il() {\n      if (Qa.value) {\n        if (rn.value) {\n          ra.value = !ra.value;\n          return;\n        }\n        Za.value = !Za.value, Ud(Za.value);\n      }\n    }\n    function ia() {\n      ra.value = !1;\n    }\n    const nr = m([]), jd = k(() => r.config.connections ?? !Ja.value), ll = k(\n      () => {\n        var i;\n        return (r.config.callerKind ?? ((i = R.value) == null ? void 0 : i.caller_kind)) === \"app\";\n      }\n    ), eo = k(() => !ll.value), $a = m(!1), to = m(!1);\n    function Yd() {\n      to.value = !1, $a.value = !0;\n    }\n    function Wd() {\n      ll.value || ($a.value = !1, to.value = !0);\n    }\n    function Do() {\n      $a.value = !1, to.value = !1;\n    }\n    const qd = k(() => $a.value || to.value);\n    function Gd(i) {\n      const l = i instanceof Error ? i.message : String(i);\n      a(\"error\", { message: l, context: { op: \"connections\" } }), Ke(l);\n    }\n    const ar = k(\n      () => Ja.value ? [\"list\", \"grid\"] : void 0\n    );\n    dv(() => {\n      Ja.value && oe.value === \"gallery\" && (oe.value = \"grid\");\n    });\n    const no = m({ ...na }), ao = m(null), Oo = m(\"name\"), Xd = k(() => Q.value ? \"relevance\" : \"sort\");\n    function Jd() {\n      ao.value = null, cl({ ...na });\n    }\n    function cl(i) {\n      no.value = i, Ae.clear();\n    }\n    He(\n      () => `${z.value}|${w.value}`,\n      () => {\n        $o(no.value) && (no.value = { ...na }), Q.value || (ao.value = null);\n      }\n    );\n    const Bo = m(!1), ul = m(\"\"), Zd = k(() => !0);\n    function Qd(i, l) {\n      const _ = String(i.path ?? \"\").replace(/^\\/+/, \"\"), F = typeof i.storage == \"string\" && i.storage ? i.storage : l, ee = String(i.name ?? _.split(\"/\").pop() ?? \"\"), me = ee.lastIndexOf(\".\"), Ee = typeof i.backend_mtime == \"string\" ? i.backend_mtime : i.updated_at, Fe = typeof Ee == \"string\" ? Date.parse(Ee) : NaN;\n      return {\n        id: typeof i.id == \"number\" ? i.id : void 0,\n        path: F ? `${F}://${_}` : _,\n        basename: ee,\n        relativePath: _,\n        type: i.type === \"dir\" ? \"dir\" : \"file\",\n        extension: me > 0 ? ee.slice(me + 1).toLowerCase() : \"\",\n        size: typeof i.size == \"number\" ? i.size : 0,\n        // ⚠ Left UNSET when the row carries no parseable timestamp rather than\n        // defaulted to 0 or to now: `matchesModified` treats a missing timestamp\n        // as \"unknown\" and drops the row from a date filter, which is the honest\n        // answer. Stamping it with `Date.now()` would file every such file under\n        // \"Today\".\n        last_modified: Number.isNaN(Fe) ? void 0 : Fe,\n        mime_type: typeof i.mime == \"string\" ? i.mime : \"\",\n        /* The content snippet the hit came with, so a content match can show why\n           it matched. Undefined on name-only hits, exactly as the backend sends. */\n        snippet: typeof i.snippet == \"string\" && i.snippet ? i.snippet : void 0,\n        /* Owner, so the People filter and the Owner column mean the same thing in a\n           content result as they do in a folder listing. Undefined rather than\n           guessed when the backend does not send it. */\n        owner_id: typeof i.owner_id == \"number\" ? i.owner_id : void 0,\n        owner_name: typeof i.owner_name == \"string\" ? i.owner_name : void 0,\n        owner_self: i.owner_self === !0 ? !0 : void 0\n      };\n    }\n    async function dl(i, l, _) {\n      var me;\n      if (i === \"name\") {\n        const Ee = await u.search(_, l);\n        return $s(Ee.files);\n      }\n      const F = await u.globalSearch(l, { limit: Ou, scope: i }), ee = T.value || ((me = (r.config.storages ?? [])[0]) == null ? void 0 : me.name) || \"\";\n      return $s(F.map((Ee) => Qd(Ee, ee)));\n    }\n    function ef() {\n      const i = z.value ?? \"\";\n      return Et.value ? Uo(i) : ut(i);\n    }\n    async function tf(i) {\n      const l = js(i), _ = await dl(i.scope, l, ef()), F = i.scope === \"name\" ? 250 : Ou;\n      return {\n        count: hi(_, i.filters).length,\n        capped: Wx(_.length, F)\n      };\n    }\n    function nf(i) {\n      ul.value = ut(z.value ?? \"\") || \"\", fl.value = i, Bo.value = !0;\n    }\n    const fl = m(\"\");\n    function af(i) {\n      Bo.value = !1, Oo.value = i.scope, ao.value = $o(i.filters) ? { ...i.filters } : null;\n      const l = js(i);\n      l === Q.value ? ot() : Q.value = l;\n    }\n    function of(i) {\n      ao.value = null, Oo.value = \"name\", w.value !== \"home\" && (Q.value = i);\n    }\n    const pl = k(() => {\n      if (w.value || se.value) return \"\";\n      const i = T.value;\n      if (!i) return \"\";\n      const l = (r.config.storages ?? []).find((_) => _.name === i);\n      return (l == null ? void 0 : l.label) || i;\n    }), or = m(\"\");\n    function sf(i) {\n      or.value = i, Xo.value = !0;\n    }\n    const Io = m(void 0);\n    function rf() {\n      const i = ut(z.value);\n      if (!i) return;\n      const l = z.value.split(\"/\").filter(Boolean);\n      q.value = {\n        path: i,\n        basename: l.length ? l[l.length - 1] : T.value,\n        type: \"dir\"\n      }, Io.value = \"drop\", Le.value = !0;\n    }\n    function lf(i) {\n      a(\"share-created\", { path: i.path, url: i.url, pin: null }), Ke(p(\"inspector.copied\"));\n    }\n    const Ho = m(null);\n    async function cf() {\n      if (!eo.value) {\n        Ho.value = null;\n        return;\n      }\n      const i = await u.quotaMe();\n      if (!i) {\n        Ho.value = null;\n        return;\n      }\n      const l = !!i.unlimited || i.quota_bytes <= 0;\n      Ho.value = l && i.used_bytes <= 0 ? null : { used: i.used_bytes, total: i.quota_bytes, unlimited: l };\n    }\n    function Fo(i) {\n      return j8(i, {\n        storages: r.config.storages ?? [],\n        multiStorageRoot: Et.value\n      });\n    }\n    async function sr(i) {\n      const l = r.config.apiBase ?? \"\", _ = i === \"shared\" ? `${l}/api/files/manager/shared-with-me?limit=200` : i === \"starred\" ? `${l}/api/files/manager/star/list?limit=200` : `${l}/api/files/manager/recent?limit=50`, F = await fetch(_, {\n        headers: await Rt(),\n        // ⚠ NOT 'include' — same reason as loadStarred: a credentialed\n        // cross-origin request cannot be answered with `ACAO: *`.\n        credentials: u.credentialsMode()\n      });\n      if (!F.ok) throw new Error(String(F.status));\n      const ee = await F.json();\n      return i === \"shared\" ? (nr.value = Array.isArray(ee == null ? void 0 : ee.storages) ? ee.storages : [], Array.isArray(ee == null ? void 0 : ee.files) ? ee.files : []) : (Array.isArray(ee == null ? void 0 : ee.nodes) ? ee.nodes : []).map(Fo).filter((Ee) => Ee !== null);\n    }\n    const vl = m([]), hl = m([]), rr = m(!1), uf = k(() => r.config.storages ?? []);\n    async function df() {\n      rr.value = !0;\n      try {\n        const [i, l] = await Promise.all([\n          sr(\"recent\").catch(() => []),\n          sr(\"starred\").catch(() => [])\n        ]);\n        vl.value = i, hl.value = l;\n      } finally {\n        rr.value = !1;\n      }\n    }\n    async function ir(i) {\n      if (ia(), i === \"home\") {\n        w.value || (j.value = z.value ?? \"\"), w.value = \"home\", be.value = \"\", pe.value = !1, yt.value = \"\", ur(), Ae.clear(), O.value = [], Y.value = De.home, z.value = De.home, T.value = \"\", await df();\n        return;\n      }\n      if (i === \"tag\") {\n        be.value && await oo(be.value);\n        return;\n      }\n      if (i === \"trash\") {\n        _f(), await Yn(), w.value = \"trash\", be.value = \"\";\n        return;\n      }\n      x.value = !0, w.value || (j.value = z.value ?? \"\"), w.value = i, be.value = \"\", pe.value = !1, yt.value = \"\", ur(), Ae.clear();\n      try {\n        O.value = await sr(i), Y.value = De[i], z.value = De[i], T.value = \"\";\n      } catch (l) {\n        const _ = l instanceof Error ? l.message : String(l);\n        O.value = [], a(\"error\", { message: _, context: { op: `nav-view:${i}` } }), Ke(_);\n      } finally {\n        x.value = !1;\n      }\n    }\n    async function oo(i) {\n      ia();\n      const l = String(i ?? \"\").trim();\n      if (l) {\n        x.value = !0, w.value || (j.value = z.value ?? \"\"), w.value = \"tag\", be.value = l, pe.value = !1, yt.value = \"\", ur(), Ae.clear();\n        try {\n          const _ = await G8(l, {\n            apiBase: r.config.apiBase ?? \"\",\n            authHeaders: () => Rt(),\n            authCredentials: u.credentialsMode()\n          });\n          O.value = _.map(Fo).filter((ee) => ee !== null);\n          const F = Cy(l);\n          Y.value = F, z.value = F, T.value = \"\";\n        } catch (_) {\n          const F = _ instanceof Error ? _.message : String(_);\n          O.value = [], a(\"error\", { message: F, context: { op: `nav-view:tag:${l}` } }), Ke(F);\n        } finally {\n          x.value = !1;\n        }\n      }\n    }\n    const ml = m([]), lr = m(!1);\n    async function cr(i = !1) {\n      tr.value && (ml.value = await q8({\n        apiBase: r.config.apiBase ?? \"\",\n        authHeaders: () => Rt(),\n        authCredentials: u.credentialsMode(),\n        force: i\n      }), lr.value = !0);\n    }\n    function ff(i) {\n      if (i === \"myfiles\") {\n        ia(), ot(\"\");\n        return;\n      }\n      ir(i);\n    }\n    function yl(i) {\n      ia(), ot(Et.value ? i : \"\");\n    }\n    async function pf() {\n      try {\n        const i = r.config.apiBase ?? \"\", l = await fetch(`${i}/api/files/manager/shared-with-me?limit=1`, {\n          headers: await Rt(),\n          credentials: u.credentialsMode()\n        });\n        if (!l.ok) return;\n        const _ = await l.json();\n        nr.value = Array.isArray(_ == null ? void 0 : _.storages) ? _.storages : [];\n      } catch {\n      }\n    }\n    function bl(i) {\n      const l = (i ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!l) return Et.value ? p(\"breadcrumb.root\") : T.value || p(\"breadcrumb.root\");\n      const _ = l.split(\"/\").pop() || l;\n      return Fs(_, p) || _;\n    }\n    function vf(i) {\n      q.value = i, Le.value = !0;\n    }\n    function No(i) {\n      return G.value ? !1 : i === void 0 || i === \"editor\" || i === \"owner\";\n    }\n    function ur() {\n      J.value = \"\", G.value = !1;\n    }\n    const hf = k(() => !!w.value && w.value !== \"trash\");\n    function gl(i) {\n      return typeof i.perm == \"string\" ? i.perm : hf.value ? void 0 : J.value;\n    }\n    function kl(i) {\n      if (i.read_only === !0) return !0;\n      const l = typeof i.storage == \"string\" ? i.storage : \"\";\n      return l ? (r.config.storages ?? []).some((_) => _.name === l && _.readOnly === !0) : !1;\n    }\n    function dr(i) {\n      return No(gl(i)) && !kl(i);\n    }\n    const _l = { none: 0, viewer: 1, editor: 2, owner: 3 };\n    function mf(i) {\n      if (i.length === 0) return J.value;\n      let l, _ = !1;\n      for (const F of i) {\n        const ee = gl(F);\n        if (ee === void 0) {\n          _ = !0;\n          continue;\n        }\n        (l === void 0 || (_l[ee] ?? 0) < (_l[l] ?? 0)) && (l = ee);\n      }\n      return l ?? (_ ? void 0 : J.value);\n    }\n    function yf(i) {\n      return i.some(kl);\n    }\n    const xn = k(() => No(J.value)), Ko = k(\n      () => xn.value && !se.value && !pe.value\n    ), la = m(null), Kt = m(null), wl = m(null), rn = m(!1), $l = m(!1);\n    let xa, yn;\n    function fr(i) {\n      $l.value = !!(i && \"matches\" in i && i.matches);\n    }\n    dt(() => {\n      var i;\n      typeof ResizeObserver < \"u\" && Kt.value && (xa = new ResizeObserver((l) => {\n        var F, ee, me;\n        const _ = ((ee = (F = l[0]) == null ? void 0 : F.contentRect) == null ? void 0 : ee.width) ?? ((me = Kt.value) == null ? void 0 : me.clientWidth) ?? 0;\n        rn.value = _ > 0 && _ < 560;\n      }), xa.observe(Kt.value)), typeof window < \"u\" && window.matchMedia && (yn = window.matchMedia(\"(pointer: coarse)\"), fr(yn), (i = yn.addEventListener) == null || i.call(yn, \"change\", fr));\n    }), it(() => {\n      var i;\n      xa == null || xa.disconnect(), xa = void 0, (i = yn == null ? void 0 : yn.removeEventListener) == null || i.call(yn, \"change\", fr), yn = void 0;\n    });\n    const Sn = m(null);\n    let Sa;\n    function xl(i, l) {\n      Sn.value = i, Sa && clearTimeout(Sa), Sa = setTimeout(() => Sn.value = null, l);\n    }\n    function Ke(i) {\n      xl({ message: i }, 2500);\n    }\n    function Ro(i, l) {\n      xl({ message: i, actionLabel: p(\"toast.undo\"), action: l }, 8e3);\n    }\n    function pr() {\n      Sa && (clearTimeout(Sa), Sa = void 0), Sn.value = null;\n    }\n    async function bf() {\n      var l;\n      const i = (l = Sn.value) == null ? void 0 : l.action;\n      if (pr(), !!i)\n        try {\n          await i(), Ke(p(\"toast.undone\")), await ot();\n        } catch {\n          Ke(p(\"toast.undo_failed\"));\n        }\n    }\n    const Et = k(() => r.config.multiStorageRoot === !0);\n    function gf(i) {\n      const l = i.replace(/^\\/+|\\/+$/g, \"\");\n      if (!l) return { adapter: \"\", rel: \"\" };\n      const _ = l.indexOf(\"/\");\n      return _ === -1 ? { adapter: l, rel: \"\" } : { adapter: l.slice(0, _), rel: l.slice(_ + 1) };\n    }\n    function Uo(i) {\n      if (i.includes(\"://\")) return i;\n      const { adapter: l, rel: _ } = gf(i);\n      return l ? _ ? `${l}://${_}` : `${l}://` : \"\";\n    }\n    function Ca(i) {\n      const l = i.indexOf(\"://\");\n      if (l === -1) return i.replace(/^\\/+|\\/+$/g, \"\");\n      const _ = i.slice(0, l), F = i.slice(l + 3).replace(/^\\/+|\\/+$/g, \"\");\n      return F ? `${_}/${F}` : _;\n    }\n    function Sl() {\n      return (r.config.storages ?? []).map((l) => ({\n        type: \"dir\",\n        path: l.name,\n        // virtual path (no adapter prefix)\n        basename: l.label || l.name,\n        extension: \"\",\n        storage: l.name,\n        visibility: \"private\",\n        file_size: 0,\n        mime_type: \"inode/storage\",\n        extra_metadata: { driver: l.driver, readOnly: l.readOnly }\n      }));\n    }\n    function Cl() {\n      var i;\n      _y(!Hs.value), ot(), (i = bt.value) == null || i.reload();\n    }\n    function Tl() {\n      ot(), a(\"refresh\");\n    }\n    async function ot(i) {\n      const l = ie(i ?? z.value ?? \"\");\n      if (l) {\n        if (!(l.kind === \"trash\" ? r.config.trashVisible !== !1 : Qa.value))\n          return hr(\"\"), await ot(\"\");\n        l.kind === \"tag\" ? await oo(l.tag) : await ir(l.kind);\n        return;\n      }\n      const _ = String(z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\"), F = (me) => {\n        String(me ?? \"\").replace(/^\\/+|\\/+$/g, \"\") !== _ && (Ae.clear(), Ie.value = []);\n      };\n      x.value = !0, pe.value = !1, w.value = \"\", be.value = \"\";\n      let ee = i ?? z.value ?? \"\";\n      try {\n        if (N.value = \"\", P.value = \"\", $) {\n          const ct = String(ee).replace(/^\\/+|\\/+$/g, \"\");\n          (!ct || !(ct === $ || ct.startsWith($ + \"/\"))) && (ee = $);\n        }\n        if (Et.value && !Uo(ee)) {\n          if (ce.value) return await ot(ce.value);\n          F(\"\"), z.value = \"\", T.value = \"\", Y.value = \"\", yt.value = \"\", O.value = Sl();\n          return;\n        }\n        const me = Et.value ? Uo(ee) : ut(ee), Fe = !!Q.value && Oo.value !== \"name\" ? {\n          adapter: T.value,\n          storages: (r.config.storages ?? []).map((ct) => ct.name),\n          dirname: Y.value,\n          read_only: !1,\n          files: await dl(Oo.value, Q.value, me)\n        } : Q.value ? await u.search(me, Q.value) : await u.index(me);\n        T.value = Fe.adapter, Y.value = Fe.dirname, J.value = Fe.perm || \"\", G.value = Fe.read_only === !0, yt.value = typeof Fe.e2e_root == \"string\" ? Fe.e2e_root : \"\";\n        const nt = Et.value ? Ca(Fe.dirname) : ca(Fe.dirname);\n        F(nt), O.value = $s(Fe.files), hd(O.value, Fe.adapter, Fe.dirname, r.config.trashVisible !== !1, {\n          isSearchResult: !!Q.value,\n          navOffersTrash: rl.value\n        }) && md(O.value, Fe.adapter, u), z.value = nt;\n      } catch (me) {\n        const Ee = me instanceof Error ? me.message : String(me), Fe = me.status;\n        if (Fe === 404 || Fe === 403) {\n          N.value = String(ee), F(String(ee)), yt.value = \"\", O.value = [], a(\"error\", { message: Ee, context: { path: i } });\n          return;\n        }\n        P.value = Ee, le = typeof ee == \"string\" ? ee : void 0, a(\"error\", { message: Ee, context: { path: i } }), O.value.length > 0 && Ke(Ee);\n      } finally {\n        x.value = !1;\n      }\n    }\n    function ca(i) {\n      const l = i.indexOf(\"://\");\n      return l === -1 ? i : i.slice(l + 3);\n    }\n    function kf() {\n      N.value = \"\", hr(\"\"), ot(\"\");\n    }\n    const Vo = m(null), jo = m(!1), Yo = m(!1), so = m(!1);\n    async function _f() {\n      Vo.value = null, jo.value = !1;\n      try {\n        const i = await fetch(`${r.config.apiBase ?? \"\"}/api/admin/protection`, {\n          headers: await Rt(),\n          credentials: u.credentialsMode()\n        });\n        if (!i.ok) return;\n        const l = await i.json(), _ = l == null ? void 0 : l.trash_retention_days;\n        typeof _ == \"number\" && _ > 0 && (Vo.value = _), jo.value = !0;\n      } catch {\n      }\n    }\n    const wf = k(\n      () => Vo.value !== null ? p(\"trash.retention\", { days: Vo.value }) : p(\"trash.retention_unknown\")\n    ), Ml = k(\n      () => O.value.reduce((i, l) => {\n        const _ = typeof l.size == \"number\" ? l.size : l.file_size;\n        return i + (typeof _ == \"number\" ? _ : 0);\n      }, 0)\n    ), $f = k(() => Ml.value > 0), xf = k(\n      () => $f.value ? \"trash.empty_confirm_body\" : \"trash.empty_confirm_body_nosize\"\n    );\n    async function Sf() {\n      if (so.value = !1, !(!jo.value || Yo.value)) {\n        Yo.value = !0;\n        try {\n          const i = await fetch(`${r.config.apiBase ?? \"\"}/api/admin/trash/empty`, {\n            method: \"POST\",\n            headers: await Rt(),\n            credentials: u.credentialsMode()\n          });\n          if (!i.ok) throw new Error(String(i.status));\n          await Yn(), Ke(p(\"trash.emptied\"));\n        } catch (i) {\n          const l = i instanceof Error ? i.message : String(i);\n          a(\"error\", { message: l, context: { op: \"trash:empty\" } }), Ke(l);\n        } finally {\n          Yo.value = !1;\n        }\n      }\n    }\n    async function Yn() {\n      x.value = !0, re.value = T.value || \"\", pe.value = !0, yt.value = \"\", Ae.clear();\n      try {\n        const { entries: i } = await u.listTrash();\n        O.value = i.map(\n          (l) => ({\n            type: \"file\",\n            id: l.id,\n            path: l.storage_name ? `${l.storage_name}://${l.path}` : l.path,\n            basename: l.name,\n            extension: l.name.includes(\".\") && l.name.split(\".\").pop() || \"\",\n            storage: l.storage_name || \"\",\n            visibility: \"private\",\n            /* tablo:t1 — ⚠ BOTH. Every view reads `size` (the Size column, the\n               info panel, the empty-trash confirmation); only the upload code\n               reads `file_size`. Setting one of the two left every trashed row\n               with a blank Size cell and made \"this permanently deletes 2 items\n               (0 B)\" a false statement about two real files. */\n            size: l.size,\n            file_size: l.size,\n            mime_type: l.mime || \"\",\n            extra_metadata: { deleted_at: l.deleted_at, ttl_days: l.ttl_days ?? null }\n          })\n        ), Y.value = \".trash\", z.value = \".trash\";\n      } catch (i) {\n        const l = i instanceof Error ? i.message : String(i);\n        a(\"error\", { message: l, context: { op: \"trash-list\" } }), Ke(l);\n      } finally {\n        x.value = !1;\n      }\n    }\n    function ut(i) {\n      if (i && i.includes(\"://\")) return i;\n      if (Et.value) {\n        const l = Uo(i ?? \"\");\n        return l || (T.value ? `${T.value}://` : \"\");\n      }\n      return i ? `${T.value}://${i.replace(/^\\/+/, \"\")}` : `${T.value}://`;\n    }\n    function Wo(i) {\n      const l = i.indexOf(\"://\"), _ = (l === -1 ? i : i.slice(l + 3)).replace(/\\/+$/, \"\"), F = _.lastIndexOf(\"/\");\n      return F === -1 ? _ : _.slice(F + 1);\n    }\n    function qo(i) {\n      const l = i.indexOf(\"://\"), _ = l === -1 ? \"\" : i.slice(0, l + 3), F = (l === -1 ? i : i.slice(l + 3)).replace(/\\/+$/, \"\"), ee = F.lastIndexOf(\"/\");\n      return ee === -1 ? _ : _ + F.slice(0, ee);\n    }\n    function vr(i, l) {\n      const _ = (F) => {\n        const ee = F.indexOf(\"://\"), me = ee === -1 ? \"\" : F.slice(0, ee + 3), Ee = (ee === -1 ? F : F.slice(ee + 3)).replace(/\\/+$/, \"\");\n        return me + Ee;\n      };\n      return _(i) === _(l);\n    }\n    function Ta(i, l) {\n      return i ? i.endsWith(\"://\") || i.endsWith(\"/\") ? i + l : `${i}/${l}` : l;\n    }\n    async function El(i, l) {\n      try {\n        const _ = await u.index(l), F = new Set((_.files ?? []).map((ee) => String(ee.basename ?? \"\").toLowerCase()));\n        return i.some((ee) => F.has(Wo(ee).toLowerCase()));\n      } catch {\n        return !0;\n      }\n    }\n    function zl(i, l, _, F, ee) {\n      if (!F || !_ || ee) return;\n      const me = l.map((Ee) => Ta(_, Wo(Ee)));\n      me.length !== 0 && I.set(i, {\n        message: p(\"toast.moved\"),\n        fn: async () => {\n          const { op: Ee } = await u.moveAsync(me, F, _);\n          U.register(Ee);\n        }\n      });\n    }\n    He(\n      () => Q.value,\n      () => void ot()\n    );\n    function Go() {\n      return r.config.pathPersist ?? \"hash\";\n    }\n    function Al() {\n      const i = Go();\n      return i === \"hash\" || i === \"hash+localStorage\";\n    }\n    function Cf(i) {\n      try {\n        return decodeURIComponent(i);\n      } catch {\n        return i;\n      }\n    }\n    function Pl() {\n      try {\n        return localStorage.getItem(ai) || \"\";\n      } catch {\n        return \"\";\n      }\n    }\n    function Ll() {\n      const i = window.location.hash || \"\";\n      return i.startsWith(\"#\") ? Cf(i.slice(1)).replace(/^\\/+|\\/+$/g, \"\") : \"\";\n    }\n    function Tf() {\n      if (typeof window > \"u\") return \"\";\n      const i = Go();\n      if (i === \"none\") return \"\";\n      if (i === \"localStorage\") return Pl();\n      const l = Ll();\n      return l || i === \"hash\" ? l : M ? \"\" : Pl();\n    }\n    function hr(i) {\n      if (typeof window > \"u\") return;\n      const l = Go();\n      if (l === \"none\") return;\n      if (l === \"localStorage\" || l === \"hash+localStorage\") {\n        try {\n          i ? localStorage.setItem(ai, i) : localStorage.removeItem(ai);\n        } catch {\n        }\n        if (l === \"localStorage\") return;\n      }\n      const _ = i ? i.split(\"/\").map(encodeURIComponent).join(\"/\") : \"\", F = _ ? `#${_}` : \"\";\n      (window.location.hash || \"\") !== F && history.replaceState(\n        history.state,\n        \"\",\n        F || window.location.pathname + window.location.search\n      );\n    }\n    function Dl() {\n      if (!Al()) return;\n      const i = Ll();\n      i && i !== z.value && ot(i);\n    }\n    He(z, (i) => {\n      hr(i), a(\"navigate\", { path: i }), b.subscribe(D(i));\n    }), t({ reload: () => ot() }), dt(async () => {\n      var l;\n      Js();\n      const i = Tf();\n      await ot(i || void 0), await gt(), (l = Kt.value) == null || l.focus(), fe(), pf(), cr(), cf(), He(tr, (_) => {\n        _ && !lr.value && cr();\n      }), Al() && window.addEventListener(\"hashchange\", Dl), u.endpoints.opsList && U.startPolling(), u.endpoints.capabilities && u.capabilities().then((_) => {\n        R.value = _;\n      }).catch(() => {\n      });\n    });\n    const Xo = m(!1), Jo = m(!1);\n    function Mf(i) {\n      return u.globalSearch(i, { limit: 8, scope: \"all\" });\n    }\n    async function Ef(i) {\n      const l = String(i.path ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!l) return;\n      const _ = i.type === \"dir\", F = l.lastIndexOf(\"/\"), ee = _ ? l : F === -1 ? \"\" : l.slice(0, F);\n      let me = ee;\n      if (Et.value) {\n        const nt = r.config.storages ?? [], ct = typeof i.storage == \"string\" && i.storage || typeof i.storage_name == \"string\" && i.storage_name || (nt.length === 1 ? nt[0].name : \"\") || T.value;\n        if (!ct) return;\n        me = ee ? `${ct}/${ee}` : ct;\n      }\n      if (await ot(me), _) return;\n      const Ee = String(i.name ?? l.slice(F + 1)), Fe = O.value.find((nt) => nt.type === \"file\" && nt.basename === Ee);\n      Fe && (Ae.click(Fe.path), dn(Fe));\n    }\n    Ov(Kt, {\n      onDelete: () => {\n        if (zt.value) {\n          const i = Ht.nodes.value;\n          i.length && (ua.value = i, Nt.value = !0, _t.value = !0);\n        } else Ae.isEmpty.value || (Nt.value = !1, _t.value = !0);\n      },\n      onRename: () => {\n        if (zt.value) {\n          const i = Ht.nodes.value;\n          i.length === 1 && (sn.value = i[0], Nt.value = !0, Pt.value = !0);\n        } else Ae.nodes.value.length === 1 && (sn.value = Ae.nodes.value[0], Nt.value = !1, Pt.value = !0);\n      },\n      onSelectAll: () => zt.value ? Ht.selectAll() : Ae.selectAll(),\n      onOpen: () => {\n        if (zt.value) {\n          const l = Ht.nodes.value[0];\n          l && zp(\"split\", l);\n          return;\n        }\n        const i = Ae.nodes.value[0];\n        i && dn(i);\n      },\n      onClose: () => {\n        var i;\n        if (xt.value = !1, Pt.value = !1, _t.value = !1, St.value = !1, (i = la.value) == null || i.hide(), pr(), qd.value) {\n          Do();\n          return;\n        }\n        if (ra.value) {\n          ia();\n          return;\n        }\n        rn.value && Xt();\n      },\n      onFocusSearch: () => {\n        var i;\n        return (i = wl.value) == null ? void 0 : i.focusSearch();\n      },\n      onCut: () => zt.value ? yc() : Vf(),\n      onCopy: () => zt.value ? bc() : jf(),\n      onPaste: () => zt.value ? void gc() : void Nl(),\n      onGoUp: () => {\n        var i;\n        return zt.value ? (i = bt.value) == null ? void 0 : i.goUp() : We();\n      },\n      /* cila:c wiring */\n      onPathJump: () => {\n        or.value = \"\", Xo.value = !0;\n      },\n      onShowHelp: () => {\n        Jo.value = !0;\n      },\n      /* /cila:c wiring */\n      onQuickLook: () => pp(),\n      onToggleHidden: () => Cl(),\n      onStar: () => void Ft(Ae.nodes.value),\n      onToggleInspector: () => Oe(),\n      /* wiring:d1 — tab actions (registry: tab-new/close/next/prev) */\n      onTabNew: () => Pr(),\n      onTabClose: () => rc(Ar.value),\n      onTabNext: () => $p(),\n      onTabPrev: () => xp(),\n      /* /wiring:d1 */\n      /* tus:t1 — the menu verbs, routed through the SAME dispatcher the right-click\n       * menu and the toolbar use (dispatchItemAction), so a key and a click cannot\n       * drift apart. The ones that act on a selection do nothing without one, which\n       * is what the menu does too. */\n      onNewFolder: () => {\n        xt.value = !0;\n      },\n      onUpload: () => qn(),\n      onRefresh: () => void ot(),\n      onDownload: () => void gn(\"download\", Jt()),\n      onPreview: () => void gn(\"preview\", Jt()),\n      onShare: () => void gn(\"access\", Jt()),\n      onTags: () => void gn(\"tags\", Jt()),\n      onConvert: () => void gn(\"convert\", Jt()),\n      onOpenTab: () => void gn(\"open-tab\", Jt()),\n      onCopyPath: () => {\n        const i = Jt()[0];\n        i && as(i.path);\n      },\n      onCopyId: () => void gn(\"copy-id\", Jt()),\n      onRestore: () => void gn(\"restore\", Jt()),\n      /* /tus:t1 */\n      hasSelection: () => !Ae.isEmpty.value\n    });\n    function Jt() {\n      return zt.value ? Ht.nodes.value : Ae.nodes.value;\n    }\n    const zf = /* @__PURE__ */ new Set([\n      \"docx\",\n      \"xlsx\",\n      \"pptx\",\n      \"doc\",\n      \"xls\",\n      \"ppt\",\n      \"odt\",\n      \"ods\",\n      \"odp\"\n    ]);\n    function dn(i) {\n      if (i.basename === \".trash\") {\n        Yn();\n        return;\n      }\n      if (i.type === \"dir\") {\n        const _ = Et.value ? Ca(i.path) : ca(i.path);\n        ot(_);\n        return;\n      }\n      if (Mn.value && i.type === \"file\") {\n        Vr(i);\n        return;\n      }\n      if (Ir.value && i.type === \"file\") return;\n      if (r.config.openInHost && i.type === \"file\") {\n        a(\"file-opened\", { path: i.path, basename: i.basename }), ft(i);\n        return;\n      }\n      const l = (i.extension || \"\").toLowerCase();\n      mn.value = dr(i) ? Pf(l) : \"view\", nn.value = i, St.value = !0, a(\"file-opened\", { path: i.path, basename: i.basename }), ft(i);\n    }\n    const Af = /* @__PURE__ */ new Set([\n      ...zf,\n      \"drawio\",\n      \"dio\",\n      \"pdf\",\n      \"epub\",\n      \"ipynb\",\n      \"tiff\",\n      \"tif\",\n      \"psd\",\n      \"mmd\",\n      \"mermaid\",\n      \"glb\",\n      \"gltf\",\n      \"obj\",\n      \"stl\",\n      \"fbx\",\n      \"3ds\",\n      \"zip\",\n      \"rar\",\n      \"7z\",\n      \"tar\",\n      \"gz\",\n      \"tgz\",\n      \"jpg\",\n      \"jpeg\",\n      \"png\",\n      \"webp\",\n      \"gif\",\n      \"bmp\",\n      \"avif\",\n      \"svg\",\n      \"heic\",\n      \"mp4\",\n      \"webm\",\n      \"mov\",\n      \"mkv\",\n      \"m4v\",\n      \"ogv\",\n      \"mp3\",\n      \"wav\",\n      \"ogg\",\n      \"flac\",\n      \"m4a\",\n      \"aac\",\n      \"opus\"\n    ]);\n    function Pf(i) {\n      return Af.has(i) ? \"view\" : \"edit\";\n    }\n    async function Lf(i) {\n      const l = i ?? Ae.nodes.value;\n      if (l.length !== 0)\n        try {\n          if (pe.value) {\n            const ee = l.map((Fe) => Fe.id).filter((Fe) => typeof Fe == \"number\"), { restored: me, taken: Ee } = await u.restoreIds(ee);\n            Ke(\n              Ee.length ? p(\"toast.restore_taken\", { n: Ee.length, name: Ee[0] }) : p(\"toast.restored\", { n: me })\n            ), Ae.clear(), await Yn();\n            return;\n          }\n          if (!u.endpoints.restore) return;\n          const _ = l.map((ee) => ee.path), { restored: F } = await u.restore(_);\n          Ke(p(\"toast.restored\", { n: F })), Ae.clear(), await ot();\n        } catch (_) {\n          a(\"error\", { message: _.message, context: { op: \"restore\" } });\n        }\n    }\n    function Ol(i) {\n      if (Mn.value && i.type === \"file\") {\n        Vr(i);\n        return;\n      }\n      mn.value = \"view\", nn.value = i, St.value = !0, ft(i);\n    }\n    function Df(i) {\n      if (i.type === \"dir\") {\n        const Ee = Et.value ? Ca(i.path) : ca(i.path);\n        ot(Ee);\n        return;\n      }\n      if (Zt.value) {\n        Mn.value && Vr(i);\n        return;\n      }\n      if (r.config.openInHost) {\n        dn(i);\n        return;\n      }\n      if (!dr(i)) {\n        Ol(i);\n        return;\n      }\n      const l = (i.extension || \"\").toLowerCase(), _ = r.config.openPageBase;\n      if (!_) {\n        dn(i);\n        return;\n      }\n      const F = Ql(_), ee = F.includes(\"?\") ? \"&\" : \"?\", me = `${F}${ee}path=${encodeURIComponent(i.path)}&type=${encodeURIComponent(l)}&mode=edit`;\n      window.open(me, \"_blank\", \"noopener\"), a(\"file-opened\", { path: i.path, basename: i.basename }), ft(i);\n    }\n    const Cn = m(\"selection\"), mr = m(\"\"), ua = m([]), Of = m(\"\"), Bf = k(() => {\n      const i = Jt();\n      return i.length === 0 ? \"none\" : i.length === 1 ? i[0].type === \"dir\" ? \"single-dir\" : \"single-file\" : \"multi\";\n    });\n    async function yr(i) {\n      const l = Jt();\n      if (i === \"open\") {\n        l[0] && dn(l[0]);\n        return;\n      }\n      await gn(i, l);\n    }\n    const bn = k(() => r.config.desktopSync ?? null), Zo = m([]);\n    async function da() {\n      if (bn.value)\n        try {\n          Zo.value = await bn.value.kept();\n        } catch {\n        }\n    }\n    const Ma = m(null);\n    async function Bl() {\n      const i = bn.value;\n      if (i != null && i.status)\n        try {\n          Ma.value = (await i.status()).active ?? null;\n        } catch {\n          Ma.value = null;\n        }\n    }\n    let Ea = null, br = !0;\n    function If() {\n      Ea || !br || (Ea = setTimeout(() => {\n        Ea = null, br && (Bl(), da());\n      }, 300));\n    }\n    dt(() => {\n      var i, l;\n      da(), Bl(), (l = (i = bn.value) == null ? void 0 : i.onChange) == null || l.call(i, If);\n    }), it(() => {\n      br = !1, Ea && (clearTimeout(Ea), Ea = null);\n    });\n    function ro(i) {\n      const l = String(i.path ?? \"\");\n      return l.includes(\"://\") ? l.replace(/\\/+$/, \"\") : `${l}://`;\n    }\n    function Qo(i, l) {\n      return l.endsWith(\"://\") ? i.startsWith(l) && i !== l : i === l ? !1 : i.startsWith(l + \"/\");\n    }\n    function gr(i) {\n      return Zo.value.some((l) => l.remote === i) ? \"kept\" : Zo.value.some((l) => Qo(i, l.remote)) ? \"inherited\" : Zo.value.some((l) => Qo(l.remote, i)) ? \"partial\" : \"none\";\n    }\n    function Il(i) {\n      if (!bn.value || S.value || i.basename === \".trash\") return null;\n      const l = ro(i), _ = Ma.value;\n      if (_ && (l === _.remote || Qo(l, _.remote) || Qo(_.remote, l)))\n        return \"syncing\";\n      const F = gr(l);\n      return F === \"kept\" || F === \"inherited\" ? \"kept\" : F === \"partial\" ? \"partial\" : \"cloud\";\n    }\n    const Hf = k(() => {\n      const i = Ma.value;\n      if (!i) return \"\";\n      const l = i.remote.endsWith(\"://\") ? i.remote.slice(0, -3) : i.remote.slice(i.remote.lastIndexOf(\"/\") + 1);\n      return i.phase === \"transfer\" && i.total > 0 ? p(\"keep.strip_transfer\", {\n        name: l,\n        done: String(i.done),\n        total: String(i.total),\n        pct: String(Math.min(100, Math.round(i.done * 100 / i.total)))\n      }) : i.phase === \"settling\" ? p(\"keep.strip_settling\", { name: l }) : p(\"keep.strip_inventory\", { name: l });\n    }), Hl = k(() => {\n      const i = Ma.value;\n      return !i || i.phase !== \"transfer\" || i.total <= 0 ? null : Math.min(100, Math.round(i.done * 100 / i.total));\n    });\n    function kr(i) {\n      var ee, me, Ee;\n      const l = bn.value, _ = i.length === 1 && (((ee = i[0]) == null ? void 0 : ee.type) === \"dir\" || ((me = i[0]) == null ? void 0 : me.type) === \"file\");\n      if (!l || !_ || S.value || Zt.value || ((Ee = i[0]) == null ? void 0 : Ee.e2e) === !0) return [];\n      const F = gr(ro(i[0]));\n      return [\n        { divider: !0, key: \"sep-keep\", label: \"\" },\n        { key: \"keep-local\", label: p(\"ctx.keep_local\"), hidden: F === \"kept\" || F === \"inherited\" },\n        { key: \"keep-online\", label: p(\"ctx.keep_online\"), hidden: F !== \"kept\" },\n        { key: \"keep-inherited\", label: p(\"ctx.keep_inherited\"), disabled: !0, hidden: F !== \"inherited\" },\n        { key: \"keep-reveal\", label: p(\"ctx.keep_reveal\"), hidden: F !== \"kept\" && F !== \"inherited\" }\n      ];\n    }\n    const _r = m([]);\n    async function wr(i, l) {\n      var F;\n      Cn.value = \"selection\", da(), Ae.has(i.path) || (Ae.click(i.path), await gt()), _r.value = Ae.nodes.value.length ? [] : [i];\n      const _ = Ae.nodes.value.length ? Ae.nodes.value : [i];\n      (F = la.value) == null || F.show({ clientX: l.clientX, clientY: l.clientY }, _);\n    }\n    function Ff(i) {\n      var l;\n      i.preventDefault(), Cn.value = \"selection\", Ae.clear(), _r.value = [], (l = la.value) == null || l.show({ clientX: i.clientX, clientY: i.clientY }, []);\n    }\n    function Nf(i) {\n      var l;\n      Cn.value = \"breadcrumb\", mr.value = i.adapterPath, Of.value = i.label, (l = la.value) == null || l.show({ clientX: i.x, clientY: i.y }, []);\n    }\n    async function Fl(i, l, _) {\n      var F, ee;\n      if (da(), i === \"split\") {\n        Tn.value = \"split\";\n        const me = Ht.nodes.value;\n        l && !Ht.has(l.path) && (Ht.click(l.path), await gt());\n        const Ee = Ht.nodes.value;\n        ua.value = l ? Ee.length > 0 ? Ee : me.length > 0 ? me : [l] : [], Cn.value = \"pane\", (F = la.value) == null || F.show({ clientX: _.clientX, clientY: _.clientY }, ua.value);\n        return;\n      }\n      if (Tn.value = \"main\", Cn.value = \"selection\", !l) {\n        Ae.clear(), (ee = la.value) == null || ee.show({ clientX: _.clientX, clientY: _.clientY }, []);\n        return;\n      }\n      await wr(l, _);\n    }\n    const Kf = k(() => {\n      if (Cn.value === \"breadcrumb\")\n        return [\n          { key: \"open\", label: p(\"ctx.open\") },\n          { key: \"copy-path\", label: p(\"breadcrumb.copy_path\") }\n        ];\n      if (Cn.value === \"pane\") {\n        const me = ua.value;\n        return me.length === 0 ? [\n          { key: \"new-folder\", label: p(\"toolbar.new_folder\") },\n          { key: \"paste\", label: p(\"ctx.paste\"), disabled: !V.value.mode }\n        ] : es(me);\n      }\n      const i = Ae.nodes.value.length ? Ae.nodes.value : _r.value, l = i.length > 0, _ = i.length === 1;\n      if (S.value)\n        return l ? [\n          { key: \"restore\", label: p(\"ctx.restore\") },\n          { divider: !0, key: \"sep1\", label: \"\" },\n          { key: \"delete\", label: p(\"ctx.delete_perm\"), danger: !0 }\n        ] : [];\n      const F = (z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (Et.value && F === \"\")\n        return l ? _ ? [\n          { key: \"open\", label: p(\"ctx.open\") },\n          { key: \"open-tab\", label: p(\"ctx.open_new_tab\") },\n          // A whole storage can be kept too — that IS the \"sync everything\"\n          // shape, and it is one pair, not one per subfolder.\n          ...kr(i)\n        ] : [] : [];\n      if (!l) {\n        const me = [\n          {\n            key: \"toggle-hidden\",\n            label: Hs.value ? p(\"ctx.hide_hidden\") : p(\"ctx.show_hidden\")\n          }\n        ];\n        return No(J.value) ? [\n          { key: \"new-folder\", label: p(\"toolbar.new_folder\") },\n          { key: \"paste\", label: p(\"ctx.paste\"), disabled: !V.value.mode },\n          ...me\n        ] : me;\n      }\n      return es(i);\n    });\n    function es(i) {\n      var Qt, Cc, Tc;\n      const l = i.length > 0, _ = i.length === 1;\n      if (i.some(Pi))\n        return _ ? [\n          { key: \"open\", label: p(\"ctx.open\") },\n          { key: \"open-tab\", label: p(\"ctx.open_new_tab\") },\n          ...kr(i)\n        ] : [];\n      const F = _ && ((Qt = i[0]) == null ? void 0 : Qt.type) === \"file\", ee = v.value === \"en\" ? \"Tags…\" : \"Etiketler…\", me = _ && typeof ((Cc = i[0]) == null ? void 0 : Cc.id) == \"number\", Ee = Be(i).length > 0, Fe = ht(i), nt = mf(i), ct = No(nt) && !yf(i), ke = v.value === \"en\" ? \"Share / Permissions\" : \"Paylaş / İzinler\";\n      return [\n        { key: \"open\", label: p(\"ctx.open\"), hidden: !_ },\n        { key: \"open-tab\", label: p(\"ctx.open_new_tab\"), hidden: !_ || ((Tc = i[0]) == null ? void 0 : Tc.type) !== \"dir\" },\n        { key: \"preview\", label: p(\"ctx.preview\"), hidden: !_, disabled: !F },\n        /* tasi:m1 — Download works on ANY selection now. It used to disappear the\n           moment a second row was ticked, because the only implementation was one\n           `window.open` per node and the browser blocks the second popup; there is\n           one streaming archive behind it now (lib/downloadSelection), and the\n           server expands a selected folder itself, so a lone folder is a zip too.\n           ⚠ Still single-only inside an encrypted folder: those bytes are\n           decrypted IN THE BROWSER, one file at a time, and the server has no\n           plaintext to zip. */\n        { key: \"download\", label: p(\"ctx.download\"), hidden: !l || Zt.value && !_, disabled: !l },\n        { key: \"convert\", label: p(\"ctx.convert\"), hidden: !_ || !Ot.value || !ct || Zt.value, disabled: !F },\n        /* tasi:m1 — VISIBLE and grey above a multi-selection, not gone. Sharing\n           really is one item at a time (a share link addresses one node), and the\n           row now says so in its tooltip; vanishing taught the reader that filex\n           cannot share the thing they are looking at. */\n        {\n          key: \"access\",\n          label: ke,\n          hidden: !l || !ct || Zt.value,\n          disabled: !_,\n          title: _ ? void 0 : p(\"ctx.access.one_only\")\n        },\n        { key: \"details\", label: p(\"ctx.details\"), hidden: !l },\n        /* ⚠ \"Copy node id\" is NOT here any more (owner's call, 2026-09-13): it is a\n           developer's handle on a support ticket, not an everyday verb, and this\n           list is rendered by BOTH the right-click menu and the selection bar — so\n           one row put it in front of everyone, twice. It lives in the details\n           panel now, beside Path and ETag, which is where the other technical\n           facts about a file already are. The `copy-id` case below stays: the\n           panel dispatches it. */\n        { divider: !0, key: \"sep1\", label: \"\", hidden: !ct },\n        { key: \"rename\", label: p(\"ctx.rename\"), hidden: !_ || !ct, disabled: !_ },\n        { key: \"cut\", label: p(\"ctx.cut\"), hidden: !l || !ct, disabled: !l },\n        { key: \"copy\", label: p(\"ctx.copy\"), hidden: !l, disabled: !l },\n        /* tasi:m1 — \"somewhere else\", without the clipboard. Cut+paste has always\n           been able to do this, but only by navigating away from the rows you had\n           just picked; these two ask WHERE in a dialog and leave the listing where\n           it is.\n           ⚠ `icon:` is not decoration here — `actionIconSvg` answers '' for a key\n           it does not know, and a bar button with no glyph is an empty 28px box.\n           They borrow the clipboard verbs' marks, which is what they are. */\n        { key: \"move-to\", label: p(\"ctx.move_to\"), icon: \"cut\", hidden: !l || !ct, disabled: !l },\n        { key: \"copy-to\", label: p(\"ctx.copy_to\"), icon: \"copy\", hidden: !l, disabled: !l },\n        /* Paste needs a destination folder; a virtual view (Recent / Starred /\n           Shared / a tag / Home) has none, so it is the one write verb the row\n           menu does not carry there — every per-row verb above and below does. */\n        { key: \"paste\", label: p(\"ctx.paste\"), hidden: !ct || se.value, disabled: !V.value.mode },\n        { divider: !0, key: \"sep-meta\", label: \"\", hidden: !me && !Ee },\n        /* yildiz:s1 — \"star must be an action, like a tag\" (owner, v0.30.0).\n           Beside Tags on purpose: they are the same kind of verb, and this is the\n           ONLY star a grid/gallery user reaches with the keyboard. Works on a\n           multi-selection; the label follows the selection's state. */\n        {\n          key: \"star\",\n          label: p(Fe ? \"ctx.unstar\" : \"ctx.star\"),\n          icon: Fe ? \"unstar\" : \"star\",\n          hidden: !Ee\n        },\n        { key: \"tags\", label: ee, hidden: !me, disabled: !me },\n        ...kr(i),\n        { divider: !0, key: \"sep2\", label: \"\", hidden: !ct },\n        { key: \"delete\", label: p(\"ctx.delete\"), danger: !0, hidden: !l || !ct, disabled: !l }\n      ];\n    }\n    const Rf = k(() => {\n      const i = Jt();\n      if (zt.value) return i.length ? es(i) : [];\n      if (S.value)\n        return i.length === 0 ? [] : [\n          { key: \"restore\", label: p(\"ctx.restore\") },\n          { key: \"delete\", label: p(\"ctx.delete_perm\"), danger: !0 }\n        ];\n      const l = (z.value ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      return Et.value && l === \"\" ? i.length === 1 ? [{ key: \"open\", label: p(\"ctx.open\") }] : [] : i.length === 0 ? [] : es(i);\n    });\n    async function Uf(i, l) {\n      if (Cn.value === \"breadcrumb\") {\n        i.key === \"open\" ? ot(ca(mr.value)) : i.key === \"copy-path\" && await as(mr.value);\n        return;\n      }\n      if (Cn.value === \"pane\") {\n        await gn(i.key, ua.value);\n        return;\n      }\n      await gn(i.key, l);\n    }\n    function Wn() {\n      return Cn.value === \"pane\" || zt.value;\n    }\n    async function gn(i, l) {\n      var _;\n      switch (i) {\n        case \"clear-selection\":\n          zt.value ? Ht.clear() : Ae.clear();\n          return;\n        case \"open\":\n          l[0] && Df(l[0]);\n          break;\n        case \"preview\":\n          l[0] && Ol(l[0]);\n          break;\n        case \"download\":\n          await qf(l);\n          break;\n        case \"move-to\":\n        case \"copy-to\":\n          if (l.length === 0) break;\n          H.value = i === \"move-to\" ? \"move\" : \"copy\", te.value = l, _e.value = !1, ne.value = !0;\n          break;\n        case \"keep-local\": {\n          const F = bn.value;\n          if (!F || !l[0]) break;\n          const ee = ro(l[0]);\n          try {\n            await F.keep(ee, l[0].type === \"file\" ? \"file\" : \"dir\"), await da(), gr(ee) !== \"none\" && Ke(p(\"keep.started\"));\n          } catch (me) {\n            await da(), Ke(`${p(\"keep.failed\")}: ${String((me == null ? void 0 : me.message) ?? me)}`);\n          }\n          break;\n        }\n        case \"keep-online\": {\n          const F = bn.value;\n          if (!F || !l[0]) break;\n          try {\n            await F.unkeep(ro(l[0]));\n          } catch {\n          }\n          await da();\n          break;\n        }\n        case \"keep-reveal\": {\n          const F = bn.value;\n          F && l[0] && F.reveal(ro(l[0]));\n          break;\n        }\n        case \"convert\":\n          l[0] && ep(l[0]);\n          break;\n        case \"access\":\n          l[0] && (q.value = l[0], Le.value = !0);\n          break;\n        case \"details\":\n          mt();\n          break;\n        case \"copy-id\":\n          if (l[0] && typeof l[0].id == \"number\") {\n            const F = l[0].id;\n            (_ = navigator.clipboard) == null || _.writeText(String(F)).then(\n              () => Ke(v.value === \"en\" ? `Node id ${F} copied` : `Node id ${F} kopyalandı`),\n              () => Ke(`#${F}`)\n            );\n          }\n          break;\n        case \"star\":\n          await Ft(l);\n          break;\n        case \"tags\":\n          l[0] && qt(l[0]);\n          break;\n        case \"rename\":\n          l[0] && (sn.value = l[0], Nt.value = Wn(), Pt.value = !0);\n          break;\n        case \"cut\":\n          Wn() ? yc() : (V.value = { mode: \"cut\", items: l, sourcePath: z.value }, Ke(p(\"toast.cut_ready\")));\n          break;\n        case \"copy\":\n          Wn() ? bc() : (V.value = { mode: \"copy\", items: l, sourcePath: z.value }, Ke(p(\"toast.copy_ready\")));\n          break;\n        case \"paste\":\n          Wn() ? await gc() : await Nl();\n          break;\n        case \"delete\": {\n          const F = Wn();\n          F && (ua.value = l), Nt.value = F, _t.value = !0;\n          break;\n        }\n        case \"restore\":\n          l.length > 0 && await Lf(l);\n          break;\n        case \"toggle-hidden\":\n          Cl();\n          break;\n        case \"new-folder\":\n          Nt.value = Wn(), xt.value = !0;\n          break;\n        case \"duplicate\":\n          l[0] && await Yf(l[0]);\n          break;\n        case \"open-tab\":\n          l[0] && ic(l[0]);\n          break;\n      }\n    }\n    function Vf() {\n      Ae.isEmpty.value || (V.value = { mode: \"cut\", items: Ae.nodes.value, sourcePath: z.value }, Ke(p(\"toast.cut\")));\n    }\n    function jf() {\n      Ae.isEmpty.value || (V.value = { mode: \"copy\", items: Ae.nodes.value, sourcePath: z.value }, Ke(p(\"toast.copied\")));\n    }\n    async function Nl() {\n      const i = V.value;\n      if (!(!i.mode || i.items.length === 0))\n        try {\n          const l = i.items.map((Ee) => Ee.path), _ = i.sourcePath || \"\";\n          if (i.mode === \"cut\" && _ === z.value) {\n            Ke(p(\"toast.same_folder_cut\"));\n            return;\n          }\n          const ee = ut(z.value), me = Au(l, ee, i.mode === \"cut\" ? \"move\" : \"copy\");\n          if (i.mode === \"cut\") {\n            const Ee = ut(_) || void 0, Fe = await El(l, ee), { op: nt } = await u.moveAsync(l, ee, Ee);\n            zl(nt.id, l, ee, Ee, Fe), U.register(nt), Ke(\n              Fe ? p(\"toast.move_kept_both\") : me.cross ? p(\"split.cross_move\") : p(\"split.move_queued\")\n            );\n          } else {\n            const { op: Ee } = await u.copy(l, ee);\n            U.register(Ee), Ke(me.cross ? p(\"split.cross_copy\") : p(\"split.copy_queued\"));\n          }\n          V.value = { mode: null, items: [], sourcePath: null };\n        } catch (l) {\n          a(\"error\", { message: l.message, context: { op: \"paste\" } });\n        }\n    }\n    async function Yf(i) {\n      try {\n        const { op: l } = await u.copy([i.path], ut(z.value));\n        U.register(l);\n      } catch (l) {\n        a(\"error\", { message: l.message, context: { op: \"duplicate\" } });\n      }\n    }\n    function Wf(i) {\n      if (Mn.value) {\n        jp(i);\n        return;\n      }\n      const l = u.downloadUrl(i.path);\n      window.open(l, \"_blank\");\n    }\n    async function qf(i) {\n      if (i.length !== 0) {\n        if (i.length === 1 && i[0].type === \"file\") {\n          Wf(i[0]);\n          return;\n        }\n        Ke(p(\"toast.archive.preparing\"));\n        try {\n          const l = await tz(u, i.map((_) => _.path));\n          Ke(p(\"toast.archive.started\", { name: l.name, count: String(l.files) }));\n        } catch (l) {\n          const _ = l;\n          Ke(_.status === 409 ? p(\"toast.archive.empty\") : _.message), a(\"error\", { message: _.message, context: { op: \"archive-download\" } });\n        }\n      }\n    }\n    async function Gf(i) {\n      var ee;\n      const l = te.value;\n      if (!i || l.length === 0) {\n        ne.value = !1;\n        return;\n      }\n      const _ = H.value === \"move\", F = Wn() ? ut(((ee = bt.value) == null ? void 0 : ee.getPath()) ?? \"\") : ut(z.value);\n      _e.value = !0;\n      try {\n        await Aa(l.map((Ee) => Ee.path), i, F || void 0, _ ? \"move\" : \"copy\");\n        const me = _i(i, i);\n        Ke(_ ? p(\"toast.moved_to\", { name: me }) : p(\"toast.copied_to\", { name: me })), _ && (Wn() ? Ht.clear() : Ae.clear());\n      } finally {\n        _e.value = !1, ne.value = !1;\n      }\n    }\n    async function Xf(i) {\n      jt.value = !1;\n      const l = i.path.slice(0, i.path.lastIndexOf(\"/\"));\n      l && l !== ut(z.value) ? await ot(l) : await ot();\n      const _ = O.value.find((F) => F.path === i.path) ?? { type: \"file\", path: i.path, basename: i.name, extension: i.ext };\n      nn.value = _, mn.value = dr(_) ? \"edit\" : \"view\", St.value = !0, a(\"file-opened\", { path: _.path, basename: _.basename }), ft(_);\n    }\n    async function Jf(i) {\n      var _, F;\n      const l = Nt.value;\n      try {\n        const ee = ut(l ? ((_ = bt.value) == null ? void 0 : _.getPath()) ?? \"\" : z.value);\n        await u.newFolder(ee, i), xt.value = !1, l ? await ((F = bt.value) == null ? void 0 : F.reload()) : await ot();\n      } catch (ee) {\n        a(\"error\", { message: ee.message, context: { op: \"newfolder\" } });\n      }\n    }\n    async function Zf(i) {\n      var F, ee;\n      const l = sn.value;\n      if (!l) return;\n      const _ = Nt.value;\n      try {\n        const me = ut(_ ? ((F = bt.value) == null ? void 0 : F.getPath()) ?? \"\" : z.value), Ee = l.path, Fe = l.basename;\n        if (await u.rename(me, Ee, i), Pt.value = !1, sn.value = null, _ ? await ((ee = bt.value) == null ? void 0 : ee.reload()) : await ot(), i && i !== Fe) {\n          const nt = Ta(qo(Ee), i);\n          Ro(p(\"toast.renamed\"), async () => {\n            await u.rename(me, nt, Fe);\n          });\n        }\n      } catch (me) {\n        a(\"error\", { message: me.message, context: { op: \"rename\" } });\n      }\n    }\n    async function Qf() {\n      var Ee, Fe, nt;\n      if (pe.value) {\n        _t.value = !1, Ke(p(\"toast.trash_retention\"));\n        return;\n      }\n      const i = Nt.value, l = i ? ua.value : Ae.nodes.value, _ = ut(i ? ((Ee = bt.value) == null ? void 0 : Ee.getPath()) ?? \"\" : z.value), F = l.map((ct) => ct.path);\n      if (F.length === 0) {\n        _t.value = !1;\n        return;\n      }\n      const ee = l.map((ct) => ct.id).filter((ct) => typeof ct == \"number\"), me = u.endpoints.trashRestore && ee.length === l.length ? async () => {\n        const { restored: ct } = await u.restoreIds(ee);\n        if (ct === 0) throw new Error(\"restore failed\");\n      } : null;\n      try {\n        if (u.endpoints.deleteAsync) {\n          const { op: ct } = await u.deleteAsync(F, _);\n          me && I.set(ct.id, { message: p(\"toast.trashed\"), fn: me }), U.register(ct), Ke(p(\"toast.delete_queued\"));\n        } else\n          await u.deleteItems(_, F), i ? await ((Fe = bt.value) == null ? void 0 : Fe.reload()) : await ot(), me && Ro(p(\"toast.trashed\"), me);\n        _t.value = !1, i ? (nt = bt.value) == null || nt.reload() : Ae.clear();\n      } catch (ct) {\n        a(\"error\", { message: ct.message, context: { op: \"delete\" } });\n      }\n    }\n    function ep(i) {\n      de.value = i, xe.value = !0;\n    }\n    function tp(i) {\n      Ke(v.value === \"en\" ? `Converted → ${i}` : `Dönüştürüldü → ${i}`), ot();\n    }\n    function qn() {\n      var i;\n      if (!xn.value) {\n        Ke(v.value === \"en\" ? \"Read-only here\" : \"Burada yazma yetkiniz yok\");\n        return;\n      }\n      (i = tn.value) == null || i.click();\n    }\n    function np(i) {\n      const l = i.target, _ = l.files ? Array.from(l.files) : [];\n      l.value = \"\", Kl(_);\n    }\n    async function Kl(i) {\n      if (i.length !== 0) {\n        if (Ir.value) {\n          Ke(p(\"e2e.upload.locked\"));\n          return;\n        }\n        if (!(Mn.value && (i = await Yp(i), i.length === 0))) {\n          for (const l of i) {\n            if (B.shouldChunk(l)) {\n              const _ = B.resumableFor(ut(z.value), l);\n              if (_ && Ke(\n                p(\"upload.resuming\", {\n                  name: l.name,\n                  percent: l.size > 0 ? Math.round(_.offset / l.size * 100) : 0\n                })\n              ), await Ul(l)) continue;\n            }\n            await Rl(l);\n          }\n          await ot();\n        }\n      }\n    }\n    async function Rl(i, l) {\n      const _ = crypto.randomUUID(), F = l ?? ut(z.value);\n      pt.value = [\n        ...pt.value,\n        { id: _, file: i, path: F, totalBytes: i.size, uploadedBytes: 0, percent: 0, status: \"uploading\", cancel() {\n        } }\n      ];\n      const ee = (me) => {\n        const Ee = pt.value.findIndex((nt) => nt.id === _);\n        if (Ee === -1) return;\n        const Fe = [...pt.value];\n        Fe[Ee] = { ...Fe[Ee], ...me }, pt.value = Fe;\n      };\n      try {\n        await u.uploadMultipart(F, [i], (me) => {\n          ee({ percent: me, uploadedBytes: Math.round(me / 100 * i.size) }), a(\"upload-progress\", { uploadId: _, percent: me, done: me >= 100 });\n        }), ee({ percent: 100, uploadedBytes: i.size, status: \"done\" }), a(\"upload-progress\", { uploadId: _, percent: 100, done: !0 });\n      } catch (me) {\n        const Ee = me.message;\n        ee({ status: \"error\", error: Ee }), Ke(p(\"upload.failed\", { name: i.name })), a(\"error\", {\n          message: Ee,\n          context: { op: \"upload\", file: i.name }\n        });\n      }\n    }\n    async function Ul(i, l) {\n      const _ = crypto.randomUUID();\n      let F = !1;\n      const ee = (Ee) => {\n        if (!F) {\n          pt.value = [...pt.value, { ...Ee, id: _ }], F = !0;\n          return;\n        }\n        const Fe = pt.value.findIndex((nt) => nt.id === _);\n        if (Fe !== -1) {\n          const nt = [...pt.value];\n          nt[Fe] = { ...Ee, id: _ }, pt.value = nt;\n        }\n      }, me = l ?? ut(z.value);\n      try {\n        return await B.uploadFile({\n          path: me,\n          file: i,\n          onProgress: (Ee) => {\n            !F && Ee.status !== \"uploading\" && Ee.uploadedBytes <= 0 || (ee(Ee), a(\"upload-progress\", {\n              uploadId: Ee.uploadId ?? _,\n              percent: Ee.percent,\n              done: Ee.status === \"done\"\n            }));\n          }\n        }), !0;\n      } catch (Ee) {\n        if (kv(Ee))\n          return F && (pt.value = pt.value.filter((nt) => nt.id !== _)), !1;\n        const Fe = Ee.message;\n        return F || (pt.value = [\n          ...pt.value,\n          {\n            id: _,\n            file: i,\n            path: me,\n            totalBytes: i.size,\n            uploadedBytes: 0,\n            percent: 0,\n            status: \"error\",\n            error: Fe,\n            cancel() {\n            }\n          }\n        ], F = !0), Ke(p(\"upload.failed\", { name: i.name })), a(\"error\", { message: Fe, context: { op: \"upload\", file: i.name } }), !0;\n      }\n    }\n    const Gn = m(0), Xn = m(!1);\n    function $r(i) {\n      const l = i.dataTransfer;\n      if (!l || l.types && l.types.includes(CD) || Co()) return !1;\n      if (l.items && l.items.length > 0) {\n        let _ = !1;\n        for (const F of Array.from(l.items))\n          if (F.kind === \"file\") {\n            _ = !0;\n            break;\n          }\n        return _;\n      }\n      return l.types ? l.types.includes(\"Files\") : !1;\n    }\n    function ap(i) {\n      $r(i) && (i.preventDefault(), Gn.value++, Xn.value = !0);\n    }\n    function op() {\n      Gn.value = Math.max(0, Gn.value - 1), Gn.value === 0 && (Xn.value = !1);\n    }\n    function sp(i) {\n      if (vn(i)) {\n        i.preventDefault();\n        return;\n      }\n      $r(i) && i.preventDefault();\n    }\n    function rp(i) {\n      var _;\n      if (vn(i)) {\n        const F = mi(i) || \"\", ee = ut(z.value), me = Cs(i);\n        if (me && F && ee && F !== ee && !pe.value && xn.value) {\n          i.preventDefault(), Gn.value = 0, Xn.value = !1, Ba(), io(), Aa(me.map((Ee) => Ee.path), ee, F);\n          return;\n        }\n      }\n      if (vn(i)) {\n        Gn.value = 0, Xn.value = !1, Ba(), io();\n        return;\n      }\n      if (!$r(i)) {\n        Gn.value = 0, Xn.value = !1;\n        return;\n      }\n      if (i.preventDefault(), Gn.value = 0, Xn.value = !1, !xn.value) {\n        Ke(v.value === \"en\" ? \"Read-only here\" : \"Burada yazma yetkiniz yok\");\n        return;\n      }\n      const l = (_ = i.dataTransfer) != null && _.files ? Array.from(i.dataTransfer.files) : [];\n      l.length !== 0 && Kl(l);\n    }\n    function Vl(i) {\n      var l;\n      (l = i.dataTransfer) != null && l.types.includes(\"Files\") && i.preventDefault();\n    }\n    function jl(i) {\n      const l = Kt.value, _ = i.target;\n      l && _ && !l.contains(_) && i.preventDefault();\n    }\n    dt(() => {\n      var i, l;\n      window.addEventListener(\"dragover\", Vl), window.addEventListener(\"drop\", jl), window.addEventListener(\"pointerup\", ts), window.addEventListener(\"blur\", ts), (l = (i = fa.value) == null ? void 0 : i.onProgress) == null || l.call(i, (_) => {\n        const F = !!(_ != null && _.dropped);\n        if ((_ == null ? void 0 : _.error) === \"drop_not_found\") {\n          Ke(p(\"dragout.not_found\"));\n          return;\n        }\n        if (_ != null && _.error) {\n          (F || !ns) && Ke(_.error);\n          return;\n        }\n        if (F) {\n          Ke(_ != null && _.finished ? p(\"dragout.done\") : p(\"dragout.downloading\"));\n          return;\n        }\n        ns || !(_ != null && _.finished) && (_ == null ? void 0 : _.done) === 0 && Ke(p(\"dragout.preparing\"));\n      });\n    });\n    function ts() {\n      Co() && Ba();\n    }\n    function io() {\n      var i;\n      (i = fa.value) != null && i.cancel && Promise.resolve(fa.value.cancel()).catch(() => {\n      });\n    }\n    it(() => {\n      window.removeEventListener(\"dragover\", Vl), window.removeEventListener(\"drop\", jl), window.removeEventListener(\"hashchange\", Dl), window.removeEventListener(\"pointerup\", ts), window.removeEventListener(\"blur\", ts);\n    });\n    const xr = k(() => V.value.mode !== \"cut\" ? /* @__PURE__ */ new Set() : new Set(V.value.items.map((i) => i.path)));\n    function Yl(i, l, _) {\n      (i === \"split\" ? Ht : Ae).click(l.path, _);\n    }\n    function Wl(i, l, _) {\n      var Fe;\n      if (!_.dataTransfer) return;\n      if (l.basename === \".trash\") {\n        _.preventDefault();\n        return;\n      }\n      const F = i === \"split\" ? Ht.nodes.value : Ae.nodes.value, ee = ut(i === \"split\" ? ((Fe = bt.value) == null ? void 0 : Fe.getPath()) ?? \"\" : z.value), Ee = (F.some((nt) => nt.path === l.path) ? F : [l]).filter((nt) => !xr.value.has(nt.path)).filter((nt) => nt.basename !== \".trash\").map((nt) => ({ path: nt.path, basename: nt.basename, type: nt.type }));\n      if (Ee.length !== 0) {\n        if (fa.value) {\n          _.preventDefault(), k_(Ee, ee), Promise.resolve(fa.value.start(Ee)).catch((nt) => {\n            Ba(), io(), a(\"error\", { message: nt.message, context: { op: \"drag-out\" } });\n          }), Xl(Ee);\n          return;\n        }\n        if (Ee.length === 1 && Ee[0] && __(r.config.auth)) {\n          const nt = $_(Ee[0], u.downloadUrl(Ee[0].path), l.mime_type);\n          nt && _.dataTransfer.setData(\"DownloadURL\", nt);\n        }\n      }\n    }\n    const fa = k(() => r.config.dragOut ?? null), ql = m(\"\"), Sr = m(!1);\n    let ns = !1, Gl;\n    He(\n      () => Ae.selected.value,\n      () => {\n        if (!fa.value) return;\n        clearTimeout(Gl);\n        const i = Ae.nodes.value;\n        if (i.length === 0 || i.length > MD || i.some((F) => F.type !== \"file\") || i.reduce((F, ee) => F + (ee.size ?? 0), 0) > TD) return;\n        const _ = i.map((F) => ({ path: F.path, basename: F.basename, type: F.type }));\n        Gl = setTimeout(() => void Xl(_, !0), 400);\n      },\n      { deep: !0 }\n    );\n    async function Xl(i, l = !1) {\n      const _ = fa.value;\n      if (!_ || Sr.value) return;\n      const F = x_(i);\n      if (F !== ql.value) {\n        Sr.value = !0, ns = l;\n        try {\n          const ee = await _.prepare(i);\n          ee != null && ee.ready ? (ql.value = F, l || Ke(p(\"dragout.ready\"))) : ee != null && ee.error && !l && Ke(ee.error);\n        } catch (ee) {\n          a(\"error\", { message: ee.message, context: { op: \"drag-out-prepare\" } });\n        } finally {\n          Sr.value = !1, ns = !1;\n        }\n      }\n    }\n    async function ip(i, l, _, F) {\n      try {\n        const ee = F ?? ut(z.value), me = await El(i, l);\n        if (u.endpoints.moveAsync) {\n          const { op: Ee } = await u.moveAsync(i, l, ee);\n          zl(Ee.id, i, l, ee, me), U.register(Ee), Ke(p(me ? \"toast.move_kept_both\" : \"split.move_queued\"));\n        } else if (await u.move(ee, i, l), await ot(), me)\n          Ke(p(\"toast.move_kept_both\"));\n        else {\n          const Ee = i.map((Fe) => Ta(l, Wo(Fe)));\n          Ro(p(\"toast.moved\"), async () => {\n            await u.move(l, Ee, ee);\n          });\n        }\n        Ae.clear();\n      } catch (ee) {\n        a(\"error\", { message: ee.message, context: { op: _, targetDir: l } });\n      }\n    }\n    async function Jl(i, l) {\n      if (i.type !== \"dir\") return;\n      const _ = Cs(l);\n      if (!_ || _.length === 0) return;\n      Ba(), io();\n      const F = i.path, ee = _.map((me) => me.path).filter((me) => me && me !== F && !F.startsWith(me + \"/\") && !vr(qo(me), F));\n      ee.length !== 0 && await Aa(ee, F, kc(l));\n    }\n    async function Zl(i, l) {\n      const _ = Cs(l);\n      if (!_ || _.length === 0) return;\n      Ba(), io();\n      const F = i, ee = _.map((me) => me.path).filter((me) => me && me !== F && !F.startsWith(me + \"/\") && !vr(qo(me), F));\n      ee.length !== 0 && await Aa(ee, F, kc(l));\n    }\n    function lp(i) {\n      i.cancel();\n    }\n    function cp(i) {\n      pt.value = pt.value.filter((l) => l.id !== i.id);\n    }\n    function up(i) {\n      if (Et.value && !i) {\n        ot(\"\");\n        return;\n      }\n      if (Et.value) {\n        ot(Ca(i));\n        return;\n      }\n      ot(ca(i));\n    }\n    async function as(i) {\n      try {\n        await navigator.clipboard.writeText(i), Ke(p(\"breadcrumb.copy_path\"));\n      } catch {\n      }\n    }\n    function Rt(i = {}) {\n      return u.authHeaders({ ...i });\n    }\n    function Ql(i) {\n      if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(i)) return i;\n      const l = r.config.apiBase;\n      if (!l) return i;\n      try {\n        return new URL(i, l.endsWith(\"/\") ? l : `${l}/`).toString();\n      } catch {\n        return i;\n      }\n    }\n    const ec = k(\n      () => Ql(r.config.viewerBaseUrl || ED)\n    ), os = m(!1), { themeId: ss, setTheme: dp } = PC(), { themeMode: Cr, setThemeMode: fp } = OC(), It = k(\n      () => Cr.value === \"host\" ? r.config.theme || \"auto\" : Cr.value\n    ), ln = typeof window < \"u\" && window.matchMedia ? window.matchMedia(\"(prefers-color-scheme: dark)\") : void 0, tc = m(!!(ln != null && ln.matches));\n    function nc(i) {\n      tc.value = i.matches;\n    }\n    dt(() => {\n      var i;\n      return (i = ln == null ? void 0 : ln.addEventListener) == null ? void 0 : i.call(ln, \"change\", nc);\n    }), it(() => {\n      var i;\n      return (i = ln == null ? void 0 : ln.removeEventListener) == null ? void 0 : i.call(ln, \"change\", nc);\n    });\n    const Tr = k(\n      () => It.value === \"dark\" || It.value !== \"light\" && tc.value\n    );\n    He(\n      [ss, Tr, Kt],\n      () => {\n        HC(ss.value), Kt.value && BC(Kt.value, ss.value, Tr.value);\n      },\n      { immediate: !0 }\n    );\n    const lo = m(!1), Jn = m(!1), Bn = m(null);\n    function pp() {\n      if (Jn.value) {\n        Jn.value = !1;\n        return;\n      }\n      const i = Ae.nodes.value, l = i.length === 1 ? i[0] : null;\n      if (!(!l || l.type !== \"file\" || l.basename === \".trash\")) {\n        if (Zt.value) {\n          if (!Mn.value) return;\n          (async () => {\n            try {\n              await Ur(l);\n            } catch {\n              Ke(p(\"e2e.decrypt_failed\"));\n              return;\n            }\n            Bn.value = l, Jn.value = !0, ft(l);\n          })();\n          return;\n        }\n        Bn.value = l, Jn.value = !0, ft(l);\n      }\n    }\n    function vp(i) {\n      const l = O.value.filter((me) => me.type === \"file\");\n      if (l.length === 0) return;\n      const _ = Bn.value;\n      let F = _ ? l.findIndex((me) => me.path === _.path) : -1;\n      F = F === -1 ? i > 0 ? 0 : l.length - 1 : (F + i + l.length) % l.length;\n      const ee = l[F];\n      !ee || ee.path === (_ == null ? void 0 : _.path) || Ae.click(ee.path);\n    }\n    function hp() {\n      const i = Bn.value;\n      Jn.value = !1, i && dn(i);\n    }\n    He(\n      () => Ae.nodes.value,\n      (i) => {\n        var _, F;\n        if (!Jn.value) return;\n        const l = i.length === 1 && i[0].type === \"file\" ? i[0] : null;\n        if (l && l.path !== ((_ = Bn.value) == null ? void 0 : _.path) && Mn.value) {\n          (async () => {\n            try {\n              await Ur(l);\n            } catch {\n            }\n            Bn.value = l, ft(l);\n          })();\n          return;\n        }\n        l && l.path !== ((F = Bn.value) == null ? void 0 : F.path) && (Bn.value = l, ft(l));\n      }\n    );\n    const Mr = c5();\n    function mp(i) {\n      pt.value = pt.value.filter((F) => F.id !== i.id);\n      const l = i.file, _ = i.path || ut(z.value);\n      (async () => {\n        if (B.shouldChunk(l) && await Ul(l, _)) {\n          await ot();\n          return;\n        }\n        await Rl(l, _), await ot();\n      })();\n    }\n    const rs = m(!1);\n    let Er;\n    function yp() {\n      try {\n        return localStorage.getItem(Bu) === \"1\";\n      } catch {\n        return !0;\n      }\n    }\n    function zr() {\n      rs.value = !0;\n    }\n    function bp() {\n      var i;\n      rs.value = !1;\n      try {\n        localStorage.setItem(Bu, \"1\");\n      } catch {\n      }\n      (i = Kt.value) == null || i.focus();\n    }\n    function ac() {\n      zr();\n    }\n    dt(() => {\n      var i;\n      (i = Kt.value) == null || i.addEventListener(\"fe:tour-restart\", ac), yp() || (Er = setTimeout(() => {\n        rs.value || zr();\n      }, 900));\n    }), it(() => {\n      var i;\n      Er && clearTimeout(Er), (i = Kt.value) == null || i.removeEventListener(\"fe:tour-restart\", ac);\n    });\n    function gp() {\n      return Go() === \"none\" ? null : E ? `${Iu}:${E}` : Iu;\n    }\n    const Lt = t8({ storageKey: gp() }), kp = Lt.restore(), Ar = Lt.activeId, In = k(() => {\n      var i;\n      return ((i = Lt.activeTab.value) == null ? void 0 : i.split) ?? null;\n    });\n    function _p(i) {\n      const l = (i || \"\").replace(/^\\/+|\\/+$/g, \"\"), _ = Fs(l.split(\"/\").pop() || l, p);\n      return _ || (l ? l.split(\"/\").pop() || l : Et.value ? p(\"breadcrumb.root\") : T.value || p(\"breadcrumb.root\"));\n    }\n    const oc = k(\n      () => Lt.tabs.value.map((i) => ({ id: i.id, label: _p(i.path), split: !!i.split }))\n    ), sc = k(\n      () => (\n        /* gezinti:g1 — the simple profile has no tab strip at all, not even once a\n           second tab exists: tabs were the first thing #14 named as power-user\n           chrome. The tab STATE is untouched, so switching the profile back brings\n           the strip and its tabs straight back. */\n        !Ja.value && (Lt.hasMultiple.value || r.config.tabStrip !== \"auto\" && oc.value.length > 0)\n      )\n    );\n    He(z, (i) => Lt.syncActive({ path: i })), He(oe, (i) => Lt.syncActive({ viewMode: i })), dt(() => {\n      kp || Lt.seed(z.value ?? \"\", oe.value);\n    });\n    function is(i) {\n      !Ay() && i.viewMode && i.viewMode !== oe.value && (oe.value = i.viewMode);\n      const l = () => Ne(W.value);\n      if (i.path === \".trash\") {\n        Yn().then(l, l);\n        return;\n      }\n      ot(i.path).then(l, l);\n    }\n    function wp(i) {\n      const l = Lt.activate(i);\n      l && is(l);\n    }\n    function Pr() {\n      Lt.openTab(z.value ?? \"\", { viewMode: oe.value, background: !1 });\n    }\n    function rc(i) {\n      const l = Lt.closeTab(i);\n      l && is(l);\n    }\n    function $p() {\n      const i = Lt.step(1);\n      i && is(i);\n    }\n    function xp() {\n      const i = Lt.step(-1);\n      i && is(i);\n    }\n    function ic(i) {\n      if (i.type !== \"dir\" || i.basename === \".trash\") return;\n      const l = Et.value ? Ca(i.path) : ca(i.path);\n      Lt.openTab(l, { viewMode: oe.value, background: !0 });\n    }\n    function lc(i) {\n      if (i.button !== 1) return;\n      const l = i.target, _ = l && typeof l.closest == \"function\" ? l.closest(\"[data-fe-path]\") : null, F = _ == null ? void 0 : _.getAttribute(\"data-fe-path\");\n      if (!F) return;\n      const ee = O.value.find((me) => me.path === F);\n      !ee || ee.type !== \"dir\" || ee.basename === \".trash\" || (i.preventDefault(), ic(ee));\n    }\n    function cc(i) {\n      if (i.button !== 1) return;\n      const l = i.target;\n      l && typeof l.closest == \"function\" && l.closest(\"[data-fe-path]\") && i.preventDefault();\n    }\n    dt(() => {\n      var i, l;\n      (i = Kt.value) == null || i.addEventListener(\"auxclick\", lc), (l = Kt.value) == null || l.addEventListener(\"mousedown\", cc);\n    }), it(() => {\n      var i, l;\n      (i = Kt.value) == null || i.removeEventListener(\"auxclick\", lc), (l = Kt.value) == null || l.removeEventListener(\"mousedown\", cc);\n    });\n    const Sp = m(null), bt = m(null), ls = m([]), Ht = Oc(\n      () => {\n        var i;\n        return ls.value.length ? ls.value : ((i = bt.value) == null ? void 0 : i.visibleNodes()) ?? [];\n      }\n    ), co = m({ ...na }), Cp = k(() => {\n      var ee;\n      if (!Z.value) return \"\";\n      const i = String(((ee = bt.value) == null ? void 0 : ee.getPath()) ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      if (!i) return \"\";\n      const [l, ..._] = i.split(\"/\"), F = (r.config.storages ?? []).find((me) => me.name === l);\n      return uu((F == null ? void 0 : F.uid) || l, _.join(\"/\"));\n    }), Tp = k(\n      () => sc.value || sl.value || uo.value\n    ), Lr = k(() => w.value === \"home\" ? \"home\" : x.value && O.value.length === 0 ? \"\" : N.value ? \"notfound\" : P.value && O.value.length === 0 ? \"\" : Ir.value ? \"locked\" : \"\"), uo = k(() => !rn.value && !Ja.value), za = k(\n      () => !!In.value && uo.value\n      /* gezinti:g1 */\n    );\n    function uc() {\n      if (In.value) {\n        Lt.setSplit(null), Tn.value = \"main\";\n        return;\n      }\n      uo.value && Lt.setSplit({ path: z.value ?? \"\", viewMode: oe.value });\n    }\n    function Mp() {\n      Lt.setSplit(null), Tn.value = \"main\";\n    }\n    function Ep(i) {\n      Lt.setSplit({ ...In.value ?? {}, path: i }), $o(co.value) && (co.value = { ...na }), Ht.clear(), ls.value = [];\n    }\n    function zp(i, l) {\n      var _;\n      if (l.type === \"dir\" && l.basename !== \".trash\") {\n        (_ = bt.value) == null || _.loadFolder(\n          /* A multi-storage drive row's path is already the wire form for that\n             storage's root; a real row needs converting. The predicate comes from\n             `lib/fileIcons`, which is that concept's one home. */\n          jn(l) === \"storage\" ? l.path : Br(l.path)\n        );\n        return;\n      }\n      dn(l);\n    }\n    function Ap() {\n      Tn.value = \"main\", Yn();\n    }\n    const dc = k(() => {\n      var i;\n      return ((i = In.value) == null ? void 0 : i.viewMode) ?? oe.value;\n    });\n    function fc(i) {\n      In.value && Lt.setSplit({ ...In.value, viewMode: i });\n    }\n    const Dr = k(\n      () => zt.value ? dc.value : oe.value\n    );\n    function pc(i) {\n      zt.value ? fc(i) : oe.value = i;\n    }\n    const Tn = m(\"main\");\n    function Pp() {\n      Tn.value = \"main\";\n    }\n    He(za, (i) => {\n      i || (Tn.value = \"main\");\n    });\n    const zt = k(() => Tn.value === \"split\" && za.value), Lp = k(() => za.value && Tn.value === \"main\"), vc = k(() => zt.value ? \"split\" : \"main\"), fo = m(null), hc = k(\n      () => {\n        var i;\n        return zt.value ? ((i = bt.value) == null ? void 0 : i.getPath()) ?? \"\" : z.value ?? \"\";\n      }\n    );\n    function Dp(i) {\n      var l;\n      return i === \"split\" ? ((l = bt.value) == null ? void 0 : l.getPath()) ?? \"\" : z.value ?? \"\";\n    }\n    function Op(i) {\n      var l;\n      return i === \"split\" ? ((l = bt.value) == null ? void 0 : l.rowPaths()) ?? [] : O.value.map((_) => _.path);\n    }\n    He(\n      () => Jt(),\n      (i) => {\n        i.length && (fo.value = {\n          nodes: i,\n          pane: vc.value,\n          path: hc.value\n        });\n      },\n      { deep: !1 }\n    );\n    const Or = k(() => {\n      const i = fo.value;\n      if (!i || !i.nodes.length || i.pane === \"split\" && !za.value) return !1;\n      if (Dp(i.pane) !== i.path) return !0;\n      const l = new Set(Op(i.pane));\n      return i.nodes.some((_) => l.has(_.path));\n    });\n    He(Or, (i) => {\n      i || (fo.value = null);\n    });\n    const Bp = k(() => Jt().length === 0 && Or.value), Ip = k(() => {\n      var l;\n      const i = Jt();\n      return i.length ? i : Or.value ? ((l = fo.value) == null ? void 0 : l.nodes) ?? [] : [];\n    }), Hp = k(\n      () => {\n        var i;\n        return Bp.value ? bl(((i = fo.value) == null ? void 0 : i.path) ?? \"\") : \"\";\n      }\n    ), Fp = k(() => bl(hc.value)), Np = k(\n      () => {\n        var i;\n        return zt.value ? ((i = bt.value) == null ? void 0 : i.rowCount()) ?? 0 : O.value.length;\n      }\n    ), Kp = k(\n      () => {\n        var i;\n        return zt.value ? ((i = bt.value) == null ? void 0 : i.dirPerm()) ?? \"\" : J.value;\n      }\n    );\n    function Br(i) {\n      return Et.value ? Ca(i) : ca(i);\n    }\n    function mc(i) {\n      const l = String(i ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n      return $ && (!l || !(l === $ || l.startsWith($ + \"/\"))) ? $ : l;\n    }\n    function yc() {\n      var l;\n      const i = Ht.nodes.value;\n      i.length !== 0 && (V.value = { mode: \"cut\", items: i, sourcePath: ((l = bt.value) == null ? void 0 : l.getPath()) ?? \"\" }, Ke(p(\"toast.cut\")));\n    }\n    function bc() {\n      var l;\n      const i = Ht.nodes.value;\n      i.length !== 0 && (V.value = { mode: \"copy\", items: i, sourcePath: ((l = bt.value) == null ? void 0 : l.getPath()) ?? \"\" }, Ke(p(\"toast.copied\")));\n    }\n    async function gc() {\n      const i = V.value, l = bt.value;\n      if (!i.mode || i.items.length === 0 || !l) return;\n      const _ = ut(l.getPath() ?? \"\"), F = ut(i.sourcePath || \"\") || void 0;\n      if (i.mode === \"cut\" && F === _) {\n        Ke(p(\"toast.same_folder_cut\"));\n        return;\n      }\n      await Aa(i.items.map((ee) => ee.path), _, F, i.mode === \"copy\" ? \"copy\" : \"move\"), V.value = { mode: null, items: [], sourcePath: null };\n    }\n    function kc(i) {\n      return mi(i);\n    }\n    async function Aa(i, l, _, F = \"auto\") {\n      var Ee;\n      const ee = i.filter(\n        (Fe) => Fe && Fe !== l && !l.startsWith(Fe + \"/\") && !vr(qo(Fe), l)\n      );\n      if (ee.length === 0 || !l) return;\n      const me = Au(ee, l, F);\n      if (me.kind === \"copy\")\n        try {\n          const { op: Fe } = await u.copy(ee, l);\n          U.register(Fe), Ke(me.cross ? p(\"split.cross_copy\") : p(\"split.copy_queued\"));\n        } catch (Fe) {\n          a(\"error\", { message: Fe.message, context: { op: \"transfer\", targetWire: l } }), Ke(Fe.message);\n          return;\n        }\n      else\n        me.cross && Ke(p(\"split.cross_move\")), await ip(ee, l, \"move-transfer\", _);\n      (Ee = bt.value) == null || Ee.reload();\n    }\n    function _c(i) {\n      Aa(i.sources, i.targetWire, i.originWire);\n    }\n    const pa = by(), Pa = m(0), yt = m(\"\"), po = /* @__PURE__ */ new Map(), Zt = k(() => !!yt.value && !pe.value), Mn = k(() => (Pa.value, Zt.value && pa.has(yt.value))), Ir = k(() => (Pa.value, Zt.value && !pa.has(yt.value))), Zn = m(\"\"), La = m(!1), Da = m(\"\"), cs = m(!1), Hr = m(!1), Yt = m(null), us = m(!1), Fr = m(!1), Qn = m(null), ds = m(!1), fs = m(\"\"), Nr = m(\"created\"), ps = m(\"\"), vs = m(!1), vo = m(\"\"), ho = m(!1), va = m(!1), mo = m(\"unlock\"), Hn = m(\"\"), En = m(!1), zn = m(\"\"), Kr = k(\n      () => {\n        var i, l;\n        return ((l = (i = R.value) == null ? void 0 : i.e2e_escrow) == null ? void 0 : l.public_key) || null;\n      }\n    ), Fn = k(\n      () => {\n        var i, l;\n        return ((l = (i = R.value) == null ? void 0 : i.e2e_escrow) == null ? void 0 : l.kid) || null;\n      }\n    );\n    function Rr() {\n      return pa.get(yt.value) ?? null;\n    }\n    function wc() {\n      for (const i of po.values()) URL.revokeObjectURL(i);\n      po.clear();\n    }\n    it(wc);\n    async function Rp() {\n      if (!(!Zn.value || La.value || !yt.value)) {\n        La.value = !0, Da.value = \"\";\n        try {\n          let i = \"\";\n          try {\n            const { blob: F, url: ee } = await u.fetchBlob(Ta(yt.value, ha), { fresh: !0 });\n            URL.revokeObjectURL(ee), i = await F.text();\n          } catch {\n            Da.value = p(\"e2e.unlock.marker_missing\");\n            return;\n          }\n          const l = Qc(i);\n          if (!l) {\n            Da.value = p(\"e2e.unlock.marker_missing\");\n            return;\n          }\n          Yt.value = l;\n          const _ = await vy(l, Zn.value);\n          if (!_) {\n            Da.value = p(\"e2e.unlock.wrong\");\n            return;\n          }\n          pa.set(yt.value, _), Pa.value++, l.v === 1 ? (vo.value = Zn.value, vs.value = !0) : Zc(l, Fn.value) === \"offer\" && (Hn.value = Zn.value, mo.value = \"unlock\", zn.value = \"\", va.value = !0), Zn.value = \"\";\n        } finally {\n          La.value = !1;\n        }\n      }\n    }\n    function Up() {\n      yt.value && (pa.lock(yt.value), Pa.value++, wc(), Ke(p(\"e2e.locked_toast\")));\n    }\n    const Vp = {\n      txt: \"text/plain\",\n      md: \"text/markdown\",\n      log: \"text/plain\",\n      csv: \"text/csv\",\n      json: \"application/json\",\n      xml: \"application/xml\",\n      html: \"text/html\",\n      jpg: \"image/jpeg\",\n      jpeg: \"image/jpeg\",\n      png: \"image/png\",\n      gif: \"image/gif\",\n      webp: \"image/webp\",\n      bmp: \"image/bmp\",\n      avif: \"image/avif\",\n      svg: \"image/svg+xml\",\n      pdf: \"application/pdf\",\n      mp4: \"video/mp4\",\n      webm: \"video/webm\",\n      mov: \"video/quicktime\",\n      m4v: \"video/mp4\",\n      mp3: \"audio/mpeg\",\n      wav: \"audio/wav\",\n      ogg: \"audio/ogg\",\n      flac: \"audio/flac\",\n      m4a: \"audio/mp4\",\n      aac: \"audio/aac\",\n      opus: \"audio/opus\"\n    };\n    function $c(i) {\n      const l = (i.extension || \"\").toLowerCase();\n      return Vp[l] || \"application/octet-stream\";\n    }\n    async function Ur(i) {\n      const l = po.get(i.path);\n      if (l) return l;\n      const _ = Rr();\n      if (!_) return null;\n      const F = await u.fetchArrayBuffer(i.path);\n      if (!di(F)) return null;\n      const ee = await eu(_, F), me = URL.createObjectURL(new Blob([ee], { type: $c(i) }));\n      return po.set(i.path, me), me;\n    }\n    function hs(i) {\n      return po.get(i) ?? u.previewUrl(i);\n    }\n    async function Vr(i) {\n      try {\n        await Ur(i);\n      } catch {\n        Ke(p(\"e2e.decrypt_failed\"));\n        return;\n      }\n      mn.value = \"view\", nn.value = i, St.value = !0, a(\"file-opened\", { path: i.path, basename: i.basename }), ft(i);\n    }\n    async function jp(i) {\n      try {\n        const l = await u.fetchArrayBuffer(i.path), _ = Rr();\n        let F = l;\n        if (di(l)) {\n          if (!_) throw new Error(\"locked\");\n          F = await eu(_, l);\n        }\n        const ee = URL.createObjectURL(new Blob([F], { type: $c(i) })), me = document.createElement(\"a\");\n        me.href = ee, me.download = i.basename, document.body.appendChild(me), me.click(), me.remove(), setTimeout(() => URL.revokeObjectURL(ee), 3e4);\n      } catch {\n        Ke(p(\"e2e.download.failed\"));\n      }\n    }\n    async function Yp(i) {\n      const l = Rr();\n      if (!l) return [];\n      const _ = [];\n      for (const F of i)\n        if (F.name !== ha) {\n          if (F.size > ld) {\n            Ke(p(\"e2e.upload.too_big\"));\n            continue;\n          }\n          try {\n            const ee = await yy(l, await F.arrayBuffer());\n            _.push(new File([ee], F.name, { type: \"application/octet-stream\" }));\n          } catch (ee) {\n            a(\"error\", { message: ee.message, context: { op: \"e2e-encrypt\", file: F.name } });\n          }\n        }\n      return _;\n    }\n    async function Wp(i) {\n      if (Zt.value) {\n        Ke(p(\"e2e.create.nested\"));\n        return;\n      }\n      Hr.value = !0;\n      try {\n        const l = ut(z.value);\n        await u.newFolder(l, i.name);\n        const { marker: _, fmk: F, recoveryKey: ee } = await sy(i.password, {\n          escrowPublicKey: Kr.value\n        }), me = new File([JSON.stringify(_)], ha, {\n          type: \"application/json\"\n        }), Ee = Ta(l, i.name);\n        await u.uploadMultipart(Ee, [me]), pa.set(Ee, F), Pa.value++, cs.value = !1, fs.value = ee, ps.value = i.name, Nr.value = \"created\", ds.value = !0, await ot();\n      } catch (l) {\n        a(\"error\", { message: l.message, context: { op: \"e2e-create\" } }), Ke(p(\"e2e.create.failed\"));\n      } finally {\n        Hr.value = !1;\n      }\n    }\n    async function qp(i) {\n      if (!(!Yt.value || !yt.value)) {\n        Fr.value = !0, Qn.value = null;\n        try {\n          let l = null;\n          if (i.mode === \"recovery\") {\n            if (l = await hy(Yt.value, i.value), !l) {\n              Qn.value = p(\"e2e.recover.wrong_recovery\");\n              return;\n            }\n          } else {\n            let _;\n            try {\n              _ = await ay(i.value);\n            } catch {\n              Qn.value = p(\"e2e.recover.bad_escrow_key\");\n              return;\n            }\n            if (l = await my(Yt.value, _), !l) {\n              Qn.value = p(\"e2e.recover.wrong_escrow\");\n              return;\n            }\n            try {\n              const F = await u.e2eEscrowChallenge(yt.value), ee = new Uint8Array(\n                await crypto.subtle.decrypt(\n                  { name: \"RSA-OAEP\" },\n                  _,\n                  On(F.challenge).buffer\n                )\n              );\n              await u.e2eEscrowUsed({\n                path: yt.value,\n                id: F.id,\n                nonce: Xa(ee)\n              });\n            } catch (F) {\n              Qn.value = p(\"e2e.recover.notify_failed\"), a(\"error\", {\n                message: F.message,\n                context: { op: \"e2e-escrow-notify\" }\n              });\n              return;\n            }\n          }\n          pa.set(yt.value, l), Pa.value++, us.value = !1, Ke(\n            i.mode === \"escrow\" ? p(\"e2e.recover.escrow_done\") : p(\"e2e.recover.recovery_done\")\n          );\n        } catch (l) {\n          Qn.value = l.message;\n        } finally {\n          Fr.value = !1;\n        }\n      }\n    }\n    async function Gp() {\n      if (!Yt.value && yt.value)\n        try {\n          const { blob: i, url: l } = await u.fetchBlob(Ta(yt.value, ha), { fresh: !0 });\n          URL.revokeObjectURL(l), Yt.value = Qc(await i.text());\n        } catch {\n          Yt.value = null;\n        }\n      Qn.value = null, us.value = !0;\n    }\n    async function Xp() {\n      if (!(!Yt.value || !yt.value || !vo.value)) {\n        ho.value = !0;\n        try {\n          const i = await ry(Yt.value, vo.value, {\n            escrowPublicKey: Kr.value\n          }), l = new File([JSON.stringify(i.marker)], ha, {\n            type: \"application/json\"\n          });\n          await u.uploadMultipart(yt.value, [l]), Yt.value = i.marker, vs.value = !1, vo.value = \"\", fs.value = i.recoveryKey, ps.value = Wo(yt.value), Nr.value = \"upgraded\", ds.value = !0;\n        } catch (i) {\n          a(\"error\", { message: i.message, context: { op: \"e2e-upgrade\" } }), Ke(p(\"e2e.upgrade.failed\"));\n        } finally {\n          ho.value = !1;\n        }\n      }\n    }\n    const Jp = k(() => Zc(Yt.value, Fn.value));\n    function Zp() {\n      mo.value = \"manual\", Hn.value = \"\", zn.value = \"\", va.value = !0;\n    }\n    async function xc(i) {\n      const l = new File([JSON.stringify(i)], ha, { type: \"application/json\" });\n      await u.uploadMultipart(yt.value, [l]), Yt.value = i;\n    }\n    async function Sc() {\n      const i = Yt.value, l = Kr.value;\n      if (!(!i || !l || !yt.value || En.value)) {\n        if (!Hn.value) {\n          zn.value = p(\"e2e.escrowoffer.password_required\");\n          return;\n        }\n        En.value = !0, zn.value = \"\";\n        try {\n          const _ = await iy(i, Hn.value, l);\n          await xc(_), va.value = !1, Hn.value = \"\", Ke(p(\"e2e.escrowoffer.done\"));\n        } catch (_) {\n          (_ == null ? void 0 : _.name) === \"E2eDecryptError\" ? zn.value = p(\"e2e.escrowoffer.wrong_password\") : (zn.value = p(\"e2e.escrowoffer.failed\"), a(\"error\", { message: _.message, context: { op: \"e2e-escrow-offer\" } }));\n        } finally {\n          En.value = !1;\n        }\n      }\n    }\n    async function Qp() {\n      const i = Yt.value;\n      if (!(!i || !yt.value || En.value)) {\n        En.value = !0;\n        try {\n          await xc(ly(i, (/* @__PURE__ */ new Date()).toISOString())), va.value = !1, Hn.value = \"\", Ke(p(\"e2e.escrowoffer.declined_toast\"));\n        } catch (l) {\n          zn.value = p(\"e2e.escrowoffer.decline_failed\"), a(\"error\", { message: l.message, context: { op: \"e2e-escrow-decline\" } });\n        } finally {\n          En.value = !1;\n        }\n      }\n    }\n    function ev() {\n      va.value = !1, Hn.value = \"\", zn.value = \"\";\n    }\n    function tv() {\n      vs.value = !1, vo.value = \"\";\n    }\n    function nv() {\n      ds.value = !1, fs.value = \"\", ps.value = \"\";\n    }\n    return (i, l) => {\n      var _, F, ee, me, Ee, Fe, nt, ct;\n      return c(), d(\"div\", {\n        ref_key: \"rootEl\",\n        ref: Kt,\n        class: we([\"fe\", {\n          \"fe--theme-light\": It.value === \"light\",\n          \"fe--theme-dark\": It.value === \"dark\",\n          \"fe--is-dragover\": Xn.value,\n          \"fe--density-compact\": ue.value === \"compact\",\n          \"fe--narrow\": rn.value\n        }]),\n        tabindex: \"-1\",\n        onDragenter: ap,\n        onDragover: sp,\n        onDragleave: op,\n        onDrop: rp,\n        onContextmenu: Ff\n      }, [\n        Ge(Km, {\n          ref_key: \"toolbarRef\",\n          ref: wl,\n          \"view-mode\": Dr.value,\n          \"search-query\": Q.value,\n          \"trash-active\": S.value,\n          actions: Rf.value,\n          \"selection-mode\": Bf.value,\n          \"selection-count\": Jt().length,\n          \"selection-pane\": vc.value,\n          \"paste-enabled\": !!V.value.mode,\n          \"convert-enabled\": !!Ot.value,\n          \"can-go-up\": L.value,\n          \"at-virtual-root\": se.value,\n          \"can-write\": xn.value,\n          locale: v.value,\n          narrow: rn.value,\n          theme: It.value,\n          \"inspector-open\": Me.value,\n          \"nav-open\": Vd.value,\n          \"nav-enabled\": Qa.value,\n          \"view-modes\": ar.value,\n          \"scope-label\": pl.value,\n          \"brand-name\": (_ = e.config.brand) == null ? void 0 : _.name,\n          \"brand-mark-url\": (F = e.config.brand) == null ? void 0 : F.markUrl,\n          \"search-escalates\": w.value === \"home\",\n          onOpenPalette: sf,\n          onToggleInspector: Oe,\n          onToggleNav: il,\n          onOpenTheme: l[0] || (l[0] = (ke) => os.value = !0),\n          \"onUpdate:viewMode\": l[1] || (l[1] = (ke) => pc(ke)),\n          \"onUpdate:searchQuery\": of,\n          onOpenAdvancedSearch: nf,\n          \"onUpdate:density\": l[2] || (l[2] = (ke) => ue.value = ke),\n          onOpenShortcutSettings: l[3] || (l[3] = (ke) => lo.value = !0),\n          onOpenTimezone: l[4] || (l[4] = (ke) => X.value = !0),\n          onNewFolder: l[5] || (l[5] = (ke) => xt.value = !0),\n          onUpload: qn,\n          onRefresh: Tl,\n          onGoUp: We,\n          onAction: yr,\n          onOpenRecents: l[6] || (l[6] = (ke) => Qe.value = !0)\n        }, fv({\n          \"header-actions\": st(() => [\n            _n(i.$slots, \"header-actions\")\n          ]),\n          _: 2\n        }, [\n          i.$slots.brand ? {\n            name: \"brand\",\n            fn: st(() => [\n              _n(i.$slots, \"brand\")\n            ]),\n            key: \"0\"\n          } : void 0\n        ]), 1032, [\"view-mode\", \"search-query\", \"trash-active\", \"actions\", \"selection-mode\", \"selection-count\", \"selection-pane\", \"paste-enabled\", \"convert-enabled\", \"can-go-up\", \"at-virtual-root\", \"can-write\", \"locale\", \"narrow\", \"theme\", \"inspector-open\", \"nav-open\", \"nav-enabled\", \"view-modes\", \"scope-label\", \"brand-name\", \"brand-mark-url\", \"search-escalates\", \"onOpenPalette\", \"onToggleInspector\", \"onToggleNav\", \"onUpdate:searchQuery\", \"onOpenAdvancedSearch\", \"onRefresh\"]),\n        o(\"div\", {\n          class: we([\n            \"fe__main\",\n            { \"fe__main--split\": za.value }\n            /* wiring:d1 */\n          ])\n        }, [\n          tr.value ? (c(), et(y_, {\n            key: 0,\n            expanded: Za.value,\n            narrow: rn.value,\n            \"active-view\": w.value,\n            \"active-tag\": be.value,\n            tags: ml.value,\n            \"tags-loaded\": lr.value,\n            \"active-storage\": T.value,\n            storages: e.config.storages ?? [],\n            \"shared-storages\": nr.value,\n            \"trash-visible\": e.config.trashVisible !== !1,\n            \"show-connections\": jd.value,\n            \"show-identity-surfaces\": eo.value,\n            \"can-write\": xn.value && !se.value && !S.value,\n            locale: v.value,\n            \"can-request-files\": xn.value && !se.value && !S.value && !w.value,\n            \"can-new-document\": un.value && !S.value && !w.value,\n            onNewDocument: l[7] || (l[7] = (ke) => jt.value = !0),\n            quota: Ho.value,\n            theme: It.value,\n            onRequestFiles: rf,\n            onToggle: il,\n            onClose: ia,\n            onOpenView: ff,\n            onOpenTag: oo,\n            onOpenStorage: yl,\n            onUpload: qn,\n            onNewFolder: l[8] || (l[8] = (ke) => xt.value = !0),\n            onOpenConnections: Yd,\n            onOpenTokens: Wd\n          }, null, 8, [\"expanded\", \"narrow\", \"active-view\", \"active-tag\", \"tags\", \"tags-loaded\", \"active-storage\", \"storages\", \"shared-storages\", \"trash-visible\", \"show-connections\", \"show-identity-surfaces\", \"can-write\", \"locale\", \"can-request-files\", \"can-new-document\", \"quota\", \"theme\", \"onRequestFiles\", \"onOpenView\"])) : g(\"\", !0),\n          rn.value && ra.value ? (c(), d(\"button\", {\n            key: 1,\n            type: \"button\",\n            class: \"fe-sidenav__scrim\",\n            title: s(p)(\"sidenav.close\"),\n            \"aria-label\": s(p)(\"sidenav.close\"),\n            onClick: ia\n          }, null, 8, uL)) : g(\"\", !0),\n          o(\"div\", dL, [\n            Tp.value ? (c(), et(T5, {\n              key: 0,\n              tabs: oc.value,\n              \"active-id\": s(Ar),\n              locale: v.value,\n              \"hide-tabs\": !sc.value,\n              \"split-enabled\": uo.value,\n              \"split-active\": !!In.value,\n              \"inspector-enabled\": sl.value,\n              \"inspector-open\": Me.value,\n              onSelect: wp,\n              onClose: rc,\n              onNew: Pr,\n              onReorder: l[9] || (l[9] = (ke, Qt) => s(Lt).move(ke, Qt)),\n              onToggleSplit: uc,\n              onToggleInspector: Oe\n            }, null, 8, [\"tabs\", \"active-id\", \"locale\", \"hide-tabs\", \"split-enabled\", \"split-active\", \"inspector-enabled\", \"inspector-open\"])) : g(\"\", !0),\n            o(\"div\", fL, [\n              Ge(Mu, {\n                \"pane-id\": \"main\",\n                ref_key: \"mainPaneRef\",\n                ref: Sp,\n                api: s(u),\n                locale: v.value,\n                theme: It.value,\n                focused: Lp.value,\n                path: z.value,\n                qualify: ut,\n                \"to-user\": Br,\n                clamp: mc,\n                \"root-path\": s(E),\n                floor: s($),\n                \"multi-root\": Et.value,\n                rows: O.value,\n                loading: x.value,\n                error: P.value,\n                order: Xd.value,\n                \"view-mode\": oe.value,\n                \"view-modes\": ar.value,\n                \"open-trigger\": r.config.openTrigger,\n                \"show-crumbs\": w.value !== \"home\",\n                \"filter-mode\": Ce.value,\n                \"find-label\": w.value === \"home\" ? s(p)(\"filter.find.home\") : \"\",\n                \"show-view-switcher\": w.value !== \"home\",\n                \"folder-key\": W.value,\n                \"show-parent-path\": !!Q.value || K.value,\n                clipped: xr.value,\n                \"extra-filters\": ao.value,\n                \"can-write\": xn.value && !S.value,\n                \"can-paste\": !!V.value.mode,\n                selected: s(Ae).selected.value,\n                filters: no.value,\n                \"thumb-src\": s(C).src,\n                \"keep-badge-for\": bn.value ? Il : void 0,\n                \"starred-ids\": je.value,\n                \"star-enabled\": eo.value,\n                \"api-base\": r.config.apiBase ?? \"\",\n                \"auth-headers\": () => Rt(),\n                \"auth-credentials\": s(u).credentialsMode(),\n                \"e2e-active\": Zt.value,\n                \"body-override\": Lr.value !== \"\",\n                onActivate: Pp,\n                onNavigate: up,\n                onOpen: dn,\n                onOpenTrash: l[14] || (l[14] = () => Yn()),\n                onClickRow: l[15] || (l[15] = (ke, Qt) => Yl(\"main\", ke, Qt)),\n                onContext: l[16] || (l[16] = (ke, Qt) => Fl(\"main\", ke, Qt)),\n                onClearSelection: l[17] || (l[17] = (ke) => s(Ae).clear()),\n                onDisplayOrder: l[18] || (l[18] = (ke) => Ie.value = ke),\n                onItemDragStart: l[19] || (l[19] = (ke, Qt) => Wl(\"main\", ke, Qt)),\n                onItemDropInto: Jl,\n                onTransfer: _c,\n                \"onUpdate:viewMode\": l[20] || (l[20] = (ke) => oe.value = ke),\n                \"onUpdate:filters\": cl,\n                onCrumbContext: Nf,\n                onCopyPath: as,\n                onCrumbDrop: Zl,\n                onNewFolder: l[21] || (l[21] = (ke) => xt.value = !0),\n                onUpload: qn,\n                onPaste: l[22] || (l[22] = (ke) => yr(\"paste\")),\n                onSelectAll: l[23] || (l[23] = (ke) => s(Ae).selectAll()),\n                onClearFilters: Jd,\n                onStarChange: Pe,\n                onRetry: ve\n              }, {\n                banners: st(() => [\n                  s(y).length || s(A) ? (c(), d(\"div\", pL, [\n                    s(y).length ? (c(), et(xh, {\n                      key: 0,\n                      users: s(y),\n                      locale: v.value\n                    }, null, 8, [\"users\", \"locale\"])) : g(\"\", !0),\n                    s(A) ? (c(), d(\"span\", {\n                      key: 1,\n                      class: \"fe-connbadge\",\n                      role: \"status\",\n                      title: s(p)(\"conn.tooltip\")\n                    }, [\n                      l[80] || (l[80] = o(\"span\", {\n                        class: \"fe-connbadge__dot\",\n                        \"aria-hidden\": \"true\"\n                      }, null, -1)),\n                      Je(\" \" + f(s(p)(\"conn.offline\")), 1)\n                    ], 8, vL)) : g(\"\", !0)\n                  ])) : g(\"\", !0),\n                  vs.value ? (c(), d(\"div\", hL, [\n                    o(\"div\", mL, [\n                      o(\"strong\", null, f(s(p)(\"e2e.upgrade.title\")), 1),\n                      o(\"p\", null, f(s(p)(\"e2e.upgrade.body\")), 1),\n                      Fn.value ? (c(), d(\"p\", yL, f(s(p)(\"e2e.upgrade.escrow_note\")), 1)) : g(\"\", !0)\n                    ]),\n                    o(\"div\", bL, [\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn\",\n                        disabled: ho.value,\n                        onClick: tv\n                      }, f(s(p)(\"e2e.upgrade.decline\")), 9, gL),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--primary\",\n                        disabled: ho.value,\n                        onClick: Xp\n                      }, f(ho.value ? s(p)(\"e2e.upgrade.busy\") : s(p)(\"e2e.upgrade.accept\")), 9, kL)\n                    ])\n                  ])) : g(\"\", !0),\n                  va.value ? (c(), d(\"div\", _L, [\n                    o(\"div\", wL, [\n                      o(\"strong\", null, f(s(p)(\"e2e.escrowoffer.title\")), 1),\n                      o(\"p\", null, f(s(p)(\"e2e.escrowoffer.body\")), 1),\n                      o(\"p\", $L, [\n                        Je(f(s(p)(\"e2e.escrowoffer.consequence\")) + \" \", 1),\n                        o(\"a\", {\n                          href: zD,\n                          target: \"_blank\",\n                          rel: \"noopener noreferrer\"\n                        }, f(s(p)(\"e2e.escrowoffer.learn_more\")), 1)\n                      ]),\n                      Fn.value ? (c(), d(\"p\", xL, [\n                        Je(f(s(p)(\"e2e.recover.escrow_kid\")) + \": \", 1),\n                        o(\"code\", null, f(Fn.value), 1)\n                      ])) : g(\"\", !0),\n                      mo.value === \"manual\" ? (c(), d(\"label\", SL, [\n                        o(\"span\", null, f(s(p)(\"e2e.escrowoffer.password_label\")), 1),\n                        Ve(o(\"input\", {\n                          \"onUpdate:modelValue\": l[10] || (l[10] = (ke) => Hn.value = ke),\n                          type: \"password\",\n                          class: \"fe-input\",\n                          autocomplete: \"current-password\",\n                          disabled: En.value,\n                          onKeyup: Ut(Sc, [\"enter\"])\n                        }, null, 40, CL), [\n                          [rt, Hn.value]\n                        ])\n                      ])) : g(\"\", !0),\n                      zn.value ? (c(), d(\"p\", TL, f(zn.value), 1)) : g(\"\", !0)\n                    ]),\n                    o(\"div\", ML, [\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn\",\n                        disabled: En.value,\n                        onClick: l[11] || (l[11] = (ke) => mo.value === \"manual\" ? ev() : Qp())\n                      }, f(mo.value === \"manual\" ? s(p)(\"e2e.escrowoffer.cancel\") : s(p)(\"e2e.escrowoffer.decline\")), 9, EL),\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--primary\",\n                        disabled: En.value,\n                        onClick: Sc\n                      }, f(En.value ? s(p)(\"e2e.escrowoffer.busy\") : s(p)(\"e2e.escrowoffer.accept\")), 9, zL)\n                    ])\n                  ])) : g(\"\", !0),\n                  Mn.value ? (c(), d(\"div\", AL, [\n                    o(\"span\", {\n                      class: \"fe-e2e-strip__icon\",\n                      \"aria-hidden\": \"true\",\n                      innerHTML: s(Ue)(\"lock\")\n                    }, null, 8, PL),\n                    o(\"span\", LL, f(s(p)(\"e2e.strip.label\")), 1),\n                    Jp.value !== \"n/a\" && !va.value ? (c(), d(\"button\", {\n                      key: 0,\n                      type: \"button\",\n                      class: \"fe-btn fe-e2e-strip__btn\",\n                      onClick: Zp\n                    }, f(s(p)(\"e2e.escrowoffer.strip_action\")), 1)) : g(\"\", !0),\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-btn fe-e2e-strip__btn\",\n                      onClick: Up\n                    }, f(s(p)(\"e2e.strip.lock\")), 1)\n                  ])) : g(\"\", !0),\n                  pe.value && !x.value ? (c(), d(\"div\", DL, [\n                    o(\"p\", OL, f(wf.value), 1),\n                    jo.value ? (c(), d(\"button\", {\n                      key: 0,\n                      type: \"button\",\n                      class: \"fe-btn fe-btn--danger fe-trashbar__action\",\n                      disabled: O.value.length === 0 || Yo.value,\n                      \"data-testid\": \"trash-empty\",\n                      onClick: l[12] || (l[12] = (ke) => so.value = !0)\n                    }, f(s(p)(\"trash.empty_action\")), 9, BL)) : g(\"\", !0)\n                  ])) : g(\"\", !0)\n                ]),\n                body: st(() => [\n                  Lr.value === \"home\" ? (c(), et(jw, {\n                    key: 0,\n                    storages: uf.value,\n                    recent: vl.value,\n                    starred: hl.value,\n                    loading: rr.value,\n                    locale: v.value,\n                    \"name-filter\": no.value.name ?? \"\",\n                    \"thumb-src\": s(C).src,\n                    onOpenStorage: yl,\n                    onOpenNode: dn,\n                    onContextNode: wr\n                  }, null, 8, [\"storages\", \"recent\", \"starred\", \"loading\", \"locale\", \"name-filter\", \"thumb-src\"])) : Lr.value === \"notfound\" ? (c(), d(\"div\", IL, [\n                    l[81] || (l[81] = o(\"svg\", {\n                      class: \"fe-state__art\",\n                      viewBox: \"0 0 120 100\",\n                      width: \"110\",\n                      height: \"92\",\n                      fill: \"none\",\n                      stroke: \"currentColor\",\n                      \"stroke-width\": \"2\",\n                      \"stroke-linecap\": \"round\",\n                      \"stroke-linejoin\": \"round\",\n                      \"aria-hidden\": \"true\"\n                    }, [\n                      o(\"path\", { d: \"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" }),\n                      o(\"path\", { d: \"M52 55c0-4.6 3.6-8 8-8s8 3.4 8 8c0 5.5-8 4.8-8 11\" }),\n                      o(\"circle\", {\n                        cx: \"60\",\n                        cy: \"73\",\n                        r: \"1.6\",\n                        fill: \"currentColor\",\n                        stroke: \"none\"\n                      })\n                    ], -1)),\n                    o(\"p\", HL, f(s(p)(\"notFound.title\")), 1),\n                    o(\"p\", FL, f(N.value), 1),\n                    o(\"p\", NL, f(s(p)(\"notFound.desc\")), 1),\n                    o(\"div\", KL, [\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn\",\n                        onClick: kf\n                      }, f(s(p)(\"notFound.goRoot\")), 1)\n                    ])\n                  ])) : (c(), d(\"div\", RL, [\n                    l[82] || (l[82] = o(\"svg\", {\n                      class: \"fe-state__art\",\n                      viewBox: \"0 0 120 100\",\n                      width: \"110\",\n                      height: \"92\",\n                      fill: \"none\",\n                      stroke: \"currentColor\",\n                      \"stroke-width\": \"2\",\n                      \"stroke-linecap\": \"round\",\n                      \"stroke-linejoin\": \"round\",\n                      \"aria-hidden\": \"true\"\n                    }, [\n                      o(\"rect\", {\n                        x: \"38\",\n                        y: \"44\",\n                        width: \"44\",\n                        height: \"34\",\n                        rx: \"6\"\n                      }),\n                      o(\"path\", { d: \"M46 44v-8a14 14 0 0 1 28 0v8\" }),\n                      o(\"circle\", {\n                        cx: \"60\",\n                        cy: \"59\",\n                        r: \"3\",\n                        fill: \"currentColor\",\n                        stroke: \"none\"\n                      }),\n                      o(\"path\", { d: \"M60 62v7\" })\n                    ], -1)),\n                    o(\"p\", UL, f(s(p)(\"e2e.locked.title\")), 1),\n                    o(\"p\", VL, f(s(p)(\"e2e.locked.hint\")), 1),\n                    o(\"form\", {\n                      class: \"fe-e2e-lock__form\",\n                      onSubmit: Re(Rp, [\"prevent\"])\n                    }, [\n                      Ve(o(\"input\", {\n                        \"onUpdate:modelValue\": l[13] || (l[13] = (ke) => Zn.value = ke),\n                        type: \"password\",\n                        class: \"fe-input fe-e2e-lock__input\",\n                        placeholder: s(p)(\"e2e.locked.pw_placeholder\"),\n                        \"aria-label\": s(p)(\"e2e.locked.pw_placeholder\"),\n                        autocomplete: \"current-password\",\n                        disabled: La.value\n                      }, null, 8, jL), [\n                        [rt, Zn.value]\n                      ]),\n                      o(\"button\", {\n                        type: \"submit\",\n                        class: \"fe-btn fe-btn--primary\",\n                        disabled: La.value || !Zn.value\n                      }, f(La.value ? s(p)(\"e2e.locked.busy\") : s(p)(\"e2e.locked.unlock\")), 9, YL)\n                    ], 32),\n                    Da.value ? (c(), d(\"p\", WL, f(Da.value), 1)) : g(\"\", !0),\n                    o(\"button\", {\n                      type: \"button\",\n                      class: \"fe-e2e-optlink\",\n                      onClick: Gp\n                    }, f(s(p)(\"e2e.locked.use_recovery\")), 1)\n                  ]))\n                ]),\n                empty: st(() => [\n                  Q.value ? (c(), d(\"div\", qL, [\n                    l[83] || (l[83] = o(\"svg\", {\n                      class: \"fe-state__art\",\n                      viewBox: \"0 0 120 100\",\n                      width: \"110\",\n                      height: \"92\",\n                      fill: \"none\",\n                      stroke: \"currentColor\",\n                      \"stroke-width\": \"2\",\n                      \"stroke-linecap\": \"round\",\n                      \"stroke-linejoin\": \"round\",\n                      \"aria-hidden\": \"true\"\n                    }, [\n                      o(\"circle\", {\n                        cx: \"52\",\n                        cy: \"44\",\n                        r: \"22\"\n                      }),\n                      o(\"path\", { d: \"M68 61l20 20\" }),\n                      o(\"path\", { d: \"M46 38l12 12M58 38l-12 12\" })\n                    ], -1)),\n                    o(\"p\", GL, f(s(p)(\"empty.search.title\")), 1),\n                    o(\"p\", XL, f(s(p)(\"empty.search.hint\")), 1)\n                  ])) : w.value && w.value !== \"trash\" ? (c(), d(\"div\", {\n                    key: 1,\n                    class: \"fe-state\",\n                    \"data-testid\": `empty-${w.value}`\n                  }, [\n                    (c(), d(\"svg\", ZL, [\n                      w.value === \"recent\" ? (c(), d(ae, { key: 0 }, [\n                        l[84] || (l[84] = o(\"circle\", {\n                          cx: \"60\",\n                          cy: \"50\",\n                          r: \"28\"\n                        }, null, -1)),\n                        l[85] || (l[85] = o(\"path\", { d: \"M60 32v18l12 8\" }, null, -1))\n                      ], 64)) : w.value === \"starred\" ? (c(), d(\"path\", QL)) : w.value === \"tag\" ? (c(), d(ae, { key: 2 }, [\n                        l[86] || (l[86] = o(\"path\", { d: \"M30 30h24l32 32-24 24-32-32z\" }, null, -1)),\n                        l[87] || (l[87] = o(\"circle\", {\n                          cx: \"43\",\n                          cy: \"43\",\n                          r: \"4.5\"\n                        }, null, -1))\n                      ], 64)) : (c(), d(ae, { key: 3 }, [\n                        l[88] || (l[88] = o(\"circle\", {\n                          cx: \"84\",\n                          cy: \"34\",\n                          r: \"9\"\n                        }, null, -1)),\n                        l[89] || (l[89] = o(\"circle\", {\n                          cx: \"36\",\n                          cy: \"52\",\n                          r: \"9\"\n                        }, null, -1)),\n                        l[90] || (l[90] = o(\"circle\", {\n                          cx: \"84\",\n                          cy: \"70\",\n                          r: \"9\"\n                        }, null, -1)),\n                        l[91] || (l[91] = o(\"path\", { d: \"M44.5 47.5l31-9M44.5 56.5l31 9\" }, null, -1))\n                      ], 64))\n                    ])),\n                    o(\"p\", eD, f(w.value === \"tag\" ? s(p)(\"empty.tag.title\", { tag: be.value }) : s(p)(`empty.${w.value}.title`)), 1),\n                    o(\"p\", tD, f(w.value === \"tag\" ? s(p)(\"empty.tag.hint\") : s(p)(`empty.${w.value}.hint`)), 1)\n                  ], 8, JL)) : pe.value ? (c(), d(\"div\", nD, [\n                    l[92] || (l[92] = o(\"svg\", {\n                      class: \"fe-state__art\",\n                      viewBox: \"0 0 120 100\",\n                      width: \"110\",\n                      height: \"92\",\n                      fill: \"none\",\n                      stroke: \"currentColor\",\n                      \"stroke-width\": \"2\",\n                      \"stroke-linecap\": \"round\",\n                      \"stroke-linejoin\": \"round\",\n                      \"aria-hidden\": \"true\"\n                    }, [\n                      o(\"path\", { d: \"M38 34l4 48a6 6 0 0 0 6 5.6h24a6 6 0 0 0 6-5.6l4-48\" }),\n                      o(\"path\", { d: \"M32 34h56\" }),\n                      o(\"path\", { d: \"M50 34v-6a6 6 0 0 1 6-6h8a6 6 0 0 1 6 6v6\" }),\n                      o(\"path\", {\n                        d: \"M52 44v32M60 44v32M68 44v32\",\n                        opacity: \"0.5\"\n                      })\n                    ], -1)),\n                    o(\"p\", aD, f(s(p)(\"empty.trash.title\")), 1),\n                    o(\"p\", oD, f(s(p)(\"empty.trash.hint\")), 1)\n                  ])) : (c(), d(\"div\", sD, [\n                    (c(), d(\"svg\", rD, [\n                      l[94] || (l[94] = o(\"path\", { d: \"M18 36v42a6 6 0 0 0 6 6h72a6 6 0 0 0 6-6V44a6 6 0 0 0-6-6H62l-9-10H24a6 6 0 0 0-6 6z\" }, null, -1)),\n                      Ko.value ? (c(), d(\"g\", iD, [...l[93] || (l[93] = [\n                        o(\"path\", {\n                          d: \"M60 50v14\",\n                          \"stroke-dasharray\": \"3 4\"\n                        }, null, -1),\n                        o(\"path\", { d: \"M53 59l7 8 7-8\" }, null, -1)\n                      ])])) : g(\"\", !0)\n                    ])),\n                    o(\"p\", lD, f(s(p)(\"empty.folder\")), 1),\n                    Ko.value ? (c(), d(\"p\", cD, f(s(p)(\"empty.hint\")), 1)) : g(\"\", !0),\n                    Ko.value ? (c(), d(\"div\", uD, [\n                      o(\"button\", {\n                        type: \"button\",\n                        class: \"fe-btn fe-btn--primary\",\n                        onClick: qn\n                      }, f(s(p)(\"empty.upload\")), 1)\n                    ])) : g(\"\", !0)\n                  ]))\n                ]),\n                _: 1\n              }, 8, [\"api\", \"locale\", \"theme\", \"focused\", \"path\", \"root-path\", \"floor\", \"multi-root\", \"rows\", \"loading\", \"error\", \"order\", \"view-mode\", \"view-modes\", \"open-trigger\", \"show-crumbs\", \"filter-mode\", \"find-label\", \"show-view-switcher\", \"folder-key\", \"show-parent-path\", \"clipped\", \"extra-filters\", \"can-write\", \"can-paste\", \"selected\", \"filters\", \"thumb-src\", \"keep-badge-for\", \"starred-ids\", \"star-enabled\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"e2e-active\", \"body-override\"]),\n              za.value && In.value ? (c(), et(Mu, {\n                ref_key: \"splitPaneRef\",\n                ref: bt,\n                key: \"split-\" + s(Ar),\n                \"pane-id\": \"split\",\n                \"self-driven\": \"\",\n                closable: \"\",\n                api: s(u),\n                locale: v.value,\n                theme: It.value,\n                focused: zt.value,\n                path: In.value.path,\n                qualify: ut,\n                \"to-user\": Br,\n                clamp: mc,\n                \"root-path\": s(E),\n                floor: s($),\n                \"multi-root\": Et.value,\n                \"virtual-rows\": Sl,\n                \"trash-visible\": e.config.trashVisible !== !1,\n                \"nav-offers-trash\": rl.value,\n                \"view-mode\": dc.value,\n                \"view-modes\": ar.value,\n                \"open-trigger\": r.config.openTrigger,\n                clipped: xr.value,\n                \"can-write\": xn.value,\n                \"can-paste\": !!V.value.mode,\n                selected: s(Ht).selected.value,\n                filters: co.value,\n                \"folder-key\": Cp.value,\n                \"thumb-src\": s(C).src,\n                \"keep-badge-for\": bn.value ? Il : void 0,\n                \"starred-ids\": je.value,\n                \"star-enabled\": eo.value,\n                \"api-base\": r.config.apiBase ?? \"\",\n                \"auth-headers\": () => Rt(),\n                \"auth-credentials\": s(u).credentialsMode(),\n                onActivate: l[24] || (l[24] = (ke) => Tn.value = \"split\"),\n                onClose: Mp,\n                onNavigate: Ep,\n                onOpen: dn,\n                onOpenTrash: Ap,\n                onClickRow: l[25] || (l[25] = (ke, Qt) => Yl(\"split\", ke, Qt)),\n                onContext: l[26] || (l[26] = (ke, Qt) => Fl(\"split\", ke, Qt)),\n                onClearSelection: l[27] || (l[27] = (ke) => s(Ht).clear()),\n                onDisplayOrder: l[28] || (l[28] = (ke) => ls.value = ke),\n                onItemDragStart: l[29] || (l[29] = (ke, Qt) => Wl(\"split\", ke, Qt)),\n                onItemDropInto: Jl,\n                onTransfer: _c,\n                \"onUpdate:viewMode\": fc,\n                \"onUpdate:filters\": l[30] || (l[30] = (ke) => co.value = ke),\n                onCopyPath: as,\n                onCrumbDrop: Zl,\n                onNewFolder: l[31] || (l[31] = (ke) => xt.value = !0),\n                onUpload: qn,\n                onPaste: l[32] || (l[32] = (ke) => yr(\"paste\")),\n                onSelectAll: l[33] || (l[33] = (ke) => s(Ht).selectAll()),\n                onClearFilters: l[34] || (l[34] = (ke) => co.value = { ...s(na) }),\n                onStarChange: Pe\n              }, null, 8, [\"api\", \"locale\", \"theme\", \"focused\", \"path\", \"root-path\", \"floor\", \"multi-root\", \"trash-visible\", \"nav-offers-trash\", \"view-mode\", \"view-modes\", \"open-trigger\", \"clipped\", \"can-write\", \"can-paste\", \"selected\", \"filters\", \"folder-key\", \"thumb-src\", \"keep-badge-for\", \"starred-ids\", \"star-enabled\", \"api-base\", \"auth-headers\", \"auth-credentials\"])) : g(\"\", !0)\n            ])\n          ]),\n          Me.value ? (c(), et(kk, {\n            key: 2,\n            api: s(u),\n            nodes: Ip.value,\n            \"dir-label\": Fp.value,\n            \"dir-count\": Np.value,\n            \"dir-perm\": Kp.value,\n            \"held-in\": Hp.value,\n            locale: v.value,\n            narrow: rn.value,\n            \"thumb-src\": s(C).src,\n            \"api-base\": r.config.apiBase ?? \"\",\n            \"auth-headers\": () => Rt(),\n            \"auth-credentials\": s(u).credentialsMode(),\n            onTagsChanged: wt,\n            onOpenTag: Gt,\n            onClose: Xt,\n            onShareCreated: lf,\n            onManagePermissions: vf,\n            onToast: Ke,\n            onChanged: l[35] || (l[35] = () => {\n              var ke;\n              return zt.value ? void ((ke = bt.value) == null ? void 0 : ke.reload()) : void ot();\n            })\n          }, null, 8, [\"api\", \"nodes\", \"dir-label\", \"dir-count\", \"dir-perm\", \"held-in\", \"locale\", \"narrow\", \"thumb-src\", \"api-base\", \"auth-headers\", \"auth-credentials\", \"onTagsChanged\", \"onOpenTag\", \"onShareCreated\"])) : g(\"\", !0)\n        ], 2),\n        $a.value || to.value ? (c(), d(\"div\", {\n          key: 0,\n          class: \"fe-overlay\",\n          \"data-testid\": \"explorer-overlay\",\n          onClick: Re(Do, [\"self\"])\n        }, [\n          o(\"div\", {\n            class: \"fe-overlay__card\",\n            onClick: l[37] || (l[37] = Re(() => {\n            }, [\"stop\"]))\n          }, [\n            $a.value ? (c(), et(ax, {\n              key: 0,\n              config: e.config,\n              \"initial-tab\": \"connect\",\n              closable: \"\",\n              onClose: Do,\n              onChanged: l[36] || (l[36] = () => ot()),\n              onError: Gd\n            }, null, 8, [\"config\"])) : (c(), d(ae, { key: 1 }, [\n              o(\"header\", dD, [\n                o(\"h2\", fD, f(s(p)(\"sidenav.apikeys\")), 1),\n                o(\"button\", {\n                  type: \"button\",\n                  class: \"fe-overlay__close\",\n                  title: s(p)(\"overlay.close\"),\n                  \"aria-label\": s(p)(\"overlay.close\"),\n                  onClick: Do\n                }, \" × \", 8, pD)\n              ]),\n              Ge(Hd, {\n                config: e.config,\n                full: \"\"\n              }, null, 8, [\"config\"])\n            ], 64))\n          ])\n        ])) : g(\"\", !0),\n        Xn.value ? (c(), d(\"div\", vD, [\n          o(\"div\", hD, [\n            o(\"span\", {\n              class: \"fe-icon\",\n              \"aria-hidden\": \"true\",\n              innerHTML: s(Ue)(\"upload\")\n            }, null, 8, mD),\n            o(\"p\", null, f(s(p)(\"dropzone.hint\")), 1)\n          ])\n        ])) : g(\"\", !0),\n        Ge(Sb, {\n          jobs: pt.value,\n          locale: v.value,\n          center: s(Mr),\n          onCancel: lp,\n          onDismiss: cp,\n          onRetry: mp\n        }, null, 8, [\"jobs\", \"locale\", \"center\"]),\n        Ge(Tb, {\n          ops: s(U).ops.value,\n          locale: v.value,\n          center: s(Mr),\n          onDismiss: l[38] || (l[38] = (ke) => s(U).dismiss(ke))\n        }, null, 8, [\"ops\", \"locale\", \"center\"]),\n        Ge(r5, {\n          center: s(Mr),\n          locale: v.value,\n          narrow: rn.value\n        }, null, 8, [\"center\", \"locale\", \"narrow\"]),\n        rn.value && Ko.value ? (c(), d(\"button\", {\n          key: 2,\n          type: \"button\",\n          class: \"fe-fab\",\n          title: s(p)(\"toolbar.upload\"),\n          \"aria-label\": s(p)(\"toolbar.upload\"),\n          onClick: qn\n        }, [...l[95] || (l[95] = [\n          o(\"svg\", {\n            class: \"fe-ficon\",\n            viewBox: \"0 0 24 24\",\n            fill: \"none\",\n            stroke: \"currentColor\",\n            \"stroke-width\": \"2.2\",\n            \"stroke-linecap\": \"round\",\n            \"aria-hidden\": \"true\",\n            focusable: \"false\"\n          }, [\n            o(\"path\", { d: \"M12 5v14M5 12h14\" })\n          ], -1)\n        ])], 8, yD)) : g(\"\", !0),\n        Ma.value ? (c(), d(\"div\", bD, [\n          l[96] || (l[96] = o(\"span\", {\n            class: \"fe-keep-strip__icon\",\n            \"aria-hidden\": \"true\"\n          }, \"⟳\", -1)),\n          o(\"span\", gD, f(Hf.value), 1),\n          Hl.value !== null ? (c(), d(\"div\", kD, [\n            o(\"div\", {\n              class: \"fe-keep-strip__fill\",\n              style: Ct({ width: Hl.value + \"%\" })\n            }, null, 4)\n          ])) : g(\"\", !0)\n        ])) : g(\"\", !0),\n        Ge(Ps, {\n          ref_key: \"ctxRef\",\n          ref: la,\n          locale: v.value,\n          theme: It.value,\n          sheet: $l.value,\n          actions: Kf.value,\n          onSelect: Uf\n        }, null, 8, [\"locale\", \"theme\", \"sheet\", \"actions\"]),\n        Ge(n6, {\n          open: jt.value,\n          locale: v.value,\n          theme: It.value,\n          api: s(u),\n          types: Bt.value,\n          \"current-path\": ut(z.value),\n          storages: (r.config.storages ?? []).map((ke) => ke.name),\n          \"only-office-ready\": !!kt.value,\n          \"drawio-ready\": !!At.value,\n          onClose: l[39] || (l[39] = (ke) => jt.value = !1),\n          onCreated: Xf,\n          onError: l[40] || (l[40] = (ke) => a(\"error\", { message: ke.message, context: { op: \"newdoc\" } }))\n        }, null, 8, [\"open\", \"locale\", \"theme\", \"api\", \"types\", \"current-path\", \"storages\", \"only-office-ready\", \"drawio-ready\"]),\n        Ge(fz, {\n          open: xt.value,\n          locale: v.value,\n          \"encrypted-option\": !Zt.value,\n          onClose: l[41] || (l[41] = (ke) => xt.value = !1),\n          onSubmit: Jf,\n          onEncrypted: l[42] || (l[42] = (ke) => {\n            xt.value = !1, cs.value = !0;\n          })\n        }, null, 8, [\"open\", \"locale\", \"encrypted-option\"]),\n        Ge(Rd, {\n          open: ne.value,\n          api: s(u),\n          locale: v.value,\n          mode: H.value,\n          busy: _e.value,\n          storages: (r.config.storages ?? []).map((ke) => ke.name),\n          \"start-at\": ut(zt.value ? ((ee = bt.value) == null ? void 0 : ee.getPath()) ?? \"\" : z.value),\n          moving: H.value === \"move\" ? te.value.filter((ke) => ke.type === \"dir\").map((ke) => ke.path) : [],\n          onClose: l[43] || (l[43] = (ke) => ne.value = !1),\n          onPick: Gf\n        }, null, 8, [\"open\", \"api\", \"locale\", \"mode\", \"busy\", \"storages\", \"start-at\", \"moving\"]),\n        Ge(b8, {\n          open: cs.value,\n          locale: v.value,\n          busy: Hr.value,\n          \"escrow-kid\": Fn.value,\n          onClose: l[44] || (l[44] = (ke) => cs.value = !1),\n          onSubmit: Wp\n        }, null, 8, [\"open\", \"locale\", \"busy\", \"escrow-kid\"]),\n        Ge(M8, {\n          open: ds.value,\n          locale: v.value,\n          \"recovery-key\": fs.value,\n          \"folder-name\": ps.value,\n          \"escrow-kid\": Fn.value,\n          variant: Nr.value,\n          onClose: nv\n        }, null, 8, [\"open\", \"locale\", \"recovery-key\", \"folder-name\", \"escrow-kid\", \"variant\"]),\n        Ge(U8, {\n          open: us.value,\n          locale: v.value,\n          \"has-recovery\": s(cy)(Yt.value),\n          \"escrow-state\": s(dy)(Yt.value, Fn.value),\n          \"escrow-kid\": ((Ee = (me = Yt.value) == null ? void 0 : me.esc) == null ? void 0 : Ee.kid) || Fn.value,\n          busy: Fr.value,\n          error: Qn.value,\n          onClose: l[45] || (l[45] = (ke) => us.value = !1),\n          onSubmit: qp\n        }, null, 8, [\"open\", \"locale\", \"has-recovery\", \"escrow-state\", \"escrow-kid\", \"busy\", \"error\"]),\n        Ge(o6, {\n          open: Pt.value,\n          locale: v.value,\n          \"current-name\": ((Fe = sn.value) == null ? void 0 : Fe.basename) || \"\",\n          onClose: l[46] || (l[46] = (ke) => Pt.value = !1),\n          onSubmit: Zf\n        }, null, 8, [\"open\", \"locale\", \"current-name\"]),\n        Ge(an, {\n          open: so.value,\n          title: s(p)(\"trash.empty_confirm_title\"),\n          size: \"sm\",\n          onClose: l[48] || (l[48] = (ke) => so.value = !1)\n        }, {\n          actions: st(() => [\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn\",\n              onClick: l[47] || (l[47] = (ke) => so.value = !1)\n            }, f(s(p)(\"modal.delete.cancel\")), 1),\n            o(\"button\", {\n              type: \"button\",\n              class: \"fe-btn fe-btn--danger\",\n              \"data-testid\": \"trash-empty-confirm\",\n              onClick: Sf\n            }, f(s(p)(\"trash.empty_action\")), 1)\n          ]),\n          default: st(() => [\n            o(\"p\", null, f(s(p)(xf.value, { count: O.value.length, size: s(h)(Ml.value) })), 1)\n          ]),\n          _: 1\n        }, 8, [\"open\", \"title\"]),\n        Ge(s6, {\n          open: _t.value,\n          locale: v.value,\n          count: s(Ae).size.value,\n          onClose: l[49] || (l[49] = (ke) => _t.value = !1),\n          onConfirm: Qf\n        }, null, 8, [\"open\", \"locale\", \"count\"]),\n        Ge(Nd, {\n          open: St.value,\n          locale: v.value,\n          file: nn.value,\n          theme: It.value,\n          \"preview-url\": (ke) => hs(ke),\n          \"download-url\": (ke) => Mn.value ? hs(ke) : s(u).downloadUrl(ke),\n          \"only-office-base\": Zt.value ? null : kt.value,\n          \"only-office-config-endpoint\": Dt.value,\n          \"new-tab-enabled\": !Zt.value,\n          \"save-text-endpoint\": Zt.value ? null : s(u).endpoints.saveText || null,\n          \"archive-list-endpoint\": s(u).endpoints.archiveList || null,\n          \"open-mode\": mn.value,\n          \"auth-headers\": () => Rt({ \"Content-Type\": \"application/json\" }),\n          \"auth-credentials\": s(u).credentialsMode(),\n          \"drawio-url\": At.value,\n          \"pdf-worker-url\": r.config.pdfWorkerUrl || null,\n          \"pdf-save-url\": r.config.pdfSaveUrl || null,\n          \"viewer-base-url\": ec.value,\n          index: vt.value.index,\n          total: vt.value.total,\n          \"nav-enabled\": vt.value.total > 1,\n          \"share-enabled\": !Zt.value,\n          onShare: l[50] || (l[50] = () => {\n            const ke = nn.value;\n            ke && (q.value = ke, Io.value = void 0, Le.value = !0);\n          }),\n          \"api-base\": r.config.apiBase ?? \"\",\n          onNav: Xe,\n          onClose: l[51] || (l[51] = (ke) => St.value = !1)\n        }, null, 8, [\"open\", \"locale\", \"file\", \"theme\", \"preview-url\", \"download-url\", \"only-office-base\", \"only-office-config-endpoint\", \"new-tab-enabled\", \"save-text-endpoint\", \"archive-list-endpoint\", \"open-mode\", \"auth-headers\", \"auth-credentials\", \"drawio-url\", \"pdf-worker-url\", \"pdf-save-url\", \"viewer-base-url\", \"index\", \"total\", \"nav-enabled\", \"share-enabled\", \"api-base\"]),\n        xe.value && de.value && Ot.value ? (c(), et(w6, {\n          key: 4,\n          \"convert-url\": Ot.value,\n          \"file-name\": ((nt = de.value) == null ? void 0 : nt.basename) || ((ct = de.value) == null ? void 0 : ct.path) || \"\",\n          \"fetch-bytes\": () => {\n            var ke;\n            return s(u).fetchArrayBuffer(((ke = de.value) == null ? void 0 : ke.path) ?? \"\");\n          },\n          upload: (ke) => s(u).uploadMultipart(ut(z.value), [ke]).then(() => {\n          }),\n          locale: v.value,\n          onClose: l[52] || (l[52] = (ke) => xe.value = !1),\n          onDone: tp\n        }, null, 8, [\"convert-url\", \"file-name\", \"fetch-bytes\", \"upload\", \"locale\"])) : g(\"\", !0),\n        Le.value && q.value ? (c(), et(cL, {\n          key: 5,\n          api: s(u),\n          path: q.value.path,\n          \"is-dir\": q.value.type === \"dir\",\n          size: typeof q.value.size == \"number\" ? q.value.size : void 0,\n          locale: v.value === \"en\" ? \"en\" : \"tr\",\n          \"share-max-ttl-days\": ye.value,\n          \"initial-tab\": Io.value,\n          onClose: l[53] || (l[53] = (ke) => {\n            Le.value = !1, Io.value = void 0;\n          })\n        }, null, 8, [\"api\", \"path\", \"is-dir\", \"size\", \"locale\", \"share-max-ttl-days\", \"initial-tab\"])) : g(\"\", !0),\n        Ge(Rn, { name: \"fe-modal\" }, {\n          default: st(() => [\n            Qe.value ? (c(), d(\"div\", {\n              key: 0,\n              class: we([\"fe fe-modal__backdrop fe-recents__backdrop\", {\n                \"fe--theme-light\": It.value === \"light\",\n                \"fe--theme-dark\": It.value === \"dark\"\n              }]),\n              onClick: l[57] || (l[57] = (ke) => Qe.value = !1)\n            }, [\n              o(\"div\", {\n                class: \"fe-recents__panel\",\n                onClick: l[56] || (l[56] = Re(() => {\n                }, [\"stop\"]))\n              }, [\n                o(\"div\", _D, [\n                  o(\"strong\", null, f(v.value === \"en\" ? \"Recently opened\" : \"Son açılanlar\"), 1),\n                  o(\"button\", {\n                    class: \"fe-recents__close\",\n                    \"aria-label\": \"Close\",\n                    onClick: l[54] || (l[54] = (ke) => Qe.value = !1)\n                  }, \"×\")\n                ]),\n                Ge(db, {\n                  \"api-base\": r.config.apiBase ?? \"\",\n                  \"auth-headers\": () => Rt(),\n                  \"auth-credentials\": s(u).credentialsMode(),\n                  limit: 20,\n                  \"refresh-key\": lt.value,\n                  onOpen: en,\n                  onContext: $t,\n                  onError: l[55] || (l[55] = (ke) => a(\"error\", { message: ke, context: { op: \"recents\" } }))\n                }, null, 8, [\"api-base\", \"auth-headers\", \"auth-credentials\", \"refresh-key\"])\n              ])\n            ], 2)) : g(\"\", !0)\n          ]),\n          _: 1\n        }),\n        Ge(Rn, { name: \"fe-modal\" }, {\n          default: st(() => [\n            at.value && Ye.value && typeof Ye.value.id == \"number\" ? (c(), d(\"div\", {\n              key: 0,\n              class: \"fe-modal__backdrop\",\n              onClick: l[62] || (l[62] = (ke) => at.value = !1)\n            }, [\n              o(\"div\", {\n                class: \"fe-modal__card fe-modal__card--md\",\n                onClick: l[61] || (l[61] = Re(() => {\n                }, [\"stop\"]))\n              }, [\n                o(\"header\", wD, [\n                  o(\"h2\", $D, f(v.value === \"en\" ? \"Tags\" : \"Etiketler\") + \" — \" + f(Ye.value.basename), 1),\n                  o(\"button\", {\n                    class: \"fe-modal__close\",\n                    \"aria-label\": \"Close\",\n                    onClick: l[58] || (l[58] = (ke) => at.value = !1)\n                  }, \"×\")\n                ]),\n                o(\"div\", xD, [\n                  Ge(td, {\n                    \"node-id\": Ye.value.id,\n                    locale: v.value,\n                    \"api-base\": r.config.apiBase ?? \"\",\n                    \"auth-headers\": () => Rt(),\n                    \"auth-credentials\": s(u).credentialsMode(),\n                    onChange: wt,\n                    onOpen: l[59] || (l[59] = (ke) => {\n                    }),\n                    onError: l[60] || (l[60] = (ke) => a(\"error\", { message: ke, context: { op: \"tags\" } }))\n                  }, null, 8, [\"node-id\", \"locale\", \"api-base\", \"auth-headers\", \"auth-credentials\"])\n                ])\n              ])\n            ])) : g(\"\", !0)\n          ]),\n          _: 1\n        }),\n        Ge(yC, {\n          open: Bo.value,\n          locale: v.value,\n          theme: It.value,\n          \"initial-query\": fl.value,\n          \"folder-label\": pl.value,\n          \"path-base\": ul.value,\n          \"content-search\": Zd.value,\n          count: tf,\n          onClose: l[63] || (l[63] = (ke) => Bo.value = !1),\n          onSubmit: af\n        }, null, 8, [\"open\", \"locale\", \"theme\", \"initial-query\", \"folder-label\", \"path-base\", \"content-search\"]),\n        Ge(Nx, {\n          \"initial-query\": or.value,\n          open: Xo.value,\n          locale: v.value,\n          files: O.value,\n          \"view-mode\": oe.value,\n          \"can-write\": xn.value && !se.value && !S.value,\n          \"can-go-up\": L.value,\n          \"global-search\": Mf,\n          onClose: l[64] || (l[64] = (ke) => Xo.value = !1),\n          onOpenHit: Ef,\n          onOpenNode: dn,\n          onNavigate: l[65] || (l[65] = (ke) => ot(ke)),\n          onNewFolder: l[66] || (l[66] = (ke) => xt.value = !0),\n          onUpload: qn,\n          onToggleView: l[67] || (l[67] = (ke) => pc(Dr.value === \"list\" ? \"grid\" : Dr.value === \"grid\" ? \"gallery\" : \"list\")),\n          onOpenTrash: Yn,\n          onRefresh: Tl,\n          onGoUp: We,\n          onOpenTheme: l[68] || (l[68] = (ke) => os.value = !0),\n          onOpenShortcutSettings: l[69] || (l[69] = (ke) => lo.value = !0),\n          onStartTour: l[70] || (l[70] = (ke) => zr()),\n          \"split-enabled\": uo.value,\n          onTabNew: l[71] || (l[71] = (ke) => Pr()),\n          onSplitToggle: l[72] || (l[72] = (ke) => uc())\n        }, null, 8, [\"initial-query\", \"open\", \"locale\", \"files\", \"view-mode\", \"can-write\", \"can-go-up\", \"onRefresh\", \"split-enabled\"]),\n        Ge(MC, {\n          open: Jo.value,\n          locale: v.value,\n          onClose: l[73] || (l[73] = (ke) => Jo.value = !1),\n          onCustomize: l[74] || (l[74] = (ke) => {\n            Jo.value = !1, lo.value = !0;\n          })\n        }, null, 8, [\"open\", \"locale\"]),\n        Ge(ZC, {\n          open: os.value,\n          locale: v.value,\n          theme: It.value,\n          dark: Tr.value,\n          current: s(ss),\n          mode: s(Cr),\n          \"host-mode\": e.config.theme || \"auto\",\n          onClose: l[75] || (l[75] = (ke) => os.value = !1),\n          onSelect: s(dp),\n          onMode: l[76] || (l[76] = (ke) => s(fp)(ke))\n        }, null, 8, [\"open\", \"locale\", \"theme\", \"dark\", \"current\", \"mode\", \"host-mode\", \"onSelect\"]),\n        o(\"input\", {\n          ref_key: \"fileInputEl\",\n          ref: tn,\n          type: \"file\",\n          multiple: \"\",\n          class: \"fe__file-input\",\n          onChange: np\n        }, null, 544),\n        Ge(Rn, { name: \"fe-toast\" }, {\n          default: st(() => [\n            Sn.value ? (c(), d(\"div\", {\n              key: 0,\n              class: we([\"fe-toast\", { \"fe-toast--action\": !!Sn.value.actionLabel }]),\n              role: \"status\",\n              onClick: pr\n            }, [\n              o(\"span\", SD, f(Sn.value.message), 1),\n              Sn.value.actionLabel && Sn.value.action ? (c(), d(\"button\", {\n                key: 0,\n                type: \"button\",\n                class: \"fe-toast__action\",\n                onClick: Re(bf, [\"stop\"])\n              }, f(Sn.value.actionLabel), 1)) : g(\"\", !0)\n            ], 2)) : g(\"\", !0)\n          ]),\n          _: 1\n        }),\n        Ge(m3, {\n          open: X.value,\n          locale: v.value,\n          theme: It.value,\n          onClose: l[77] || (l[77] = (ke) => X.value = !1)\n        }, null, 8, [\"open\", \"locale\", \"theme\"]),\n        Ge(Y3, {\n          open: lo.value,\n          locale: v.value,\n          theme: It.value,\n          onClose: l[78] || (l[78] = (ke) => lo.value = !1)\n        }, null, 8, [\"open\", \"locale\", \"theme\"]),\n        Ge(C4, {\n          open: Jn.value,\n          locale: v.value,\n          file: Bn.value,\n          theme: It.value,\n          \"preview-url\": (ke) => hs(ke),\n          \"download-url\": (ke) => Mn.value ? hs(ke) : s(u).downloadUrl(ke),\n          \"only-office-base\": Zt.value ? null : kt.value,\n          \"only-office-config-endpoint\": Dt.value,\n          \"auth-headers\": () => Rt({ \"Content-Type\": \"application/json\" }),\n          \"auth-credentials\": s(u).credentialsMode(),\n          \"drawio-url\": At.value,\n          \"pdf-worker-url\": r.config.pdfWorkerUrl || null,\n          \"viewer-base-url\": ec.value,\n          onClose: l[79] || (l[79] = (ke) => Jn.value = !1),\n          onNav: vp,\n          onOpenFull: hp\n        }, null, 8, [\"open\", \"locale\", \"file\", \"theme\", \"preview-url\", \"download-url\", \"only-office-base\", \"only-office-config-endpoint\", \"auth-headers\", \"auth-credentials\", \"drawio-url\", \"pdf-worker-url\", \"viewer-base-url\"]),\n        Ge(y5, {\n          open: rs.value,\n          locale: v.value,\n          root: Kt.value,\n          theme: It.value,\n          onClose: bp\n        }, null, 8, [\"open\", \"locale\", \"root\", \"theme\"])\n      ], 34);\n    };\n  }\n});\nexport {\n  ZC as $,\n  Nd as A,\n  C4 as B,\n  ma as C,\n  G3 as D,\n  rd as E,\n  cu as F,\n  Id as G,\n  db as H,\n  M8 as I,\n  $0 as J,\n  V0 as K,\n  Y3 as L,\n  Dv as M,\n  fu as N,\n  er as O,\n  T1 as P,\n  To as Q,\n  mv as R,\n  oa as S,\n  Qi as T,\n  Ys as U,\n  Es as V,\n  ko as W,\n  Hv as X,\n  T5 as Y,\n  td as Z,\n  G1 as _,\n  Ue as a,\n  Ha as a$,\n  VC as a0,\n  f3 as a1,\n  Hd as a2,\n  Qy as a3,\n  UD as a4,\n  VD as a5,\n  RD as a6,\n  J8 as a7,\n  DD as a8,\n  ID as a9,\n  Kd as aA,\n  j_ as aB,\n  ly as aC,\n  eu as aD,\n  yv as aE,\n  zo as aF,\n  oz as aG,\n  pv as aH,\n  qs as aI,\n  tz as aJ,\n  sz as aK,\n  Wa as aL,\n  Iv as aM,\n  yy as aN,\n  ri as aO,\n  dy as aP,\n  oy as aQ,\n  Zc as aR,\n  si as aS,\n  Mv as aT,\n  Iy as aU,\n  uu as aV,\n  Ay as aW,\n  By as aX,\n  Ry as aY,\n  Ky as aZ,\n  Xu as a_,\n  Kv as aa,\n  iy as ab,\n  BC as ac,\n  X8 as ad,\n  Jy as ae,\n  ol as af,\n  Fd as ag,\n  Jw as ah,\n  a1 as ai,\n  Zw as aj,\n  Gw as ak,\n  Xw as al,\n  qw as am,\n  pu as an,\n  yo as ao,\n  Ks as ap,\n  ga as aq,\n  wo as ar,\n  Wy as as,\n  Ti as at,\n  Lv as au,\n  wa as av,\n  Yw as aw,\n  sy as ax,\n  by as ay,\n  HD as az,\n  ax as b,\n  Na as b$,\n  ty as b0,\n  Vy as b1,\n  dd as b2,\n  IC as b3,\n  dh as b4,\n  Qu as b5,\n  Gi as b6,\n  qi as b7,\n  n1 as b8,\n  di as b9,\n  Di as bA,\n  al as bB,\n  Js as bC,\n  jD as bD,\n  Ru as bE,\n  Yv as bF,\n  Fy as bG,\n  OD as bH,\n  Hy as bI,\n  Z8 as bJ,\n  Tv as bK,\n  Yy as bL,\n  Cv as bM,\n  Ku as bN,\n  cn as bO,\n  Mi as bP,\n  eb as bQ,\n  LD as bR,\n  Wr as bS,\n  jy as bT,\n  Jr as bU,\n  FD as bV,\n  jv as bW,\n  Yr as bX,\n  AC as bY,\n  DC as bZ,\n  Vv as b_,\n  ka as ba,\n  ay as bb,\n  ny as bc,\n  rz as bd,\n  az as be,\n  Mc as bf,\n  Pv as bg,\n  Bd as bh,\n  Bc as bi,\n  kv as bj,\n  qa as bk,\n  Va as bl,\n  _i as bm,\n  bv as bn,\n  zc as bo,\n  Ai as bp,\n  uy as bq,\n  cy as br,\n  Od as bs,\n  Vu as bt,\n  Ms as bu,\n  Cd as bv,\n  Uy as bw,\n  Cb as bx,\n  nz as by,\n  Qc as bz,\n  Ln as c,\n  Vs as c0,\n  _a as c1,\n  Nv as c2,\n  HC as c3,\n  Zy as c4,\n  Ua as c5,\n  Rv as c6,\n  Ny as c7,\n  Bv as c8,\n  ez as c9,\n  Ic as cA,\n  my as ca,\n  vy as cb,\n  hy as cc,\n  ry as cd,\n  jr as ce,\n  Ww as cf,\n  Ya as cg,\n  Ov as ch,\n  tt as ci,\n  BD as cj,\n  j0 as ck,\n  c5 as cl,\n  Qv as cm,\n  X1 as cn,\n  x0 as co,\n  Oc as cp,\n  Uu as cq,\n  t8 as cr,\n  OC as cs,\n  PC as ct,\n  g2 as cu,\n  _v as cv,\n  fy as cw,\n  KD as cx,\n  Uv as cy,\n  Td as cz,\n  Zr as d,\n  Zu as e,\n  fn as f,\n  Q8 as g,\n  Wt as h,\n  Rd as i,\n  cd as j,\n  Gm as k,\n  ha as l,\n  sd as m,\n  ld as n,\n  Xm as o,\n  _s as p,\n  od as q,\n  xo as r,\n  U8 as s,\n  b8 as t,\n  YD as u,\n  Mu as v,\n  ND as w,\n  b2 as x,\n  n6 as y,\n  r5 as z\n};\n//# sourceMappingURL=index-BArI-B1M.js.map\n","/**\n * @brftech/filex — Web Component (custom element) wrapper around\n * `@brftech/filex-core`'s FileExplorer.\n *\n * Importing this file (side-effect) registers `<filex-explorer>` as a\n * global custom element. Use it in any framework / no framework:\n *\n *   <filex-explorer api-base=\"https://files.example.com\" locale=\"tr\"></filex-explorer>\n *\n *   <script type=\"module\">\n *     // ⚠ Set `config` BEFORE the import that registers the element, not\n *     // after. Registering upgrades and MOUNTS it, and the explorer loads its\n *     // first folder on mount — a config assigned afterwards misses that one\n *     // request, which then goes out unauthenticated against the default\n *     // adapter. The element renders fine and the file list says \"Could not\n *     // load this folder\", which sends everybody looking at the backend.\n *     document.querySelector('filex-explorer').config = {\n *       apiBase: 'https://files.example.com',\n *       auth: { kind: 'bearer', token: '<jwt>' },\n *       locale: 'tr',\n *     };\n *     await import('@brftech/filex');   // side effect: registers the element\n *   </script>\n *\n * Attributes that map to top-level config keys are auto-parsed: `api-base`,\n * `endpoint`, `locale`, `theme`, `time-zone`, `trash-visible`, `sidenav`,\n * `connections`, `ui-profile`.\n * Anything else (auth, shareBase, custom endpoints…) is set via the `config`\n * JS property.\n *\n *   <filex-explorer api-base=\"https://files.example.com\" sidenav ui-profile=\"simple\">\n *   </filex-explorer>\n *\n * Boolean attributes follow the DOM convention: present (or `=\"true\"`) is true,\n * `=\"false\"` is false, absent leaves the core default alone.\n *\n * `shadowRoot: false` — Tailwind / global CSS / OS dark mode propagate\n * naturally into the explorer; `<style>` from the core stylesheet is\n * appended to the host page once on first registration.\n */\n\nimport { defineCustomElement, h, ref, watch, type PropType } from 'vue';\nimport FileExplorer from '@brftech/filex-core/src/FileExplorer.vue';\nimport ConnectionsPanel from '@brftech/filex-core/src/components/ConnectionsPanel.vue';\nimport type { ExplorerConfig, LocaleCode, ThemeMode } from '@brftech/filex-core';\nimport { resolveUiProfile } from '@brftech/filex-core';\nimport coreCss from '@brftech/filex-core/style.css?inline';\n\n/**\n * Inject the core stylesheet into <head> once. We `?inline` it (handled\n * by Vite) so the CSS string lives inside the JS bundle — no separate\n * stylesheet to wire up on the host page. The bundle ALSO emits a\n * `style.css` file alongside in case the consumer wants the link tag\n * approach instead.\n */\nlet stylesInjected = false;\nfunction injectStylesOnce() {\n  if (stylesInjected) return;\n  if (typeof document === 'undefined') return;\n  const tag = document.createElement('style');\n  tag.setAttribute('data-filex', '');\n  tag.textContent = coreCss as unknown as string;\n  document.head.appendChild(tag);\n  stylesInjected = true;\n}\n\n/**\n * Build the `config` object passed to the underlying FileExplorer SFC.\n * Pulls simple attributes (api-base, locale, theme, trash-visible) and\n * merges anything the consumer set via the `config` JS property.\n */\nfunction buildConfig(\n  attrs: {\n    apiBase?: string;\n    endpoint?: string;\n    locale?: string;\n    theme?: string;\n    timeZone?: string;\n    trashVisible?: boolean | string;\n    sidenav?: boolean | string;\n    connections?: boolean | string;\n    uiProfile?: string;\n  },\n  override: ExplorerConfig | null,\n): ExplorerConfig {\n  const base: ExplorerConfig = {};\n  if (attrs.apiBase) base.apiBase = attrs.apiBase;\n  if (attrs.endpoint) base.endpoint = attrs.endpoint;\n  if (attrs.locale === 'tr' || attrs.locale === 'en') base.locale = attrs.locale as LocaleCode;\n  if (attrs.theme === 'light' || attrs.theme === 'dark' || attrs.theme === 'auto') {\n    base.theme = attrs.theme as ThemeMode;\n  }\n  // zaman:z3 — the host's default clock (tier `host` in core's lib/timezone).\n  // Passed through as given: core ignores an id the browser does not accept,\n  // and a visitor's own pick in the explorer still outranks it.\n  if (attrs.timeZone) base.timeZone = attrs.timeZone;\n  if (attrs.trashVisible !== undefined) {\n    base.trashVisible =\n      attrs.trashVisible === true || attrs.trashVisible === 'true' || attrs.trashVisible === '';\n  }\n  // gezinti:g1 — the navigation panel, for host pages that never touch JS.\n  // ⚠ `undefined` is left ALONE rather than coerced to false: the core default\n  // is on, and an element that never mentions `sidenav` must keep it. Writing\n  // `base.sideNav = attrs.sidenav === true || …` would have every plain\n  // `<filex-explorer>` silently opt out of the panel.\n  if (attrs.sidenav !== undefined) {\n    base.sideNav = attrs.sidenav === true || attrs.sidenav === 'true' || attrs.sidenav === '';\n  }\n  // The panel's \"How to connect\" + \"API keys\" entries. Same `undefined` rule:\n  // the core default depends on `uiProfile`, and an element that never mentions\n  // the attribute must not overrule it.\n  if (attrs.connections !== undefined) {\n    base.connections =\n      attrs.connections === true || attrs.connections === 'true' || attrs.connections === '';\n  }\n  // ⚠ Resolved rather than passed through, and resolved by CORE's own rule\n  // (`lib/uiProfile`): an attribute is a string the DOM hands over unexamined,\n  // so a typo — or the third profile that was removed after v0.40.0 — must\n  // have a defined answer rather than an unknown profile reaching the SFC.\n  // That answer is `\"standard\"`, said once in the console.\n  // An absent attribute stays absent, so the core default keeps deciding.\n  if (typeof attrs.uiProfile === 'string' && attrs.uiProfile !== '') {\n    base.uiProfile = resolveUiProfile(attrs.uiProfile);\n  }\n  // `config` JS-property overrides win over individual attributes —\n  // letting power users feed the whole shape at once.\n  return { ...base, ...(override ?? {}) };\n}\n\n/**\n * Can the core resolve endpoints from this config yet?\n *\n * Mirrors `resolveEndpoints()` in `@brftech/filex-core`, which THROWS\n * (\"config requires either `apiBase` or `endpoint`\") when neither is\n * there — including the empty string, which is a valid relative root.\n *\n * ⚠⚠ Load-bearing for every host that cannot set a property before the\n * element is inserted, and React is exactly that host. `@lit/react`'s\n * `createComponent` assigns element properties in a layout effect, which\n * runs AFTER React has put the node in the document — so the element is\n * upgraded, mounted, and inside the core's setup with `config === null`\n * one tick before the config it was given arrives. Without this guard the\n * core threw there, the Vue instance died, and `<FileManager>` rendered a\n * blank page: no explorer, no stylesheet, nothing in the DOM. Measured\n * 2026-09-13 in a real browser with the built packages, and it is the\n * whole of what a React consumer got.\n *\n * The reactive watch below re-runs this the moment a config lands, so the\n * fix is a wait, not a refusal.\n */\nfunction isMountable(cfg: ExplorerConfig): boolean {\n  return cfg.apiBase != null || !!cfg.endpoint;\n}\n\n/**\n * A host that never supplies one at all would now get an empty element\n * instead of an exception, which is a quieter kind of broken. So the wait\n * says so once, on the next task — after any framework has had its turn\n * at assigning properties.\n */\nfunction warnIfStillUnconfigured(get: () => ExplorerConfig, tag: string): void {\n  if (typeof setTimeout !== 'function') return;\n  setTimeout(() => {\n    if (isMountable(get())) return;\n    console.warn(\n      `[@brftech/filex] <${tag}> has no apiBase and no endpoint, so there is ` +\n        'nothing to render. Set the `config` property (or the `api-base` ' +\n        'attribute) on the element.',\n    );\n  }, 0);\n}\n\n/**\n * Wrapper component — translates element attributes/properties into the\n * SFC's single `config` prop and forwards every event back out as a\n * native CustomEvent. Vue's `defineCustomElement` discovers props via\n * the `props` option below; events are dispatched against the host\n * element by Vue itself when we `emit(...)` here.\n */\nconst FilexExplorerWrapper = defineCustomElement({\n  /**\n   * Host attrs (style/class) must NOT fall through onto the inner `.fe`\n   * root: an embedder's `el.style.cssText = 'display:block;height:100%'`\n   * would get copied verbatim, and the inline display:block overrides the\n   * core `.fe{display:flex}` — the flex column collapses and internal\n   * scrolling dies in height-constrained embeds. The host element keeps\n   * its own style/class regardless (it is a real DOM element).\n   */\n  inheritAttrs: false,\n  props: {\n    /** Full ExplorerConfig as a JS property (preferred for complex shape). */\n    config: {\n      type: Object as PropType<ExplorerConfig | null>,\n      default: null,\n    },\n    /** Shortcut attribute → config.apiBase. */\n    apiBase: { type: String, default: '' },\n    /** Shortcut attribute → config.endpoint (legacy). */\n    endpoint: { type: String, default: '' },\n    locale: { type: String, default: '' },\n    theme: { type: String, default: '' },\n    /** Shortcut attribute → config.timeZone (the host's default clock). */\n    timeZone: { type: String, default: '' },\n    trashVisible: { type: [Boolean, String], default: undefined },\n    /** Shortcut attribute → config.sideNav (the navigation panel). */\n    sidenav: { type: [Boolean, String], default: undefined },\n    /** Shortcut attribute → config.connections (How to connect + API keys). */\n    connections: { type: [Boolean, String], default: undefined },\n    /** Shortcut attribute → config.uiProfile ('standard' | 'simple'). */\n    uiProfile: { type: String, default: '' },\n  },\n  emits: [\n    'share-created',\n    'file-opened',\n    'error',\n    'upload-progress',\n    'selection-change',\n  ],\n  setup(props, { emit }) {\n    injectStylesOnce();\n\n    // Reactive config — recomputed when any input attribute or the\n    // `config` JS property changes.\n    const merged = ref<ExplorerConfig>(\n      buildConfig(\n        {\n          apiBase: props.apiBase,\n          endpoint: props.endpoint,\n          locale: props.locale,\n          theme: props.theme,\n          timeZone: props.timeZone,\n          trashVisible: props.trashVisible,\n          sidenav: props.sidenav,\n          connections: props.connections,\n          uiProfile: props.uiProfile,\n        },\n        props.config,\n      ),\n    );\n\n    watch(\n      () => [\n        props.config,\n        props.apiBase,\n        props.endpoint,\n        props.locale,\n        props.theme,\n        props.timeZone,\n        props.trashVisible,\n        props.sidenav,\n        props.connections,\n        props.uiProfile,\n      ],\n      () => {\n        merged.value = buildConfig(\n          {\n            apiBase: props.apiBase,\n            endpoint: props.endpoint,\n            locale: props.locale,\n            theme: props.theme,\n            timeZone: props.timeZone,\n            trashVisible: props.trashVisible,\n            sidenav: props.sidenav,\n            connections: props.connections,\n            uiProfile: props.uiProfile,\n          },\n          props.config,\n        );\n      },\n      { deep: true },\n    );\n\n    warnIfStillUnconfigured(() => merged.value, 'filex-explorer');\n\n    return () =>\n      !isMountable(merged.value)\n        ? null\n        : h(FileExplorer as never, {\n            config: merged.value,\n            onShareCreated: (p: unknown) => emit('share-created', p),\n            onFileOpened: (f: unknown) => emit('file-opened', f),\n            onError: (e: unknown) => emit('error', e),\n            onUploadProgress: (p: unknown) => emit('upload-progress', p),\n            onSelectionChange: (s: unknown) => emit('selection-change', s),\n          });\n  },\n}, { shadowRoot: false });\n\n/**\n * `<filex-connections>` — the storage-connection surface as a custom\n * element, so a host with no bundler (the desktop shell, a plain page)\n * mounts the SAME component the admin SPA imports as an SFC. There is no\n * second form and no second set of instructions anywhere.\n *\n * ⚠⚠ Configure it through the `config` PROPERTY, exactly like the\n * explorer:\n *\n *   el.config = { ...el.config, locale: 'tr' };\n *\n * Setting `el.locale = 'tr'` changes a property nothing renders from:\n * `buildConfig` merges `{...attributes, ...config}` and the config object\n * wins, so an attribute is only ever a fallback for a key the config does\n * not carry. That exact mistake shipped in v0.19.0 — the shell went\n * Turkish while the file list stayed English, and the element reported\n * `locale === 'tr'` the whole time.\n */\nconst FilexConnectionsWrapper = defineCustomElement(\n  {\n    inheritAttrs: false,\n    props: {\n      config: {\n        type: Object as PropType<ExplorerConfig | null>,\n        default: null,\n      },\n      apiBase: { type: String, default: '' },\n      endpoint: { type: String, default: '' },\n      locale: { type: String, default: '' },\n      theme: { type: String, default: '' },\n      /** 'storages' | 'connect' — which half to open on. */\n      initialTab: { type: String, default: '' },\n      closable: { type: [Boolean, String], default: undefined },\n    },\n    emits: ['changed', 'close', 'error'],\n    setup(props, { emit }) {\n      injectStylesOnce();\n\n      const attrs = () => ({\n        apiBase: props.apiBase,\n        endpoint: props.endpoint,\n        locale: props.locale,\n        theme: props.theme,\n      });\n      const merged = ref<ExplorerConfig>(buildConfig(attrs(), props.config));\n\n      watch(\n        () => [props.config, props.apiBase, props.endpoint, props.locale, props.theme],\n        () => {\n          merged.value = buildConfig(attrs(), props.config);\n        },\n        { deep: true },\n      );\n\n      // Same wait as the explorer, for the same reason: `useConnections`\n      // runs `useFileApi` → `resolveEndpoints`, which throws on a config\n      // that carries neither half. The React README tells people to render\n      // this element directly and set `config` on the ref, which is the\n      // late-property path exactly.\n      warnIfStillUnconfigured(() => merged.value, 'filex-connections');\n\n      return () =>\n        !isMountable(merged.value)\n          ? null\n          : h(ConnectionsPanel as never, {\n              config: merged.value,\n              initialTab: props.initialTab === 'connect' ? 'connect' : 'storages',\n              closable:\n                props.closable === true ||\n                props.closable === 'true' ||\n                props.closable === '',\n              onChanged: () => emit('changed'),\n              onClose: () => emit('close'),\n              onError: (e: unknown) => emit('error', e),\n            });\n    },\n  },\n  { shadowRoot: false },\n);\n\n/** Public classes — useful for tests / programmatic instantiation. */\nexport const FilexElement = FilexExplorerWrapper;\nexport const FilexConnectionsElement = FilexConnectionsWrapper;\n\n/**\n * Self-register on import so consumers can do\n *   `import '@brftech/filex'`\n * and have the elements available immediately. Idempotent — re-import\n * doesn't throw.\n */\nif (typeof customElements !== 'undefined' && !customElements.get('filex-explorer')) {\n  customElements.define('filex-explorer', FilexExplorerWrapper);\n}\nif (typeof customElements !== 'undefined' && !customElements.get('filex-connections')) {\n  customElements.define('filex-connections', FilexConnectionsWrapper);\n}\n\n/**\n * Augment the global JSX/HTML element typings so TypeScript projects\n * embedding the WC get autocomplete + type checking on `<filex-explorer>`.\n *\n * We deliberately resolve to `HTMLElement` rather than the wrapper class\n * because `InstanceType<typeof FilexExplorerWrapper>` triggers a TS2502\n * \"self-referential type annotation\" error inside this very file.\n */\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'filex-explorer': HTMLElement;\n    'filex-connections': HTMLElement;\n  }\n}\n\nexport type { ExplorerConfig } from '@brftech/filex-core';\n","/* eslint-disable no-multi-assign */\n\nfunction deepFreeze(obj) {\n  if (obj instanceof Map) {\n    obj.clear =\n      obj.delete =\n      obj.set =\n        function () {\n          throw new Error('map is read-only');\n        };\n  } else if (obj instanceof Set) {\n    obj.add =\n      obj.clear =\n      obj.delete =\n        function () {\n          throw new Error('set is read-only');\n        };\n  }\n\n  // Freeze self\n  Object.freeze(obj);\n\n  Object.getOwnPropertyNames(obj).forEach((name) => {\n    const prop = obj[name];\n    const type = typeof prop;\n\n    // Freeze prop if it is an object or function and also not already frozen\n    if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) {\n      deepFreeze(prop);\n    }\n  });\n\n  return obj;\n}\n\n/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */\n/** @typedef {import('highlight.js').CompiledMode} CompiledMode */\n/** @implements CallbackResponse */\n\nclass Response {\n  /**\n   * @param {CompiledMode} mode\n   */\n  constructor(mode) {\n    // eslint-disable-next-line no-undefined\n    if (mode.data === undefined) mode.data = {};\n\n    this.data = mode.data;\n    this.isMatchIgnored = false;\n  }\n\n  ignoreMatch() {\n    this.isMatchIgnored = true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHTML(value) {\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#x27;');\n}\n\n/**\n * performs a shallow merge of multiple objects into one\n *\n * @template T\n * @param {T} original\n * @param {Record<string,any>[]} objects\n * @returns {T} a single new object\n */\nfunction inherit$1(original, ...objects) {\n  /** @type Record<string,any> */\n  const result = Object.create(null);\n\n  for (const key in original) {\n    result[key] = original[key];\n  }\n  objects.forEach(function(obj) {\n    for (const key in obj) {\n      result[key] = obj[key];\n    }\n  });\n  return /** @type {T} */ (result);\n}\n\n/**\n * @typedef {object} Renderer\n * @property {(text: string) => void} addText\n * @property {(node: Node) => void} openNode\n * @property {(node: Node) => void} closeNode\n * @property {() => string} value\n */\n\n/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */\n/** @typedef {{walk: (r: Renderer) => void}} Tree */\n/** */\n\nconst SPAN_CLOSE = '</span>';\n\n/**\n * Determines if a node needs to be wrapped in <span>\n *\n * @param {Node} node */\nconst emitsWrappingTags = (node) => {\n  // rarely we can have a sublanguage where language is undefined\n  // TODO: track down why\n  return !!node.scope;\n};\n\n/**\n *\n * @param {string} name\n * @param {{prefix:string}} options\n */\nconst scopeToCSSClass = (name, { prefix }) => {\n  // sub-language\n  if (name.startsWith(\"language:\")) {\n    return name.replace(\"language:\", \"language-\");\n  }\n  // tiered scope: comment.line\n  if (name.includes(\".\")) {\n    const pieces = name.split(\".\");\n    return [\n      `${prefix}${pieces.shift()}`,\n      ...(pieces.map((x, i) => `${x}${\"_\".repeat(i + 1)}`))\n    ].join(\" \");\n  }\n  // simple scope\n  return `${prefix}${name}`;\n};\n\n/** @type {Renderer} */\nclass HTMLRenderer {\n  /**\n   * Creates a new HTMLRenderer\n   *\n   * @param {Tree} parseTree - the parse tree (must support `walk` API)\n   * @param {{classPrefix: string}} options\n   */\n  constructor(parseTree, options) {\n    this.buffer = \"\";\n    this.classPrefix = options.classPrefix;\n    parseTree.walk(this);\n  }\n\n  /**\n   * Adds texts to the output stream\n   *\n   * @param {string} text */\n  addText(text) {\n    this.buffer += escapeHTML(text);\n  }\n\n  /**\n   * Adds a node open to the output stream (if needed)\n   *\n   * @param {Node} node */\n  openNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    const className = scopeToCSSClass(node.scope,\n      { prefix: this.classPrefix });\n    this.span(className);\n  }\n\n  /**\n   * Adds a node close to the output stream (if needed)\n   *\n   * @param {Node} node */\n  closeNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    this.buffer += SPAN_CLOSE;\n  }\n\n  /**\n   * returns the accumulated buffer\n  */\n  value() {\n    return this.buffer;\n  }\n\n  // helpers\n\n  /**\n   * Builds a span element\n   *\n   * @param {string} className */\n  span(className) {\n    this.buffer += `<span class=\"${className}\">`;\n  }\n}\n\n/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */\n/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */\n/** @typedef {import('highlight.js').Emitter} Emitter */\n/**  */\n\n/** @returns {DataNode} */\nconst newNode = (opts = {}) => {\n  /** @type DataNode */\n  const result = { children: [] };\n  Object.assign(result, opts);\n  return result;\n};\n\nclass TokenTree {\n  constructor() {\n    /** @type DataNode */\n    this.rootNode = newNode();\n    this.stack = [this.rootNode];\n  }\n\n  get top() {\n    return this.stack[this.stack.length - 1];\n  }\n\n  get root() { return this.rootNode; }\n\n  /** @param {Node} node */\n  add(node) {\n    this.top.children.push(node);\n  }\n\n  /** @param {string} scope */\n  openNode(scope) {\n    /** @type Node */\n    const node = newNode({ scope });\n    this.add(node);\n    this.stack.push(node);\n  }\n\n  closeNode() {\n    if (this.stack.length > 1) {\n      return this.stack.pop();\n    }\n    // eslint-disable-next-line no-undefined\n    return undefined;\n  }\n\n  closeAllNodes() {\n    while (this.closeNode());\n  }\n\n  toJSON() {\n    return JSON.stringify(this.rootNode, null, 4);\n  }\n\n  /**\n   * @typedef { import(\"./html_renderer\").Renderer } Renderer\n   * @param {Renderer} builder\n   */\n  walk(builder) {\n    // this does not\n    return this.constructor._walk(builder, this.rootNode);\n    // this works\n    // return TokenTree._walk(builder, this.rootNode);\n  }\n\n  /**\n   * @param {Renderer} builder\n   * @param {Node} node\n   */\n  static _walk(builder, node) {\n    if (typeof node === \"string\") {\n      builder.addText(node);\n    } else if (node.children) {\n      builder.openNode(node);\n      node.children.forEach((child) => this._walk(builder, child));\n      builder.closeNode(node);\n    }\n    return builder;\n  }\n\n  /**\n   * @param {Node} node\n   */\n  static _collapse(node) {\n    if (typeof node === \"string\") return;\n    if (!node.children) return;\n\n    if (node.children.every(el => typeof el === \"string\")) {\n      // node.text = node.children.join(\"\");\n      // delete node.children;\n      node.children = [node.children.join(\"\")];\n    } else {\n      node.children.forEach((child) => {\n        TokenTree._collapse(child);\n      });\n    }\n  }\n}\n\n/**\n  Currently this is all private API, but this is the minimal API necessary\n  that an Emitter must implement to fully support the parser.\n\n  Minimal interface:\n\n  - addText(text)\n  - __addSublanguage(emitter, subLanguageName)\n  - startScope(scope)\n  - endScope()\n  - finalize()\n  - toHTML()\n\n*/\n\n/**\n * @implements {Emitter}\n */\nclass TokenTreeEmitter extends TokenTree {\n  /**\n   * @param {*} options\n   */\n  constructor(options) {\n    super();\n    this.options = options;\n  }\n\n  /**\n   * @param {string} text\n   */\n  addText(text) {\n    if (text === \"\") { return; }\n\n    this.add(text);\n  }\n\n  /** @param {string} scope */\n  startScope(scope) {\n    this.openNode(scope);\n  }\n\n  endScope() {\n    this.closeNode();\n  }\n\n  /**\n   * @param {Emitter & {root: DataNode}} emitter\n   * @param {string} name\n   */\n  __addSublanguage(emitter, name) {\n    /** @type DataNode */\n    const node = emitter.root;\n    if (name) node.scope = `language:${name}`;\n\n    this.add(node);\n  }\n\n  toHTML() {\n    const renderer = new HTMLRenderer(this, this.options);\n    return renderer.value();\n  }\n\n  finalize() {\n    this.closeAllNodes();\n    return true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n  if (!re) return null;\n  if (typeof re === \"string\") return re;\n\n  return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n  return concat('(?=', re, ')');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction anyNumberOfTimes(re) {\n  return concat('(?:', re, ')*');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction optional(re) {\n  return concat('(?:', re, ')?');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n  const joined = args.map((x) => source(x)).join(\"\");\n  return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n  const opts = args[args.length - 1];\n\n  if (typeof opts === 'object' && opts.constructor === Object) {\n    args.splice(args.length - 1, 1);\n    return opts;\n  } else {\n    return {};\n  }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n  /** @type { object & {capture?: boolean} }  */\n  const opts = stripOptionsFromArgs(args);\n  const joined = '('\n    + (opts.capture ? \"\" : \"?:\")\n    + args.map((x) => source(x)).join(\"|\") + \")\";\n  return joined;\n}\n\n/**\n * @param {RegExp | string} re\n * @returns {number}\n */\nfunction countMatchGroups(re) {\n  return (new RegExp(re.toString() + '|')).exec('').length - 1;\n}\n\n/**\n * Does lexeme start with a regular expression match at the beginning\n * @param {RegExp} re\n * @param {string} lexeme\n */\nfunction startsWith(re, lexeme) {\n  const match = re && re.exec(lexeme);\n  return match && match.index === 0;\n}\n\n// BACKREF_RE matches an open parenthesis or backreference. To avoid\n// an incorrect parse, it additionally matches the following:\n// - [...] elements, where the meaning of parentheses and escapes change\n// - other escape sequences, so we do not misparse escape sequences as\n//   interesting elements\n// - non-matching or lookahead parentheses, which do not capture. These\n//   follow the '(' with a '?'.\nconst BACKREF_RE = /\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;\n\n// **INTERNAL** Not intended for outside usage\n// join logically computes regexps.join(separator), but fixes the\n// backreferences so they continue to match.\n// it also places each individual regular expression into it's own\n// match group, keeping track of the sequencing of those match groups\n// is currently an exercise for the caller. :-)\n/**\n * @param {(string | RegExp)[]} regexps\n * @param {{joinWith: string}} opts\n * @returns {string}\n */\nfunction _rewriteBackreferences(regexps, { joinWith }) {\n  let numCaptures = 0;\n\n  return regexps.map((regex) => {\n    numCaptures += 1;\n    const offset = numCaptures;\n    let re = source(regex);\n    let out = '';\n\n    while (re.length > 0) {\n      const match = BACKREF_RE.exec(re);\n      if (!match) {\n        out += re;\n        break;\n      }\n      out += re.substring(0, match.index);\n      re = re.substring(match.index + match[0].length);\n      if (match[0][0] === '\\\\' && match[1]) {\n        // Adjust the backreference.\n        out += '\\\\' + String(Number(match[1]) + offset);\n      } else {\n        out += match[0];\n        if (match[0] === '(') {\n          numCaptures++;\n        }\n      }\n    }\n    return out;\n  }).map(re => `(${re})`).join(joinWith);\n}\n\n/** @typedef {import('highlight.js').Mode} Mode */\n/** @typedef {import('highlight.js').ModeCallback} ModeCallback */\n\n// Common regexps\nconst MATCH_NOTHING_RE = /\\b\\B/;\nconst IDENT_RE = '[a-zA-Z]\\\\w*';\nconst UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\nconst NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\nconst C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\nconst BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\nconst RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n/**\n* @param { Partial<Mode> & {binary?: string | RegExp} } opts\n*/\nconst SHEBANG = (opts = {}) => {\n  const beginShebang = /^#![ ]*\\//;\n  if (opts.binary) {\n    opts.begin = concat(\n      beginShebang,\n      /.*\\b/,\n      opts.binary,\n      /\\b.*/);\n  }\n  return inherit$1({\n    scope: 'meta',\n    begin: beginShebang,\n    end: /$/,\n    relevance: 0,\n    /** @type {ModeCallback} */\n    \"on:begin\": (m, resp) => {\n      if (m.index !== 0) resp.ignoreMatch();\n    }\n  }, opts);\n};\n\n// Common modes\nconst BACKSLASH_ESCAPE = {\n  begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n};\nconst APOS_STRING_MODE = {\n  scope: 'string',\n  begin: '\\'',\n  end: '\\'',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst QUOTE_STRING_MODE = {\n  scope: 'string',\n  begin: '\"',\n  end: '\"',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst PHRASAL_WORDS_MODE = {\n  begin: /\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n};\n/**\n * Creates a comment mode\n *\n * @param {string | RegExp} begin\n * @param {string | RegExp} end\n * @param {Mode | {}} [modeOptions]\n * @returns {Partial<Mode>}\n */\nconst COMMENT = function(begin, end, modeOptions = {}) {\n  const mode = inherit$1(\n    {\n      scope: 'comment',\n      begin,\n      end,\n      contains: []\n    },\n    modeOptions\n  );\n  mode.contains.push({\n    scope: 'doctag',\n    // hack to avoid the space from being included. the space is necessary to\n    // match here to prevent the plain text rule below from gobbling up doctags\n    begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)',\n    end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,\n    excludeBegin: true,\n    relevance: 0\n  });\n  const ENGLISH_WORD = either(\n    // list of common 1 and 2 letter words in English\n    \"I\",\n    \"a\",\n    \"is\",\n    \"so\",\n    \"us\",\n    \"to\",\n    \"at\",\n    \"if\",\n    \"in\",\n    \"it\",\n    \"on\",\n    // note: this is not an exhaustive list of contractions, just popular ones\n    /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc\n    /[A-Za-z]+[-][a-z]+/, // `no-way`, etc.\n    /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences\n  );\n  // looking like plain text, more likely to be a comment\n  mode.contains.push(\n    {\n      // TODO: how to include \", (, ) without breaking grammars that use these for\n      // comment delimiters?\n      // begin: /[ ]+([()\"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()\":]?([.][ ]|[ ]|\\))){3}/\n      // ---\n\n      // this tries to find sequences of 3 english words in a row (without any\n      // \"programming\" type syntax) this gives us a strong signal that we've\n      // TRULY found a comment - vs perhaps scanning with the wrong language.\n      // It's possible to find something that LOOKS like the start of the\n      // comment - but then if there is no readable text - good chance it is a\n      // false match and not a comment.\n      //\n      // for a visual example please see:\n      // https://github.com/highlightjs/highlight.js/issues/2827\n\n      begin: concat(\n        /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */\n        '(',\n        ENGLISH_WORD,\n        /[.]?[:]?([.][ ]|[ ])/,\n        '){3}') // look for 3 words in a row\n    }\n  );\n  return mode;\n};\nconst C_LINE_COMMENT_MODE = COMMENT('//', '$');\nconst C_BLOCK_COMMENT_MODE = COMMENT('/\\\\*', '\\\\*/');\nconst HASH_COMMENT_MODE = COMMENT('#', '$');\nconst NUMBER_MODE = {\n  scope: 'number',\n  begin: NUMBER_RE,\n  relevance: 0\n};\nconst C_NUMBER_MODE = {\n  scope: 'number',\n  begin: C_NUMBER_RE,\n  relevance: 0\n};\nconst BINARY_NUMBER_MODE = {\n  scope: 'number',\n  begin: BINARY_NUMBER_RE,\n  relevance: 0\n};\nconst REGEXP_MODE = {\n  scope: \"regexp\",\n  begin: /\\/(?=[^/\\n]*\\/)/,\n  end: /\\/[gimuy]*/,\n  contains: [\n    BACKSLASH_ESCAPE,\n    {\n      begin: /\\[/,\n      end: /\\]/,\n      relevance: 0,\n      contains: [BACKSLASH_ESCAPE]\n    }\n  ]\n};\nconst TITLE_MODE = {\n  scope: 'title',\n  begin: IDENT_RE,\n  relevance: 0\n};\nconst UNDERSCORE_TITLE_MODE = {\n  scope: 'title',\n  begin: UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\nconst METHOD_GUARD = {\n  // excludes method names from keyword processing\n  begin: '\\\\.\\\\s*' + UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\n\n/**\n * Adds end same as begin mechanics to a mode\n *\n * Your mode must include at least a single () match group as that first match\n * group is what is used for comparison\n * @param {Partial<Mode>} mode\n */\nconst END_SAME_AS_BEGIN = function(mode) {\n  return Object.assign(mode,\n    {\n      /** @type {ModeCallback} */\n      'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },\n      /** @type {ModeCallback} */\n      'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }\n    });\n};\n\nvar MODES = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  APOS_STRING_MODE: APOS_STRING_MODE,\n  BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,\n  BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,\n  BINARY_NUMBER_RE: BINARY_NUMBER_RE,\n  COMMENT: COMMENT,\n  C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,\n  C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,\n  C_NUMBER_MODE: C_NUMBER_MODE,\n  C_NUMBER_RE: C_NUMBER_RE,\n  END_SAME_AS_BEGIN: END_SAME_AS_BEGIN,\n  HASH_COMMENT_MODE: HASH_COMMENT_MODE,\n  IDENT_RE: IDENT_RE,\n  MATCH_NOTHING_RE: MATCH_NOTHING_RE,\n  METHOD_GUARD: METHOD_GUARD,\n  NUMBER_MODE: NUMBER_MODE,\n  NUMBER_RE: NUMBER_RE,\n  PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,\n  QUOTE_STRING_MODE: QUOTE_STRING_MODE,\n  REGEXP_MODE: REGEXP_MODE,\n  RE_STARTERS_RE: RE_STARTERS_RE,\n  SHEBANG: SHEBANG,\n  TITLE_MODE: TITLE_MODE,\n  UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,\n  UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE\n});\n\n/**\n@typedef {import('highlight.js').CallbackResponse} CallbackResponse\n@typedef {import('highlight.js').CompilerExt} CompilerExt\n*/\n\n// Grammar extensions / plugins\n// See: https://github.com/highlightjs/highlight.js/issues/2833\n\n// Grammar extensions allow \"syntactic sugar\" to be added to the grammar modes\n// without requiring any underlying changes to the compiler internals.\n\n// `compileMatch` being the perfect small example of now allowing a grammar\n// author to write `match` when they desire to match a single expression rather\n// than being forced to use `begin`.  The extension then just moves `match` into\n// `begin` when it runs.  Ie, no features have been added, but we've just made\n// the experience of writing (and reading grammars) a little bit nicer.\n\n// ------\n\n// TODO: We need negative look-behind support to do this properly\n/**\n * Skip a match if it has a preceding dot\n *\n * This is used for `beginKeywords` to prevent matching expressions such as\n * `bob.keyword.do()`. The mode compiler automatically wires this up as a\n * special _internal_ 'on:begin' callback for modes with `beginKeywords`\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\nfunction skipIfHasPrecedingDot(match, response) {\n  const before = match.input[match.index - 1];\n  if (before === \".\") {\n    response.ignoreMatch();\n  }\n}\n\n/**\n *\n * @type {CompilerExt}\n */\nfunction scopeClassName(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.className !== undefined) {\n    mode.scope = mode.className;\n    delete mode.className;\n  }\n}\n\n/**\n * `beginKeywords` syntactic sugar\n * @type {CompilerExt}\n */\nfunction beginKeywords(mode, parent) {\n  if (!parent) return;\n  if (!mode.beginKeywords) return;\n\n  // for languages with keywords that include non-word characters checking for\n  // a word boundary is not sufficient, so instead we check for a word boundary\n  // or whitespace - this does no harm in any case since our keyword engine\n  // doesn't allow spaces in keywords anyways and we still check for the boundary\n  // first\n  mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\\\.)(?=\\\\b|\\\\s)';\n  mode.__beforeBegin = skipIfHasPrecedingDot;\n  mode.keywords = mode.keywords || mode.beginKeywords;\n  delete mode.beginKeywords;\n\n  // prevents double relevance, the keywords themselves provide\n  // relevance, the mode doesn't need to double it\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 0;\n}\n\n/**\n * Allow `illegal` to contain an array of illegal values\n * @type {CompilerExt}\n */\nfunction compileIllegal(mode, _parent) {\n  if (!Array.isArray(mode.illegal)) return;\n\n  mode.illegal = either(...mode.illegal);\n}\n\n/**\n * `match` to match a single expression for readability\n * @type {CompilerExt}\n */\nfunction compileMatch(mode, _parent) {\n  if (!mode.match) return;\n  if (mode.begin || mode.end) throw new Error(\"begin & end are not supported with match\");\n\n  mode.begin = mode.match;\n  delete mode.match;\n}\n\n/**\n * provides the default 1 relevance to all modes\n * @type {CompilerExt}\n */\nfunction compileRelevance(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 1;\n}\n\n// allow beforeMatch to act as a \"qualifier\" for the match\n// the full match begin must be [beforeMatch][begin]\nconst beforeMatchExt = (mode, parent) => {\n  if (!mode.beforeMatch) return;\n  // starts conflicts with endsParent which we need to make sure the child\n  // rule is not matched multiple times\n  if (mode.starts) throw new Error(\"beforeMatch cannot be used with starts\");\n\n  const originalMode = Object.assign({}, mode);\n  Object.keys(mode).forEach((key) => { delete mode[key]; });\n\n  mode.keywords = originalMode.keywords;\n  mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin));\n  mode.starts = {\n    relevance: 0,\n    contains: [\n      Object.assign(originalMode, { endsParent: true })\n    ]\n  };\n  mode.relevance = 0;\n\n  delete originalMode.beforeMatch;\n};\n\n// keywords that should have no default relevance value\nconst COMMON_KEYWORDS = [\n  'of',\n  'and',\n  'for',\n  'in',\n  'not',\n  'or',\n  'if',\n  'then',\n  'parent', // common variable name\n  'list', // common variable name\n  'value' // common variable name\n];\n\nconst DEFAULT_KEYWORD_SCOPE = \"keyword\";\n\n/**\n * Given raw keywords from a language definition, compile them.\n *\n * @param {string | Record<string,string|string[]> | Array<string>} rawKeywords\n * @param {boolean} caseInsensitive\n */\nfunction compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) {\n  /** @type {import(\"highlight.js/private\").KeywordDict} */\n  const compiledKeywords = Object.create(null);\n\n  // input can be a string of keywords, an array of keywords, or a object with\n  // named keys representing scopeName (which can then point to a string or array)\n  if (typeof rawKeywords === 'string') {\n    compileList(scopeName, rawKeywords.split(\" \"));\n  } else if (Array.isArray(rawKeywords)) {\n    compileList(scopeName, rawKeywords);\n  } else {\n    Object.keys(rawKeywords).forEach(function(scopeName) {\n      // collapse all our objects back into the parent object\n      Object.assign(\n        compiledKeywords,\n        compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName)\n      );\n    });\n  }\n  return compiledKeywords;\n\n  // ---\n\n  /**\n   * Compiles an individual list of keywords\n   *\n   * Ex: \"for if when while|5\"\n   *\n   * @param {string} scopeName\n   * @param {Array<string>} keywordList\n   */\n  function compileList(scopeName, keywordList) {\n    if (caseInsensitive) {\n      keywordList = keywordList.map(x => x.toLowerCase());\n    }\n    keywordList.forEach(function(keyword) {\n      const pair = keyword.split('|');\n      compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])];\n    });\n  }\n}\n\n/**\n * Returns the proper score for a given keyword\n *\n * Also takes into account comment keywords, which will be scored 0 UNLESS\n * another score has been manually assigned.\n * @param {string} keyword\n * @param {string} [providedScore]\n */\nfunction scoreForKeyword(keyword, providedScore) {\n  // manual scores always win over common keywords\n  // so you can force a score of 1 if you really insist\n  if (providedScore) {\n    return Number(providedScore);\n  }\n\n  return commonKeyword(keyword) ? 0 : 1;\n}\n\n/**\n * Determines if a given keyword is common or not\n *\n * @param {string} keyword */\nfunction commonKeyword(keyword) {\n  return COMMON_KEYWORDS.includes(keyword.toLowerCase());\n}\n\n/*\n\nFor the reasoning behind this please see:\nhttps://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419\n\n*/\n\n/**\n * @type {Record<string, boolean>}\n */\nconst seenDeprecations = {};\n\n/**\n * @param {string} message\n */\nconst error = (message) => {\n  console.error(message);\n};\n\n/**\n * @param {string} message\n * @param {any} args\n */\nconst warn = (message, ...args) => {\n  console.log(`WARN: ${message}`, ...args);\n};\n\n/**\n * @param {string} version\n * @param {string} message\n */\nconst deprecated = (version, message) => {\n  if (seenDeprecations[`${version}/${message}`]) return;\n\n  console.log(`Deprecated as of ${version}. ${message}`);\n  seenDeprecations[`${version}/${message}`] = true;\n};\n\n/* eslint-disable no-throw-literal */\n\n/**\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n*/\n\nconst MultiClassError = new Error();\n\n/**\n * Renumbers labeled scope names to account for additional inner match\n * groups that otherwise would break everything.\n *\n * Lets say we 3 match scopes:\n *\n *   { 1 => ..., 2 => ..., 3 => ... }\n *\n * So what we need is a clean match like this:\n *\n *   (a)(b)(c) => [ \"a\", \"b\", \"c\" ]\n *\n * But this falls apart with inner match groups:\n *\n * (a)(((b)))(c) => [\"a\", \"b\", \"b\", \"b\", \"c\" ]\n *\n * Our scopes are now \"out of alignment\" and we're repeating `b` 3 times.\n * What needs to happen is the numbers are remapped:\n *\n *   { 1 => ..., 2 => ..., 5 => ... }\n *\n * We also need to know that the ONLY groups that should be output\n * are 1, 2, and 5.  This function handles this behavior.\n *\n * @param {CompiledMode} mode\n * @param {Array<RegExp | string>} regexes\n * @param {{key: \"beginScope\"|\"endScope\"}} opts\n */\nfunction remapScopeNames(mode, regexes, { key }) {\n  let offset = 0;\n  const scopeNames = mode[key];\n  /** @type Record<number,boolean> */\n  const emit = {};\n  /** @type Record<number,string> */\n  const positions = {};\n\n  for (let i = 1; i <= regexes.length; i++) {\n    positions[i + offset] = scopeNames[i];\n    emit[i + offset] = true;\n    offset += countMatchGroups(regexes[i - 1]);\n  }\n  // we use _emit to keep track of which match groups are \"top-level\" to avoid double\n  // output from inside match groups\n  mode[key] = positions;\n  mode[key]._emit = emit;\n  mode[key]._multi = true;\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction beginMultiClass(mode) {\n  if (!Array.isArray(mode.begin)) return;\n\n  if (mode.skip || mode.excludeBegin || mode.returnBegin) {\n    error(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.beginScope !== \"object\" || mode.beginScope === null) {\n    error(\"beginScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.begin, { key: \"beginScope\" });\n  mode.begin = _rewriteBackreferences(mode.begin, { joinWith: \"\" });\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction endMultiClass(mode) {\n  if (!Array.isArray(mode.end)) return;\n\n  if (mode.skip || mode.excludeEnd || mode.returnEnd) {\n    error(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.endScope !== \"object\" || mode.endScope === null) {\n    error(\"endScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.end, { key: \"endScope\" });\n  mode.end = _rewriteBackreferences(mode.end, { joinWith: \"\" });\n}\n\n/**\n * this exists only to allow `scope: {}` to be used beside `match:`\n * Otherwise `beginScope` would necessary and that would look weird\n\n  {\n    match: [ /def/, /\\w+/ ]\n    scope: { 1: \"keyword\" , 2: \"title\" }\n  }\n\n * @param {CompiledMode} mode\n */\nfunction scopeSugar(mode) {\n  if (mode.scope && typeof mode.scope === \"object\" && mode.scope !== null) {\n    mode.beginScope = mode.scope;\n    delete mode.scope;\n  }\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction MultiClass(mode) {\n  scopeSugar(mode);\n\n  if (typeof mode.beginScope === \"string\") {\n    mode.beginScope = { _wrap: mode.beginScope };\n  }\n  if (typeof mode.endScope === \"string\") {\n    mode.endScope = { _wrap: mode.endScope };\n  }\n\n  beginMultiClass(mode);\n  endMultiClass(mode);\n}\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage\n*/\n\n// compilation\n\n/**\n * Compiles a language definition result\n *\n * Given the raw result of a language definition (Language), compiles this so\n * that it is ready for highlighting code.\n * @param {Language} language\n * @returns {CompiledLanguage}\n */\nfunction compileLanguage(language) {\n  /**\n   * Builds a regex with the case sensitivity of the current language\n   *\n   * @param {RegExp | string} value\n   * @param {boolean} [global]\n   */\n  function langRe(value, global) {\n    return new RegExp(\n      source(value),\n      'm'\n      + (language.case_insensitive ? 'i' : '')\n      + (language.unicodeRegex ? 'u' : '')\n      + (global ? 'g' : '')\n    );\n  }\n\n  /**\n    Stores multiple regular expressions and allows you to quickly search for\n    them all in a string simultaneously - returning the first match.  It does\n    this by creating a huge (a|b|c) regex - each individual item wrapped with ()\n    and joined by `|` - using match groups to track position.  When a match is\n    found checking which position in the array has content allows us to figure\n    out which of the original regexes / match groups triggered the match.\n\n    The match object itself (the result of `Regex.exec`) is returned but also\n    enhanced by merging in any meta-data that was registered with the regex.\n    This is how we keep track of which mode matched, and what type of rule\n    (`illegal`, `begin`, end, etc).\n  */\n  class MultiRegex {\n    constructor() {\n      this.matchIndexes = {};\n      // @ts-ignore\n      this.regexes = [];\n      this.matchAt = 1;\n      this.position = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      opts.position = this.position++;\n      // @ts-ignore\n      this.matchIndexes[this.matchAt] = opts;\n      this.regexes.push([opts, re]);\n      this.matchAt += countMatchGroups(re) + 1;\n    }\n\n    compile() {\n      if (this.regexes.length === 0) {\n        // avoids the need to check length every time exec is called\n        // @ts-ignore\n        this.exec = () => null;\n      }\n      const terminators = this.regexes.map(el => el[1]);\n      this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true);\n      this.lastIndex = 0;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      this.matcherRe.lastIndex = this.lastIndex;\n      const match = this.matcherRe.exec(s);\n      if (!match) { return null; }\n\n      // eslint-disable-next-line no-undefined\n      const i = match.findIndex((el, i) => i > 0 && el !== undefined);\n      // @ts-ignore\n      const matchData = this.matchIndexes[i];\n      // trim off any earlier non-relevant match groups (ie, the other regex\n      // match groups that make up the multi-matcher)\n      match.splice(0, i);\n\n      return Object.assign(match, matchData);\n    }\n  }\n\n  /*\n    Created to solve the key deficiently with MultiRegex - there is no way to\n    test for multiple matches at a single location.  Why would we need to do\n    that?  In the future a more dynamic engine will allow certain matches to be\n    ignored.  An example: if we matched say the 3rd regex in a large group but\n    decided to ignore it - we'd need to started testing again at the 4th\n    regex... but MultiRegex itself gives us no real way to do that.\n\n    So what this class creates MultiRegexs on the fly for whatever search\n    position they are needed.\n\n    NOTE: These additional MultiRegex objects are created dynamically.  For most\n    grammars most of the time we will never actually need anything more than the\n    first MultiRegex - so this shouldn't have too much overhead.\n\n    Say this is our search group, and we match regex3, but wish to ignore it.\n\n      regex1 | regex2 | regex3 | regex4 | regex5    ' ie, startAt = 0\n\n    What we need is a new MultiRegex that only includes the remaining\n    possibilities:\n\n      regex4 | regex5                               ' ie, startAt = 3\n\n    This class wraps all that complexity up in a simple API... `startAt` decides\n    where in the array of expressions to start doing the matching. It\n    auto-increments, so if a match is found at position 2, then startAt will be\n    set to 3.  If the end is reached startAt will return to 0.\n\n    MOST of the time the parser will be setting startAt manually to 0.\n  */\n  class ResumableMultiRegex {\n    constructor() {\n      // @ts-ignore\n      this.rules = [];\n      // @ts-ignore\n      this.multiRegexes = [];\n      this.count = 0;\n\n      this.lastIndex = 0;\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    getMatcher(index) {\n      if (this.multiRegexes[index]) return this.multiRegexes[index];\n\n      const matcher = new MultiRegex();\n      this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));\n      matcher.compile();\n      this.multiRegexes[index] = matcher;\n      return matcher;\n    }\n\n    resumingScanAtSamePosition() {\n      return this.regexIndex !== 0;\n    }\n\n    considerAll() {\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      this.rules.push([re, opts]);\n      if (opts.type === \"begin\") this.count++;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      const m = this.getMatcher(this.regexIndex);\n      m.lastIndex = this.lastIndex;\n      let result = m.exec(s);\n\n      // The following is because we have no easy way to say \"resume scanning at the\n      // existing position but also skip the current rule ONLY\". What happens is\n      // all prior rules are also skipped which can result in matching the wrong\n      // thing. Example of matching \"booger\":\n\n      // our matcher is [string, \"booger\", number]\n      //\n      // ....booger....\n\n      // if \"booger\" is ignored then we'd really need a regex to scan from the\n      // SAME position for only: [string, number] but ignoring \"booger\" (if it\n      // was the first match), a simple resume would scan ahead who knows how\n      // far looking only for \"number\", ignoring potential string matches (or\n      // future \"booger\" matches that might be valid.)\n\n      // So what we do: We execute two matchers, one resuming at the same\n      // position, but the second full matcher starting at the position after:\n\n      //     /--- resume first regex match here (for [number])\n      //     |/---- full match here for [string, \"booger\", number]\n      //     vv\n      // ....booger....\n\n      // Which ever results in a match first is then used. So this 3-4 step\n      // process essentially allows us to say \"match at this position, excluding\n      // a prior rule that was ignored\".\n      //\n      // 1. Match \"booger\" first, ignore. Also proves that [string] does non match.\n      // 2. Resume matching for [number]\n      // 3. Match at index + 1 for [string, \"booger\", number]\n      // 4. If #2 and #3 result in matches, which came first?\n      if (this.resumingScanAtSamePosition()) {\n        if (result && result.index === this.lastIndex) ; else { // use the second matcher result\n          const m2 = this.getMatcher(0);\n          m2.lastIndex = this.lastIndex + 1;\n          result = m2.exec(s);\n        }\n      }\n\n      if (result) {\n        this.regexIndex += result.position + 1;\n        if (this.regexIndex === this.count) {\n          // wrap-around to considering all matches again\n          this.considerAll();\n        }\n      }\n\n      return result;\n    }\n  }\n\n  /**\n   * Given a mode, builds a huge ResumableMultiRegex that can be used to walk\n   * the content and find matches.\n   *\n   * @param {CompiledMode} mode\n   * @returns {ResumableMultiRegex}\n   */\n  function buildModeRegex(mode) {\n    const mm = new ResumableMultiRegex();\n\n    mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: \"begin\" }));\n\n    if (mode.terminatorEnd) {\n      mm.addRule(mode.terminatorEnd, { type: \"end\" });\n    }\n    if (mode.illegal) {\n      mm.addRule(mode.illegal, { type: \"illegal\" });\n    }\n\n    return mm;\n  }\n\n  /** skip vs abort vs ignore\n   *\n   * @skip   - The mode is still entered and exited normally (and contains rules apply),\n   *           but all content is held and added to the parent buffer rather than being\n   *           output when the mode ends.  Mostly used with `sublanguage` to build up\n   *           a single large buffer than can be parsed by sublanguage.\n   *\n   *             - The mode begin ands ends normally.\n   *             - Content matched is added to the parent mode buffer.\n   *             - The parser cursor is moved forward normally.\n   *\n   * @abort  - A hack placeholder until we have ignore.  Aborts the mode (as if it\n   *           never matched) but DOES NOT continue to match subsequent `contains`\n   *           modes.  Abort is bad/suboptimal because it can result in modes\n   *           farther down not getting applied because an earlier rule eats the\n   *           content but then aborts.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is added to the mode buffer.\n   *             - The parser cursor is moved forward accordingly.\n   *\n   * @ignore - Ignores the mode (as if it never matched) and continues to match any\n   *           subsequent `contains` modes.  Ignore isn't technically possible with\n   *           the current parser implementation.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is ignored.\n   *             - The parser cursor is not moved forward.\n   */\n\n  /**\n   * Compiles an individual mode\n   *\n   * This can raise an error if the mode contains certain detectable known logic\n   * issues.\n   * @param {Mode} mode\n   * @param {CompiledMode | null} [parent]\n   * @returns {CompiledMode | never}\n   */\n  function compileMode(mode, parent) {\n    const cmode = /** @type CompiledMode */ (mode);\n    if (mode.isCompiled) return cmode;\n\n    [\n      scopeClassName,\n      // do this early so compiler extensions generally don't have to worry about\n      // the distinction between match/begin\n      compileMatch,\n      MultiClass,\n      beforeMatchExt\n    ].forEach(ext => ext(mode, parent));\n\n    language.compilerExtensions.forEach(ext => ext(mode, parent));\n\n    // __beforeBegin is considered private API, internal use only\n    mode.__beforeBegin = null;\n\n    [\n      beginKeywords,\n      // do this later so compiler extensions that come earlier have access to the\n      // raw array if they wanted to perhaps manipulate it, etc.\n      compileIllegal,\n      // default to 1 relevance if not specified\n      compileRelevance\n    ].forEach(ext => ext(mode, parent));\n\n    mode.isCompiled = true;\n\n    let keywordPattern = null;\n    if (typeof mode.keywords === \"object\" && mode.keywords.$pattern) {\n      // we need a copy because keywords might be compiled multiple times\n      // so we can't go deleting $pattern from the original on the first\n      // pass\n      mode.keywords = Object.assign({}, mode.keywords);\n      keywordPattern = mode.keywords.$pattern;\n      delete mode.keywords.$pattern;\n    }\n    keywordPattern = keywordPattern || /\\w+/;\n\n    if (mode.keywords) {\n      mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);\n    }\n\n    cmode.keywordPatternRe = langRe(keywordPattern, true);\n\n    if (parent) {\n      if (!mode.begin) mode.begin = /\\B|\\b/;\n      cmode.beginRe = langRe(cmode.begin);\n      if (!mode.end && !mode.endsWithParent) mode.end = /\\B|\\b/;\n      if (mode.end) cmode.endRe = langRe(cmode.end);\n      cmode.terminatorEnd = source(cmode.end) || '';\n      if (mode.endsWithParent && parent.terminatorEnd) {\n        cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;\n      }\n    }\n    if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));\n    if (!mode.contains) mode.contains = [];\n\n    mode.contains = [].concat(...mode.contains.map(function(c) {\n      return expandOrCloneMode(c === 'self' ? mode : c);\n    }));\n    mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });\n\n    if (mode.starts) {\n      compileMode(mode.starts, parent);\n    }\n\n    cmode.matcher = buildModeRegex(cmode);\n    return cmode;\n  }\n\n  if (!language.compilerExtensions) language.compilerExtensions = [];\n\n  // self is not valid at the top-level\n  if (language.contains && language.contains.includes('self')) {\n    throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");\n  }\n\n  // we need a null object, which inherit will guarantee\n  language.classNameAliases = inherit$1(language.classNameAliases || {});\n\n  return compileMode(/** @type Mode */ (language));\n}\n\n/**\n * Determines if a mode has a dependency on it's parent or not\n *\n * If a mode does have a parent dependency then often we need to clone it if\n * it's used in multiple places so that each copy points to the correct parent,\n * where-as modes without a parent can often safely be re-used at the bottom of\n * a mode chain.\n *\n * @param {Mode | null} mode\n * @returns {boolean} - is there a dependency on the parent?\n * */\nfunction dependencyOnParent(mode) {\n  if (!mode) return false;\n\n  return mode.endsWithParent || dependencyOnParent(mode.starts);\n}\n\n/**\n * Expands a mode or clones it if necessary\n *\n * This is necessary for modes with parental dependenceis (see notes on\n * `dependencyOnParent`) and for nodes that have `variants` - which must then be\n * exploded into their own individual modes at compile time.\n *\n * @param {Mode} mode\n * @returns {Mode | Mode[]}\n * */\nfunction expandOrCloneMode(mode) {\n  if (mode.variants && !mode.cachedVariants) {\n    mode.cachedVariants = mode.variants.map(function(variant) {\n      return inherit$1(mode, { variants: null }, variant);\n    });\n  }\n\n  // EXPAND\n  // if we have variants then essentially \"replace\" the mode with the variants\n  // this happens in compileMode, where this function is called from\n  if (mode.cachedVariants) {\n    return mode.cachedVariants;\n  }\n\n  // CLONE\n  // if we have dependencies on parents then we need a unique\n  // instance of ourselves, so we can be reused with many\n  // different parents without issue\n  if (dependencyOnParent(mode)) {\n    return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null });\n  }\n\n  if (Object.isFrozen(mode)) {\n    return inherit$1(mode);\n  }\n\n  // no special dependency issues, just return ourselves\n  return mode;\n}\n\nvar version = \"11.11.1\";\n\nclass HTMLInjectionError extends Error {\n  constructor(reason, html) {\n    super(reason);\n    this.name = \"HTMLInjectionError\";\n    this.html = html;\n  }\n}\n\n/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').CompiledScope} CompiledScope\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSApi} HLJSApi\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').PluginEvent} PluginEvent\n@typedef {import('highlight.js').HLJSOptions} HLJSOptions\n@typedef {import('highlight.js').LanguageFn} LanguageFn\n@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement\n@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext\n@typedef {import('highlight.js/private').MatchType} MatchType\n@typedef {import('highlight.js/private').KeywordData} KeywordData\n@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch\n@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError\n@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult\n@typedef {import('highlight.js').HighlightOptions} HighlightOptions\n@typedef {import('highlight.js').HighlightResult} HighlightResult\n*/\n\n\nconst escape = escapeHTML;\nconst inherit = inherit$1;\nconst NO_MATCH = Symbol(\"nomatch\");\nconst MAX_KEYWORD_HITS = 7;\n\n/**\n * @param {any} hljs - object that is extended (legacy)\n * @returns {HLJSApi}\n */\nconst HLJS = function(hljs) {\n  // Global internal variables used within the highlight.js library.\n  /** @type {Record<string, Language>} */\n  const languages = Object.create(null);\n  /** @type {Record<string, string>} */\n  const aliases = Object.create(null);\n  /** @type {HLJSPlugin[]} */\n  const plugins = [];\n\n  // safe/production mode - swallows more errors, tries to keep running\n  // even if a single syntax or parse hits a fatal error\n  let SAFE_MODE = true;\n  const LANGUAGE_NOT_FOUND = \"Could not find the language '{}', did you forget to load/include a language module?\";\n  /** @type {Language} */\n  const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };\n\n  // Global options used when within external APIs. This is modified when\n  // calling the `hljs.configure` function.\n  /** @type HLJSOptions */\n  let options = {\n    ignoreUnescapedHTML: false,\n    throwUnescapedHTML: false,\n    noHighlightRe: /^(no-?highlight)$/i,\n    languageDetectRe: /\\blang(?:uage)?-([\\w-]+)\\b/i,\n    classPrefix: 'hljs-',\n    cssSelector: 'pre code',\n    languages: null,\n    // beta configuration options, subject to change, welcome to discuss\n    // https://github.com/highlightjs/highlight.js/issues/1086\n    __emitter: TokenTreeEmitter\n  };\n\n  /* Utility functions */\n\n  /**\n   * Tests a language name to see if highlighting should be skipped\n   * @param {string} languageName\n   */\n  function shouldNotHighlight(languageName) {\n    return options.noHighlightRe.test(languageName);\n  }\n\n  /**\n   * @param {HighlightedHTMLElement} block - the HTML element to determine language for\n   */\n  function blockLanguage(block) {\n    let classes = block.className + ' ';\n\n    classes += block.parentNode ? block.parentNode.className : '';\n\n    // language-* takes precedence over non-prefixed class names.\n    const match = options.languageDetectRe.exec(classes);\n    if (match) {\n      const language = getLanguage(match[1]);\n      if (!language) {\n        warn(LANGUAGE_NOT_FOUND.replace(\"{}\", match[1]));\n        warn(\"Falling back to no-highlight mode for this block.\", block);\n      }\n      return language ? match[1] : 'no-highlight';\n    }\n\n    return classes\n      .split(/\\s+/)\n      .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));\n  }\n\n  /**\n   * Core highlighting function.\n   *\n   * OLD API\n   * highlight(lang, code, ignoreIllegals, continuation)\n   *\n   * NEW API\n   * highlight(code, {lang, ignoreIllegals})\n   *\n   * @param {string} codeOrLanguageName - the language to use for highlighting\n   * @param {string | HighlightOptions} optionsOrCode - the code to highlight\n   * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   *\n   * @returns {HighlightResult} Result - an object that represents the result\n   * @property {string} language - the language name\n   * @property {number} relevance - the relevance score\n   * @property {string} value - the highlighted HTML code\n   * @property {string} code - the original raw code\n   * @property {CompiledMode} top - top of the current mode stack\n   * @property {boolean} illegal - indicates whether any illegal matches were found\n  */\n  function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) {\n    let code = \"\";\n    let languageName = \"\";\n    if (typeof optionsOrCode === \"object\") {\n      code = codeOrLanguageName;\n      ignoreIllegals = optionsOrCode.ignoreIllegals;\n      languageName = optionsOrCode.language;\n    } else {\n      // old API\n      deprecated(\"10.7.0\", \"highlight(lang, code, ...args) has been deprecated.\");\n      deprecated(\"10.7.0\", \"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\");\n      languageName = codeOrLanguageName;\n      code = optionsOrCode;\n    }\n\n    // https://github.com/highlightjs/highlight.js/issues/3149\n    // eslint-disable-next-line no-undefined\n    if (ignoreIllegals === undefined) { ignoreIllegals = true; }\n\n    /** @type {BeforeHighlightContext} */\n    const context = {\n      code,\n      language: languageName\n    };\n    // the plugin can change the desired language or the code to be highlighted\n    // just be changing the object it was passed\n    fire(\"before:highlight\", context);\n\n    // a before plugin can usurp the result completely by providing it's own\n    // in which case we don't even need to call highlight\n    const result = context.result\n      ? context.result\n      : _highlight(context.language, context.code, ignoreIllegals);\n\n    result.code = context.code;\n    // the plugin can change anything in result to suite it\n    fire(\"after:highlight\", result);\n\n    return result;\n  }\n\n  /**\n   * private highlight that's used internally and does not fire callbacks\n   *\n   * @param {string} languageName - the language to use for highlighting\n   * @param {string} codeToHighlight - the code to highlight\n   * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   * @param {CompiledMode?} [continuation] - current continuation mode, if any\n   * @returns {HighlightResult} - result of the highlight operation\n  */\n  function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {\n    const keywordHits = Object.create(null);\n\n    /**\n     * Return keyword data if a match is a keyword\n     * @param {CompiledMode} mode - current mode\n     * @param {string} matchText - the textual match\n     * @returns {KeywordData | false}\n     */\n    function keywordData(mode, matchText) {\n      return mode.keywords[matchText];\n    }\n\n    function processKeywords() {\n      if (!top.keywords) {\n        emitter.addText(modeBuffer);\n        return;\n      }\n\n      let lastIndex = 0;\n      top.keywordPatternRe.lastIndex = 0;\n      let match = top.keywordPatternRe.exec(modeBuffer);\n      let buf = \"\";\n\n      while (match) {\n        buf += modeBuffer.substring(lastIndex, match.index);\n        const word = language.case_insensitive ? match[0].toLowerCase() : match[0];\n        const data = keywordData(top, word);\n        if (data) {\n          const [kind, keywordRelevance] = data;\n          emitter.addText(buf);\n          buf = \"\";\n\n          keywordHits[word] = (keywordHits[word] || 0) + 1;\n          if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance;\n          if (kind.startsWith(\"_\")) {\n            // _ implied for relevance only, do not highlight\n            // by applying a class name\n            buf += match[0];\n          } else {\n            const cssClass = language.classNameAliases[kind] || kind;\n            emitKeyword(match[0], cssClass);\n          }\n        } else {\n          buf += match[0];\n        }\n        lastIndex = top.keywordPatternRe.lastIndex;\n        match = top.keywordPatternRe.exec(modeBuffer);\n      }\n      buf += modeBuffer.substring(lastIndex);\n      emitter.addText(buf);\n    }\n\n    function processSubLanguage() {\n      if (modeBuffer === \"\") return;\n      /** @type HighlightResult */\n      let result = null;\n\n      if (typeof top.subLanguage === 'string') {\n        if (!languages[top.subLanguage]) {\n          emitter.addText(modeBuffer);\n          return;\n        }\n        result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);\n        continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);\n      } else {\n        result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);\n      }\n\n      // Counting embedded language score towards the host language may be disabled\n      // with zeroing the containing mode relevance. Use case in point is Markdown that\n      // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n      // score.\n      if (top.relevance > 0) {\n        relevance += result.relevance;\n      }\n      emitter.__addSublanguage(result._emitter, result.language);\n    }\n\n    function processBuffer() {\n      if (top.subLanguage != null) {\n        processSubLanguage();\n      } else {\n        processKeywords();\n      }\n      modeBuffer = '';\n    }\n\n    /**\n     * @param {string} text\n     * @param {string} scope\n     */\n    function emitKeyword(keyword, scope) {\n      if (keyword === \"\") return;\n\n      emitter.startScope(scope);\n      emitter.addText(keyword);\n      emitter.endScope();\n    }\n\n    /**\n     * @param {CompiledScope} scope\n     * @param {RegExpMatchArray} match\n     */\n    function emitMultiClass(scope, match) {\n      let i = 1;\n      const max = match.length - 1;\n      while (i <= max) {\n        if (!scope._emit[i]) { i++; continue; }\n        const klass = language.classNameAliases[scope[i]] || scope[i];\n        const text = match[i];\n        if (klass) {\n          emitKeyword(text, klass);\n        } else {\n          modeBuffer = text;\n          processKeywords();\n          modeBuffer = \"\";\n        }\n        i++;\n      }\n    }\n\n    /**\n     * @param {CompiledMode} mode - new mode to start\n     * @param {RegExpMatchArray} match\n     */\n    function startNewMode(mode, match) {\n      if (mode.scope && typeof mode.scope === \"string\") {\n        emitter.openNode(language.classNameAliases[mode.scope] || mode.scope);\n      }\n      if (mode.beginScope) {\n        // beginScope just wraps the begin match itself in a scope\n        if (mode.beginScope._wrap) {\n          emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap);\n          modeBuffer = \"\";\n        } else if (mode.beginScope._multi) {\n          // at this point modeBuffer should just be the match\n          emitMultiClass(mode.beginScope, match);\n          modeBuffer = \"\";\n        }\n      }\n\n      top = Object.create(mode, { parent: { value: top } });\n      return top;\n    }\n\n    /**\n     * @param {CompiledMode } mode - the mode to potentially end\n     * @param {RegExpMatchArray} match - the latest match\n     * @param {string} matchPlusRemainder - match plus remainder of content\n     * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode\n     */\n    function endOfMode(mode, match, matchPlusRemainder) {\n      let matched = startsWith(mode.endRe, matchPlusRemainder);\n\n      if (matched) {\n        if (mode[\"on:end\"]) {\n          const resp = new Response(mode);\n          mode[\"on:end\"](match, resp);\n          if (resp.isMatchIgnored) matched = false;\n        }\n\n        if (matched) {\n          while (mode.endsParent && mode.parent) {\n            mode = mode.parent;\n          }\n          return mode;\n        }\n      }\n      // even if on:end fires an `ignore` it's still possible\n      // that we might trigger the end node because of a parent mode\n      if (mode.endsWithParent) {\n        return endOfMode(mode.parent, match, matchPlusRemainder);\n      }\n    }\n\n    /**\n     * Handle matching but then ignoring a sequence of text\n     *\n     * @param {string} lexeme - string containing full match text\n     */\n    function doIgnore(lexeme) {\n      if (top.matcher.regexIndex === 0) {\n        // no more regexes to potentially match here, so we move the cursor forward one\n        // space\n        modeBuffer += lexeme[0];\n        return 1;\n      } else {\n        // no need to move the cursor, we still have additional regexes to try and\n        // match at this very spot\n        resumeScanAtSamePosition = true;\n        return 0;\n      }\n    }\n\n    /**\n     * Handle the start of a new potential mode match\n     *\n     * @param {EnhancedMatch} match - the current match\n     * @returns {number} how far to advance the parse cursor\n     */\n    function doBeginMatch(match) {\n      const lexeme = match[0];\n      const newMode = match.rule;\n\n      const resp = new Response(newMode);\n      // first internal before callbacks, then the public ones\n      const beforeCallbacks = [newMode.__beforeBegin, newMode[\"on:begin\"]];\n      for (const cb of beforeCallbacks) {\n        if (!cb) continue;\n        cb(match, resp);\n        if (resp.isMatchIgnored) return doIgnore(lexeme);\n      }\n\n      if (newMode.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (newMode.excludeBegin) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (!newMode.returnBegin && !newMode.excludeBegin) {\n          modeBuffer = lexeme;\n        }\n      }\n      startNewMode(newMode, match);\n      return newMode.returnBegin ? 0 : lexeme.length;\n    }\n\n    /**\n     * Handle the potential end of mode\n     *\n     * @param {RegExpMatchArray} match - the current match\n     */\n    function doEndMatch(match) {\n      const lexeme = match[0];\n      const matchPlusRemainder = codeToHighlight.substring(match.index);\n\n      const endMode = endOfMode(top, match, matchPlusRemainder);\n      if (!endMode) { return NO_MATCH; }\n\n      const origin = top;\n      if (top.endScope && top.endScope._wrap) {\n        processBuffer();\n        emitKeyword(lexeme, top.endScope._wrap);\n      } else if (top.endScope && top.endScope._multi) {\n        processBuffer();\n        emitMultiClass(top.endScope, match);\n      } else if (origin.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (!(origin.returnEnd || origin.excludeEnd)) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (origin.excludeEnd) {\n          modeBuffer = lexeme;\n        }\n      }\n      do {\n        if (top.scope) {\n          emitter.closeNode();\n        }\n        if (!top.skip && !top.subLanguage) {\n          relevance += top.relevance;\n        }\n        top = top.parent;\n      } while (top !== endMode.parent);\n      if (endMode.starts) {\n        startNewMode(endMode.starts, match);\n      }\n      return origin.returnEnd ? 0 : lexeme.length;\n    }\n\n    function processContinuations() {\n      const list = [];\n      for (let current = top; current !== language; current = current.parent) {\n        if (current.scope) {\n          list.unshift(current.scope);\n        }\n      }\n      list.forEach(item => emitter.openNode(item));\n    }\n\n    /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */\n    let lastMatch = {};\n\n    /**\n     *  Process an individual match\n     *\n     * @param {string} textBeforeMatch - text preceding the match (since the last match)\n     * @param {EnhancedMatch} [match] - the match itself\n     */\n    function processLexeme(textBeforeMatch, match) {\n      const lexeme = match && match[0];\n\n      // add non-matched text to the current mode buffer\n      modeBuffer += textBeforeMatch;\n\n      if (lexeme == null) {\n        processBuffer();\n        return 0;\n      }\n\n      // we've found a 0 width match and we're stuck, so we need to advance\n      // this happens when we have badly behaved rules that have optional matchers to the degree that\n      // sometimes they can end up matching nothing at all\n      // Ref: https://github.com/highlightjs/highlight.js/issues/2140\n      if (lastMatch.type === \"begin\" && match.type === \"end\" && lastMatch.index === match.index && lexeme === \"\") {\n        // spit the \"skipped\" character that our regex choked on back into the output sequence\n        modeBuffer += codeToHighlight.slice(match.index, match.index + 1);\n        if (!SAFE_MODE) {\n          /** @type {AnnotatedError} */\n          const err = new Error(`0 width match regex (${languageName})`);\n          err.languageName = languageName;\n          err.badRule = lastMatch.rule;\n          throw err;\n        }\n        return 1;\n      }\n      lastMatch = match;\n\n      if (match.type === \"begin\") {\n        return doBeginMatch(match);\n      } else if (match.type === \"illegal\" && !ignoreIllegals) {\n        // illegal match, we do not continue processing\n        /** @type {AnnotatedError} */\n        const err = new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.scope || '<unnamed>') + '\"');\n        err.mode = top;\n        throw err;\n      } else if (match.type === \"end\") {\n        const processed = doEndMatch(match);\n        if (processed !== NO_MATCH) {\n          return processed;\n        }\n      }\n\n      // edge case for when illegal matches $ (end of line) which is technically\n      // a 0 width match but not a begin/end match so it's not caught by the\n      // first handler (when ignoreIllegals is true)\n      if (match.type === \"illegal\" && lexeme === \"\") {\n        // advance so we aren't stuck in an infinite loop\n        modeBuffer += \"\\n\";\n        return 1;\n      }\n\n      // infinite loops are BAD, this is a last ditch catch all. if we have a\n      // decent number of iterations yet our index (cursor position in our\n      // parsing) still 3x behind our index then something is very wrong\n      // so we bail\n      if (iterations > 100000 && iterations > match.index * 3) {\n        const err = new Error('potential infinite loop, way more iterations than matches');\n        throw err;\n      }\n\n      /*\n      Why might be find ourselves here?  An potential end match that was\n      triggered but could not be completed.  IE, `doEndMatch` returned NO_MATCH.\n      (this could be because a callback requests the match be ignored, etc)\n\n      This causes no real harm other than stopping a few times too many.\n      */\n\n      modeBuffer += lexeme;\n      return lexeme.length;\n    }\n\n    const language = getLanguage(languageName);\n    if (!language) {\n      error(LANGUAGE_NOT_FOUND.replace(\"{}\", languageName));\n      throw new Error('Unknown language: \"' + languageName + '\"');\n    }\n\n    const md = compileLanguage(language);\n    let result = '';\n    /** @type {CompiledMode} */\n    let top = continuation || md;\n    /** @type Record<string,CompiledMode> */\n    const continuations = {}; // keep continuations for sub-languages\n    const emitter = new options.__emitter(options);\n    processContinuations();\n    let modeBuffer = '';\n    let relevance = 0;\n    let index = 0;\n    let iterations = 0;\n    let resumeScanAtSamePosition = false;\n\n    try {\n      if (!language.__emitTokens) {\n        top.matcher.considerAll();\n\n        for (;;) {\n          iterations++;\n          if (resumeScanAtSamePosition) {\n            // only regexes not matched previously will now be\n            // considered for a potential match\n            resumeScanAtSamePosition = false;\n          } else {\n            top.matcher.considerAll();\n          }\n          top.matcher.lastIndex = index;\n\n          const match = top.matcher.exec(codeToHighlight);\n          // console.log(\"match\", match[0], match.rule && match.rule.begin)\n\n          if (!match) break;\n\n          const beforeMatch = codeToHighlight.substring(index, match.index);\n          const processedCount = processLexeme(beforeMatch, match);\n          index = match.index + processedCount;\n        }\n        processLexeme(codeToHighlight.substring(index));\n      } else {\n        language.__emitTokens(codeToHighlight, emitter);\n      }\n\n      emitter.finalize();\n      result = emitter.toHTML();\n\n      return {\n        language: languageName,\n        value: result,\n        relevance,\n        illegal: false,\n        _emitter: emitter,\n        _top: top\n      };\n    } catch (err) {\n      if (err.message && err.message.includes('Illegal')) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: true,\n          relevance: 0,\n          _illegalBy: {\n            message: err.message,\n            index,\n            context: codeToHighlight.slice(index - 100, index + 100),\n            mode: err.mode,\n            resultSoFar: result\n          },\n          _emitter: emitter\n        };\n      } else if (SAFE_MODE) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: false,\n          relevance: 0,\n          errorRaised: err,\n          _emitter: emitter,\n          _top: top\n        };\n      } else {\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * returns a valid highlight result, without actually doing any actual work,\n   * auto highlight starts with this and it's possible for small snippets that\n   * auto-detection may not find a better match\n   * @param {string} code\n   * @returns {HighlightResult}\n   */\n  function justTextHighlightResult(code) {\n    const result = {\n      value: escape(code),\n      illegal: false,\n      relevance: 0,\n      _top: PLAINTEXT_LANGUAGE,\n      _emitter: new options.__emitter(options)\n    };\n    result._emitter.addText(code);\n    return result;\n  }\n\n  /**\n  Highlighting with language detection. Accepts a string with the code to\n  highlight. Returns an object with the following properties:\n\n  - language (detected language)\n  - relevance (int)\n  - value (an HTML string with highlighting markup)\n  - secondBest (object with the same structure for second-best heuristically\n    detected language, may be absent)\n\n    @param {string} code\n    @param {Array<string>} [languageSubset]\n    @returns {AutoHighlightResult}\n  */\n  function highlightAuto(code, languageSubset) {\n    languageSubset = languageSubset || options.languages || Object.keys(languages);\n    const plaintext = justTextHighlightResult(code);\n\n    const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>\n      _highlight(name, code, false)\n    );\n    results.unshift(plaintext); // plaintext is always an option\n\n    const sorted = results.sort((a, b) => {\n      // sort base on relevance\n      if (a.relevance !== b.relevance) return b.relevance - a.relevance;\n\n      // always award the tie to the base language\n      // ie if C++ and Arduino are tied, it's more likely to be C++\n      if (a.language && b.language) {\n        if (getLanguage(a.language).supersetOf === b.language) {\n          return 1;\n        } else if (getLanguage(b.language).supersetOf === a.language) {\n          return -1;\n        }\n      }\n\n      // otherwise say they are equal, which has the effect of sorting on\n      // relevance while preserving the original ordering - which is how ties\n      // have historically been settled, ie the language that comes first always\n      // wins in the case of a tie\n      return 0;\n    });\n\n    const [best, secondBest] = sorted;\n\n    /** @type {AutoHighlightResult} */\n    const result = best;\n    result.secondBest = secondBest;\n\n    return result;\n  }\n\n  /**\n   * Builds new class name for block given the language name\n   *\n   * @param {HTMLElement} element\n   * @param {string} [currentLang]\n   * @param {string} [resultLang]\n   */\n  function updateClassName(element, currentLang, resultLang) {\n    const language = (currentLang && aliases[currentLang]) || resultLang;\n\n    element.classList.add(\"hljs\");\n    element.classList.add(`language-${language}`);\n  }\n\n  /**\n   * Applies highlighting to a DOM node containing code.\n   *\n   * @param {HighlightedHTMLElement} element - the HTML element to highlight\n  */\n  function highlightElement(element) {\n    /** @type HTMLElement */\n    let node = null;\n    const language = blockLanguage(element);\n\n    if (shouldNotHighlight(language)) return;\n\n    fire(\"before:highlightElement\",\n      { el: element, language });\n\n    if (element.dataset.highlighted) {\n      console.log(\"Element previously highlighted. To highlight again, first unset `dataset.highlighted`.\", element);\n      return;\n    }\n\n    // we should be all text, no child nodes (unescaped HTML) - this is possibly\n    // an HTML injection attack - it's likely too late if this is already in\n    // production (the code has likely already done its damage by the time\n    // we're seeing it)... but we yell loudly about this so that hopefully it's\n    // more likely to be caught in development before making it to production\n    if (element.children.length > 0) {\n      if (!options.ignoreUnescapedHTML) {\n        console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\");\n        console.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\");\n        console.warn(\"The element with unescaped HTML:\");\n        console.warn(element);\n      }\n      if (options.throwUnescapedHTML) {\n        const err = new HTMLInjectionError(\n          \"One of your code blocks includes unescaped HTML.\",\n          element.innerHTML\n        );\n        throw err;\n      }\n    }\n\n    node = element;\n    const text = node.textContent;\n    const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);\n\n    element.innerHTML = result.value;\n    element.dataset.highlighted = \"yes\";\n    updateClassName(element, language, result.language);\n    element.result = {\n      language: result.language,\n      // TODO: remove with version 11.0\n      re: result.relevance,\n      relevance: result.relevance\n    };\n    if (result.secondBest) {\n      element.secondBest = {\n        language: result.secondBest.language,\n        relevance: result.secondBest.relevance\n      };\n    }\n\n    fire(\"after:highlightElement\", { el: element, result, text });\n  }\n\n  /**\n   * Updates highlight.js global options with the passed options\n   *\n   * @param {Partial<HLJSOptions>} userOptions\n   */\n  function configure(userOptions) {\n    options = inherit(options, userOptions);\n  }\n\n  // TODO: remove v12, deprecated\n  const initHighlighting = () => {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlighting() deprecated.  Use highlightAll() now.\");\n  };\n\n  // TODO: remove v12, deprecated\n  function initHighlightingOnLoad() {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlightingOnLoad() deprecated.  Use highlightAll() now.\");\n  }\n\n  let wantsHighlight = false;\n\n  /**\n   * auto-highlights all pre>code elements on the page\n   */\n  function highlightAll() {\n    function boot() {\n      // if a highlight was requested before DOM was loaded, do now\n      highlightAll();\n    }\n\n    // if we are called too early in the loading process\n    if (document.readyState === \"loading\") {\n      // make sure the event listener is only added once\n      if (!wantsHighlight) {\n        window.addEventListener('DOMContentLoaded', boot, false);\n      }\n      wantsHighlight = true;\n      return;\n    }\n\n    const blocks = document.querySelectorAll(options.cssSelector);\n    blocks.forEach(highlightElement);\n  }\n\n  /**\n   * Register a language grammar module\n   *\n   * @param {string} languageName\n   * @param {LanguageFn} languageDefinition\n   */\n  function registerLanguage(languageName, languageDefinition) {\n    let lang = null;\n    try {\n      lang = languageDefinition(hljs);\n    } catch (error$1) {\n      error(\"Language definition for '{}' could not be registered.\".replace(\"{}\", languageName));\n      // hard or soft error\n      if (!SAFE_MODE) { throw error$1; } else { error(error$1); }\n      // languages that have serious errors are replaced with essentially a\n      // \"plaintext\" stand-in so that the code blocks will still get normal\n      // css classes applied to them - and one bad language won't break the\n      // entire highlighter\n      lang = PLAINTEXT_LANGUAGE;\n    }\n    // give it a temporary name if it doesn't have one in the meta-data\n    if (!lang.name) lang.name = languageName;\n    languages[languageName] = lang;\n    lang.rawDefinition = languageDefinition.bind(null, hljs);\n\n    if (lang.aliases) {\n      registerAliases(lang.aliases, { languageName });\n    }\n  }\n\n  /**\n   * Remove a language grammar module\n   *\n   * @param {string} languageName\n   */\n  function unregisterLanguage(languageName) {\n    delete languages[languageName];\n    for (const alias of Object.keys(aliases)) {\n      if (aliases[alias] === languageName) {\n        delete aliases[alias];\n      }\n    }\n  }\n\n  /**\n   * @returns {string[]} List of language internal names\n   */\n  function listLanguages() {\n    return Object.keys(languages);\n  }\n\n  /**\n   * @param {string} name - name of the language to retrieve\n   * @returns {Language | undefined}\n   */\n  function getLanguage(name) {\n    name = (name || '').toLowerCase();\n    return languages[name] || languages[aliases[name]];\n  }\n\n  /**\n   *\n   * @param {string|string[]} aliasList - single alias or list of aliases\n   * @param {{languageName: string}} opts\n   */\n  function registerAliases(aliasList, { languageName }) {\n    if (typeof aliasList === 'string') {\n      aliasList = [aliasList];\n    }\n    aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });\n  }\n\n  /**\n   * Determines if a given language has auto-detection enabled\n   * @param {string} name - name of the language\n   */\n  function autoDetection(name) {\n    const lang = getLanguage(name);\n    return lang && !lang.disableAutodetect;\n  }\n\n  /**\n   * Upgrades the old highlightBlock plugins to the new\n   * highlightElement API\n   * @param {HLJSPlugin} plugin\n   */\n  function upgradePluginAPI(plugin) {\n    // TODO: remove with v12\n    if (plugin[\"before:highlightBlock\"] && !plugin[\"before:highlightElement\"]) {\n      plugin[\"before:highlightElement\"] = (data) => {\n        plugin[\"before:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n    if (plugin[\"after:highlightBlock\"] && !plugin[\"after:highlightElement\"]) {\n      plugin[\"after:highlightElement\"] = (data) => {\n        plugin[\"after:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function addPlugin(plugin) {\n    upgradePluginAPI(plugin);\n    plugins.push(plugin);\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function removePlugin(plugin) {\n    const index = plugins.indexOf(plugin);\n    if (index !== -1) {\n      plugins.splice(index, 1);\n    }\n  }\n\n  /**\n   *\n   * @param {PluginEvent} event\n   * @param {any} args\n   */\n  function fire(event, args) {\n    const cb = event;\n    plugins.forEach(function(plugin) {\n      if (plugin[cb]) {\n        plugin[cb](args);\n      }\n    });\n  }\n\n  /**\n   * DEPRECATED\n   * @param {HighlightedHTMLElement} el\n   */\n  function deprecateHighlightBlock(el) {\n    deprecated(\"10.7.0\", \"highlightBlock will be removed entirely in v12.0\");\n    deprecated(\"10.7.0\", \"Please use highlightElement now.\");\n\n    return highlightElement(el);\n  }\n\n  /* Interface definition */\n  Object.assign(hljs, {\n    highlight,\n    highlightAuto,\n    highlightAll,\n    highlightElement,\n    // TODO: Remove with v12 API\n    highlightBlock: deprecateHighlightBlock,\n    configure,\n    initHighlighting,\n    initHighlightingOnLoad,\n    registerLanguage,\n    unregisterLanguage,\n    listLanguages,\n    getLanguage,\n    registerAliases,\n    autoDetection,\n    inherit,\n    addPlugin,\n    removePlugin\n  });\n\n  hljs.debugMode = function() { SAFE_MODE = false; };\n  hljs.safeMode = function() { SAFE_MODE = true; };\n  hljs.versionString = version;\n\n  hljs.regex = {\n    concat: concat,\n    lookahead: lookahead,\n    either: either,\n    optional: optional,\n    anyNumberOfTimes: anyNumberOfTimes\n  };\n\n  for (const key in MODES) {\n    // @ts-ignore\n    if (typeof MODES[key] === \"object\") {\n      // @ts-ignore\n      deepFreeze(MODES[key]);\n    }\n  }\n\n  // merge all the modes/regexes into our main object\n  Object.assign(hljs, MODES);\n\n  return hljs;\n};\n\n// Other names for the variable may break build script\nconst highlight = HLJS({});\n\n// returns a new instance of the highlighter to be used for extensions\n// check https://github.com/wooorm/lowlight/issues/47\nhighlight.newInstance = () => HLJS({});\n\nmodule.exports = highlight;\nhighlight.HighlightJS = highlight;\nhighlight.default = highlight;\n","/*\nLanguage: HTML, XML\nWebsite: https://www.w3.org/XML/\nCategory: common, web\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction xml(hljs) {\n  const regex = hljs.regex;\n  // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar\n  // OTHER_NAME_CHARS = /[:\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]/;\n  // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods\n  // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);;\n  // const XML_IDENT_RE = /[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]+/;\n  // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);\n  // however, to cater for performance and more Unicode support rely simply on the Unicode letter class\n  const TAG_NAME_RE = regex.concat(/[\\p{L}_]/u, regex.optional(/[\\p{L}0-9_.-]*:/u), /[\\p{L}0-9_.-]*/u);\n  const XML_IDENT_RE = /[\\p{L}0-9._:-]+/u;\n  const XML_ENTITIES = {\n    className: 'symbol',\n    begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/\n  };\n  const XML_META_KEYWORDS = {\n    begin: /\\s/,\n    contains: [\n      {\n        className: 'keyword',\n        begin: /#?[a-z_][a-z1-9_-]+/,\n        illegal: /\\n/\n      }\n    ]\n  };\n  const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {\n    begin: /\\(/,\n    end: /\\)/\n  });\n  const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });\n  const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });\n  const TAG_INTERNALS = {\n    endsWithParent: true,\n    illegal: /</,\n    relevance: 0,\n    contains: [\n      {\n        className: 'attr',\n        begin: XML_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: /=\\s*/,\n        relevance: 0,\n        contains: [\n          {\n            className: 'string',\n            endsParent: true,\n            variants: [\n              {\n                begin: /\"/,\n                end: /\"/,\n                contains: [ XML_ENTITIES ]\n              },\n              {\n                begin: /'/,\n                end: /'/,\n                contains: [ XML_ENTITIES ]\n              },\n              { begin: /[^\\s\"'=<>`]+/ }\n            ]\n          }\n        ]\n      }\n    ]\n  };\n  return {\n    name: 'HTML, XML',\n    aliases: [\n      'html',\n      'xhtml',\n      'rss',\n      'atom',\n      'xjb',\n      'xsd',\n      'xsl',\n      'plist',\n      'wsf',\n      'svg'\n    ],\n    case_insensitive: true,\n    unicodeRegex: true,\n    contains: [\n      {\n        className: 'meta',\n        begin: /<![a-z]/,\n        end: />/,\n        relevance: 10,\n        contains: [\n          XML_META_KEYWORDS,\n          QUOTE_META_STRING_MODE,\n          APOS_META_STRING_MODE,\n          XML_META_PAR_KEYWORDS,\n          {\n            begin: /\\[/,\n            end: /\\]/,\n            contains: [\n              {\n                className: 'meta',\n                begin: /<![a-z]/,\n                end: />/,\n                contains: [\n                  XML_META_KEYWORDS,\n                  XML_META_PAR_KEYWORDS,\n                  QUOTE_META_STRING_MODE,\n                  APOS_META_STRING_MODE\n                ]\n              }\n            ]\n          }\n        ]\n      },\n      hljs.COMMENT(\n        /<!--/,\n        /-->/,\n        { relevance: 10 }\n      ),\n      {\n        begin: /<!\\[CDATA\\[/,\n        end: /\\]\\]>/,\n        relevance: 10\n      },\n      XML_ENTITIES,\n      // xml processing instructions\n      {\n        className: 'meta',\n        end: /\\?>/,\n        variants: [\n          {\n            begin: /<\\?xml/,\n            relevance: 10,\n            contains: [\n              QUOTE_META_STRING_MODE\n            ]\n          },\n          {\n            begin: /<\\?[a-z][a-z0-9]+/,\n          }\n        ]\n\n      },\n      {\n        className: 'tag',\n        /*\n        The lookahead pattern (?=...) ensures that 'begin' only matches\n        '<style' as a single word, followed by a whitespace or an\n        ending bracket.\n        */\n        begin: /<style(?=\\s|>)/,\n        end: />/,\n        keywords: { name: 'style' },\n        contains: [ TAG_INTERNALS ],\n        starts: {\n          end: /<\\/style>/,\n          returnEnd: true,\n          subLanguage: [\n            'css',\n            'xml'\n          ]\n        }\n      },\n      {\n        className: 'tag',\n        // See the comment in the <style tag about the lookahead pattern\n        begin: /<script(?=\\s|>)/,\n        end: />/,\n        keywords: { name: 'script' },\n        contains: [ TAG_INTERNALS ],\n        starts: {\n          end: /<\\/script>/,\n          returnEnd: true,\n          subLanguage: [\n            'javascript',\n            'handlebars',\n            'xml'\n          ]\n        }\n      },\n      // we need this for now for jSX\n      {\n        className: 'tag',\n        begin: /<>|<\\/>/\n      },\n      // open tag\n      {\n        className: 'tag',\n        begin: regex.concat(\n          /</,\n          regex.lookahead(regex.concat(\n            TAG_NAME_RE,\n            // <tag/>\n            // <tag>\n            // <tag ...\n            regex.either(/\\/>/, />/, /\\s/)\n          ))\n        ),\n        end: /\\/?>/,\n        contains: [\n          {\n            className: 'name',\n            begin: TAG_NAME_RE,\n            relevance: 0,\n            starts: TAG_INTERNALS\n          }\n        ]\n      },\n      // close tag\n      {\n        className: 'tag',\n        begin: regex.concat(\n          /<\\//,\n          regex.lookahead(regex.concat(\n            TAG_NAME_RE, />/\n          ))\n        ),\n        contains: [\n          {\n            className: 'name',\n            begin: TAG_NAME_RE,\n            relevance: 0\n          },\n          {\n            begin: />/,\n            relevance: 0,\n            endsParent: true\n          }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = xml;\n","/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\nWebsite: https://www.gnu.org/software/bash/\nCategory: common, scripting\n*/\n\n/** @type LanguageFn */\nfunction bash(hljs) {\n  const regex = hljs.regex;\n  const VAR = {};\n  const BRACED_VAR = {\n    begin: /\\$\\{/,\n    end: /\\}/,\n    contains: [\n      \"self\",\n      {\n        begin: /:-/,\n        contains: [ VAR ]\n      } // default values\n    ]\n  };\n  Object.assign(VAR, {\n    className: 'variable',\n    variants: [\n      { begin: regex.concat(/\\$[\\w\\d#@][\\w\\d_]*/,\n        // negative look-ahead tries to avoid matching patterns that are not\n        // Perl at all like $ident$, @ident@, etc.\n        `(?![\\\\w\\\\d])(?![$])`) },\n      BRACED_VAR\n    ]\n  });\n\n  const SUBST = {\n    className: 'subst',\n    begin: /\\$\\(/,\n    end: /\\)/,\n    contains: [ hljs.BACKSLASH_ESCAPE ]\n  };\n  const COMMENT = hljs.inherit(\n    hljs.COMMENT(),\n    {\n      match: [\n        /(^|\\s)/,\n        /#.*$/\n      ],\n      scope: {\n        2: 'comment'\n      }\n    }\n  );\n  const HERE_DOC = {\n    begin: /<<-?\\s*(?=\\w+)/,\n    starts: { contains: [\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(\\w+)/,\n        end: /(\\w+)/,\n        className: 'string'\n      })\n    ] }\n  };\n  const QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VAR,\n      SUBST\n    ]\n  };\n  SUBST.contains.push(QUOTE_STRING);\n  const ESCAPED_QUOTE = {\n    match: /\\\\\"/\n  };\n  const APOS_STRING = {\n    className: 'string',\n    begin: /'/,\n    end: /'/\n  };\n  const ESCAPED_APOS = {\n    match: /\\\\'/\n  };\n  const ARITHMETIC = {\n    begin: /\\$?\\(\\(/,\n    end: /\\)\\)/,\n    contains: [\n      {\n        begin: /\\d+#[0-9a-f]+/,\n        className: \"number\"\n      },\n      hljs.NUMBER_MODE,\n      VAR\n    ]\n  };\n  const SH_LIKE_SHELLS = [\n    \"fish\",\n    \"bash\",\n    \"zsh\",\n    \"sh\",\n    \"csh\",\n    \"ksh\",\n    \"tcsh\",\n    \"dash\",\n    \"scsh\",\n  ];\n  const KNOWN_SHEBANG = hljs.SHEBANG({\n    binary: `(${SH_LIKE_SHELLS.join(\"|\")})`,\n    relevance: 10\n  });\n  const FUNCTION = {\n    className: 'function',\n    begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n    returnBegin: true,\n    contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\\w[\\w\\d_]*/ }) ],\n    relevance: 0\n  };\n\n  const KEYWORDS = [\n    \"if\",\n    \"then\",\n    \"else\",\n    \"elif\",\n    \"fi\",\n    \"time\",\n    \"for\",\n    \"while\",\n    \"until\",\n    \"in\",\n    \"do\",\n    \"done\",\n    \"case\",\n    \"esac\",\n    \"coproc\",\n    \"function\",\n    \"select\"\n  ];\n\n  const LITERALS = [\n    \"true\",\n    \"false\"\n  ];\n\n  // to consume paths to prevent keyword matches inside them\n  const PATH_MODE = { match: /(\\/[a-z._-]+)+/ };\n\n  // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n  const SHELL_BUILT_INS = [\n    \"break\",\n    \"cd\",\n    \"continue\",\n    \"eval\",\n    \"exec\",\n    \"exit\",\n    \"export\",\n    \"getopts\",\n    \"hash\",\n    \"pwd\",\n    \"readonly\",\n    \"return\",\n    \"shift\",\n    \"test\",\n    \"times\",\n    \"trap\",\n    \"umask\",\n    \"unset\"\n  ];\n\n  const BASH_BUILT_INS = [\n    \"alias\",\n    \"bind\",\n    \"builtin\",\n    \"caller\",\n    \"command\",\n    \"declare\",\n    \"echo\",\n    \"enable\",\n    \"help\",\n    \"let\",\n    \"local\",\n    \"logout\",\n    \"mapfile\",\n    \"printf\",\n    \"read\",\n    \"readarray\",\n    \"source\",\n    \"sudo\",\n    \"type\",\n    \"typeset\",\n    \"ulimit\",\n    \"unalias\"\n  ];\n\n  const ZSH_BUILT_INS = [\n    \"autoload\",\n    \"bg\",\n    \"bindkey\",\n    \"bye\",\n    \"cap\",\n    \"chdir\",\n    \"clone\",\n    \"comparguments\",\n    \"compcall\",\n    \"compctl\",\n    \"compdescribe\",\n    \"compfiles\",\n    \"compgroups\",\n    \"compquote\",\n    \"comptags\",\n    \"comptry\",\n    \"compvalues\",\n    \"dirs\",\n    \"disable\",\n    \"disown\",\n    \"echotc\",\n    \"echoti\",\n    \"emulate\",\n    \"fc\",\n    \"fg\",\n    \"float\",\n    \"functions\",\n    \"getcap\",\n    \"getln\",\n    \"history\",\n    \"integer\",\n    \"jobs\",\n    \"kill\",\n    \"limit\",\n    \"log\",\n    \"noglob\",\n    \"popd\",\n    \"print\",\n    \"pushd\",\n    \"pushln\",\n    \"rehash\",\n    \"sched\",\n    \"setcap\",\n    \"setopt\",\n    \"stat\",\n    \"suspend\",\n    \"ttyctl\",\n    \"unfunction\",\n    \"unhash\",\n    \"unlimit\",\n    \"unsetopt\",\n    \"vared\",\n    \"wait\",\n    \"whence\",\n    \"where\",\n    \"which\",\n    \"zcompile\",\n    \"zformat\",\n    \"zftp\",\n    \"zle\",\n    \"zmodload\",\n    \"zparseopts\",\n    \"zprof\",\n    \"zpty\",\n    \"zregexparse\",\n    \"zsocket\",\n    \"zstyle\",\n    \"ztcp\"\n  ];\n\n  const GNU_CORE_UTILS = [\n    \"chcon\",\n    \"chgrp\",\n    \"chown\",\n    \"chmod\",\n    \"cp\",\n    \"dd\",\n    \"df\",\n    \"dir\",\n    \"dircolors\",\n    \"ln\",\n    \"ls\",\n    \"mkdir\",\n    \"mkfifo\",\n    \"mknod\",\n    \"mktemp\",\n    \"mv\",\n    \"realpath\",\n    \"rm\",\n    \"rmdir\",\n    \"shred\",\n    \"sync\",\n    \"touch\",\n    \"truncate\",\n    \"vdir\",\n    \"b2sum\",\n    \"base32\",\n    \"base64\",\n    \"cat\",\n    \"cksum\",\n    \"comm\",\n    \"csplit\",\n    \"cut\",\n    \"expand\",\n    \"fmt\",\n    \"fold\",\n    \"head\",\n    \"join\",\n    \"md5sum\",\n    \"nl\",\n    \"numfmt\",\n    \"od\",\n    \"paste\",\n    \"ptx\",\n    \"pr\",\n    \"sha1sum\",\n    \"sha224sum\",\n    \"sha256sum\",\n    \"sha384sum\",\n    \"sha512sum\",\n    \"shuf\",\n    \"sort\",\n    \"split\",\n    \"sum\",\n    \"tac\",\n    \"tail\",\n    \"tr\",\n    \"tsort\",\n    \"unexpand\",\n    \"uniq\",\n    \"wc\",\n    \"arch\",\n    \"basename\",\n    \"chroot\",\n    \"date\",\n    \"dirname\",\n    \"du\",\n    \"echo\",\n    \"env\",\n    \"expr\",\n    \"factor\",\n    // \"false\", // keyword literal already\n    \"groups\",\n    \"hostid\",\n    \"id\",\n    \"link\",\n    \"logname\",\n    \"nice\",\n    \"nohup\",\n    \"nproc\",\n    \"pathchk\",\n    \"pinky\",\n    \"printenv\",\n    \"printf\",\n    \"pwd\",\n    \"readlink\",\n    \"runcon\",\n    \"seq\",\n    \"sleep\",\n    \"stat\",\n    \"stdbuf\",\n    \"stty\",\n    \"tee\",\n    \"test\",\n    \"timeout\",\n    // \"true\", // keyword literal already\n    \"tty\",\n    \"uname\",\n    \"unlink\",\n    \"uptime\",\n    \"users\",\n    \"who\",\n    \"whoami\",\n    \"yes\"\n  ];\n\n  return {\n    name: 'Bash',\n    aliases: [\n      'sh',\n      'zsh'\n    ],\n    keywords: {\n      $pattern: /\\b[a-z][a-z0-9._-]+\\b/,\n      keyword: KEYWORDS,\n      literal: LITERALS,\n      built_in: [\n        ...SHELL_BUILT_INS,\n        ...BASH_BUILT_INS,\n        // Shell modifiers\n        \"set\",\n        \"shopt\",\n        ...ZSH_BUILT_INS,\n        ...GNU_CORE_UTILS\n      ]\n    },\n    contains: [\n      KNOWN_SHEBANG, // to catch known shells and boost relevancy\n      hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang\n      FUNCTION,\n      ARITHMETIC,\n      COMMENT,\n      HERE_DOC,\n      PATH_MODE,\n      QUOTE_STRING,\n      ESCAPED_QUOTE,\n      APOS_STRING,\n      ESCAPED_APOS,\n      VAR\n    ]\n  };\n}\n\nmodule.exports = bash;\n","/*\nLanguage: C\nCategory: common, system\nWebsite: https://en.wikipedia.org/wiki/C_(programming_language)\n*/\n\n/** @type LanguageFn */\nfunction c(hljs) {\n  const regex = hljs.regex;\n  // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does\n  // not include such support nor can we be sure all the grammars depending\n  // on it would desire this behavior\n  const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\\\\n/ } ] });\n  const DECLTYPE_AUTO_RE = 'decltype\\\\(auto\\\\)';\n  const NAMESPACE_RE = '[a-zA-Z_]\\\\w*::';\n  const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';\n  const FUNCTION_TYPE_RE = '('\n    + DECLTYPE_AUTO_RE + '|'\n    + regex.optional(NAMESPACE_RE)\n    + '[a-zA-Z_]\\\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)\n  + ')';\n\n\n  const TYPES = {\n    className: 'type',\n    variants: [\n      { begin: '\\\\b[a-z\\\\d_]*_t\\\\b' },\n      { match: /\\batomic_[a-z]{3,6}\\b/ }\n    ]\n\n  };\n\n  // https://en.cppreference.com/w/cpp/language/escape\n  // \\\\ \\x \\xFF \\u2837 \\u00323747 \\374\n  const CHARACTER_ESCAPES = '\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)';\n  const STRINGS = {\n    className: 'string',\n    variants: [\n      {\n        begin: '(u8?|U|L)?\"',\n        end: '\"',\n        illegal: '\\\\n',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '(u8?|U|L)?\\'(' + CHARACTER_ESCAPES + \"|.)\",\n        end: '\\'',\n        illegal: '.'\n      },\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\(/,\n        end: /\\)([^()\\\\ ]{0,16})\"/\n      })\n    ]\n  };\n\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      { match: /\\b(0b[01']+)/ },  \n      { match: /(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/ },  \n      { match: /(-?)\\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/ },  \n      { match: /(-?)\\b\\d+(?:'\\d+)*(?:\\.\\d*(?:'\\d*)*)?(?:[eE][-+]?\\d+)?/ }  \n  ],\n    relevance: 0\n  };  \n  \n  const PREPROCESSOR = {\n    className: 'meta',\n    begin: /#\\s*[a-z]+\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'if else elif endif define undef warning error line '\n        + 'pragma _Pragma ifdef ifndef elifdef elifndef include' },\n    contains: [\n      {\n        begin: /\\\\\\n/,\n        relevance: 0\n      },\n      hljs.inherit(STRINGS, { className: 'string' }),\n      {\n        className: 'string',\n        begin: /<.*?>/\n      },\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n\n  const TITLE_MODE = {\n    className: 'title',\n    begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\\\s*\\\\(';\n\n  const C_KEYWORDS = [\n    \"asm\",\n    \"auto\",\n    \"break\",\n    \"case\",\n    \"continue\",\n    \"default\",\n    \"do\",\n    \"else\",\n    \"enum\",\n    \"extern\",\n    \"for\",\n    \"fortran\",\n    \"goto\",\n    \"if\",\n    \"inline\",\n    \"register\",\n    \"restrict\",\n    \"return\",\n    \"sizeof\",\n    \"typeof\",\n    \"typeof_unqual\",\n    \"struct\",\n    \"switch\",\n    \"typedef\",\n    \"union\",\n    \"volatile\",\n    \"while\",\n    \"_Alignas\",\n    \"_Alignof\",\n    \"_Atomic\",\n    \"_Generic\",\n    \"_Noreturn\",\n    \"_Static_assert\",\n    \"_Thread_local\",\n    // aliases\n    \"alignas\",\n    \"alignof\",\n    \"noreturn\",\n    \"static_assert\",\n    \"thread_local\",\n    // not a C keyword but is, for all intents and purposes, treated exactly like one.\n    \"_Pragma\"\n  ];\n\n  const C_TYPES = [\n    \"float\",\n    \"double\",\n    \"signed\",\n    \"unsigned\",\n    \"int\",\n    \"short\",\n    \"long\",\n    \"char\",\n    \"void\",\n    \"_Bool\",\n    \"_BitInt\",\n    \"_Complex\",\n    \"_Imaginary\",\n    \"_Decimal32\",\n    \"_Decimal64\",\n    \"_Decimal96\",\n    \"_Decimal128\",\n    \"_Decimal64x\",\n    \"_Decimal128x\",\n    \"_Float16\",\n    \"_Float32\",\n    \"_Float64\",\n    \"_Float128\",\n    \"_Float32x\",\n    \"_Float64x\",\n    \"_Float128x\",\n    // modifiers\n    \"const\",\n    \"static\",\n    \"constexpr\",\n    // aliases\n    \"complex\",\n    \"bool\",\n    \"imaginary\"\n  ];\n\n  const KEYWORDS = {\n    keyword: C_KEYWORDS,\n    type: C_TYPES,\n    literal: 'true false NULL',\n    // TODO: apply hinting work similar to what was done in cpp.js\n    built_in: 'std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream '\n      + 'auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set '\n      + 'unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos '\n      + 'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp '\n      + 'fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper '\n      + 'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow '\n      + 'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp '\n      + 'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan '\n      + 'vfprintf vprintf vsprintf endl initializer_list unique_ptr',\n  };\n\n  const EXPRESSION_CONTAINS = [\n    PREPROCESSOR,\n    TYPES,\n    C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    NUMBERS,\n    STRINGS\n  ];\n\n  const EXPRESSION_CONTEXT = {\n    // This mode covers expression context where we can't expect a function\n    // definition and shouldn't highlight anything that looks like one:\n    // `return some()`, `else if()`, `(x*sum(1, 2))`\n    variants: [\n      {\n        begin: /=/,\n        end: /;/\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/\n      },\n      {\n        beginKeywords: 'new throw return else',\n        end: /;/\n      }\n    ],\n    keywords: KEYWORDS,\n    contains: EXPRESSION_CONTAINS.concat([\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: KEYWORDS,\n        contains: EXPRESSION_CONTAINS.concat([ 'self' ]),\n        relevance: 0\n      }\n    ]),\n    relevance: 0\n  };\n\n  const FUNCTION_DECLARATION = {\n    begin: '(' + FUNCTION_TYPE_RE + '[\\\\*&\\\\s]+)+' + FUNCTION_TITLE,\n    returnBegin: true,\n    end: /[{;=]/,\n    excludeEnd: true,\n    keywords: KEYWORDS,\n    illegal: /[^\\w\\s\\*&:<>.]/,\n    contains: [\n      { // to prevent it from being confused as the function title\n        begin: DECLTYPE_AUTO_RE,\n        keywords: KEYWORDS,\n        relevance: 0\n      },\n      {\n        begin: FUNCTION_TITLE,\n        returnBegin: true,\n        contains: [ hljs.inherit(TITLE_MODE, { className: \"title.function\" }) ],\n        relevance: 0\n      },\n      // allow for multiple declarations, e.g.:\n      // extern void f(int), g(char);\n      {\n        relevance: 0,\n        match: /,/\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: KEYWORDS,\n        relevance: 0,\n        contains: [\n          C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          STRINGS,\n          NUMBERS,\n          TYPES,\n          // Count matching parentheses.\n          {\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              'self',\n              C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRINGS,\n              NUMBERS,\n              TYPES\n            ]\n          }\n        ]\n      },\n      TYPES,\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      PREPROCESSOR\n    ]\n  };\n\n  return {\n    name: \"C\",\n    aliases: [ 'h' ],\n    keywords: KEYWORDS,\n    // Until differentiations are added between `c` and `cpp`, `c` will\n    // not be auto-detected to avoid auto-detect conflicts between C and C++\n    disableAutodetect: true,\n    illegal: '</',\n    contains: [].concat(\n      EXPRESSION_CONTEXT,\n      FUNCTION_DECLARATION,\n      EXPRESSION_CONTAINS,\n      [\n        PREPROCESSOR,\n        {\n          begin: hljs.IDENT_RE + '::',\n          keywords: KEYWORDS\n        },\n        {\n          className: 'class',\n          beginKeywords: 'enum class struct union',\n          end: /[{;:<>=]/,\n          contains: [\n            { beginKeywords: \"final class struct\" },\n            hljs.TITLE_MODE\n          ]\n        }\n      ]),\n    exports: {\n      preprocessor: PREPROCESSOR,\n      strings: STRINGS,\n      keywords: KEYWORDS\n    }\n  };\n}\n\nmodule.exports = c;\n","/*\nLanguage: C++\nCategory: common, system\nWebsite: https://isocpp.org\n*/\n\n/** @type LanguageFn */\nfunction cpp(hljs) {\n  const regex = hljs.regex;\n  // added for historic reasons because `hljs.C_LINE_COMMENT_MODE` does\n  // not include such support nor can we be sure all the grammars depending\n  // on it would desire this behavior\n  const C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$', { contains: [ { begin: /\\\\\\n/ } ] });\n  const DECLTYPE_AUTO_RE = 'decltype\\\\(auto\\\\)';\n  const NAMESPACE_RE = '[a-zA-Z_]\\\\w*::';\n  const TEMPLATE_ARGUMENT_RE = '<[^<>]+>';\n  const FUNCTION_TYPE_RE = '(?!struct)('\n    + DECLTYPE_AUTO_RE + '|'\n    + regex.optional(NAMESPACE_RE)\n    + '[a-zA-Z_]\\\\w*' + regex.optional(TEMPLATE_ARGUMENT_RE)\n  + ')';\n\n  const CPP_PRIMITIVE_TYPES = {\n    className: 'type',\n    begin: '\\\\b[a-z\\\\d_]*_t\\\\b'\n  };\n\n  // https://en.cppreference.com/w/cpp/language/escape\n  // \\\\ \\x \\xFF \\u2837 \\u00323747 \\374\n  const CHARACTER_ESCAPES = '\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)';\n  const STRINGS = {\n    className: 'string',\n    variants: [\n      {\n        begin: '(u8?|U|L)?\"',\n        end: '\"',\n        illegal: '\\\\n',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '(u8?|U|L)?\\'(' + CHARACTER_ESCAPES + '|.)',\n        end: '\\'',\n        illegal: '.'\n      },\n      hljs.END_SAME_AS_BEGIN({\n        begin: /(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\(/,\n        end: /\\)([^()\\\\ ]{0,16})\"/\n      })\n    ]\n  };\n\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      // Floating-point literal.\n      { begin:\n        \"[+-]?(?:\" // Leading sign.\n          // Decimal.\n          + \"(?:\"\n            +\"[0-9](?:'?[0-9])*\\\\.(?:[0-9](?:'?[0-9])*)?\"\n            + \"|\\\\.[0-9](?:'?[0-9])*\"\n          + \")(?:[Ee][+-]?[0-9](?:'?[0-9])*)?\"\n          + \"|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*\"\n          // Hexadecimal.\n          + \"|0[Xx](?:\"\n            +\"[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?\"\n            + \"|\\\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*\"\n          + \")[Pp][+-]?[0-9](?:'?[0-9])*\"\n        + \")(?:\" // Literal suffixes.\n          + \"[Ff](?:16|32|64|128)?\"\n          + \"|(BF|bf)16\"\n          + \"|[Ll]\"\n          + \"|\" // Literal suffix is optional.\n        + \")\"\n      },\n      // Integer literal.\n      { begin:\n        \"[+-]?\\\\b(?:\" // Leading sign.\n          + \"0[Bb][01](?:'?[01])*\" // Binary.\n          + \"|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*\" // Hexadecimal.\n          + \"|0(?:'?[0-7])*\" // Octal or just a lone zero.\n          + \"|[1-9](?:'?[0-9])*\" // Decimal.\n        + \")(?:\" // Literal suffixes.\n          + \"[Uu](?:LL?|ll?)\"\n          + \"|[Uu][Zz]?\"\n          + \"|(?:LL?|ll?)[Uu]?\"\n          + \"|[Zz][Uu]\"\n          + \"|\" // Literal suffix is optional.\n        + \")\"\n        // Note: there are user-defined literal suffixes too, but perhaps having the custom suffix not part of the\n        // literal highlight actually makes it stand out more.\n      }\n    ],\n    relevance: 0\n  };\n\n  const PREPROCESSOR = {\n    className: 'meta',\n    begin: /#\\s*[a-z]+\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'if else elif endif define undef warning error line '\n        + 'pragma _Pragma ifdef ifndef include' },\n    contains: [\n      {\n        begin: /\\\\\\n/,\n        relevance: 0\n      },\n      hljs.inherit(STRINGS, { className: 'string' }),\n      {\n        className: 'string',\n        begin: /<.*?>/\n      },\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n\n  const TITLE_MODE = {\n    className: 'title',\n    begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + '\\\\s*\\\\(';\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const RESERVED_KEYWORDS = [\n    'alignas',\n    'alignof',\n    'and',\n    'and_eq',\n    'asm',\n    'atomic_cancel',\n    'atomic_commit',\n    'atomic_noexcept',\n    'auto',\n    'bitand',\n    'bitor',\n    'break',\n    'case',\n    'catch',\n    'class',\n    'co_await',\n    'co_return',\n    'co_yield',\n    'compl',\n    'concept',\n    'const_cast|10',\n    'consteval',\n    'constexpr',\n    'constinit',\n    'continue',\n    'decltype',\n    'default',\n    'delete',\n    'do',\n    'dynamic_cast|10',\n    'else',\n    'enum',\n    'explicit',\n    'export',\n    'extern',\n    'false',\n    'final',\n    'for',\n    'friend',\n    'goto',\n    'if',\n    'import',\n    'inline',\n    'module',\n    'mutable',\n    'namespace',\n    'new',\n    'noexcept',\n    'not',\n    'not_eq',\n    'nullptr',\n    'operator',\n    'or',\n    'or_eq',\n    'override',\n    'private',\n    'protected',\n    'public',\n    'reflexpr',\n    'register',\n    'reinterpret_cast|10',\n    'requires',\n    'return',\n    'sizeof',\n    'static_assert',\n    'static_cast|10',\n    'struct',\n    'switch',\n    'synchronized',\n    'template',\n    'this',\n    'thread_local',\n    'throw',\n    'transaction_safe',\n    'transaction_safe_dynamic',\n    'true',\n    'try',\n    'typedef',\n    'typeid',\n    'typename',\n    'union',\n    'using',\n    'virtual',\n    'volatile',\n    'while',\n    'xor',\n    'xor_eq'\n  ];\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const RESERVED_TYPES = [\n    'bool',\n    'char',\n    'char16_t',\n    'char32_t',\n    'char8_t',\n    'double',\n    'float',\n    'int',\n    'long',\n    'short',\n    'void',\n    'wchar_t',\n    'unsigned',\n    'signed',\n    'const',\n    'static'\n  ];\n\n  const TYPE_HINTS = [\n    'any',\n    'auto_ptr',\n    'barrier',\n    'binary_semaphore',\n    'bitset',\n    'complex',\n    'condition_variable',\n    'condition_variable_any',\n    'counting_semaphore',\n    'deque',\n    'false_type',\n    'flat_map',\n    'flat_set',\n    'future',\n    'imaginary',\n    'initializer_list',\n    'istringstream',\n    'jthread',\n    'latch',\n    'lock_guard',\n    'multimap',\n    'multiset',\n    'mutex',\n    'optional',\n    'ostringstream',\n    'packaged_task',\n    'pair',\n    'promise',\n    'priority_queue',\n    'queue',\n    'recursive_mutex',\n    'recursive_timed_mutex',\n    'scoped_lock',\n    'set',\n    'shared_future',\n    'shared_lock',\n    'shared_mutex',\n    'shared_timed_mutex',\n    'shared_ptr',\n    'stack',\n    'string_view',\n    'stringstream',\n    'timed_mutex',\n    'thread',\n    'true_type',\n    'tuple',\n    'unique_lock',\n    'unique_ptr',\n    'unordered_map',\n    'unordered_multimap',\n    'unordered_multiset',\n    'unordered_set',\n    'variant',\n    'vector',\n    'weak_ptr',\n    'wstring',\n    'wstring_view'\n  ];\n\n  const FUNCTION_HINTS = [\n    'abort',\n    'abs',\n    'acos',\n    'apply',\n    'as_const',\n    'asin',\n    'atan',\n    'atan2',\n    'calloc',\n    'ceil',\n    'cerr',\n    'cin',\n    'clog',\n    'cos',\n    'cosh',\n    'cout',\n    'declval',\n    'endl',\n    'exchange',\n    'exit',\n    'exp',\n    'fabs',\n    'floor',\n    'fmod',\n    'forward',\n    'fprintf',\n    'fputs',\n    'free',\n    'frexp',\n    'fscanf',\n    'future',\n    'invoke',\n    'isalnum',\n    'isalpha',\n    'iscntrl',\n    'isdigit',\n    'isgraph',\n    'islower',\n    'isprint',\n    'ispunct',\n    'isspace',\n    'isupper',\n    'isxdigit',\n    'labs',\n    'launder',\n    'ldexp',\n    'log',\n    'log10',\n    'make_pair',\n    'make_shared',\n    'make_shared_for_overwrite',\n    'make_tuple',\n    'make_unique',\n    'malloc',\n    'memchr',\n    'memcmp',\n    'memcpy',\n    'memset',\n    'modf',\n    'move',\n    'pow',\n    'printf',\n    'putchar',\n    'puts',\n    'realloc',\n    'scanf',\n    'sin',\n    'sinh',\n    'snprintf',\n    'sprintf',\n    'sqrt',\n    'sscanf',\n    'std',\n    'stderr',\n    'stdin',\n    'stdout',\n    'strcat',\n    'strchr',\n    'strcmp',\n    'strcpy',\n    'strcspn',\n    'strlen',\n    'strncat',\n    'strncmp',\n    'strncpy',\n    'strpbrk',\n    'strrchr',\n    'strspn',\n    'strstr',\n    'swap',\n    'tan',\n    'tanh',\n    'terminate',\n    'to_underlying',\n    'tolower',\n    'toupper',\n    'vfprintf',\n    'visit',\n    'vprintf',\n    'vsprintf'\n  ];\n\n  const LITERALS = [\n    'NULL',\n    'false',\n    'nullopt',\n    'nullptr',\n    'true'\n  ];\n\n  // https://en.cppreference.com/w/cpp/keyword\n  const BUILT_IN = [ '_Pragma' ];\n\n  const CPP_KEYWORDS = {\n    type: RESERVED_TYPES,\n    keyword: RESERVED_KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_IN,\n    _type_hints: TYPE_HINTS\n  };\n\n  const FUNCTION_DISPATCH = {\n    className: 'function.dispatch',\n    relevance: 0,\n    keywords: {\n      // Only for relevance, not highlighting.\n      _hint: FUNCTION_HINTS },\n    begin: regex.concat(\n      /\\b/,\n      /(?!decltype)/,\n      /(?!if)/,\n      /(?!for)/,\n      /(?!switch)/,\n      /(?!while)/,\n      hljs.IDENT_RE,\n      regex.lookahead(/(<[^<>]+>|)\\s*\\(/))\n  };\n\n  const EXPRESSION_CONTAINS = [\n    FUNCTION_DISPATCH,\n    PREPROCESSOR,\n    CPP_PRIMITIVE_TYPES,\n    C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    NUMBERS,\n    STRINGS\n  ];\n\n  const EXPRESSION_CONTEXT = {\n    // This mode covers expression context where we can't expect a function\n    // definition and shouldn't highlight anything that looks like one:\n    // `return some()`, `else if()`, `(x*sum(1, 2))`\n    variants: [\n      {\n        begin: /=/,\n        end: /;/\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/\n      },\n      {\n        beginKeywords: 'new throw return else',\n        end: /;/\n      }\n    ],\n    keywords: CPP_KEYWORDS,\n    contains: EXPRESSION_CONTAINS.concat([\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: CPP_KEYWORDS,\n        contains: EXPRESSION_CONTAINS.concat([ 'self' ]),\n        relevance: 0\n      }\n    ]),\n    relevance: 0\n  };\n\n  const FUNCTION_DECLARATION = {\n    className: 'function',\n    begin: '(' + FUNCTION_TYPE_RE + '[\\\\*&\\\\s]+)+' + FUNCTION_TITLE,\n    returnBegin: true,\n    end: /[{;=]/,\n    excludeEnd: true,\n    keywords: CPP_KEYWORDS,\n    illegal: /[^\\w\\s\\*&:<>.]/,\n    contains: [\n      { // to prevent it from being confused as the function title\n        begin: DECLTYPE_AUTO_RE,\n        keywords: CPP_KEYWORDS,\n        relevance: 0\n      },\n      {\n        begin: FUNCTION_TITLE,\n        returnBegin: true,\n        contains: [ TITLE_MODE ],\n        relevance: 0\n      },\n      // needed because we do not have look-behind on the below rule\n      // to prevent it from grabbing the final : in a :: pair\n      {\n        begin: /::/,\n        relevance: 0\n      },\n      // initializers\n      {\n        begin: /:/,\n        endsWithParent: true,\n        contains: [\n          STRINGS,\n          NUMBERS\n        ]\n      },\n      // allow for multiple declarations, e.g.:\n      // extern void f(int), g(char);\n      {\n        relevance: 0,\n        match: /,/\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: CPP_KEYWORDS,\n        relevance: 0,\n        contains: [\n          C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          STRINGS,\n          NUMBERS,\n          CPP_PRIMITIVE_TYPES,\n          // Count matching parentheses.\n          {\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: CPP_KEYWORDS,\n            relevance: 0,\n            contains: [\n              'self',\n              C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRINGS,\n              NUMBERS,\n              CPP_PRIMITIVE_TYPES\n            ]\n          }\n        ]\n      },\n      CPP_PRIMITIVE_TYPES,\n      C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      PREPROCESSOR\n    ]\n  };\n\n  return {\n    name: 'C++',\n    aliases: [\n      'cc',\n      'c++',\n      'h++',\n      'hpp',\n      'hh',\n      'hxx',\n      'cxx'\n    ],\n    keywords: CPP_KEYWORDS,\n    illegal: '</',\n    classNameAliases: { 'function.dispatch': 'built_in' },\n    contains: [].concat(\n      EXPRESSION_CONTEXT,\n      FUNCTION_DECLARATION,\n      FUNCTION_DISPATCH,\n      EXPRESSION_CONTAINS,\n      [\n        PREPROCESSOR,\n        { // containers: ie, `vector <int> rooms (9);`\n          begin: '\\\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\\\s*<(?!<)',\n          end: '>',\n          keywords: CPP_KEYWORDS,\n          contains: [\n            'self',\n            CPP_PRIMITIVE_TYPES\n          ]\n        },\n        {\n          begin: hljs.IDENT_RE + '::',\n          keywords: CPP_KEYWORDS\n        },\n        {\n          match: [\n            // extra complexity to deal with `enum class` and `enum struct`\n            /\\b(?:enum(?:\\s+(?:class|struct))?|class|struct|union)/,\n            /\\s+/,\n            /\\w+/\n          ],\n          className: {\n            1: 'keyword',\n            3: 'title.class'\n          }\n        }\n      ])\n  };\n}\n\nmodule.exports = cpp;\n","/*\nLanguage: C#\nAuthor: Jason Diamond <jason@diamond.name>\nContributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>\nWebsite: https://docs.microsoft.com/dotnet/csharp/\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction csharp(hljs) {\n  const BUILT_IN_KEYWORDS = [\n    'bool',\n    'byte',\n    'char',\n    'decimal',\n    'delegate',\n    'double',\n    'dynamic',\n    'enum',\n    'float',\n    'int',\n    'long',\n    'nint',\n    'nuint',\n    'object',\n    'sbyte',\n    'short',\n    'string',\n    'ulong',\n    'uint',\n    'ushort'\n  ];\n  const FUNCTION_MODIFIERS = [\n    'public',\n    'private',\n    'protected',\n    'static',\n    'internal',\n    'protected',\n    'abstract',\n    'async',\n    'extern',\n    'override',\n    'unsafe',\n    'virtual',\n    'new',\n    'sealed',\n    'partial'\n  ];\n  const LITERAL_KEYWORDS = [\n    'default',\n    'false',\n    'null',\n    'true'\n  ];\n  const NORMAL_KEYWORDS = [\n    'abstract',\n    'as',\n    'base',\n    'break',\n    'case',\n    'catch',\n    'class',\n    'const',\n    'continue',\n    'do',\n    'else',\n    'event',\n    'explicit',\n    'extern',\n    'finally',\n    'fixed',\n    'for',\n    'foreach',\n    'goto',\n    'if',\n    'implicit',\n    'in',\n    'interface',\n    'internal',\n    'is',\n    'lock',\n    'namespace',\n    'new',\n    'operator',\n    'out',\n    'override',\n    'params',\n    'private',\n    'protected',\n    'public',\n    'readonly',\n    'record',\n    'ref',\n    'return',\n    'scoped',\n    'sealed',\n    'sizeof',\n    'stackalloc',\n    'static',\n    'struct',\n    'switch',\n    'this',\n    'throw',\n    'try',\n    'typeof',\n    'unchecked',\n    'unsafe',\n    'using',\n    'virtual',\n    'void',\n    'volatile',\n    'while'\n  ];\n  const CONTEXTUAL_KEYWORDS = [\n    'add',\n    'alias',\n    'and',\n    'ascending',\n    'args',\n    'async',\n    'await',\n    'by',\n    'descending',\n    'dynamic',\n    'equals',\n    'file',\n    'from',\n    'get',\n    'global',\n    'group',\n    'init',\n    'into',\n    'join',\n    'let',\n    'nameof',\n    'not',\n    'notnull',\n    'on',\n    'or',\n    'orderby',\n    'partial',\n    'record',\n    'remove',\n    'required',\n    'scoped',\n    'select',\n    'set',\n    'unmanaged',\n    'value|0',\n    'var',\n    'when',\n    'where',\n    'with',\n    'yield'\n  ];\n\n  const KEYWORDS = {\n    keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),\n    built_in: BUILT_IN_KEYWORDS,\n    literal: LITERAL_KEYWORDS\n  };\n  const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\\\.?\\\\w)*' });\n  const NUMBERS = {\n    className: 'number',\n    variants: [\n      { begin: '\\\\b(0b[01\\']+)' },\n      { begin: '(-?)\\\\b([\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)(u|U|l|L|ul|UL|f|F|b|B)' },\n      { begin: '(-?)(\\\\b0[xX][a-fA-F0-9\\']+|(\\\\b[\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)([eE][-+]?[\\\\d\\']+)?)' }\n    ],\n    relevance: 0\n  };\n  const RAW_STRING = {\n    className: 'string',\n    begin: /\"\"\"(\"*)(?!\")(.|\\n)*?\"\"\"\\1/,\n    relevance: 1\n  };\n  const VERBATIM_STRING = {\n    className: 'string',\n    begin: '@\"',\n    end: '\"',\n    contains: [ { begin: '\"\"' } ]\n  };\n  const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\\n/ });\n  const SUBST = {\n    className: 'subst',\n    begin: /\\{/,\n    end: /\\}/,\n    keywords: KEYWORDS\n  };\n  const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\\n/ });\n  const INTERPOLATED_STRING = {\n    className: 'string',\n    begin: /\\$\"/,\n    end: '\"',\n    illegal: /\\n/,\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      hljs.BACKSLASH_ESCAPE,\n      SUBST_NO_LF\n    ]\n  };\n  const INTERPOLATED_VERBATIM_STRING = {\n    className: 'string',\n    begin: /\\$@\"/,\n    end: '\"',\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      { begin: '\"\"' },\n      SUBST\n    ]\n  };\n  const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {\n    illegal: /\\n/,\n    contains: [\n      { begin: /\\{\\{/ },\n      { begin: /\\}\\}/ },\n      { begin: '\"\"' },\n      SUBST_NO_LF\n    ]\n  });\n  SUBST.contains = [\n    INTERPOLATED_VERBATIM_STRING,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    NUMBERS,\n    hljs.C_BLOCK_COMMENT_MODE\n  ];\n  SUBST_NO_LF.contains = [\n    INTERPOLATED_VERBATIM_STRING_NO_LF,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING_NO_LF,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    NUMBERS,\n    hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\\n/ })\n  ];\n  const STRING = { variants: [\n    RAW_STRING,\n    INTERPOLATED_VERBATIM_STRING,\n    INTERPOLATED_STRING,\n    VERBATIM_STRING,\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE\n  ] };\n\n  const GENERIC_MODIFIER = {\n    begin: \"<\",\n    end: \">\",\n    contains: [\n      { beginKeywords: \"in out\" },\n      TITLE_MODE\n    ]\n  };\n  const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\\\s*,\\\\s*' + hljs.IDENT_RE + ')*>)?(\\\\[\\\\])?';\n  const AT_IDENTIFIER = {\n    // prevents expressions like `@class` from incorrect flagging\n    // `class` as a keyword\n    begin: \"@\" + hljs.IDENT_RE,\n    relevance: 0\n  };\n\n  return {\n    name: 'C#',\n    aliases: [\n      'cs',\n      'c#'\n    ],\n    keywords: KEYWORDS,\n    illegal: /::/,\n    contains: [\n      hljs.COMMENT(\n        '///',\n        '$',\n        {\n          returnBegin: true,\n          contains: [\n            {\n              className: 'doctag',\n              variants: [\n                {\n                  begin: '///',\n                  relevance: 0\n                },\n                { begin: '<!--|-->' },\n                {\n                  begin: '</?',\n                  end: '>'\n                }\n              ]\n            }\n          ]\n        }\n      ),\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'meta',\n        begin: '#',\n        end: '$',\n        keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' }\n      },\n      STRING,\n      NUMBERS,\n      {\n        beginKeywords: 'class interface',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:,]/,\n        contains: [\n          { beginKeywords: \"where class\" },\n          TITLE_MODE,\n          GENERIC_MODIFIER,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        beginKeywords: 'namespace',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:]/,\n        contains: [\n          TITLE_MODE,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        beginKeywords: 'record',\n        relevance: 0,\n        end: /[{;=]/,\n        illegal: /[^\\s:]/,\n        contains: [\n          TITLE_MODE,\n          GENERIC_MODIFIER,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        // [Attributes(\"\")]\n        className: 'meta',\n        begin: '^\\\\s*\\\\[(?=[\\\\w])',\n        excludeBegin: true,\n        end: '\\\\]',\n        excludeEnd: true,\n        contains: [\n          {\n            className: 'string',\n            begin: /\"/,\n            end: /\"/\n          }\n        ]\n      },\n      {\n        // Expression keywords prevent 'keyword Name(...)' from being\n        // recognized as a function definition\n        beginKeywords: 'new return throw await else',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        begin: '(' + TYPE_IDENT_RE + '\\\\s+)+' + hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n        returnBegin: true,\n        end: /\\s*[{;=]/,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        contains: [\n          // prevents these from being highlighted `title`\n          {\n            beginKeywords: FUNCTION_MODIFIERS.join(\" \"),\n            relevance: 0\n          },\n          {\n            begin: hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n            returnBegin: true,\n            contains: [\n              hljs.TITLE_MODE,\n              GENERIC_MODIFIER\n            ],\n            relevance: 0\n          },\n          { match: /\\(\\)/ },\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            excludeBegin: true,\n            excludeEnd: true,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              STRING,\n              NUMBERS,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      AT_IDENTIFIER\n    ]\n  };\n}\n\nmodule.exports = csharp;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n/*\nLanguage: CSS\nCategory: common, css, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/CSS\n*/\n\n\n/** @type LanguageFn */\nfunction css(hljs) {\n  const regex = hljs.regex;\n  const modes = MODES(hljs);\n  const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };\n  const AT_MODIFIERS = \"and or not only\";\n  const AT_PROPERTY_RE = /@-?\\w[\\w]*(-\\w+)*/; // @-webkit-keyframes\n  const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  const STRINGS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE\n  ];\n\n  return {\n    name: 'CSS',\n    case_insensitive: true,\n    illegal: /[=|'\\$]/,\n    keywords: { keyframePosition: \"from to\" },\n    classNameAliases: {\n      // for visual continuity with `tag {}` and because we\n      // don't have a great class for this?\n      keyframePosition: \"selector-tag\" },\n    contains: [\n      modes.BLOCK_COMMENT,\n      VENDOR_PREFIX,\n      // to recognize keyframe 40% etc which are outside the scope of our\n      // attribute value mode\n      modes.CSS_NUMBER_MODE,\n      {\n        className: 'selector-id',\n        begin: /#[A-Za-z0-9_-]+/,\n        relevance: 0\n      },\n      {\n        className: 'selector-class',\n        begin: '\\\\.' + IDENT_RE,\n        relevance: 0\n      },\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-pseudo',\n        variants: [\n          { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },\n          { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }\n        ]\n      },\n      // we may actually need this (12/2020)\n      // { // pseudo-selector params\n      //   begin: /\\(/,\n      //   end: /\\)/,\n      //   contains: [ hljs.CSS_NUMBER_MODE ]\n      // },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n      },\n      // attribute values\n      {\n        begin: /:/,\n        end: /[;}{]/,\n        contains: [\n          modes.BLOCK_COMMENT,\n          modes.HEXCOLOR,\n          modes.IMPORTANT,\n          modes.CSS_NUMBER_MODE,\n          ...STRINGS,\n          // needed to highlight these as strings and to avoid issues with\n          // illegal characters that might be inside urls that would tigger the\n          // languages illegal stack\n          {\n            begin: /(url|data-uri)\\(/,\n            end: /\\)/,\n            relevance: 0, // from keywords\n            keywords: { built_in: \"url data-uri\" },\n            contains: [\n              ...STRINGS,\n              {\n                className: \"string\",\n                // any character other than `)` as in `url()` will be the start\n                // of a string, which ends with `)` (from the parent mode)\n                begin: /[^)]/,\n                endsWithParent: true,\n                excludeEnd: true\n              }\n            ]\n          },\n          modes.FUNCTION_DISPATCH\n        ]\n      },\n      {\n        begin: regex.lookahead(/@/),\n        end: '[{;]',\n        relevance: 0,\n        illegal: /:/, // break on Less variables @var: ...\n        contains: [\n          {\n            className: 'keyword',\n            begin: AT_PROPERTY_RE\n          },\n          {\n            begin: /\\s/,\n            endsWithParent: true,\n            excludeEnd: true,\n            relevance: 0,\n            keywords: {\n              $pattern: /[a-z-]+/,\n              keyword: AT_MODIFIERS,\n              attribute: MEDIA_FEATURES.join(\" \")\n            },\n            contains: [\n              {\n                begin: /[a-z-]+(?=:)/,\n                className: \"attribute\"\n              },\n              ...STRINGS,\n              modes.CSS_NUMBER_MODE\n            ]\n          }\n        ]\n      },\n      {\n        className: 'selector-tag',\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b'\n      }\n    ]\n  };\n}\n\nmodule.exports = css;\n","/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi <john.crepezzi@gmail.com>\nWebsite: https://daringfireball.net/projects/markdown/\nCategory: common, markup\n*/\n\nfunction markdown(hljs) {\n  const regex = hljs.regex;\n  const INLINE_HTML = {\n    begin: /<\\/?[A-Za-z_]/,\n    end: '>',\n    subLanguage: 'xml',\n    relevance: 0\n  };\n  const HORIZONTAL_RULE = {\n    begin: '^[-\\\\*]{3,}',\n    end: '$'\n  };\n  const CODE = {\n    className: 'code',\n    variants: [\n      // TODO: fix to allow these to work with sublanguage also\n      { begin: '(`{3,})[^`](.|\\\\n)*?\\\\1`*[ ]*' },\n      { begin: '(~{3,})[^~](.|\\\\n)*?\\\\1~*[ ]*' },\n      // needed to allow markdown as a sublanguage to work\n      {\n        begin: '```',\n        end: '```+[ ]*$'\n      },\n      {\n        begin: '~~~',\n        end: '~~~+[ ]*$'\n      },\n      { begin: '`.+?`' },\n      {\n        begin: '(?=^( {4}|\\\\t))',\n        // use contains to gobble up multiple lines to allow the block to be whatever size\n        // but only have a single open/close tag vs one per line\n        contains: [\n          {\n            begin: '^( {4}|\\\\t)',\n            end: '(\\\\n)$'\n          }\n        ],\n        relevance: 0\n      }\n    ]\n  };\n  const LIST = {\n    className: 'bullet',\n    begin: '^[ \\t]*([*+-]|(\\\\d+\\\\.))(?=\\\\s+)',\n    end: '\\\\s+',\n    excludeEnd: true\n  };\n  const LINK_REFERENCE = {\n    begin: /^\\[[^\\n]+\\]:/,\n    returnBegin: true,\n    contains: [\n      {\n        className: 'symbol',\n        begin: /\\[/,\n        end: /\\]/,\n        excludeBegin: true,\n        excludeEnd: true\n      },\n      {\n        className: 'link',\n        begin: /:\\s*/,\n        end: /$/,\n        excludeBegin: true\n      }\n    ]\n  };\n  const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/;\n  const LINK = {\n    variants: [\n      // too much like nested array access in so many languages\n      // to have any real relevance\n      {\n        begin: /\\[.+?\\]\\[.*?\\]/,\n        relevance: 0\n      },\n      // popular internet URLs\n      {\n        begin: /\\[.+?\\]\\(((data|javascript|mailto):|(?:http|ftp)s?:\\/\\/).*?\\)/,\n        relevance: 2\n      },\n      {\n        begin: regex.concat(/\\[.+?\\]\\(/, URL_SCHEME, /:\\/\\/.*?\\)/),\n        relevance: 2\n      },\n      // relative urls\n      {\n        begin: /\\[.+?\\]\\([./?&#].*?\\)/,\n        relevance: 1\n      },\n      // whatever else, lower relevance (might not be a link at all)\n      {\n        begin: /\\[.*?\\]\\(.*?\\)/,\n        relevance: 0\n      }\n    ],\n    returnBegin: true,\n    contains: [\n      {\n        // empty strings for alt or link text\n        match: /\\[(?=\\])/ },\n      {\n        className: 'string',\n        relevance: 0,\n        begin: '\\\\[',\n        end: '\\\\]',\n        excludeBegin: true,\n        returnEnd: true\n      },\n      {\n        className: 'link',\n        relevance: 0,\n        begin: '\\\\]\\\\(',\n        end: '\\\\)',\n        excludeBegin: true,\n        excludeEnd: true\n      },\n      {\n        className: 'symbol',\n        relevance: 0,\n        begin: '\\\\]\\\\[',\n        end: '\\\\]',\n        excludeBegin: true,\n        excludeEnd: true\n      }\n    ]\n  };\n  const BOLD = {\n    className: 'strong',\n    contains: [], // defined later\n    variants: [\n      {\n        begin: /_{2}(?!\\s)/,\n        end: /_{2}/\n      },\n      {\n        begin: /\\*{2}(?!\\s)/,\n        end: /\\*{2}/\n      }\n    ]\n  };\n  const ITALIC = {\n    className: 'emphasis',\n    contains: [], // defined later\n    variants: [\n      {\n        begin: /\\*(?![*\\s])/,\n        end: /\\*/\n      },\n      {\n        begin: /_(?![_\\s])/,\n        end: /_/,\n        relevance: 0\n      }\n    ]\n  };\n\n  // 3 level deep nesting is not allowed because it would create confusion\n  // in cases like `***testing***` because where we don't know if the last\n  // `***` is starting a new bold/italic or finishing the last one\n  const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] });\n  const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] });\n  BOLD.contains.push(ITALIC_WITHOUT_BOLD);\n  ITALIC.contains.push(BOLD_WITHOUT_ITALIC);\n\n  let CONTAINABLE = [\n    INLINE_HTML,\n    LINK\n  ];\n\n  [\n    BOLD,\n    ITALIC,\n    BOLD_WITHOUT_ITALIC,\n    ITALIC_WITHOUT_BOLD\n  ].forEach(m => {\n    m.contains = m.contains.concat(CONTAINABLE);\n  });\n\n  CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC);\n\n  const HEADER = {\n    className: 'section',\n    variants: [\n      {\n        begin: '^#{1,6}',\n        end: '$',\n        contains: CONTAINABLE\n      },\n      {\n        begin: '(?=^.+?\\\\n[=-]{2,}$)',\n        contains: [\n          { begin: '^[=-]*$' },\n          {\n            begin: '^',\n            end: \"\\\\n\",\n            contains: CONTAINABLE\n          }\n        ]\n      }\n    ]\n  };\n\n  const BLOCKQUOTE = {\n    className: 'quote',\n    begin: '^>\\\\s+',\n    contains: CONTAINABLE,\n    end: '$'\n  };\n\n  const ENTITY = {\n    //https://spec.commonmark.org/0.31.2/#entity-references\n    scope: 'literal',\n    match: /&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/\n  };\n\n  return {\n    name: 'Markdown',\n    aliases: [\n      'md',\n      'mkdown',\n      'mkd'\n    ],\n    contains: [\n      HEADER,\n      INLINE_HTML,\n      LIST,\n      BOLD,\n      ITALIC,\n      BLOCKQUOTE,\n      CODE,\n      HORIZONTAL_RULE,\n      LINK,\n      LINK_REFERENCE,\n      ENTITY\n    ]\n  };\n}\n\nmodule.exports = markdown;\n","/*\nLanguage: Diff\nDescription: Unified and context diff\nAuthor: Vasily Polovnyov <vast@whiteants.net>\nWebsite: https://www.gnu.org/software/diffutils/\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction diff(hljs) {\n  const regex = hljs.regex;\n  return {\n    name: 'Diff',\n    aliases: [ 'patch' ],\n    contains: [\n      {\n        className: 'meta',\n        relevance: 10,\n        match: regex.either(\n          /^@@ +-\\d+,\\d+ +\\+\\d+,\\d+ +@@/,\n          /^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/,\n          /^--- +\\d+,\\d+ +----$/\n        )\n      },\n      {\n        className: 'comment',\n        variants: [\n          {\n            begin: regex.either(\n              /Index: /,\n              /^index/,\n              /={3,}/,\n              /^-{3}/,\n              /^\\*{3} /,\n              /^\\+{3}/,\n              /^diff --git/\n            ),\n            end: /$/\n          },\n          { match: /^\\*{15}$/ }\n        ]\n      },\n      {\n        className: 'addition',\n        begin: /^\\+/,\n        end: /$/\n      },\n      {\n        className: 'deletion',\n        begin: /^-/,\n        end: /$/\n      },\n      {\n        className: 'addition',\n        begin: /^!/,\n        end: /$/\n      }\n    ]\n  };\n}\n\nmodule.exports = diff;\n","/*\nLanguage: Ruby\nDescription: Ruby is a dynamic, open source programming language with a focus on simplicity and productivity.\nWebsite: https://www.ruby-lang.org/\nAuthor: Anton Kovalyov <anton@kovalyov.net>\nContributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>, Cedric Sohrauer <sohrauer@googlemail.com>\nCategory: common, scripting\n*/\n\nfunction ruby(hljs) {\n  const regex = hljs.regex;\n  const RUBY_METHOD_RE = '([a-zA-Z_]\\\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?)';\n  // TODO: move concepts like CAMEL_CASE into `modes.js`\n  const CLASS_NAME_RE = regex.either(\n    /\\b([A-Z]+[a-z0-9]+)+/,\n    // ends in caps\n    /\\b([A-Z]+[a-z0-9]+)+[A-Z]+/,\n  )\n  ;\n  const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\\w+)*/);\n  // very popular ruby built-ins that one might even assume\n  // are actual keywords (despite that not being the case)\n  const PSEUDO_KWS = [\n    \"include\",\n    \"extend\",\n    \"prepend\",\n    \"public\",\n    \"private\",\n    \"protected\",\n    \"raise\",\n    \"throw\"\n  ];\n  const RUBY_KEYWORDS = {\n    \"variable.constant\": [\n      \"__FILE__\",\n      \"__LINE__\",\n      \"__ENCODING__\"\n    ],\n    \"variable.language\": [\n      \"self\",\n      \"super\",\n    ],\n    keyword: [\n      \"alias\",\n      \"and\",\n      \"begin\",\n      \"BEGIN\",\n      \"break\",\n      \"case\",\n      \"class\",\n      \"defined\",\n      \"do\",\n      \"else\",\n      \"elsif\",\n      \"end\",\n      \"END\",\n      \"ensure\",\n      \"for\",\n      \"if\",\n      \"in\",\n      \"module\",\n      \"next\",\n      \"not\",\n      \"or\",\n      \"redo\",\n      \"require\",\n      \"rescue\",\n      \"retry\",\n      \"return\",\n      \"then\",\n      \"undef\",\n      \"unless\",\n      \"until\",\n      \"when\",\n      \"while\",\n      \"yield\",\n      ...PSEUDO_KWS\n    ],\n    built_in: [\n      \"proc\",\n      \"lambda\",\n      \"attr_accessor\",\n      \"attr_reader\",\n      \"attr_writer\",\n      \"define_method\",\n      \"private_constant\",\n      \"module_function\"\n    ],\n    literal: [\n      \"true\",\n      \"false\",\n      \"nil\"\n    ]\n  };\n  const YARDOCTAG = {\n    className: 'doctag',\n    begin: '@[A-Za-z]+'\n  };\n  const IRB_OBJECT = {\n    begin: '#<',\n    end: '>'\n  };\n  const COMMENT_MODES = [\n    hljs.COMMENT(\n      '#',\n      '$',\n      { contains: [ YARDOCTAG ] }\n    ),\n    hljs.COMMENT(\n      '^=begin',\n      '^=end',\n      {\n        contains: [ YARDOCTAG ],\n        relevance: 10\n      }\n    ),\n    hljs.COMMENT('^__END__', hljs.MATCH_NOTHING_RE)\n  ];\n  const SUBST = {\n    className: 'subst',\n    begin: /#\\{/,\n    end: /\\}/,\n    keywords: RUBY_KEYWORDS\n  };\n  const STRING = {\n    className: 'string',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ],\n    variants: [\n      {\n        begin: /'/,\n        end: /'/\n      },\n      {\n        begin: /\"/,\n        end: /\"/\n      },\n      {\n        begin: /`/,\n        end: /`/\n      },\n      {\n        begin: /%[qQwWx]?\\(/,\n        end: /\\)/\n      },\n      {\n        begin: /%[qQwWx]?\\[/,\n        end: /\\]/\n      },\n      {\n        begin: /%[qQwWx]?\\{/,\n        end: /\\}/\n      },\n      {\n        begin: /%[qQwWx]?</,\n        end: />/\n      },\n      {\n        begin: /%[qQwWx]?\\//,\n        end: /\\//\n      },\n      {\n        begin: /%[qQwWx]?%/,\n        end: /%/\n      },\n      {\n        begin: /%[qQwWx]?-/,\n        end: /-/\n      },\n      {\n        begin: /%[qQwWx]?\\|/,\n        end: /\\|/\n      },\n      // in the following expressions, \\B in the beginning suppresses recognition of ?-sequences\n      // where ? is the last character of a preceding identifier, as in: `func?4`\n      { begin: /\\B\\?(\\\\\\d{1,3})/ },\n      { begin: /\\B\\?(\\\\x[A-Fa-f0-9]{1,2})/ },\n      { begin: /\\B\\?(\\\\u\\{?[A-Fa-f0-9]{1,6}\\}?)/ },\n      { begin: /\\B\\?(\\\\M-\\\\C-|\\\\M-\\\\c|\\\\c\\\\M-|\\\\M-|\\\\C-\\\\M-)[\\x20-\\x7e]/ },\n      { begin: /\\B\\?\\\\(c|C-)[\\x20-\\x7e]/ },\n      { begin: /\\B\\?\\\\?\\S/ },\n      // heredocs\n      {\n        // this guard makes sure that we have an entire heredoc and not a false\n        // positive (auto-detect, etc.)\n        begin: regex.concat(\n          /<<[-~]?'?/,\n          regex.lookahead(/(\\w+)(?=\\W)[^\\n]*\\n(?:[^\\n]*\\n)*?\\s*\\1\\b/)\n        ),\n        contains: [\n          hljs.END_SAME_AS_BEGIN({\n            begin: /(\\w+)/,\n            end: /(\\w+)/,\n            contains: [\n              hljs.BACKSLASH_ESCAPE,\n              SUBST\n            ]\n          })\n        ]\n      }\n    ]\n  };\n\n  // Ruby syntax is underdocumented, but this grammar seems to be accurate\n  // as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`)\n  // https://docs.ruby-lang.org/en/2.7.0/doc/syntax/literals_rdoc.html#label-Numbers\n  const decimal = '[1-9](_?[0-9])*|0';\n  const digits = '[0-9](_?[0-9])*';\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // decimal integer/float, optionally exponential or rational, optionally imaginary\n      { begin: `\\\\b(${decimal})(\\\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\\\b` },\n\n      // explicit decimal/binary/octal/hexadecimal integer,\n      // optionally rational and/or imaginary\n      { begin: \"\\\\b0[dD][0-9](_?[0-9])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*r?i?\\\\b\" },\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\\\b\" },\n\n      // 0-prefixed implicit octal integer, optionally rational and/or imaginary\n      { begin: \"\\\\b0(_?[0-7])+r?i?\\\\b\" }\n    ]\n  };\n\n  const PARAMS = {\n    variants: [\n      {\n        match: /\\(\\)/,\n      },\n      {\n        className: 'params',\n        begin: /\\(/,\n        end: /(?=\\))/,\n        excludeBegin: true,\n        endsParent: true,\n        keywords: RUBY_KEYWORDS,\n      }\n    ]\n  };\n\n  const INCLUDE_EXTEND = {\n    match: [\n      /(include|extend)\\s+/,\n      CLASS_NAME_WITH_NAMESPACE_RE\n    ],\n    scope: {\n      2: \"title.class\"\n    },\n    keywords: RUBY_KEYWORDS\n  };\n\n  const CLASS_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /class\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE,\n          /\\s+<\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE\n        ]\n      },\n      {\n        match: [\n          /\\b(class|module)\\s+/,\n          CLASS_NAME_WITH_NAMESPACE_RE\n        ]\n      }\n    ],\n    scope: {\n      2: \"title.class\",\n      4: \"title.class.inherited\"\n    },\n    keywords: RUBY_KEYWORDS\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  const METHOD_DEFINITION = {\n    match: [\n      /def/, /\\s+/,\n      RUBY_METHOD_RE\n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  const OBJECT_CREATION = {\n    relevance: 0,\n    match: [\n      CLASS_NAME_WITH_NAMESPACE_RE,\n      /\\.new[. (]/\n    ],\n    scope: {\n      1: \"title.class\"\n    }\n  };\n\n  // CamelCase\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match: CLASS_NAME_RE,\n    scope: \"title.class\"\n  };\n\n  const RUBY_DEFAULT_CONTAINS = [\n    STRING,\n    CLASS_DEFINITION,\n    INCLUDE_EXTEND,\n    OBJECT_CREATION,\n    UPPER_CASE_CONSTANT,\n    CLASS_REFERENCE,\n    METHOD_DEFINITION,\n    {\n      // swallow namespace qualifiers before symbols\n      begin: hljs.IDENT_RE + '::' },\n    {\n      className: 'symbol',\n      begin: hljs.UNDERSCORE_IDENT_RE + '(!|\\\\?)?:',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':(?!\\\\s)',\n      contains: [\n        STRING,\n        { begin: RUBY_METHOD_RE }\n      ],\n      relevance: 0\n    },\n    NUMBER,\n    {\n      // negative-look forward attempts to prevent false matches like:\n      // @ident@ or $ident$ that might indicate this is not ruby at all\n      className: \"variable\",\n      begin: '(\\\\$\\\\W)|((\\\\$|@@?)(\\\\w+))(?=[^@$?])' + `(?![A-Za-z])(?![@$?'])`\n    },\n    {\n      className: 'params',\n      begin: /\\|(?!=)/,\n      end: /\\|/,\n      excludeBegin: true,\n      excludeEnd: true,\n      relevance: 0, // this could be a lot of things (in other languages) other than params\n      keywords: RUBY_KEYWORDS\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + '|unless)\\\\s*',\n      keywords: 'unless',\n      contains: [\n        {\n          className: 'regexp',\n          contains: [\n            hljs.BACKSLASH_ESCAPE,\n            SUBST\n          ],\n          illegal: /\\n/,\n          variants: [\n            {\n              begin: '/',\n              end: '/[a-z]*'\n            },\n            {\n              begin: /%r\\{/,\n              end: /\\}[a-z]*/\n            },\n            {\n              begin: '%r\\\\(',\n              end: '\\\\)[a-z]*'\n            },\n            {\n              begin: '%r!',\n              end: '![a-z]*'\n            },\n            {\n              begin: '%r\\\\[',\n              end: '\\\\][a-z]*'\n            }\n          ]\n        }\n      ].concat(IRB_OBJECT, COMMENT_MODES),\n      relevance: 0\n    }\n  ].concat(IRB_OBJECT, COMMENT_MODES);\n\n  SUBST.contains = RUBY_DEFAULT_CONTAINS;\n  PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n\n  // >>\n  // ?>\n  const SIMPLE_PROMPT = \"[>?]>\";\n  // irb(main):001:0>\n  const DEFAULT_PROMPT = \"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+[>*]\";\n  const RVM_PROMPT = \"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d+(p\\\\d+)?[^\\\\d][^>]+>\";\n\n  const IRB_DEFAULT = [\n    {\n      begin: /^\\s*=>/,\n      starts: {\n        end: '$',\n        contains: RUBY_DEFAULT_CONTAINS\n      }\n    },\n    {\n      className: 'meta.prompt',\n      begin: '^(' + SIMPLE_PROMPT + \"|\" + DEFAULT_PROMPT + '|' + RVM_PROMPT + ')(?=[ ])',\n      starts: {\n        end: '$',\n        keywords: RUBY_KEYWORDS,\n        contains: RUBY_DEFAULT_CONTAINS\n      }\n    }\n  ];\n\n  COMMENT_MODES.unshift(IRB_OBJECT);\n\n  return {\n    name: 'Ruby',\n    aliases: [\n      'rb',\n      'gemspec',\n      'podspec',\n      'thor',\n      'irb'\n    ],\n    keywords: RUBY_KEYWORDS,\n    illegal: /\\/\\*/,\n    contains: [ hljs.SHEBANG({ binary: \"ruby\" }) ]\n      .concat(IRB_DEFAULT)\n      .concat(COMMENT_MODES)\n      .concat(RUBY_DEFAULT_CONTAINS)\n  };\n}\n\nmodule.exports = ruby;\n","/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language\nWebsite: http://golang.org/\nCategory: common, system\n*/\n\nfunction go(hljs) {\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"iota\",\n    \"nil\"\n  ];\n  const BUILT_INS = [\n    \"append\",\n    \"cap\",\n    \"close\",\n    \"complex\",\n    \"copy\",\n    \"imag\",\n    \"len\",\n    \"make\",\n    \"new\",\n    \"panic\",\n    \"print\",\n    \"println\",\n    \"real\",\n    \"recover\",\n    \"delete\"\n  ];\n  const TYPES = [\n    \"bool\",\n    \"byte\",\n    \"complex64\",\n    \"complex128\",\n    \"error\",\n    \"float32\",\n    \"float64\",\n    \"int8\",\n    \"int16\",\n    \"int32\",\n    \"int64\",\n    \"string\",\n    \"uint8\",\n    \"uint16\",\n    \"uint32\",\n    \"uint64\",\n    \"int\",\n    \"uint\",\n    \"uintptr\",\n    \"rune\"\n  ];\n  const KWS = [\n    \"break\",\n    \"case\",\n    \"chan\",\n    \"const\",\n    \"continue\",\n    \"default\",\n    \"defer\",\n    \"else\",\n    \"fallthrough\",\n    \"for\",\n    \"func\",\n    \"go\",\n    \"goto\",\n    \"if\",\n    \"import\",\n    \"interface\",\n    \"map\",\n    \"package\",\n    \"range\",\n    \"return\",\n    \"select\",\n    \"struct\",\n    \"switch\",\n    \"type\",\n    \"var\",\n  ];\n  const KEYWORDS = {\n    keyword: KWS,\n    type: TYPES,\n    literal: LITERALS,\n    built_in: BUILT_INS\n  };\n  return {\n    name: 'Go',\n    aliases: [ 'golang' ],\n    keywords: KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        variants: [\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          {\n            begin: '`',\n            end: '`'\n          }\n        ]\n      },\n      {\n        className: 'number',\n        variants: [\n          {\n            match: /-?\\b0[xX]\\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\\d(_?\\d)*i?/, // hex without a present digit before . (making a digit afterwards required)\n            relevance: 0\n          },\n          {\n            match: /-?\\b0[xX](_?[a-fA-F0-9])+((\\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\\d(_?\\d)*)?i?/, // hex with a present digit before . (making a digit afterwards optional)\n            relevance: 0\n          },\n          {\n            match: /-?\\b0[oO](_?[0-7])*i?/, // leading 0o octal\n            relevance: 0\n          },\n          {\n            match: /-?\\.\\d(_?\\d)*([eE][+-]?\\d(_?\\d)*)?i?/, // decimal without a present digit before . (making a digit afterwards required)\n            relevance: 0\n          },\n          {\n            match: /-?\\b\\d(_?\\d)*(\\.(\\d(_?\\d)*)?)?([eE][+-]?\\d(_?\\d)*)?i?/, // decimal with a present digit before . (making a digit afterwards optional)\n            relevance: 0\n          }\n        ]\n      },\n      { begin: /:=/ // relevance booster\n      },\n      {\n        className: 'function',\n        beginKeywords: 'func',\n        end: '\\\\s*(\\\\{|$)',\n        excludeEnd: true,\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            endsParent: true,\n            keywords: KEYWORDS,\n            illegal: /[\"']/\n          }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = go;\n","/*\n Language: GraphQL\n Author: John Foster (GH jf990), and others\n Description: GraphQL is a query language for APIs\n Category: web, common\n*/\n\n/** @type LanguageFn */\nfunction graphql(hljs) {\n  const regex = hljs.regex;\n  const GQL_NAME = /[_A-Za-z][_0-9A-Za-z]*/;\n  return {\n    name: \"GraphQL\",\n    aliases: [ \"gql\" ],\n    case_insensitive: true,\n    disableAutodetect: false,\n    keywords: {\n      keyword: [\n        \"query\",\n        \"mutation\",\n        \"subscription\",\n        \"type\",\n        \"input\",\n        \"schema\",\n        \"directive\",\n        \"interface\",\n        \"union\",\n        \"scalar\",\n        \"fragment\",\n        \"enum\",\n        \"on\"\n      ],\n      literal: [\n        \"true\",\n        \"false\",\n        \"null\"\n      ]\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      {\n        scope: \"punctuation\",\n        match: /[.]{3}/,\n        relevance: 0\n      },\n      {\n        scope: \"punctuation\",\n        begin: /[\\!\\(\\)\\:\\=\\[\\]\\{\\|\\}]{1}/,\n        relevance: 0\n      },\n      {\n        scope: \"variable\",\n        begin: /\\$/,\n        end: /\\W/,\n        excludeEnd: true,\n        relevance: 0\n      },\n      {\n        scope: \"meta\",\n        match: /@\\w+/,\n        excludeEnd: true\n      },\n      {\n        scope: \"symbol\",\n        begin: regex.concat(GQL_NAME, regex.lookahead(/\\s*:/)),\n        relevance: 0\n      }\n    ],\n    illegal: [\n      /[;<']/,\n      /BEGIN/\n    ]\n  };\n}\n\nmodule.exports = graphql;\n","/*\nLanguage: TOML, also INI\nDescription: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.\nContributors: Guillaume Gomez <guillaume1.gomez@gmail.com>\nCategory: common, config\nWebsite: https://github.com/toml-lang/toml\n*/\n\nfunction ini(hljs) {\n  const regex = hljs.regex;\n  const NUMBERS = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      { begin: /([+-]+)?[\\d]+_[\\d_]+/ },\n      { begin: hljs.NUMBER_RE }\n    ]\n  };\n  const COMMENTS = hljs.COMMENT();\n  COMMENTS.variants = [\n    {\n      begin: /;/,\n      end: /$/\n    },\n    {\n      begin: /#/,\n      end: /$/\n    }\n  ];\n  const VARIABLES = {\n    className: 'variable',\n    variants: [\n      { begin: /\\$[\\w\\d\"][\\w\\d_]*/ },\n      { begin: /\\$\\{(.*?)\\}/ }\n    ]\n  };\n  const LITERALS = {\n    className: 'literal',\n    begin: /\\bon|off|true|false|yes|no\\b/\n  };\n  const STRINGS = {\n    className: \"string\",\n    contains: [ hljs.BACKSLASH_ESCAPE ],\n    variants: [\n      {\n        begin: \"'''\",\n        end: \"'''\",\n        relevance: 10\n      },\n      {\n        begin: '\"\"\"',\n        end: '\"\"\"',\n        relevance: 10\n      },\n      {\n        begin: '\"',\n        end: '\"'\n      },\n      {\n        begin: \"'\",\n        end: \"'\"\n      }\n    ]\n  };\n  const ARRAY = {\n    begin: /\\[/,\n    end: /\\]/,\n    contains: [\n      COMMENTS,\n      LITERALS,\n      VARIABLES,\n      STRINGS,\n      NUMBERS,\n      'self'\n    ],\n    relevance: 0\n  };\n\n  const BARE_KEY = /[A-Za-z0-9_-]+/;\n  const QUOTED_KEY_DOUBLE_QUOTE = /\"(\\\\\"|[^\"])*\"/;\n  const QUOTED_KEY_SINGLE_QUOTE = /'[^']*'/;\n  const ANY_KEY = regex.either(\n    BARE_KEY, QUOTED_KEY_DOUBLE_QUOTE, QUOTED_KEY_SINGLE_QUOTE\n  );\n  const DOTTED_KEY = regex.concat(\n    ANY_KEY, '(\\\\s*\\\\.\\\\s*', ANY_KEY, ')*',\n    regex.lookahead(/\\s*=\\s*[^#\\s]/)\n  );\n\n  return {\n    name: 'TOML, also INI',\n    aliases: [ 'toml' ],\n    case_insensitive: true,\n    illegal: /\\S/,\n    contains: [\n      COMMENTS,\n      {\n        className: 'section',\n        begin: /\\[+/,\n        end: /\\]+/\n      },\n      {\n        begin: DOTTED_KEY,\n        className: 'attr',\n        starts: {\n          end: /$/,\n          contains: [\n            COMMENTS,\n            ARRAY,\n            LITERALS,\n            VARIABLES,\n            STRINGS,\n            NUMBERS\n          ]\n        }\n      }\n    ]\n  };\n}\n\nmodule.exports = ini;\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n  className: 'number',\n  variants: [\n    // DecimalFloatingPointLiteral\n    // including ExponentPart\n    { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n      `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n    // excluding ExponentPart\n    { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n    { begin: `(${frac})[fFdD]?\\\\b` },\n    { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n    // HexadecimalFloatingPointLiteral\n    { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n      `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n    // DecimalIntegerLiteral\n    { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n    // HexIntegerLiteral\n    { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n    // OctalIntegerLiteral\n    { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n    // BinaryIntegerLiteral\n    { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n  ],\n  relevance: 0\n};\n\n/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\nCategory: common, enterprise\nWebsite: https://www.java.com/\n*/\n\n\n/**\n * Allows recursive regex expressions to a given depth\n *\n * ie: recurRegex(\"(abc~~~)\", /~~~/g, 2) becomes:\n * (abc(abc(abc)))\n *\n * @param {string} re\n * @param {RegExp} substitution (should be a g mode regex)\n * @param {number} depth\n * @returns {string}``\n */\nfunction recurRegex(re, substitution, depth) {\n  if (depth === -1) return \"\";\n\n  return re.replace(substitution, _ => {\n    return recurRegex(re, substitution, depth - 1);\n  });\n}\n\n/** @type LanguageFn */\nfunction java(hljs) {\n  const regex = hljs.regex;\n  const JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n  const GENERIC_IDENT_RE = JAVA_IDENT_RE\n    + recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\\\s*,\\\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2);\n  const MAIN_KEYWORDS = [\n    'synchronized',\n    'abstract',\n    'private',\n    'var',\n    'static',\n    'if',\n    'const ',\n    'for',\n    'while',\n    'strictfp',\n    'finally',\n    'protected',\n    'import',\n    'native',\n    'final',\n    'void',\n    'enum',\n    'else',\n    'break',\n    'transient',\n    'catch',\n    'instanceof',\n    'volatile',\n    'case',\n    'assert',\n    'package',\n    'default',\n    'public',\n    'try',\n    'switch',\n    'continue',\n    'throws',\n    'protected',\n    'public',\n    'private',\n    'module',\n    'requires',\n    'exports',\n    'do',\n    'sealed',\n    'yield',\n    'permits',\n    'goto',\n    'when'\n  ];\n\n  const BUILT_INS = [\n    'super',\n    'this'\n  ];\n\n  const LITERALS = [\n    'false',\n    'true',\n    'null'\n  ];\n\n  const TYPES = [\n    'char',\n    'boolean',\n    'long',\n    'float',\n    'int',\n    'byte',\n    'short',\n    'double'\n  ];\n\n  const KEYWORDS = {\n    keyword: MAIN_KEYWORDS,\n    literal: LITERALS,\n    type: TYPES,\n    built_in: BUILT_INS\n  };\n\n  const ANNOTATION = {\n    className: 'meta',\n    begin: '@' + JAVA_IDENT_RE,\n    contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [ \"self\" ] // allow nested () inside our annotation\n      }\n    ]\n  };\n  const PARAMS = {\n    className: 'params',\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    relevance: 0,\n    contains: [ hljs.C_BLOCK_COMMENT_MODE ],\n    endsParent: true\n  };\n\n  return {\n    name: 'Java',\n    aliases: [ 'jsp' ],\n    keywords: KEYWORDS,\n    illegal: /<\\/|#/,\n    contains: [\n      hljs.COMMENT(\n        '/\\\\*\\\\*',\n        '\\\\*/',\n        {\n          relevance: 0,\n          contains: [\n            {\n              // eat up @'s in emails to prevent them to be recognized as doctags\n              begin: /\\w+@/,\n              relevance: 0\n            },\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            }\n          ]\n        }\n      ),\n      // relevance boost\n      {\n        begin: /import java\\.[a-z]+\\./,\n        keywords: \"import\",\n        relevance: 2\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        begin: /\"\"\"/,\n        end: /\"\"\"/,\n        className: \"string\",\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        match: [\n          /\\b(?:class|interface|enum|extends|implements|new)/,\n          /\\s+/,\n          JAVA_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        // Exceptions for hyphenated keywords\n        match: /non-sealed/,\n        scope: \"keyword\"\n      },\n      {\n        begin: [\n          regex.concat(/(?!else)/, JAVA_IDENT_RE),\n          /\\s+/,\n          JAVA_IDENT_RE,\n          /\\s+/,\n          /=(?!=)/\n        ],\n        className: {\n          1: \"type\",\n          3: \"variable\",\n          5: \"operator\"\n        }\n      },\n      {\n        begin: [\n          /record/,\n          /\\s+/,\n          JAVA_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        },\n        contains: [\n          PARAMS,\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        // Expression keywords prevent 'keyword Name(...)' from being\n        // recognized as a function definition\n        beginKeywords: 'new throw return else',\n        relevance: 0\n      },\n      {\n        begin: [\n          '(?:' + GENERIC_IDENT_RE + '\\\\s+)',\n          hljs.UNDERSCORE_IDENT_RE,\n          /\\s*(?=\\()/\n        ],\n        className: { 2: \"title.function\" },\n        keywords: KEYWORDS,\n        contains: [\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              ANNOTATION,\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              NUMERIC,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      NUMERIC,\n      ANNOTATION\n    ]\n  };\n}\n\nmodule.exports = java;\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n  \"as\", // for exports\n  \"in\",\n  \"of\",\n  \"if\",\n  \"for\",\n  \"while\",\n  \"finally\",\n  \"var\",\n  \"new\",\n  \"function\",\n  \"do\",\n  \"return\",\n  \"void\",\n  \"else\",\n  \"break\",\n  \"catch\",\n  \"instanceof\",\n  \"with\",\n  \"throw\",\n  \"case\",\n  \"default\",\n  \"try\",\n  \"switch\",\n  \"continue\",\n  \"typeof\",\n  \"delete\",\n  \"let\",\n  \"yield\",\n  \"const\",\n  \"class\",\n  // JS handles these with a special rule\n  // \"get\",\n  // \"set\",\n  \"debugger\",\n  \"async\",\n  \"await\",\n  \"static\",\n  \"import\",\n  \"from\",\n  \"export\",\n  \"extends\",\n  // It's reached stage 3, which is \"recommended for implementation\":\n  \"using\"\n];\nconst LITERALS = [\n  \"true\",\n  \"false\",\n  \"null\",\n  \"undefined\",\n  \"NaN\",\n  \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n  // Fundamental objects\n  \"Object\",\n  \"Function\",\n  \"Boolean\",\n  \"Symbol\",\n  // numbers and dates\n  \"Math\",\n  \"Date\",\n  \"Number\",\n  \"BigInt\",\n  // text\n  \"String\",\n  \"RegExp\",\n  // Indexed collections\n  \"Array\",\n  \"Float32Array\",\n  \"Float64Array\",\n  \"Int8Array\",\n  \"Uint8Array\",\n  \"Uint8ClampedArray\",\n  \"Int16Array\",\n  \"Int32Array\",\n  \"Uint16Array\",\n  \"Uint32Array\",\n  \"BigInt64Array\",\n  \"BigUint64Array\",\n  // Keyed collections\n  \"Set\",\n  \"Map\",\n  \"WeakSet\",\n  \"WeakMap\",\n  // Structured data\n  \"ArrayBuffer\",\n  \"SharedArrayBuffer\",\n  \"Atomics\",\n  \"DataView\",\n  \"JSON\",\n  // Control abstraction objects\n  \"Promise\",\n  \"Generator\",\n  \"GeneratorFunction\",\n  \"AsyncFunction\",\n  // Reflection\n  \"Reflect\",\n  \"Proxy\",\n  // Internationalization\n  \"Intl\",\n  // WebAssembly\n  \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n  \"Error\",\n  \"EvalError\",\n  \"InternalError\",\n  \"RangeError\",\n  \"ReferenceError\",\n  \"SyntaxError\",\n  \"TypeError\",\n  \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n  \"setInterval\",\n  \"setTimeout\",\n  \"clearInterval\",\n  \"clearTimeout\",\n\n  \"require\",\n  \"exports\",\n\n  \"eval\",\n  \"isFinite\",\n  \"isNaN\",\n  \"parseFloat\",\n  \"parseInt\",\n  \"decodeURI\",\n  \"decodeURIComponent\",\n  \"encodeURI\",\n  \"encodeURIComponent\",\n  \"escape\",\n  \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n  \"arguments\",\n  \"this\",\n  \"super\",\n  \"console\",\n  \"window\",\n  \"document\",\n  \"localStorage\",\n  \"sessionStorage\",\n  \"module\",\n  \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n  BUILT_IN_GLOBALS,\n  TYPES,\n  ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Takes a string like \"<Booger\" and checks to see\n   * if we can find a matching \"</Booger\" later in the\n   * content.\n   * @param {RegExpMatchArray} match\n   * @param {{after:number}} param1\n   */\n  const hasClosingTag = (match, { after }) => {\n    const tag = \"</\" + match[0].slice(1);\n    const pos = match.input.indexOf(tag, after);\n    return pos !== -1;\n  };\n\n  const IDENT_RE$1 = IDENT_RE;\n  const FRAGMENT = {\n    begin: '<>',\n    end: '</>'\n  };\n  // to avoid some special cases inside isTrulyOpeningTag\n  const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n  const XML_TAG = {\n    begin: /<[A-Za-z0-9\\\\._:-]+/,\n    end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n    /**\n     * @param {RegExpMatchArray} match\n     * @param {CallbackResponse} response\n     */\n    isTrulyOpeningTag: (match, response) => {\n      const afterMatchIndex = match[0].length + match.index;\n      const nextChar = match.input[afterMatchIndex];\n      if (\n        // HTML should not include another raw `<` inside a tag\n        // nested type?\n        // `<Array<Array<number>>`, etc.\n        nextChar === \"<\" ||\n        // the , gives away that this is not HTML\n        // `<T, A extends keyof T, V>`\n        nextChar === \",\"\n        ) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<something>`\n      // Quite possibly a tag, lets look for a matching closing tag...\n      if (nextChar === \">\") {\n        // if we cannot find a matching closing tag, then we\n        // will ignore it\n        if (!hasClosingTag(match, { after: afterMatchIndex })) {\n          response.ignoreMatch();\n        }\n      }\n\n      // `<blah />` (self-closing)\n      // handled by simpleSelfClosing rule\n\n      let m;\n      const afterMatch = match.input.substring(afterMatchIndex);\n\n      // some more template typing stuff\n      //  <T = any>(key?: string) => Modify<\n      if ((m = afterMatch.match(/^\\s*=/))) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<From extends string>`\n      // technically this could be HTML, but it smells like a type\n      // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n      if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n        if (m.index === 0) {\n          response.ignoreMatch();\n          // eslint-disable-next-line no-useless-return\n          return;\n        }\n      }\n    }\n  };\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  // https://tc39.es/ecma262/#sec-literals-numeric-literals\n  const decimalDigits = '[0-9](_?[0-9])*';\n  const frac = `\\\\.(${decimalDigits})`;\n  // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n  // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n  const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // DecimalLiteral\n      { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n        `[eE][+-]?(${decimalDigits})\\\\b` },\n      { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n      // DecimalBigIntegerLiteral\n      { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n      // NonDecimalIntegerLiteral\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n      // LegacyOctalIntegerLiteral (does not include underscore separators)\n      // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n      { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n    ],\n    relevance: 0\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: '\\\\$\\\\{',\n    end: '\\\\}',\n    keywords: KEYWORDS$1,\n    contains: [] // defined later\n  };\n  const HTML_TEMPLATE = {\n    begin: '\\.?html`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'xml'\n    }\n  };\n  const CSS_TEMPLATE = {\n    begin: '\\.?css`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'css'\n    }\n  };\n  const GRAPHQL_TEMPLATE = {\n    begin: '\\.?gql`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'graphql'\n    }\n  };\n  const TEMPLATE_STRING = {\n    className: 'string',\n    begin: '`',\n    end: '`',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ]\n  };\n  const JSDOC_COMMENT = hljs.COMMENT(\n    /\\/\\*\\*(?!\\/)/,\n    '\\\\*/',\n    {\n      relevance: 0,\n      contains: [\n        {\n          begin: '(?=@[A-Za-z]+)',\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            },\n            {\n              className: 'type',\n              begin: '\\\\{',\n              end: '\\\\}',\n              excludeEnd: true,\n              excludeBegin: true,\n              relevance: 0\n            },\n            {\n              className: 'variable',\n              begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n              endsParent: true,\n              relevance: 0\n            },\n            // eat spaces (not newlines) so we can find\n            // types or variables\n            {\n              begin: /(?=[^\\n])\\s/,\n              relevance: 0\n            }\n          ]\n        }\n      ]\n    }\n  );\n  const COMMENT = {\n    className: \"comment\",\n    variants: [\n      JSDOC_COMMENT,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_LINE_COMMENT_MODE\n    ]\n  };\n  const SUBST_INTERNALS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    HTML_TEMPLATE,\n    CSS_TEMPLATE,\n    GRAPHQL_TEMPLATE,\n    TEMPLATE_STRING,\n    // Skip numbers when they are part of a variable name\n    { match: /\\$\\d+/ },\n    NUMBER,\n    // This is intentional:\n    // See https://github.com/highlightjs/highlight.js/issues/3288\n    // hljs.REGEXP_MODE\n  ];\n  SUBST.contains = SUBST_INTERNALS\n    .concat({\n      // we need to pair up {} inside our subst to prevent\n      // it from ending too early by matching another }\n      begin: /\\{/,\n      end: /\\}/,\n      keywords: KEYWORDS$1,\n      contains: [\n        \"self\"\n      ].concat(SUBST_INTERNALS)\n    });\n  const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n  const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n    // eat recursive parens in sub expressions\n    {\n      begin: /(\\s*)\\(/,\n      end: /\\)/,\n      keywords: KEYWORDS$1,\n      contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n    }\n  ]);\n  const PARAMS = {\n    className: 'params',\n    // convert this to negative lookbehind in v12\n    begin: /(\\s*)\\(/, // to match the parms with\n    end: /\\)/,\n    excludeBegin: true,\n    excludeEnd: true,\n    keywords: KEYWORDS$1,\n    contains: PARAMS_CONTAINS\n  };\n\n  // ES6 classes\n  const CLASS_OR_EXTENDS = {\n    variants: [\n      // class Car extends vehicle\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1,\n          /\\s+/,\n          /extends/,\n          /\\s+/,\n          regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          5: \"keyword\",\n          7: \"title.class.inherited\"\n        }\n      },\n      // class Car\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n\n    ]\n  };\n\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match:\n    regex.either(\n      // Hard coded exceptions\n      /\\bJSON/,\n      // Float32Array, OutT\n      /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n      // CSSFactory, CSSFactoryT\n      /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n      // FPs, FPsT\n      /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n      // P\n      // single letters are not highlighted\n      // BLAH\n      // this will be flagged as a UPPER_CASE_CONSTANT instead\n    ),\n    className: \"title.class\",\n    keywords: {\n      _: [\n        // se we still get relevance credit for JS library classes\n        ...TYPES,\n        ...ERROR_TYPES\n      ]\n    }\n  };\n\n  const USE_STRICT = {\n    label: \"use_strict\",\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use (strict|asm)['\"]/\n  };\n\n  const FUNCTION_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /function/,\n          /\\s+/,\n          IDENT_RE$1,\n          /(?=\\s*\\()/\n        ]\n      },\n      // anonymous function\n      {\n        match: [\n          /function/,\n          /\\s*(?=\\()/\n        ]\n      }\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    label: \"func.def\",\n    contains: [ PARAMS ],\n    illegal: /%/\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  function noneOf(list) {\n    return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n  }\n\n  const FUNCTION_CALL = {\n    match: regex.concat(\n      /\\b/,\n      noneOf([\n        ...BUILT_IN_GLOBALS,\n        \"super\",\n        \"import\"\n      ].map(x => `${x}\\\\s*\\\\(`)),\n      IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n    className: \"title.function\",\n    relevance: 0\n  };\n\n  const PROPERTY_ACCESS = {\n    begin: regex.concat(/\\./, regex.lookahead(\n      regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n    )),\n    end: IDENT_RE$1,\n    excludeBegin: true,\n    keywords: \"prototype\",\n    className: \"property\",\n    relevance: 0\n  };\n\n  const GETTER_OR_SETTER = {\n    match: [\n      /get|set/,\n      /\\s+/,\n      IDENT_RE$1,\n      /(?=\\()/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      { // eat to avoid empty params\n        begin: /\\(\\)/\n      },\n      PARAMS\n    ]\n  };\n\n  const FUNC_LEAD_IN_RE = '(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n  const FUNCTION_VARIABLE = {\n    match: [\n      /const|var|let/, /\\s+/,\n      IDENT_RE$1, /\\s*/,\n      /=\\s*/,\n      /(async\\s*)?/, // async is optional\n      regex.lookahead(FUNC_LEAD_IN_RE)\n    ],\n    keywords: \"async\",\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  return {\n    name: 'JavaScript',\n    aliases: ['js', 'jsx', 'mjs', 'cjs'],\n    keywords: KEYWORDS$1,\n    // this will be extended by TypeScript\n    exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n    illegal: /#(?![$_A-z])/,\n    contains: [\n      hljs.SHEBANG({\n        label: \"shebang\",\n        binary: \"node\",\n        relevance: 5\n      }),\n      USE_STRICT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      HTML_TEMPLATE,\n      CSS_TEMPLATE,\n      GRAPHQL_TEMPLATE,\n      TEMPLATE_STRING,\n      COMMENT,\n      // Skip numbers when they are part of a variable name\n      { match: /\\$\\d+/ },\n      NUMBER,\n      CLASS_REFERENCE,\n      {\n        scope: 'attr',\n        match: IDENT_RE$1 + regex.lookahead(':'),\n        relevance: 0\n      },\n      FUNCTION_VARIABLE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        relevance: 0,\n        contains: [\n          COMMENT,\n          hljs.REGEXP_MODE,\n          {\n            className: 'function',\n            // we have to count the parens to make sure we actually have the\n            // correct bounding ( ) before the =>.  There could be any number of\n            // sub-expressions inside also surrounded by parens.\n            begin: FUNC_LEAD_IN_RE,\n            returnBegin: true,\n            end: '\\\\s*=>',\n            contains: [\n              {\n                className: 'params',\n                variants: [\n                  {\n                    begin: hljs.UNDERSCORE_IDENT_RE,\n                    relevance: 0\n                  },\n                  {\n                    className: null,\n                    begin: /\\(\\s*\\)/,\n                    skip: true\n                  },\n                  {\n                    begin: /(\\s*)\\(/,\n                    end: /\\)/,\n                    excludeBegin: true,\n                    excludeEnd: true,\n                    keywords: KEYWORDS$1,\n                    contains: PARAMS_CONTAINS\n                  }\n                ]\n              }\n            ]\n          },\n          { // could be a comma delimited list of params to a function call\n            begin: /,/,\n            relevance: 0\n          },\n          {\n            match: /\\s+/,\n            relevance: 0\n          },\n          { // JSX\n            variants: [\n              { begin: FRAGMENT.begin, end: FRAGMENT.end },\n              { match: XML_SELF_CLOSING },\n              {\n                begin: XML_TAG.begin,\n                // we carefully check the opening tag to see if it truly\n                // is a tag and not a false positive\n                'on:begin': XML_TAG.isTrulyOpeningTag,\n                end: XML_TAG.end\n              }\n            ],\n            subLanguage: 'xml',\n            contains: [\n              {\n                begin: XML_TAG.begin,\n                end: XML_TAG.end,\n                skip: true,\n                contains: ['self']\n              }\n            ]\n          }\n        ],\n      },\n      FUNCTION_DEFINITION,\n      {\n        // prevent this from getting swallowed up by function\n        // since they appear \"function like\"\n        beginKeywords: \"while if switch catch for\"\n      },\n      {\n        // we have to count the parens to make sure we actually have the correct\n        // bounding ( ).  There could be any number of sub-expressions inside\n        // also surrounded by parens.\n        begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n          '\\\\(' + // first parens\n          '[^()]*(\\\\(' +\n            '[^()]*(\\\\(' +\n              '[^()]*' +\n            '\\\\)[^()]*)*' +\n          '\\\\)[^()]*)*' +\n          '\\\\)\\\\s*\\\\{', // end parens\n        returnBegin:true,\n        label: \"func.def\",\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n        ]\n      },\n      // catch ... so it won't trigger the property rule below\n      {\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      PROPERTY_ACCESS,\n      // hack: prevents detection of keywords in some circumstances\n      // .keyword()\n      // $keyword = x\n      {\n        match: '\\\\$' + IDENT_RE$1,\n        relevance: 0\n      },\n      {\n        match: [ /\\bconstructor(?=\\s*\\()/ ],\n        className: { 1: \"title.function\" },\n        contains: [ PARAMS ]\n      },\n      FUNCTION_CALL,\n      UPPER_CASE_CONSTANT,\n      CLASS_OR_EXTENDS,\n      GETTER_OR_SETTER,\n      {\n        match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      }\n    ]\n  };\n}\n\nmodule.exports = javascript;\n","/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://www.json.org\nCategory: common, protocols, web\n*/\n\nfunction json(hljs) {\n  const ATTRIBUTE = {\n    className: 'attr',\n    begin: /\"(\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n    relevance: 1.01\n  };\n  const PUNCTUATION = {\n    match: /[{}[\\],:]/,\n    className: \"punctuation\",\n    relevance: 0\n  };\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"null\"\n  ];\n  // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n  // - to use the very tight `illegal: \\S` rule later to flag any other character\n  // - as illegal indicating that despite looking like JSON we do not truly have\n  // - JSON and thus improve false-positively greatly since JSON will try and claim\n  // - all sorts of JSON looking stuff\n  const LITERALS_MODE = {\n    scope: \"literal\",\n    beginKeywords: LITERALS.join(\" \"),\n  };\n\n  return {\n    name: 'JSON',\n    aliases: ['jsonc'],\n    keywords:{\n      literal: LITERALS,\n    },\n    contains: [\n      ATTRIBUTE,\n      PUNCTUATION,\n      hljs.QUOTE_STRING_MODE,\n      LITERALS_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ],\n    illegal: '\\\\S'\n  };\n}\n\nmodule.exports = json;\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n  className: 'number',\n  variants: [\n    // DecimalFloatingPointLiteral\n    // including ExponentPart\n    { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n      `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n    // excluding ExponentPart\n    { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n    { begin: `(${frac})[fFdD]?\\\\b` },\n    { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n    // HexadecimalFloatingPointLiteral\n    { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n      `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n    // DecimalIntegerLiteral\n    { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n    // HexIntegerLiteral\n    { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n    // OctalIntegerLiteral\n    { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n    // BinaryIntegerLiteral\n    { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n  ],\n  relevance: 0\n};\n\n/*\n Language: Kotlin\n Description: Kotlin is an OSS statically typed programming language that targets the JVM, Android, JavaScript and Native.\n Author: Sergey Mashkov <cy6erGn0m@gmail.com>\n Website: https://kotlinlang.org\n Category: common\n */\n\n\nfunction kotlin(hljs) {\n  const KEYWORDS = {\n    keyword:\n      'abstract as val var vararg get set class object open private protected public noinline '\n      + 'crossinline dynamic final enum if else do while for when throw try catch finally '\n      + 'import package is in fun override companion reified inline lateinit init '\n      + 'interface annotation data sealed internal infix operator out by constructor super '\n      + 'tailrec where const inner suspend typealias external expect actual',\n    built_in:\n      'Byte Short Char Int Long Boolean Float Double Void Unit Nothing',\n    literal:\n      'true false null'\n  };\n  const KEYWORDS_WITH_LABEL = {\n    className: 'keyword',\n    begin: /\\b(break|continue|return|this)\\b/,\n    starts: { contains: [\n      {\n        className: 'symbol',\n        begin: /@\\w+/\n      }\n    ] }\n  };\n  const LABEL = {\n    className: 'symbol',\n    begin: hljs.UNDERSCORE_IDENT_RE + '@'\n  };\n\n  // for string templates\n  const SUBST = {\n    className: 'subst',\n    begin: /\\$\\{/,\n    end: /\\}/,\n    contains: [ hljs.C_NUMBER_MODE ]\n  };\n  const VARIABLE = {\n    className: 'variable',\n    begin: '\\\\$' + hljs.UNDERSCORE_IDENT_RE\n  };\n  const STRING = {\n    className: 'string',\n    variants: [\n      {\n        begin: '\"\"\"',\n        end: '\"\"\"(?=[^\"])',\n        contains: [\n          VARIABLE,\n          SUBST\n        ]\n      },\n      // Can't use built-in modes easily, as we want to use STRING in the meta\n      // context as 'meta-string' and there's no syntax to remove explicitly set\n      // classNames in built-in modes.\n      {\n        begin: '\\'',\n        end: '\\'',\n        illegal: /\\n/,\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      {\n        begin: '\"',\n        end: '\"',\n        illegal: /\\n/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          VARIABLE,\n          SUBST\n        ]\n      }\n    ]\n  };\n  SUBST.contains.push(STRING);\n\n  const ANNOTATION_USE_SITE = {\n    className: 'meta',\n    begin: '@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*' + hljs.UNDERSCORE_IDENT_RE + ')?'\n  };\n  const ANNOTATION = {\n    className: 'meta',\n    begin: '@' + hljs.UNDERSCORE_IDENT_RE,\n    contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [\n          hljs.inherit(STRING, { className: 'string' }),\n          \"self\"\n        ]\n      }\n    ]\n  };\n\n  // https://kotlinlang.org/docs/reference/whatsnew11.html#underscores-in-numeric-literals\n  // According to the doc above, the number mode of kotlin is the same as java 8,\n  // so the code below is copied from java.js\n  const KOTLIN_NUMBER_MODE = NUMERIC;\n  const KOTLIN_NESTED_COMMENT = hljs.COMMENT(\n    '/\\\\*', '\\\\*/',\n    { contains: [ hljs.C_BLOCK_COMMENT_MODE ] }\n  );\n  const KOTLIN_PAREN_TYPE = { variants: [\n    {\n      className: 'type',\n      begin: hljs.UNDERSCORE_IDENT_RE\n    },\n    {\n      begin: /\\(/,\n      end: /\\)/,\n      contains: [] // defined later\n    }\n  ] };\n  const KOTLIN_PAREN_TYPE2 = KOTLIN_PAREN_TYPE;\n  KOTLIN_PAREN_TYPE2.variants[1].contains = [ KOTLIN_PAREN_TYPE ];\n  KOTLIN_PAREN_TYPE.variants[1].contains = [ KOTLIN_PAREN_TYPE2 ];\n\n  return {\n    name: 'Kotlin',\n    aliases: [\n      'kt',\n      'kts'\n    ],\n    keywords: KEYWORDS,\n    contains: [\n      hljs.COMMENT(\n        '/\\\\*\\\\*',\n        '\\\\*/',\n        {\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            }\n          ]\n        }\n      ),\n      hljs.C_LINE_COMMENT_MODE,\n      KOTLIN_NESTED_COMMENT,\n      KEYWORDS_WITH_LABEL,\n      LABEL,\n      ANNOTATION_USE_SITE,\n      ANNOTATION,\n      {\n        className: 'function',\n        beginKeywords: 'fun',\n        end: '[(]|$',\n        returnBegin: true,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        relevance: 5,\n        contains: [\n          {\n            begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(',\n            returnBegin: true,\n            relevance: 0,\n            contains: [ hljs.UNDERSCORE_TITLE_MODE ]\n          },\n          {\n            className: 'type',\n            begin: /</,\n            end: />/,\n            keywords: 'reified',\n            relevance: 0\n          },\n          {\n            className: 'params',\n            begin: /\\(/,\n            end: /\\)/,\n            endsParent: true,\n            keywords: KEYWORDS,\n            relevance: 0,\n            contains: [\n              {\n                begin: /:/,\n                end: /[=,\\/]/,\n                endsWithParent: true,\n                contains: [\n                  KOTLIN_PAREN_TYPE,\n                  hljs.C_LINE_COMMENT_MODE,\n                  KOTLIN_NESTED_COMMENT\n                ],\n                relevance: 0\n              },\n              hljs.C_LINE_COMMENT_MODE,\n              KOTLIN_NESTED_COMMENT,\n              ANNOTATION_USE_SITE,\n              ANNOTATION,\n              STRING,\n              hljs.C_NUMBER_MODE\n            ]\n          },\n          KOTLIN_NESTED_COMMENT\n        ]\n      },\n      {\n        begin: [\n          /class|interface|trait/,\n          /\\s+/,\n          hljs.UNDERSCORE_IDENT_RE\n        ],\n        beginScope: {\n          3: \"title.class\"\n        },\n        keywords: 'class interface trait',\n        end: /[:\\{(]|$/,\n        excludeEnd: true,\n        illegal: 'extends implements',\n        contains: [\n          { beginKeywords: 'public protected internal private constructor' },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'type',\n            begin: /</,\n            end: />/,\n            excludeBegin: true,\n            excludeEnd: true,\n            relevance: 0\n          },\n          {\n            className: 'type',\n            begin: /[,:]\\s*/,\n            end: /[<\\(,){\\s]|$/,\n            excludeBegin: true,\n            returnEnd: true\n          },\n          ANNOTATION_USE_SITE,\n          ANNOTATION\n        ]\n      },\n      STRING,\n      {\n        className: 'meta',\n        begin: \"^#!/usr/bin/env\",\n        end: '$',\n        illegal: '\\n'\n      },\n      KOTLIN_NUMBER_MODE\n    ]\n  };\n}\n\nmodule.exports = kotlin;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n// some grammars use them all as a single group\nconst PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS).sort().reverse();\n\n/*\nLanguage: Less\nDescription: It's CSS, with just a little more.\nAuthor:   Max Mikhailov <seven.phases.max@gmail.com>\nWebsite: http://lesscss.org\nCategory: common, css, web\n*/\n\n\n/** @type LanguageFn */\nfunction less(hljs) {\n  const modes = MODES(hljs);\n  const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS;\n\n  const AT_MODIFIERS = \"and or not only\";\n  const IDENT_RE = '[\\\\w-]+'; // yes, Less identifiers may begin with a digit\n  const INTERP_IDENT_RE = '(' + IDENT_RE + '|@\\\\{' + IDENT_RE + '\\\\})';\n\n  /* Generic Modes */\n\n  const RULES = []; const VALUE_MODES = []; // forward def. for recursive modes\n\n  const STRING_MODE = function(c) {\n    return {\n    // Less strings are not multiline (also include '~' for more consistent coloring of \"escaped\" strings)\n      className: 'string',\n      begin: '~?' + c + '.*?' + c\n    };\n  };\n\n  const IDENT_MODE = function(name, begin, relevance) {\n    return {\n      className: name,\n      begin: begin,\n      relevance: relevance\n    };\n  };\n\n  const AT_KEYWORDS = {\n    $pattern: /[a-z-]+/,\n    keyword: AT_MODIFIERS,\n    attribute: MEDIA_FEATURES.join(\" \")\n  };\n\n  const PARENS_MODE = {\n    // used only to properly balance nested parens inside mixin call, def. arg list\n    begin: '\\\\(',\n    end: '\\\\)',\n    contains: VALUE_MODES,\n    keywords: AT_KEYWORDS,\n    relevance: 0\n  };\n\n  // generic Less highlighter (used almost everywhere except selectors):\n  VALUE_MODES.push(\n    hljs.C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    STRING_MODE(\"'\"),\n    STRING_MODE('\"'),\n    modes.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :(\n    {\n      begin: '(url|data-uri)\\\\(',\n      starts: {\n        className: 'string',\n        end: '[\\\\)\\\\n]',\n        excludeEnd: true\n      }\n    },\n    modes.HEXCOLOR,\n    PARENS_MODE,\n    IDENT_MODE('variable', '@@?' + IDENT_RE, 10),\n    IDENT_MODE('variable', '@\\\\{' + IDENT_RE + '\\\\}'),\n    IDENT_MODE('built_in', '~?`[^`]*?`'), // inline javascript (or whatever host language) *multiline* string\n    { // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding):\n      className: 'attribute',\n      begin: IDENT_RE + '\\\\s*:',\n      end: ':',\n      returnBegin: true,\n      excludeEnd: true\n    },\n    modes.IMPORTANT,\n    { beginKeywords: 'and not' },\n    modes.FUNCTION_DISPATCH\n  );\n\n  const VALUE_WITH_RULESETS = VALUE_MODES.concat({\n    begin: /\\{/,\n    end: /\\}/,\n    contains: RULES\n  });\n\n  const MIXIN_GUARD_MODE = {\n    beginKeywords: 'when',\n    endsWithParent: true,\n    contains: [ { beginKeywords: 'and not' } ].concat(VALUE_MODES) // using this form to override VALUE’s 'function' match\n  };\n\n  /* Rule-Level Modes */\n\n  const RULE_MODE = {\n    begin: INTERP_IDENT_RE + '\\\\s*:',\n    returnBegin: true,\n    end: /[;}]/,\n    relevance: 0,\n    contains: [\n      { begin: /-(webkit|moz|ms|o)-/ },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b',\n        end: /(?=:)/,\n        starts: {\n          endsWithParent: true,\n          illegal: '[<=$]',\n          relevance: 0,\n          contains: VALUE_MODES\n        }\n      }\n    ]\n  };\n\n  const AT_RULE_MODE = {\n    className: 'keyword',\n    begin: '@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b',\n    starts: {\n      end: '[;{}]',\n      keywords: AT_KEYWORDS,\n      returnEnd: true,\n      contains: VALUE_MODES,\n      relevance: 0\n    }\n  };\n\n  // variable definitions and calls\n  const VAR_RULE_MODE = {\n    className: 'variable',\n    variants: [\n      // using more strict pattern for higher relevance to increase chances of Less detection.\n      // this is *the only* Less specific statement used in most of the sources, so...\n      // (we’ll still often loose to the css-parser unless there's '//' comment,\n      // simply because 1 variable just can't beat 99 properties :)\n      {\n        begin: '@' + IDENT_RE + '\\\\s*:',\n        relevance: 15\n      },\n      { begin: '@' + IDENT_RE }\n    ],\n    starts: {\n      end: '[;}]',\n      returnEnd: true,\n      contains: VALUE_WITH_RULESETS\n    }\n  };\n\n  const SELECTOR_MODE = {\n    // first parse unambiguous selectors (i.e. those not starting with tag)\n    // then fall into the scary lookahead-discriminator variant.\n    // this mode also handles mixin definitions and calls\n    variants: [\n      {\n        begin: '[\\\\.#:&\\\\[>]',\n        end: '[;{}]' // mixin calls end with ';'\n      },\n      {\n        begin: INTERP_IDENT_RE,\n        end: /\\{/\n      }\n    ],\n    returnBegin: true,\n    returnEnd: true,\n    illegal: '[<=\\'$\"]',\n    relevance: 0,\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      MIXIN_GUARD_MODE,\n      IDENT_MODE('keyword', 'all\\\\b'),\n      IDENT_MODE('variable', '@\\\\{' + IDENT_RE + '\\\\}'), // otherwise it’s identified as tag\n      \n      {\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b',\n        className: 'selector-tag'\n      },\n      modes.CSS_NUMBER_MODE,\n      IDENT_MODE('selector-tag', INTERP_IDENT_RE, 0),\n      IDENT_MODE('selector-id', '#' + INTERP_IDENT_RE),\n      IDENT_MODE('selector-class', '\\\\.' + INTERP_IDENT_RE, 0),\n      IDENT_MODE('selector-tag', '&', 0),\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-pseudo',\n        begin: ':(' + PSEUDO_CLASSES.join('|') + ')'\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')'\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        relevance: 0,\n        contains: VALUE_WITH_RULESETS\n      }, // argument list of parametric mixins\n      { begin: '!important' }, // eat !important after mixin call or it will be colored as tag\n      modes.FUNCTION_DISPATCH\n    ]\n  };\n\n  const PSEUDO_SELECTOR_MODE = {\n    begin: IDENT_RE + ':(:)?' + `(${PSEUDO_SELECTORS$1.join('|')})`,\n    returnBegin: true,\n    contains: [ SELECTOR_MODE ]\n  };\n\n  RULES.push(\n    hljs.C_LINE_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    AT_RULE_MODE,\n    VAR_RULE_MODE,\n    PSEUDO_SELECTOR_MODE,\n    RULE_MODE,\n    SELECTOR_MODE,\n    MIXIN_GUARD_MODE,\n    modes.FUNCTION_DISPATCH\n  );\n\n  return {\n    name: 'Less',\n    case_insensitive: true,\n    illegal: '[=>\\'/<($\"]',\n    contains: RULES\n  };\n}\n\nmodule.exports = less;\n","/*\nLanguage: Lua\nDescription: Lua is a powerful, efficient, lightweight, embeddable scripting language.\nAuthor: Andrew Fedorov <dmmdrs@mail.ru>\nCategory: common, gaming, scripting\nWebsite: https://www.lua.org\n*/\n\nfunction lua(hljs) {\n  const OPENING_LONG_BRACKET = '\\\\[=*\\\\[';\n  const CLOSING_LONG_BRACKET = '\\\\]=*\\\\]';\n  const LONG_BRACKETS = {\n    begin: OPENING_LONG_BRACKET,\n    end: CLOSING_LONG_BRACKET,\n    contains: [ 'self' ]\n  };\n  const COMMENTS = [\n    hljs.COMMENT('--(?!' + OPENING_LONG_BRACKET + ')', '$'),\n    hljs.COMMENT(\n      '--' + OPENING_LONG_BRACKET,\n      CLOSING_LONG_BRACKET,\n      {\n        contains: [ LONG_BRACKETS ],\n        relevance: 10\n      }\n    )\n  ];\n  return {\n    name: 'Lua',\n    aliases: ['pluto'],\n    keywords: {\n      $pattern: hljs.UNDERSCORE_IDENT_RE,\n      literal: \"true false nil\",\n      keyword: \"and break do else elseif end for goto if in local not or repeat return then until while\",\n      built_in:\n        // Metatags and globals:\n        '_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len '\n        + '__gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert '\n        // Standard methods and properties:\n        + 'collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring '\n        + 'module next pairs pcall print rawequal rawget rawset require select setfenv '\n        + 'setmetatable tonumber tostring type unpack xpcall arg self '\n        // Library methods and properties (one line per library):\n        + 'coroutine resume yield status wrap create running debug getupvalue '\n        + 'debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv '\n        + 'io lines write close flush open output type read stderr stdin input stdout popen tmpfile '\n        + 'math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan '\n        + 'os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall '\n        + 'string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower '\n        + 'table setn insert getn foreachi maxn foreach concat sort remove'\n    },\n    contains: COMMENTS.concat([\n      {\n        className: 'function',\n        beginKeywords: 'function',\n        end: '\\\\)',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, { begin: '([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*' }),\n          {\n            className: 'params',\n            begin: '\\\\(',\n            endsWithParent: true,\n            contains: COMMENTS\n          }\n        ].concat(COMMENTS)\n      },\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: OPENING_LONG_BRACKET,\n        end: CLOSING_LONG_BRACKET,\n        contains: [ LONG_BRACKETS ],\n        relevance: 5\n      }\n    ])\n  };\n}\n\nmodule.exports = lua;\n","/*\nLanguage: Makefile\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Joël Porquet <joel@porquet.org>\nWebsite: https://www.gnu.org/software/make/manual/html_node/Introduction.html\nCategory: common, build-system\n*/\n\nfunction makefile(hljs) {\n  /* Variables: simple (eg $(var)) and special (eg $@) */\n  const VARIABLE = {\n    className: 'variable',\n    variants: [\n      {\n        begin: '\\\\$\\\\(' + hljs.UNDERSCORE_IDENT_RE + '\\\\)',\n        contains: [ hljs.BACKSLASH_ESCAPE ]\n      },\n      { begin: /\\$[@%<?\\^\\+\\*]/ }\n    ]\n  };\n  /* Quoted string with variables inside */\n  const QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VARIABLE\n    ]\n  };\n  /* Function: $(func arg,...) */\n  const FUNC = {\n    className: 'variable',\n    begin: /\\$\\([\\w-]+\\s/,\n    end: /\\)/,\n    keywords: { built_in:\n        'subst patsubst strip findstring filter filter-out sort '\n        + 'word wordlist firstword lastword dir notdir suffix basename '\n        + 'addsuffix addprefix join wildcard realpath abspath error warning '\n        + 'shell origin flavor foreach if or and call eval file value' },\n    contains: [ \n      VARIABLE,\n      QUOTE_STRING // Added QUOTE_STRING as they can be a part of functions\n    ]\n  };\n  /* Variable assignment */\n  const ASSIGNMENT = { begin: '^' + hljs.UNDERSCORE_IDENT_RE + '\\\\s*(?=[:+?]?=)' };\n  /* Meta targets (.PHONY) */\n  const META = {\n    className: 'meta',\n    begin: /^\\.PHONY:/,\n    end: /$/,\n    keywords: {\n      $pattern: /[\\.\\w]+/,\n      keyword: '.PHONY'\n    }\n  };\n  /* Targets */\n  const TARGET = {\n    className: 'section',\n    begin: /^[^\\s]+:/,\n    end: /$/,\n    contains: [ VARIABLE ]\n  };\n  return {\n    name: 'Makefile',\n    aliases: [\n      'mk',\n      'mak',\n      'make',\n    ],\n    keywords: {\n      $pattern: /[\\w-]+/,\n      keyword: 'define endef undefine ifdef ifndef ifeq ifneq else endif '\n      + 'include -include sinclude override export unexport private vpath'\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      VARIABLE,\n      QUOTE_STRING,\n      FUNC,\n      ASSIGNMENT,\n      META,\n      TARGET\n    ]\n  };\n}\n\nmodule.exports = makefile;\n","/*\nLanguage: Perl\nAuthor: Peter Leonov <gojpeg@yandex.ru>\nWebsite: https://www.perl.org\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction perl(hljs) {\n  const regex = hljs.regex;\n  const KEYWORDS = [\n    'abs',\n    'accept',\n    'alarm',\n    'and',\n    'atan2',\n    'bind',\n    'binmode',\n    'bless',\n    'break',\n    'caller',\n    'chdir',\n    'chmod',\n    'chomp',\n    'chop',\n    'chown',\n    'chr',\n    'chroot',\n    'class',\n    'close',\n    'closedir',\n    'connect',\n    'continue',\n    'cos',\n    'crypt',\n    'dbmclose',\n    'dbmopen',\n    'defined',\n    'delete',\n    'die',\n    'do',\n    'dump',\n    'each',\n    'else',\n    'elsif',\n    'endgrent',\n    'endhostent',\n    'endnetent',\n    'endprotoent',\n    'endpwent',\n    'endservent',\n    'eof',\n    'eval',\n    'exec',\n    'exists',\n    'exit',\n    'exp',\n    'fcntl',\n    'field',\n    'fileno',\n    'flock',\n    'for',\n    'foreach',\n    'fork',\n    'format',\n    'formline',\n    'getc',\n    'getgrent',\n    'getgrgid',\n    'getgrnam',\n    'gethostbyaddr',\n    'gethostbyname',\n    'gethostent',\n    'getlogin',\n    'getnetbyaddr',\n    'getnetbyname',\n    'getnetent',\n    'getpeername',\n    'getpgrp',\n    'getpriority',\n    'getprotobyname',\n    'getprotobynumber',\n    'getprotoent',\n    'getpwent',\n    'getpwnam',\n    'getpwuid',\n    'getservbyname',\n    'getservbyport',\n    'getservent',\n    'getsockname',\n    'getsockopt',\n    'given',\n    'glob',\n    'gmtime',\n    'goto',\n    'grep',\n    'gt',\n    'hex',\n    'if',\n    'index',\n    'int',\n    'ioctl',\n    'join',\n    'keys',\n    'kill',\n    'last',\n    'lc',\n    'lcfirst',\n    'length',\n    'link',\n    'listen',\n    'local',\n    'localtime',\n    'log',\n    'lstat',\n    'lt',\n    'ma',\n    'map',\n    'method',\n    'mkdir',\n    'msgctl',\n    'msgget',\n    'msgrcv',\n    'msgsnd',\n    'my',\n    'ne',\n    'next',\n    'no',\n    'not',\n    'oct',\n    'open',\n    'opendir',\n    'or',\n    'ord',\n    'our',\n    'pack',\n    'package',\n    'pipe',\n    'pop',\n    'pos',\n    'print',\n    'printf',\n    'prototype',\n    'push',\n    'q|0',\n    'qq',\n    'quotemeta',\n    'qw',\n    'qx',\n    'rand',\n    'read',\n    'readdir',\n    'readline',\n    'readlink',\n    'readpipe',\n    'recv',\n    'redo',\n    'ref',\n    'rename',\n    'require',\n    'reset',\n    'return',\n    'reverse',\n    'rewinddir',\n    'rindex',\n    'rmdir',\n    'say',\n    'scalar',\n    'seek',\n    'seekdir',\n    'select',\n    'semctl',\n    'semget',\n    'semop',\n    'send',\n    'setgrent',\n    'sethostent',\n    'setnetent',\n    'setpgrp',\n    'setpriority',\n    'setprotoent',\n    'setpwent',\n    'setservent',\n    'setsockopt',\n    'shift',\n    'shmctl',\n    'shmget',\n    'shmread',\n    'shmwrite',\n    'shutdown',\n    'sin',\n    'sleep',\n    'socket',\n    'socketpair',\n    'sort',\n    'splice',\n    'split',\n    'sprintf',\n    'sqrt',\n    'srand',\n    'stat',\n    'state',\n    'study',\n    'sub',\n    'substr',\n    'symlink',\n    'syscall',\n    'sysopen',\n    'sysread',\n    'sysseek',\n    'system',\n    'syswrite',\n    'tell',\n    'telldir',\n    'tie',\n    'tied',\n    'time',\n    'times',\n    'tr',\n    'truncate',\n    'uc',\n    'ucfirst',\n    'umask',\n    'undef',\n    'unless',\n    'unlink',\n    'unpack',\n    'unshift',\n    'untie',\n    'until',\n    'use',\n    'utime',\n    'values',\n    'vec',\n    'wait',\n    'waitpid',\n    'wantarray',\n    'warn',\n    'when',\n    'while',\n    'write',\n    'x|0',\n    'xor',\n    'y|0'\n  ];\n\n  // https://perldoc.perl.org/perlre#Modifiers\n  const REGEX_MODIFIERS = /[dualxmsipngr]{0,12}/; // aa and xx are valid, making max length 12\n  const PERL_KEYWORDS = {\n    $pattern: /[\\w.]+/,\n    keyword: KEYWORDS.join(\" \")\n  };\n  const SUBST = {\n    className: 'subst',\n    begin: '[$@]\\\\{',\n    end: '\\\\}',\n    keywords: PERL_KEYWORDS\n  };\n  const METHOD = {\n    begin: /->\\{/,\n    end: /\\}/\n    // contains defined later\n  };\n  const ATTR = {\n    scope: 'attr',\n    match: /\\s+:\\s*\\w+(\\s*\\(.*?\\))?/,\n  };\n  const VAR = {\n    scope: 'variable',\n    variants: [\n      { begin: /\\$\\d/ },\n      { begin: regex.concat(\n        /[$%@](?!\")(\\^\\w\\b|#\\w+(::\\w+)*|\\{\\w+\\}|\\w+(::\\w*)*)/,\n        // negative look-ahead tries to avoid matching patterns that are not\n        // Perl at all like $ident$, @ident@, etc.\n        `(?![A-Za-z])(?![@$%])`\n        )\n      },\n      {\n        // Only $= is a special Perl variable and one can't declare @= or %=.\n        begin: /[$%@](?!\")[^\\s\\w{=]|\\$=/,\n        relevance: 0\n      }\n    ],\n    contains: [ ATTR ],\n  };\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // decimal numbers:\n      // include the case where a number starts with a dot (eg. .9), and\n      // the leading 0? avoids mixing the first and second match on 0.x cases\n      { match: /0?\\.[0-9][0-9_]+\\b/ },\n      // include the special versioned number (eg. v5.38)\n      { match: /\\bv?(0|[1-9][0-9_]*(\\.[0-9_]+)?|[1-9][0-9_]*)\\b/ },\n      // non-decimal numbers:\n      { match: /\\b0[0-7][0-7_]*\\b/ },\n      { match: /\\b0x[0-9a-fA-F][0-9a-fA-F_]*\\b/ },\n      { match: /\\b0b[0-1][0-1_]*\\b/ },\n    ],\n    relevance: 0\n  };\n  const STRING_CONTAINS = [\n    hljs.BACKSLASH_ESCAPE,\n    SUBST,\n    VAR\n  ];\n  const REGEX_DELIMS = [\n    /!/,\n    /\\//,\n    /\\|/,\n    /\\?/,\n    /'/,\n    /\"/, // valid but infrequent and weird\n    /#/ // valid but infrequent and weird\n  ];\n  /**\n   * @param {string|RegExp} prefix\n   * @param {string|RegExp} open\n   * @param {string|RegExp} close\n   */\n  const PAIRED_DOUBLE_RE = (prefix, open, close = '\\\\1') => {\n    const middle = (close === '\\\\1')\n      ? close\n      : regex.concat(close, open);\n    return regex.concat(\n      regex.concat(\"(?:\", prefix, \")\"),\n      open,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      middle,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      close,\n      REGEX_MODIFIERS\n    );\n  };\n  /**\n   * @param {string|RegExp} prefix\n   * @param {string|RegExp} open\n   * @param {string|RegExp} close\n   */\n  const PAIRED_RE = (prefix, open, close) => {\n    return regex.concat(\n      regex.concat(\"(?:\", prefix, \")\"),\n      open,\n      /(?:\\\\.|[^\\\\\\/])*?/,\n      close,\n      REGEX_MODIFIERS\n    );\n  };\n  const PERL_DEFAULT_CONTAINS = [\n    VAR,\n    hljs.HASH_COMMENT_MODE,\n    hljs.COMMENT(\n      /^=\\w/,\n      /=cut/,\n      { endsWithParent: true }\n    ),\n    METHOD,\n    {\n      className: 'string',\n      contains: STRING_CONTAINS,\n      variants: [\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\(',\n          end: '\\\\)',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\[',\n          end: '\\\\]',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\{',\n          end: '\\\\}',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\|',\n          end: '\\\\|',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*<',\n          end: '>',\n          relevance: 5\n        },\n        {\n          begin: 'qw\\\\s+q',\n          end: 'q',\n          relevance: 5\n        },\n        {\n          begin: '\\'',\n          end: '\\'',\n          contains: [ hljs.BACKSLASH_ESCAPE ]\n        },\n        {\n          begin: '\"',\n          end: '\"'\n        },\n        {\n          begin: '`',\n          end: '`',\n          contains: [ hljs.BACKSLASH_ESCAPE ]\n        },\n        {\n          begin: /\\{\\w+\\}/,\n          relevance: 0\n        },\n        {\n          begin: '-?\\\\w+\\\\s*=>',\n          relevance: 0\n        }\n      ]\n    },\n    NUMBER,\n    { // regexp container\n      begin: '(\\\\/\\\\/|' + hljs.RE_STARTERS_RE + '|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*',\n      keywords: 'split return print reverse grep',\n      relevance: 0,\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        {\n          className: 'regexp',\n          variants: [\n            // allow matching common delimiters\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", regex.either(...REGEX_DELIMS, { capture: true })) },\n            // and then paired delmis\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\(\", \"\\\\)\") },\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\[\", \"\\\\]\") },\n            { begin: PAIRED_DOUBLE_RE(\"s|tr|y\", \"\\\\{\", \"\\\\}\") }\n          ],\n          relevance: 2\n        },\n        {\n          className: 'regexp',\n          variants: [\n            {\n              // could be a comment in many languages so do not count\n              // as relevant\n              begin: /(m|qr)\\/\\//,\n              relevance: 0\n            },\n            // prefix is optional with /regex/\n            { begin: PAIRED_RE(\"(?:m|qr)?\", /\\//, /\\//) },\n            // allow matching common delimiters\n            { begin: PAIRED_RE(\"m|qr\", regex.either(...REGEX_DELIMS, { capture: true }), /\\1/) },\n            // allow common paired delmins\n            { begin: PAIRED_RE(\"m|qr\", /\\(/, /\\)/) },\n            { begin: PAIRED_RE(\"m|qr\", /\\[/, /\\]/) },\n            { begin: PAIRED_RE(\"m|qr\", /\\{/, /\\}/) }\n          ]\n        }\n      ]\n    },\n    {\n      className: 'function',\n      beginKeywords: 'sub method',\n      end: '(\\\\s*\\\\(.*?\\\\))?[;{]',\n      excludeEnd: true,\n      relevance: 5,\n      contains: [ hljs.TITLE_MODE, ATTR ]\n    },\n    {\n      className: 'class',\n      beginKeywords: 'class',\n      end: '[;{]',\n      excludeEnd: true,\n      relevance: 5,\n      contains: [ hljs.TITLE_MODE, ATTR, NUMBER ]\n    },\n    {\n      begin: '-\\\\w\\\\b',\n      relevance: 0\n    },\n    {\n      begin: \"^__DATA__$\",\n      end: \"^__END__$\",\n      subLanguage: 'mojolicious',\n      contains: [\n        {\n          begin: \"^@@.*\",\n          end: \"$\",\n          className: \"comment\"\n        }\n      ]\n    }\n  ];\n  SUBST.contains = PERL_DEFAULT_CONTAINS;\n  METHOD.contains = PERL_DEFAULT_CONTAINS;\n\n  return {\n    name: 'Perl',\n    aliases: [\n      'pl',\n      'pm'\n    ],\n    keywords: PERL_KEYWORDS,\n    contains: PERL_DEFAULT_CONTAINS\n  };\n}\n\nmodule.exports = perl;\n","/*\nLanguage: Objective-C\nAuthor: Valerii Hiora <valerii.hiora@gmail.com>\nContributors: Angel G. Olloqui <angelgarcia.mail@gmail.com>, Matt Diephouse <matt@diephouse.com>, Andrew Farmer <ahfarmer@gmail.com>, Minh Nguyễn <mxn@1ec5.org>\nWebsite: https://developer.apple.com/documentation/objectivec\nCategory: common\n*/\n\nfunction objectivec(hljs) {\n  const API_CLASS = {\n    className: 'built_in',\n    begin: '\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+'\n  };\n  const IDENTIFIER_RE = /[a-zA-Z@][a-zA-Z0-9_]*/;\n  const TYPES = [\n    \"int\",\n    \"float\",\n    \"char\",\n    \"unsigned\",\n    \"signed\",\n    \"short\",\n    \"long\",\n    \"double\",\n    \"wchar_t\",\n    \"unichar\",\n    \"void\",\n    \"bool\",\n    \"BOOL\",\n    \"id|0\",\n    \"_Bool\"\n  ];\n  const KWS = [\n    \"while\",\n    \"export\",\n    \"sizeof\",\n    \"typedef\",\n    \"const\",\n    \"struct\",\n    \"for\",\n    \"union\",\n    \"volatile\",\n    \"static\",\n    \"mutable\",\n    \"if\",\n    \"do\",\n    \"return\",\n    \"goto\",\n    \"enum\",\n    \"else\",\n    \"break\",\n    \"extern\",\n    \"asm\",\n    \"case\",\n    \"default\",\n    \"register\",\n    \"explicit\",\n    \"typename\",\n    \"switch\",\n    \"continue\",\n    \"inline\",\n    \"readonly\",\n    \"assign\",\n    \"readwrite\",\n    \"self\",\n    \"@synchronized\",\n    \"id\",\n    \"typeof\",\n    \"nonatomic\",\n    \"IBOutlet\",\n    \"IBAction\",\n    \"strong\",\n    \"weak\",\n    \"copy\",\n    \"in\",\n    \"out\",\n    \"inout\",\n    \"bycopy\",\n    \"byref\",\n    \"oneway\",\n    \"__strong\",\n    \"__weak\",\n    \"__block\",\n    \"__autoreleasing\",\n    \"@private\",\n    \"@protected\",\n    \"@public\",\n    \"@try\",\n    \"@property\",\n    \"@end\",\n    \"@throw\",\n    \"@catch\",\n    \"@finally\",\n    \"@autoreleasepool\",\n    \"@synthesize\",\n    \"@dynamic\",\n    \"@selector\",\n    \"@optional\",\n    \"@required\",\n    \"@encode\",\n    \"@package\",\n    \"@import\",\n    \"@defs\",\n    \"@compatibility_alias\",\n    \"__bridge\",\n    \"__bridge_transfer\",\n    \"__bridge_retained\",\n    \"__bridge_retain\",\n    \"__covariant\",\n    \"__contravariant\",\n    \"__kindof\",\n    \"_Nonnull\",\n    \"_Nullable\",\n    \"_Null_unspecified\",\n    \"__FUNCTION__\",\n    \"__PRETTY_FUNCTION__\",\n    \"__attribute__\",\n    \"getter\",\n    \"setter\",\n    \"retain\",\n    \"unsafe_unretained\",\n    \"nonnull\",\n    \"nullable\",\n    \"null_unspecified\",\n    \"null_resettable\",\n    \"class\",\n    \"instancetype\",\n    \"NS_DESIGNATED_INITIALIZER\",\n    \"NS_UNAVAILABLE\",\n    \"NS_REQUIRES_SUPER\",\n    \"NS_RETURNS_INNER_POINTER\",\n    \"NS_INLINE\",\n    \"NS_AVAILABLE\",\n    \"NS_DEPRECATED\",\n    \"NS_ENUM\",\n    \"NS_OPTIONS\",\n    \"NS_SWIFT_UNAVAILABLE\",\n    \"NS_ASSUME_NONNULL_BEGIN\",\n    \"NS_ASSUME_NONNULL_END\",\n    \"NS_REFINED_FOR_SWIFT\",\n    \"NS_SWIFT_NAME\",\n    \"NS_SWIFT_NOTHROW\",\n    \"NS_DURING\",\n    \"NS_HANDLER\",\n    \"NS_ENDHANDLER\",\n    \"NS_VALUERETURN\",\n    \"NS_VOIDRETURN\"\n  ];\n  const LITERALS = [\n    \"false\",\n    \"true\",\n    \"FALSE\",\n    \"TRUE\",\n    \"nil\",\n    \"YES\",\n    \"NO\",\n    \"NULL\"\n  ];\n  const BUILT_INS = [\n    \"dispatch_once_t\",\n    \"dispatch_queue_t\",\n    \"dispatch_sync\",\n    \"dispatch_async\",\n    \"dispatch_once\"\n  ];\n  const KEYWORDS = {\n    \"variable.language\": [\n      \"this\",\n      \"super\"\n    ],\n    $pattern: IDENTIFIER_RE,\n    keyword: KWS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    type: TYPES\n  };\n  const CLASS_KEYWORDS = {\n    $pattern: IDENTIFIER_RE,\n    keyword: [\n      \"@interface\",\n      \"@class\",\n      \"@protocol\",\n      \"@implementation\"\n    ]\n  };\n  return {\n    name: 'Objective-C',\n    aliases: [\n      'mm',\n      'objc',\n      'obj-c',\n      'obj-c++',\n      'objective-c++'\n    ],\n    keywords: KEYWORDS,\n    illegal: '</',\n    contains: [\n      API_CLASS,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'string',\n        variants: [\n          {\n            begin: '@\"',\n            end: '\"',\n            illegal: '\\\\n',\n            contains: [ hljs.BACKSLASH_ESCAPE ]\n          }\n        ]\n      },\n      {\n        className: 'meta',\n        begin: /#\\s*[a-z]+\\b/,\n        end: /$/,\n        keywords: { keyword:\n            'if else elif endif define undef warning error line '\n            + 'pragma ifdef ifndef include' },\n        contains: [\n          {\n            begin: /\\\\\\n/,\n            relevance: 0\n          },\n          hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' }),\n          {\n            className: 'string',\n            begin: /<.*?>/,\n            end: /$/,\n            illegal: '\\\\n'\n          },\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE\n        ]\n      },\n      {\n        className: 'class',\n        begin: '(' + CLASS_KEYWORDS.keyword.join('|') + ')\\\\b',\n        end: /(\\{|$)/,\n        excludeEnd: true,\n        keywords: CLASS_KEYWORDS,\n        contains: [ hljs.UNDERSCORE_TITLE_MODE ]\n      },\n      {\n        begin: '\\\\.' + hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      }\n    ]\n  };\n}\n\nmodule.exports = objectivec;\n","/*\nLanguage: PHP\nAuthor: Victor Karamzin <Victor.Karamzin@enterra-inc.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: https://www.php.net\nCategory: common\n*/\n\n/**\n * @param {HLJSApi} hljs\n * @returns {LanguageDetail}\n * */\nfunction php(hljs) {\n  const regex = hljs.regex;\n  // negative look-ahead tries to avoid matching patterns that are not\n  // Perl at all like $ident$, @ident@, etc.\n  const NOT_PERL_ETC = /(?![A-Za-z0-9])(?![$])/;\n  const IDENT_RE = regex.concat(\n    /[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/,\n    NOT_PERL_ETC);\n  // Will not detect camelCase classes\n  const PASCAL_CASE_CLASS_NAME_RE = regex.concat(\n    /(\\\\?[A-Z][a-z0-9_\\x7f-\\xff]+|\\\\?[A-Z]+(?=[A-Z][a-z0-9_\\x7f-\\xff])){1,}/,\n    NOT_PERL_ETC);\n  const UPCASE_NAME_RE = regex.concat(\n    /[A-Z]+/,\n    NOT_PERL_ETC);\n  const VARIABLE = {\n    scope: 'variable',\n    match: '\\\\$+' + IDENT_RE,\n  };\n  const PREPROCESSOR = {\n    scope: \"meta\",\n    variants: [\n      { begin: /<\\?php/, relevance: 10 }, // boost for obvious PHP\n      { begin: /<\\?=/ },\n      // less relevant per PSR-1 which says not to use short-tags\n      { begin: /<\\?/, relevance: 0.1 },\n      { begin: /\\?>/ } // end php tag\n    ]\n  };\n  const SUBST = {\n    scope: 'subst',\n    variants: [\n      { begin: /\\$\\w+/ },\n      {\n        begin: /\\{\\$/,\n        end: /\\}/\n      }\n    ]\n  };\n  const SINGLE_QUOTED = hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null, });\n  const DOUBLE_QUOTED = hljs.inherit(hljs.QUOTE_STRING_MODE, {\n    illegal: null,\n    contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),\n  });\n\n  const HEREDOC = {\n    begin: /<<<[ \\t]*(?:(\\w+)|\"(\\w+)\")\\n/,\n    end: /[ \\t]*(\\w+)\\b/,\n    contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),\n    'on:begin': (m, resp) => { resp.data._beginMatch = m[1] || m[2]; },\n    'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); },\n  };\n\n  const NOWDOC = hljs.END_SAME_AS_BEGIN({\n    begin: /<<<[ \\t]*'(\\w+)'\\n/,\n    end: /[ \\t]*(\\w+)\\b/,\n  });\n  // list of valid whitespaces because non-breaking space might be part of a IDENT_RE\n  const WHITESPACE = '[ \\t\\n]';\n  const STRING = {\n    scope: 'string',\n    variants: [\n      DOUBLE_QUOTED,\n      SINGLE_QUOTED,\n      HEREDOC,\n      NOWDOC\n    ]\n  };\n  const NUMBER = {\n    scope: 'number',\n    variants: [\n      { begin: `\\\\b0[bB][01]+(?:_[01]+)*\\\\b` }, // Binary w/ underscore support\n      { begin: `\\\\b0[oO][0-7]+(?:_[0-7]+)*\\\\b` }, // Octals w/ underscore support\n      { begin: `\\\\b0[xX][\\\\da-fA-F]+(?:_[\\\\da-fA-F]+)*\\\\b` }, // Hex w/ underscore support\n      // Decimals w/ underscore support, with optional fragments and scientific exponent (e) suffix.\n      { begin: `(?:\\\\b\\\\d+(?:_\\\\d+)*(\\\\.(?:\\\\d+(?:_\\\\d+)*))?|\\\\B\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?` }\n    ],\n    relevance: 0\n  };\n  const LITERALS = [\n    \"false\",\n    \"null\",\n    \"true\"\n  ];\n  const KWS = [\n    // Magic constants:\n    // <https://www.php.net/manual/en/language.constants.predefined.php>\n    \"__CLASS__\",\n    \"__DIR__\",\n    \"__FILE__\",\n    \"__FUNCTION__\",\n    \"__COMPILER_HALT_OFFSET__\",\n    \"__LINE__\",\n    \"__METHOD__\",\n    \"__NAMESPACE__\",\n    \"__TRAIT__\",\n    // Function that look like language construct or language construct that look like function:\n    // List of keywords that may not require parenthesis\n    \"die\",\n    \"echo\",\n    \"exit\",\n    \"include\",\n    \"include_once\",\n    \"print\",\n    \"require\",\n    \"require_once\",\n    // These are not language construct (function) but operate on the currently-executing function and can access the current symbol table\n    // 'compact extract func_get_arg func_get_args func_num_args get_called_class get_parent_class ' +\n    // Other keywords:\n    // <https://www.php.net/manual/en/reserved.php>\n    // <https://www.php.net/manual/en/language.types.type-juggling.php>\n    \"array\",\n    \"abstract\",\n    \"and\",\n    \"as\",\n    \"binary\",\n    \"bool\",\n    \"boolean\",\n    \"break\",\n    \"callable\",\n    \"case\",\n    \"catch\",\n    \"class\",\n    \"clone\",\n    \"const\",\n    \"continue\",\n    \"declare\",\n    \"default\",\n    \"do\",\n    \"double\",\n    \"else\",\n    \"elseif\",\n    \"empty\",\n    \"enddeclare\",\n    \"endfor\",\n    \"endforeach\",\n    \"endif\",\n    \"endswitch\",\n    \"endwhile\",\n    \"enum\",\n    \"eval\",\n    \"extends\",\n    \"final\",\n    \"finally\",\n    \"float\",\n    \"for\",\n    \"foreach\",\n    \"from\",\n    \"global\",\n    \"goto\",\n    \"if\",\n    \"implements\",\n    \"instanceof\",\n    \"insteadof\",\n    \"int\",\n    \"integer\",\n    \"interface\",\n    \"isset\",\n    \"iterable\",\n    \"list\",\n    \"match|0\",\n    \"mixed\",\n    \"new\",\n    \"never\",\n    \"object\",\n    \"or\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"readonly\",\n    \"real\",\n    \"return\",\n    \"string\",\n    \"switch\",\n    \"throw\",\n    \"trait\",\n    \"try\",\n    \"unset\",\n    \"use\",\n    \"var\",\n    \"void\",\n    \"while\",\n    \"xor\",\n    \"yield\"\n  ];\n\n  const BUILT_INS = [\n    // Standard PHP library:\n    // <https://www.php.net/manual/en/book.spl.php>\n    \"Error|0\",\n    \"AppendIterator\",\n    \"ArgumentCountError\",\n    \"ArithmeticError\",\n    \"ArrayIterator\",\n    \"ArrayObject\",\n    \"AssertionError\",\n    \"BadFunctionCallException\",\n    \"BadMethodCallException\",\n    \"CachingIterator\",\n    \"CallbackFilterIterator\",\n    \"CompileError\",\n    \"Countable\",\n    \"DirectoryIterator\",\n    \"DivisionByZeroError\",\n    \"DomainException\",\n    \"EmptyIterator\",\n    \"ErrorException\",\n    \"Exception\",\n    \"FilesystemIterator\",\n    \"FilterIterator\",\n    \"GlobIterator\",\n    \"InfiniteIterator\",\n    \"InvalidArgumentException\",\n    \"IteratorIterator\",\n    \"LengthException\",\n    \"LimitIterator\",\n    \"LogicException\",\n    \"MultipleIterator\",\n    \"NoRewindIterator\",\n    \"OutOfBoundsException\",\n    \"OutOfRangeException\",\n    \"OuterIterator\",\n    \"OverflowException\",\n    \"ParentIterator\",\n    \"ParseError\",\n    \"RangeException\",\n    \"RecursiveArrayIterator\",\n    \"RecursiveCachingIterator\",\n    \"RecursiveCallbackFilterIterator\",\n    \"RecursiveDirectoryIterator\",\n    \"RecursiveFilterIterator\",\n    \"RecursiveIterator\",\n    \"RecursiveIteratorIterator\",\n    \"RecursiveRegexIterator\",\n    \"RecursiveTreeIterator\",\n    \"RegexIterator\",\n    \"RuntimeException\",\n    \"SeekableIterator\",\n    \"SplDoublyLinkedList\",\n    \"SplFileInfo\",\n    \"SplFileObject\",\n    \"SplFixedArray\",\n    \"SplHeap\",\n    \"SplMaxHeap\",\n    \"SplMinHeap\",\n    \"SplObjectStorage\",\n    \"SplObserver\",\n    \"SplPriorityQueue\",\n    \"SplQueue\",\n    \"SplStack\",\n    \"SplSubject\",\n    \"SplTempFileObject\",\n    \"TypeError\",\n    \"UnderflowException\",\n    \"UnexpectedValueException\",\n    \"UnhandledMatchError\",\n    // Reserved interfaces:\n    // <https://www.php.net/manual/en/reserved.interfaces.php>\n    \"ArrayAccess\",\n    \"BackedEnum\",\n    \"Closure\",\n    \"Fiber\",\n    \"Generator\",\n    \"Iterator\",\n    \"IteratorAggregate\",\n    \"Serializable\",\n    \"Stringable\",\n    \"Throwable\",\n    \"Traversable\",\n    \"UnitEnum\",\n    \"WeakReference\",\n    \"WeakMap\",\n    // Reserved classes:\n    // <https://www.php.net/manual/en/reserved.classes.php>\n    \"Directory\",\n    \"__PHP_Incomplete_Class\",\n    \"parent\",\n    \"php_user_filter\",\n    \"self\",\n    \"static\",\n    \"stdClass\"\n  ];\n\n  /** Dual-case keywords\n   *\n   * [\"then\",\"FILE\"] =>\n   *     [\"then\", \"THEN\", \"FILE\", \"file\"]\n   *\n   * @param {string[]} items */\n  const dualCase = (items) => {\n    /** @type string[] */\n    const result = [];\n    items.forEach(item => {\n      result.push(item);\n      if (item.toLowerCase() === item) {\n        result.push(item.toUpperCase());\n      } else {\n        result.push(item.toLowerCase());\n      }\n    });\n    return result;\n  };\n\n  const KEYWORDS = {\n    keyword: KWS,\n    literal: dualCase(LITERALS),\n    built_in: BUILT_INS,\n  };\n\n  /**\n   * @param {string[]} items */\n  const normalizeKeywords = (items) => {\n    return items.map(item => {\n      return item.replace(/\\|\\d+$/, \"\");\n    });\n  };\n\n  const CONSTRUCTOR_CALL = { variants: [\n    {\n      match: [\n        /new/,\n        regex.concat(WHITESPACE, \"+\"),\n        // to prevent built ins from being confused as the class constructor call\n        regex.concat(\"(?!\", normalizeKeywords(BUILT_INS).join(\"\\\\b|\"), \"\\\\b)\"),\n        PASCAL_CASE_CLASS_NAME_RE,\n      ],\n      scope: {\n        1: \"keyword\",\n        4: \"title.class\",\n      },\n    }\n  ] };\n\n  const CONSTANT_REFERENCE = regex.concat(IDENT_RE, \"\\\\b(?!\\\\()\");\n\n  const LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON = { variants: [\n    {\n      match: [\n        regex.concat(\n          /::/,\n          regex.lookahead(/(?!class\\b)/)\n        ),\n        CONSTANT_REFERENCE,\n      ],\n      scope: { 2: \"variable.constant\", },\n    },\n    {\n      match: [\n        /::/,\n        /class/,\n      ],\n      scope: { 2: \"variable.language\", },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        regex.concat(\n          /::/,\n          regex.lookahead(/(?!class\\b)/)\n        ),\n        CONSTANT_REFERENCE,\n      ],\n      scope: {\n        1: \"title.class\",\n        3: \"variable.constant\",\n      },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        regex.concat(\n          \"::\",\n          regex.lookahead(/(?!class\\b)/)\n        ),\n      ],\n      scope: { 1: \"title.class\", },\n    },\n    {\n      match: [\n        PASCAL_CASE_CLASS_NAME_RE,\n        /::/,\n        /class/,\n      ],\n      scope: {\n        1: \"title.class\",\n        3: \"variable.language\",\n      },\n    }\n  ] };\n\n  const NAMED_ARGUMENT = {\n    scope: 'attr',\n    match: regex.concat(IDENT_RE, regex.lookahead(':'), regex.lookahead(/(?!::)/)),\n  };\n  const PARAMS_MODE = {\n    relevance: 0,\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    contains: [\n      NAMED_ARGUMENT,\n      VARIABLE,\n      LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n      hljs.C_BLOCK_COMMENT_MODE,\n      STRING,\n      NUMBER,\n      CONSTRUCTOR_CALL,\n    ],\n  };\n  const FUNCTION_INVOKE = {\n    relevance: 0,\n    match: [\n      /\\b/,\n      // to prevent keywords from being confused as the function title\n      regex.concat(\"(?!fn\\\\b|function\\\\b|\", normalizeKeywords(KWS).join(\"\\\\b|\"), \"|\", normalizeKeywords(BUILT_INS).join(\"\\\\b|\"), \"\\\\b)\"),\n      IDENT_RE,\n      regex.concat(WHITESPACE, \"*\"),\n      regex.lookahead(/(?=\\()/)\n    ],\n    scope: { 3: \"title.function.invoke\", },\n    contains: [ PARAMS_MODE ]\n  };\n  PARAMS_MODE.contains.push(FUNCTION_INVOKE);\n\n  const ATTRIBUTE_CONTAINS = [\n    NAMED_ARGUMENT,\n    LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n    hljs.C_BLOCK_COMMENT_MODE,\n    STRING,\n    NUMBER,\n    CONSTRUCTOR_CALL,\n  ];\n\n  const ATTRIBUTES = {\n    begin: regex.concat(/#\\[\\s*\\\\?/,\n      regex.either(\n        PASCAL_CASE_CLASS_NAME_RE,\n        UPCASE_NAME_RE\n      )\n    ),\n    beginScope: \"meta\",\n    end: /]/,\n    endScope: \"meta\",\n    keywords: {\n      literal: LITERALS,\n      keyword: [\n        'new',\n        'array',\n      ]\n    },\n    contains: [\n      {\n        begin: /\\[/,\n        end: /]/,\n        keywords: {\n          literal: LITERALS,\n          keyword: [\n            'new',\n            'array',\n          ]\n        },\n        contains: [\n          'self',\n          ...ATTRIBUTE_CONTAINS,\n        ]\n      },\n      ...ATTRIBUTE_CONTAINS,\n      {\n        scope: 'meta',\n        variants: [\n          { match: PASCAL_CASE_CLASS_NAME_RE },\n          { match: UPCASE_NAME_RE }\n        ]\n      }\n    ]\n  };\n\n  return {\n    case_insensitive: false,\n    keywords: KEYWORDS,\n    contains: [\n      ATTRIBUTES,\n      hljs.HASH_COMMENT_MODE,\n      hljs.COMMENT('//', '$'),\n      hljs.COMMENT(\n        '/\\\\*',\n        '\\\\*/',\n        { contains: [\n          {\n            scope: 'doctag',\n            match: '@[A-Za-z]+'\n          }\n        ] }\n      ),\n      {\n        match: /__halt_compiler\\(\\);/,\n        keywords: '__halt_compiler',\n        starts: {\n          scope: \"comment\",\n          end: hljs.MATCH_NOTHING_RE,\n          contains: [\n            {\n              match: /\\?>/,\n              scope: \"meta\",\n              endsParent: true\n            }\n          ]\n        }\n      },\n      PREPROCESSOR,\n      {\n        scope: 'variable.language',\n        match: /\\$this\\b/\n      },\n      VARIABLE,\n      FUNCTION_INVOKE,\n      LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n      {\n        match: [\n          /const/,\n          /\\s/,\n          IDENT_RE,\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"variable.constant\",\n        },\n      },\n      CONSTRUCTOR_CALL,\n      {\n        scope: 'function',\n        relevance: 0,\n        beginKeywords: 'fn function',\n        end: /[;{]/,\n        excludeEnd: true,\n        illegal: '[$%\\\\[]',\n        contains: [\n          { beginKeywords: 'use', },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            begin: '=>', // No markup, just a relevance booster\n            endsParent: true\n          },\n          {\n            scope: 'params',\n            begin: '\\\\(',\n            end: '\\\\)',\n            excludeBegin: true,\n            excludeEnd: true,\n            keywords: KEYWORDS,\n            contains: [\n              'self',\n              ATTRIBUTES,\n              VARIABLE,\n              LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRING,\n              NUMBER\n            ]\n          },\n        ]\n      },\n      {\n        scope: 'class',\n        variants: [\n          {\n            beginKeywords: \"enum\",\n            illegal: /[($\"]/\n          },\n          {\n            beginKeywords: \"class interface trait\",\n            illegal: /[:($\"]/\n          }\n        ],\n        relevance: 0,\n        end: /\\{/,\n        excludeEnd: true,\n        contains: [\n          { beginKeywords: 'extends implements' },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      // both use and namespace still use \"old style\" rules (vs multi-match)\n      // because the namespace name can include `\\` and we still want each\n      // element to be treated as its own *individual* title\n      {\n        beginKeywords: 'namespace',\n        relevance: 0,\n        end: ';',\n        illegal: /[.']/,\n        contains: [ hljs.inherit(hljs.UNDERSCORE_TITLE_MODE, { scope: \"title.class\" }) ]\n      },\n      {\n        beginKeywords: 'use',\n        relevance: 0,\n        end: ';',\n        contains: [\n          // TODO: title.function vs title.class\n          {\n            match: /\\b(as|const|function)\\b/,\n            scope: \"keyword\"\n          },\n          // TODO: could be title.class or title.function\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      STRING,\n      NUMBER,\n    ]\n  };\n}\n\nmodule.exports = php;\n","/*\nLanguage: PHP Template\nRequires: xml.js, php.js\nAuthor: Josh Goebel <hello@joshgoebel.com>\nWebsite: https://www.php.net\nCategory: common\n*/\n\nfunction phpTemplate(hljs) {\n  return {\n    name: \"PHP template\",\n    subLanguage: 'xml',\n    contains: [\n      {\n        begin: /<\\?(php|=)?/,\n        end: /\\?>/,\n        subLanguage: 'php',\n        contains: [\n          // We don't want the php closing tag ?> to close the PHP block when\n          // inside any of the following blocks:\n          {\n            begin: '/\\\\*',\n            end: '\\\\*/',\n            skip: true\n          },\n          {\n            begin: 'b\"',\n            end: '\"',\n            skip: true\n          },\n          {\n            begin: 'b\\'',\n            end: '\\'',\n            skip: true\n          },\n          hljs.inherit(hljs.APOS_STRING_MODE, {\n            illegal: null,\n            className: null,\n            contains: null,\n            skip: true\n          }),\n          hljs.inherit(hljs.QUOTE_STRING_MODE, {\n            illegal: null,\n            className: null,\n            contains: null,\n            skip: true\n          })\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = phpTemplate;\n","/*\nLanguage: Plain text\nAuthor: Egor Rogov (e.rogov@postgrespro.ru)\nDescription: Plain text without any highlighting.\nCategory: common\n*/\n\nfunction plaintext(hljs) {\n  return {\n    name: 'Plain text',\n    aliases: [\n      'text',\n      'txt'\n    ],\n    disableAutodetect: true\n  };\n}\n\nmodule.exports = plaintext;\n","/*\nLanguage: Python\nDescription: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.\nWebsite: https://www.python.org\nCategory: common\n*/\n\nfunction python(hljs) {\n  const regex = hljs.regex;\n  const IDENT_RE = /[\\p{XID_Start}_]\\p{XID_Continue}*/u;\n  const RESERVED_WORDS = [\n    'and',\n    'as',\n    'assert',\n    'async',\n    'await',\n    'break',\n    'case',\n    'class',\n    'continue',\n    'def',\n    'del',\n    'elif',\n    'else',\n    'except',\n    'finally',\n    'for',\n    'from',\n    'global',\n    'if',\n    'import',\n    'in',\n    'is',\n    'lambda',\n    'match',\n    'nonlocal|10',\n    'not',\n    'or',\n    'pass',\n    'raise',\n    'return',\n    'try',\n    'while',\n    'with',\n    'yield'\n  ];\n\n  const BUILT_INS = [\n    '__import__',\n    'abs',\n    'all',\n    'any',\n    'ascii',\n    'bin',\n    'bool',\n    'breakpoint',\n    'bytearray',\n    'bytes',\n    'callable',\n    'chr',\n    'classmethod',\n    'compile',\n    'complex',\n    'delattr',\n    'dict',\n    'dir',\n    'divmod',\n    'enumerate',\n    'eval',\n    'exec',\n    'filter',\n    'float',\n    'format',\n    'frozenset',\n    'getattr',\n    'globals',\n    'hasattr',\n    'hash',\n    'help',\n    'hex',\n    'id',\n    'input',\n    'int',\n    'isinstance',\n    'issubclass',\n    'iter',\n    'len',\n    'list',\n    'locals',\n    'map',\n    'max',\n    'memoryview',\n    'min',\n    'next',\n    'object',\n    'oct',\n    'open',\n    'ord',\n    'pow',\n    'print',\n    'property',\n    'range',\n    'repr',\n    'reversed',\n    'round',\n    'set',\n    'setattr',\n    'slice',\n    'sorted',\n    'staticmethod',\n    'str',\n    'sum',\n    'super',\n    'tuple',\n    'type',\n    'vars',\n    'zip'\n  ];\n\n  const LITERALS = [\n    '__debug__',\n    'Ellipsis',\n    'False',\n    'None',\n    'NotImplemented',\n    'True'\n  ];\n\n  // https://docs.python.org/3/library/typing.html\n  // TODO: Could these be supplemented by a CamelCase matcher in certain\n  // contexts, leaving these remaining only for relevance hinting?\n  const TYPES = [\n    \"Any\",\n    \"Callable\",\n    \"Coroutine\",\n    \"Dict\",\n    \"List\",\n    \"Literal\",\n    \"Generic\",\n    \"Optional\",\n    \"Sequence\",\n    \"Set\",\n    \"Tuple\",\n    \"Type\",\n    \"Union\"\n  ];\n\n  const KEYWORDS = {\n    $pattern: /[A-Za-z]\\w+|__\\w+__/,\n    keyword: RESERVED_WORDS,\n    built_in: BUILT_INS,\n    literal: LITERALS,\n    type: TYPES\n  };\n\n  const PROMPT = {\n    className: 'meta',\n    begin: /^(>>>|\\.\\.\\.) /\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: /\\{/,\n    end: /\\}/,\n    keywords: KEYWORDS,\n    illegal: /#/\n  };\n\n  const LITERAL_BRACKET = {\n    begin: /\\{\\{/,\n    relevance: 0\n  };\n\n  const STRING = {\n    className: 'string',\n    contains: [ hljs.BACKSLASH_ESCAPE ],\n    variants: [\n      {\n        begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,\n        end: /'''/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT\n        ],\n        relevance: 10\n      },\n      {\n        begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?\"\"\"/,\n        end: /\"\"\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT\n        ],\n        relevance: 10\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])'''/,\n        end: /'''/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])\"\"\"/,\n        end: /\"\"\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          PROMPT,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([uU]|[rR])'/,\n        end: /'/,\n        relevance: 10\n      },\n      {\n        begin: /([uU]|[rR])\"/,\n        end: /\"/,\n        relevance: 10\n      },\n      {\n        begin: /([bB]|[bB][rR]|[rR][bB])'/,\n        end: /'/\n      },\n      {\n        begin: /([bB]|[bB][rR]|[rR][bB])\"/,\n        end: /\"/\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])'/,\n        end: /'/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      {\n        begin: /([fF][rR]|[rR][fF]|[fF])\"/,\n        end: /\"/,\n        contains: [\n          hljs.BACKSLASH_ESCAPE,\n          LITERAL_BRACKET,\n          SUBST\n        ]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n\n  // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals\n  const digitpart = '[0-9](_?[0-9])*';\n  const pointfloat = `(\\\\b(${digitpart}))?\\\\.(${digitpart})|\\\\b(${digitpart})\\\\.`;\n  // Whitespace after a number (or any lexical token) is needed only if its absence\n  // would change the tokenization\n  // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens\n  // We deviate slightly, requiring a word boundary or a keyword\n  // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)\n  const lookahead = `\\\\b|${RESERVED_WORDS.join('|')}`;\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // exponentfloat, pointfloat\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals\n      // optionally imaginary\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      // Note: no leading \\b because floats can start with a decimal point\n      // and we don't want to mishandle e.g. `fn(.5)`,\n      // no trailing \\b for pointfloat because it can end with a decimal point\n      // and we don't want to mishandle e.g. `0..hex()`; this should be safe\n      // because both MUST contain a decimal point and so cannot be confused with\n      // the interior part of an identifier\n      {\n        begin: `(\\\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`\n      },\n      {\n        begin: `(${pointfloat})[jJ]?`\n      },\n\n      // decinteger, bininteger, octinteger, hexinteger\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals\n      // optionally \"long\" in Python 2\n      // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals\n      // decinteger is optionally imaginary\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      {\n        begin: `\\\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[bB](_?[01])+[lL]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`\n      },\n      {\n        begin: `\\\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`\n      },\n\n      // imagnumber (digitpart-based)\n      // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n      {\n        begin: `\\\\b(${digitpart})[jJ](?=${lookahead})`\n      }\n    ]\n  };\n  const COMMENT_TYPE = {\n    className: \"comment\",\n    begin: regex.lookahead(/# type:/),\n    end: /$/,\n    keywords: KEYWORDS,\n    contains: [\n      { // prevent keywords from coloring `type`\n        begin: /# type:/\n      },\n      // comment within a datatype comment includes no keywords\n      {\n        begin: /#/,\n        end: /\\b\\B/,\n        endsWithParent: true\n      }\n    ]\n  };\n  const PARAMS = {\n    className: 'params',\n    variants: [\n      // Exclude params in functions without params\n      {\n        className: \"\",\n        begin: /\\(\\s*\\)/,\n        skip: true\n      },\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        excludeBegin: true,\n        excludeEnd: true,\n        keywords: KEYWORDS,\n        contains: [\n          'self',\n          PROMPT,\n          NUMBER,\n          STRING,\n          hljs.HASH_COMMENT_MODE\n        ]\n      }\n    ]\n  };\n  SUBST.contains = [\n    STRING,\n    NUMBER,\n    PROMPT\n  ];\n\n  return {\n    name: 'Python',\n    aliases: [\n      'py',\n      'gyp',\n      'ipython'\n    ],\n    unicodeRegex: true,\n    keywords: KEYWORDS,\n    illegal: /(<\\/|\\?)|=>/,\n    contains: [\n      PROMPT,\n      NUMBER,\n      {\n        // very common convention\n        scope: 'variable.language',\n        match: /\\bself\\b/\n      },\n      {\n        // eat \"if\" prior to string so that it won't accidentally be\n        // labeled as an f-string\n        beginKeywords: \"if\",\n        relevance: 0\n      },\n      { match: /\\bor\\b/, scope: \"keyword\" },\n      STRING,\n      COMMENT_TYPE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        match: [\n          /\\bdef/, /\\s+/,\n          IDENT_RE,\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.function\"\n        },\n        contains: [ PARAMS ]\n      },\n      {\n        variants: [\n          {\n            match: [\n              /\\bclass/, /\\s+/,\n              IDENT_RE, /\\s*/,\n              /\\(\\s*/, IDENT_RE,/\\s*\\)/\n            ],\n          },\n          {\n            match: [\n              /\\bclass/, /\\s+/,\n              IDENT_RE\n            ],\n          }\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          6: \"title.class.inherited\",\n        }\n      },\n      {\n        className: 'meta',\n        begin: /^[\\t ]*@/,\n        end: /(?=#)|$/,\n        contains: [\n          NUMBER,\n          PARAMS,\n          STRING\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = python;\n","/*\nLanguage: Python REPL\nRequires: python.js\nAuthor: Josh Goebel <hello@joshgoebel.com>\nCategory: common\n*/\n\nfunction pythonRepl(hljs) {\n  return {\n    aliases: [ 'pycon' ],\n    contains: [\n      {\n        className: 'meta.prompt',\n        starts: {\n          // a space separates the REPL prefix from the actual code\n          // this is purely for cleaner HTML output\n          end: / |$/,\n          starts: {\n            end: '$',\n            subLanguage: 'python'\n          }\n        },\n        variants: [\n          { begin: /^>>>(?=[ ]|$)/ },\n          { begin: /^\\.\\.\\.(?=[ ]|$)/ }\n        ]\n      }\n    ]\n  };\n}\n\nmodule.exports = pythonRepl;\n","/*\nLanguage: R\nDescription: R is a free software environment for statistical computing and graphics.\nAuthor: Joe Cheng <joe@rstudio.org>\nContributors: Konrad Rudolph <konrad.rudolph@gmail.com>\nWebsite: https://www.r-project.org\nCategory: common,scientific\n*/\n\n/** @type LanguageFn */\nfunction r(hljs) {\n  const regex = hljs.regex;\n  // Identifiers in R cannot start with `_`, but they can start with `.` if it\n  // is not immediately followed by a digit.\n  // R also supports quoted identifiers, which are near-arbitrary sequences\n  // delimited by backticks (`…`), which may contain escape sequences. These are\n  // handled in a separate mode. See `test/markup/r/names.txt` for examples.\n  // FIXME: Support Unicode identifiers.\n  const IDENT_RE = /(?:(?:[a-zA-Z]|\\.[._a-zA-Z])[._a-zA-Z0-9]*)|\\.(?!\\d)/;\n  const NUMBER_TYPES_RE = regex.either(\n    // Special case: only hexadecimal binary powers can contain fractions\n    /0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*[pP][+-]?\\d+i?/,\n    // Hexadecimal numbers without fraction and optional binary power\n    /0[xX][0-9a-fA-F]+(?:[pP][+-]?\\d+)?[Li]?/,\n    // Decimal numbers\n    /(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?[Li]?/\n  );\n  const OPERATORS_RE = /[=!<>:]=|\\|\\||&&|:::?|<-|<<-|->>|->|\\|>|[-+*\\/?!$&|:<=>@^~]|\\*\\*/;\n  const PUNCTUATION_RE = regex.either(\n    /[()]/,\n    /[{}]/,\n    /\\[\\[/,\n    /[[\\]]/,\n    /\\\\/,\n    /,/\n  );\n\n  return {\n    name: 'R',\n\n    keywords: {\n      $pattern: IDENT_RE,\n      keyword:\n        'function if in break next repeat else for while',\n      literal:\n        'NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 '\n        + 'NA_character_|10 NA_complex_|10',\n      built_in:\n        // Builtin constants\n        'LETTERS letters month.abb month.name pi T F '\n        // Primitive functions\n        // These are all the functions in `base` that are implemented as a\n        // `.Primitive`, minus those functions that are also keywords.\n        + 'abs acos acosh all any anyNA Arg as.call as.character '\n        + 'as.complex as.double as.environment as.integer as.logical '\n        + 'as.null.default as.numeric as.raw asin asinh atan atanh attr '\n        + 'attributes baseenv browser c call ceiling class Conj cos cosh '\n        + 'cospi cummax cummin cumprod cumsum digamma dim dimnames '\n        + 'emptyenv exp expression floor forceAndCall gamma gc.time '\n        + 'globalenv Im interactive invisible is.array is.atomic is.call '\n        + 'is.character is.complex is.double is.environment is.expression '\n        + 'is.finite is.function is.infinite is.integer is.language '\n        + 'is.list is.logical is.matrix is.na is.name is.nan is.null '\n        + 'is.numeric is.object is.pairlist is.raw is.recursive is.single '\n        + 'is.symbol lazyLoadDBfetch length lgamma list log max min '\n        + 'missing Mod names nargs nzchar oldClass on.exit pos.to.env '\n        + 'proc.time prod quote range Re rep retracemem return round '\n        + 'seq_along seq_len seq.int sign signif sin sinh sinpi sqrt '\n        + 'standardGeneric substitute sum switch tan tanh tanpi tracemem '\n        + 'trigamma trunc unclass untracemem UseMethod xtfrm',\n    },\n\n    contains: [\n      // Roxygen comments\n      hljs.COMMENT(\n        /#'/,\n        /$/,\n        { contains: [\n          {\n            // Handle `@examples` separately to cause all subsequent code\n            // until the next `@`-tag on its own line to be kept as-is,\n            // preventing highlighting. This code is example R code, so nested\n            // doctags shouldn’t be treated as such. See\n            // `test/markup/r/roxygen.txt` for an example.\n            scope: 'doctag',\n            match: /@examples/,\n            starts: {\n              end: regex.lookahead(regex.either(\n                // end if another doc comment\n                /\\n^#'\\s*(?=@[a-zA-Z]+)/,\n                // or a line with no comment\n                /\\n^(?!#')/\n              )),\n              endsParent: true\n            }\n          },\n          {\n            // Handle `@param` to highlight the parameter name following\n            // after.\n            scope: 'doctag',\n            begin: '@param',\n            end: /$/,\n            contains: [\n              {\n                scope: 'variable',\n                variants: [\n                  { match: IDENT_RE },\n                  { match: /`(?:\\\\.|[^`\\\\])+`/ }\n                ],\n                endsParent: true\n              }\n            ]\n          },\n          {\n            scope: 'doctag',\n            match: /@[a-zA-Z]+/\n          },\n          {\n            scope: 'keyword',\n            match: /\\\\[a-zA-Z]+/\n          }\n        ] }\n      ),\n\n      hljs.HASH_COMMENT_MODE,\n\n      {\n        scope: 'string',\n        contains: [ hljs.BACKSLASH_ESCAPE ],\n        variants: [\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\(/,\n            end: /\\)(-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\{/,\n            end: /\\}(-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]\"(-*)\\[/,\n            end: /\\](-*)\"/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\(/,\n            end: /\\)(-*)'/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\{/,\n            end: /\\}(-*)'/\n          }),\n          hljs.END_SAME_AS_BEGIN({\n            begin: /[rR]'(-*)\\[/,\n            end: /\\](-*)'/\n          }),\n          {\n            begin: '\"',\n            end: '\"',\n            relevance: 0\n          },\n          {\n            begin: \"'\",\n            end: \"'\",\n            relevance: 0\n          }\n        ],\n      },\n\n      // Matching numbers immediately following punctuation and operators is\n      // tricky since we need to look at the character ahead of a number to\n      // ensure the number is not part of an identifier, and we cannot use\n      // negative look-behind assertions. So instead we explicitly handle all\n      // possible combinations of (operator|punctuation), number.\n      // TODO: replace with negative look-behind when available\n      // { begin: /(?<![a-zA-Z0-9._])0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*[pP][+-]?\\d+i?/ },\n      // { begin: /(?<![a-zA-Z0-9._])0[xX][0-9a-fA-F]+([pP][+-]?\\d+)?[Li]?/ },\n      // { begin: /(?<![a-zA-Z0-9._])(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?[Li]?/ }\n      {\n        relevance: 0,\n        variants: [\n          {\n            scope: {\n              1: 'operator',\n              2: 'number'\n            },\n            match: [\n              OPERATORS_RE,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: {\n              1: 'operator',\n              2: 'number'\n            },\n            match: [\n              /%[^%]*%/,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: {\n              1: 'punctuation',\n              2: 'number'\n            },\n            match: [\n              PUNCTUATION_RE,\n              NUMBER_TYPES_RE\n            ]\n          },\n          {\n            scope: { 2: 'number' },\n            match: [\n              /[^a-zA-Z0-9._]|^/, // not part of an identifier, or start of document\n              NUMBER_TYPES_RE\n            ]\n          }\n        ]\n      },\n\n      // Operators/punctuation when they're not directly followed by numbers\n      {\n        // Relevance boost for the most common assignment form.\n        scope: { 3: 'operator' },\n        match: [\n          IDENT_RE,\n          /\\s+/,\n          /<-/,\n          /\\s+/\n        ]\n      },\n\n      {\n        scope: 'operator',\n        relevance: 0,\n        variants: [\n          { match: OPERATORS_RE },\n          { match: /%[^%]*%/ }\n        ]\n      },\n\n      {\n        scope: 'punctuation',\n        relevance: 0,\n        match: PUNCTUATION_RE\n      },\n\n      {\n        // Escaped identifier\n        begin: '`',\n        end: '`',\n        contains: [ { begin: /\\\\./ } ]\n      }\n    ]\n  };\n}\n\nmodule.exports = r;\n","/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>\nWebsite: https://www.rust-lang.org\nCategory: common, system\n*/\n\n/** @type LanguageFn */\n\nfunction rust(hljs) {\n  const regex = hljs.regex;\n  // ============================================\n  // Added to support the r# keyword, which is a raw identifier in Rust.\n  const RAW_IDENTIFIER = /(r#)?/;\n  const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE);\n  const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE);\n  // ============================================\n  const FUNCTION_INVOKE = {\n    className: \"title.function.invoke\",\n    relevance: 0,\n    begin: regex.concat(\n      /\\b/,\n      /(?!let|for|while|if|else|match\\b)/,\n      IDENT_RE,\n      regex.lookahead(/\\s*\\(/))\n  };\n  const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\\?';\n  const KEYWORDS = [\n    \"abstract\",\n    \"as\",\n    \"async\",\n    \"await\",\n    \"become\",\n    \"box\",\n    \"break\",\n    \"const\",\n    \"continue\",\n    \"crate\",\n    \"do\",\n    \"dyn\",\n    \"else\",\n    \"enum\",\n    \"extern\",\n    \"false\",\n    \"final\",\n    \"fn\",\n    \"for\",\n    \"if\",\n    \"impl\",\n    \"in\",\n    \"let\",\n    \"loop\",\n    \"macro\",\n    \"match\",\n    \"mod\",\n    \"move\",\n    \"mut\",\n    \"override\",\n    \"priv\",\n    \"pub\",\n    \"ref\",\n    \"return\",\n    \"self\",\n    \"Self\",\n    \"static\",\n    \"struct\",\n    \"super\",\n    \"trait\",\n    \"true\",\n    \"try\",\n    \"type\",\n    \"typeof\",\n    \"union\",\n    \"unsafe\",\n    \"unsized\",\n    \"use\",\n    \"virtual\",\n    \"where\",\n    \"while\",\n    \"yield\"\n  ];\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    \"Some\",\n    \"None\",\n    \"Ok\",\n    \"Err\"\n  ];\n  const BUILTINS = [\n    // functions\n    'drop ',\n    // traits\n    \"Copy\",\n    \"Send\",\n    \"Sized\",\n    \"Sync\",\n    \"Drop\",\n    \"Fn\",\n    \"FnMut\",\n    \"FnOnce\",\n    \"ToOwned\",\n    \"Clone\",\n    \"Debug\",\n    \"PartialEq\",\n    \"PartialOrd\",\n    \"Eq\",\n    \"Ord\",\n    \"AsRef\",\n    \"AsMut\",\n    \"Into\",\n    \"From\",\n    \"Default\",\n    \"Iterator\",\n    \"Extend\",\n    \"IntoIterator\",\n    \"DoubleEndedIterator\",\n    \"ExactSizeIterator\",\n    \"SliceConcatExt\",\n    \"ToString\",\n    // macros\n    \"assert!\",\n    \"assert_eq!\",\n    \"bitflags!\",\n    \"bytes!\",\n    \"cfg!\",\n    \"col!\",\n    \"concat!\",\n    \"concat_idents!\",\n    \"debug_assert!\",\n    \"debug_assert_eq!\",\n    \"env!\",\n    \"eprintln!\",\n    \"panic!\",\n    \"file!\",\n    \"format!\",\n    \"format_args!\",\n    \"include_bytes!\",\n    \"include_str!\",\n    \"line!\",\n    \"local_data_key!\",\n    \"module_path!\",\n    \"option_env!\",\n    \"print!\",\n    \"println!\",\n    \"select!\",\n    \"stringify!\",\n    \"try!\",\n    \"unimplemented!\",\n    \"unreachable!\",\n    \"vec!\",\n    \"write!\",\n    \"writeln!\",\n    \"macro_rules!\",\n    \"assert_ne!\",\n    \"debug_assert_ne!\"\n  ];\n  const TYPES = [\n    \"i8\",\n    \"i16\",\n    \"i32\",\n    \"i64\",\n    \"i128\",\n    \"isize\",\n    \"u8\",\n    \"u16\",\n    \"u32\",\n    \"u64\",\n    \"u128\",\n    \"usize\",\n    \"f32\",\n    \"f64\",\n    \"str\",\n    \"char\",\n    \"bool\",\n    \"Box\",\n    \"Option\",\n    \"Result\",\n    \"String\",\n    \"Vec\"\n  ];\n  return {\n    name: 'Rust',\n    aliases: [ 'rs' ],\n    keywords: {\n      $pattern: hljs.IDENT_RE + '!?',\n      type: TYPES,\n      keyword: KEYWORDS,\n      literal: LITERALS,\n      built_in: BUILTINS\n    },\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.COMMENT('/\\\\*', '\\\\*/', { contains: [ 'self' ] }),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {\n        begin: /b?\"/,\n        illegal: null\n      }),\n      {\n        className: 'symbol',\n        // negative lookahead to avoid matching `'`\n        begin: /'[a-zA-Z_][a-zA-Z0-9_]*(?!')/\n      },\n      {\n        scope: 'string',\n        variants: [\n          { begin: /b?r(#*)\"(.|\\n)*?\"\\1(?!#)/ },\n          {\n            begin: /b?'/,\n            end: /'/,\n            contains: [\n              {\n                scope: \"char.escape\",\n                match: /\\\\('|\\w|x\\w{2}|u\\w{4}|U\\w{8})/\n              }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'number',\n        variants: [\n          { begin: '\\\\b0b([01_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b0o([0-7_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },\n          { begin: '\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'\n                   + NUMBER_SUFFIX }\n        ],\n        relevance: 0\n      },\n      {\n        begin: [\n          /fn/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.function\"\n        }\n      },\n      {\n        className: 'meta',\n        begin: '#!?\\\\[',\n        end: '\\\\]',\n        contains: [\n          {\n            className: 'string',\n            begin: /\"/,\n            end: /\"/,\n            contains: [\n              hljs.BACKSLASH_ESCAPE\n            ]\n          }\n        ]\n      },\n      {\n        begin: [\n          /let/,\n          /\\s+/,\n          /(?:mut\\s+)?/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"keyword\",\n          4: \"variable\"\n        }\n      },\n      // must come before impl/for rule later\n      {\n        begin: [\n          /for/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE,\n          /\\s+/,\n          /in/\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"variable\",\n          5: \"keyword\"\n        }\n      },\n      {\n        begin: [\n          /type/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        begin: [\n          /(?:trait|enum|struct|union|impl|for)/,\n          /\\s+/,\n          UNDERSCORE_IDENT_RE\n        ],\n        className: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n      {\n        begin: hljs.IDENT_RE + '::',\n        keywords: {\n          keyword: \"Self\",\n          built_in: BUILTINS,\n          type: TYPES\n        }\n      },\n      {\n        className: \"punctuation\",\n        begin: '->'\n      },\n      FUNCTION_INVOKE\n    ]\n  };\n}\n\nmodule.exports = rust;\n","const MODES = (hljs) => {\n  return {\n    IMPORTANT: {\n      scope: 'meta',\n      begin: '!important'\n    },\n    BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n    HEXCOLOR: {\n      scope: 'number',\n      begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n    },\n    FUNCTION_DISPATCH: {\n      className: \"built_in\",\n      begin: /[\\w-]+(?=\\()/\n    },\n    ATTRIBUTE_SELECTOR_MODE: {\n      scope: 'selector-attr',\n      begin: /\\[/,\n      end: /\\]/,\n      illegal: '$',\n      contains: [\n        hljs.APOS_STRING_MODE,\n        hljs.QUOTE_STRING_MODE\n      ]\n    },\n    CSS_NUMBER_MODE: {\n      scope: 'number',\n      begin: hljs.NUMBER_RE + '(' +\n        '%|em|ex|ch|rem' +\n        '|vw|vh|vmin|vmax' +\n        '|cm|mm|in|pt|pc|px' +\n        '|deg|grad|rad|turn' +\n        '|s|ms' +\n        '|Hz|kHz' +\n        '|dpi|dpcm|dppx' +\n        ')?',\n      relevance: 0\n    },\n    CSS_VARIABLE: {\n      className: \"attr\",\n      begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n    }\n  };\n};\n\nconst HTML_TAGS = [\n  'a',\n  'abbr',\n  'address',\n  'article',\n  'aside',\n  'audio',\n  'b',\n  'blockquote',\n  'body',\n  'button',\n  'canvas',\n  'caption',\n  'cite',\n  'code',\n  'dd',\n  'del',\n  'details',\n  'dfn',\n  'div',\n  'dl',\n  'dt',\n  'em',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'header',\n  'hgroup',\n  'html',\n  'i',\n  'iframe',\n  'img',\n  'input',\n  'ins',\n  'kbd',\n  'label',\n  'legend',\n  'li',\n  'main',\n  'mark',\n  'menu',\n  'nav',\n  'object',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'picture',\n  'q',\n  'quote',\n  'samp',\n  'section',\n  'select',\n  'source',\n  'span',\n  'strong',\n  'summary',\n  'sup',\n  'table',\n  'tbody',\n  'td',\n  'textarea',\n  'tfoot',\n  'th',\n  'thead',\n  'time',\n  'tr',\n  'ul',\n  'var',\n  'video'\n];\n\nconst SVG_TAGS = [\n  'defs',\n  'g',\n  'marker',\n  'mask',\n  'pattern',\n  'svg',\n  'switch',\n  'symbol',\n  'feBlend',\n  'feColorMatrix',\n  'feComponentTransfer',\n  'feComposite',\n  'feConvolveMatrix',\n  'feDiffuseLighting',\n  'feDisplacementMap',\n  'feFlood',\n  'feGaussianBlur',\n  'feImage',\n  'feMerge',\n  'feMorphology',\n  'feOffset',\n  'feSpecularLighting',\n  'feTile',\n  'feTurbulence',\n  'linearGradient',\n  'radialGradient',\n  'stop',\n  'circle',\n  'ellipse',\n  'image',\n  'line',\n  'path',\n  'polygon',\n  'polyline',\n  'rect',\n  'text',\n  'use',\n  'textPath',\n  'tspan',\n  'foreignObject',\n  'clipPath'\n];\n\nconst TAGS = [\n  ...HTML_TAGS,\n  ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n  'any-hover',\n  'any-pointer',\n  'aspect-ratio',\n  'color',\n  'color-gamut',\n  'color-index',\n  'device-aspect-ratio',\n  'device-height',\n  'device-width',\n  'display-mode',\n  'forced-colors',\n  'grid',\n  'height',\n  'hover',\n  'inverted-colors',\n  'monochrome',\n  'orientation',\n  'overflow-block',\n  'overflow-inline',\n  'pointer',\n  'prefers-color-scheme',\n  'prefers-contrast',\n  'prefers-reduced-motion',\n  'prefers-reduced-transparency',\n  'resolution',\n  'scan',\n  'scripting',\n  'update',\n  'width',\n  // TODO: find a better solution?\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n  'active',\n  'any-link',\n  'blank',\n  'checked',\n  'current',\n  'default',\n  'defined',\n  'dir', // dir()\n  'disabled',\n  'drop',\n  'empty',\n  'enabled',\n  'first',\n  'first-child',\n  'first-of-type',\n  'fullscreen',\n  'future',\n  'focus',\n  'focus-visible',\n  'focus-within',\n  'has', // has()\n  'host', // host or host()\n  'host-context', // host-context()\n  'hover',\n  'indeterminate',\n  'in-range',\n  'invalid',\n  'is', // is()\n  'lang', // lang()\n  'last-child',\n  'last-of-type',\n  'left',\n  'link',\n  'local-link',\n  'not', // not()\n  'nth-child', // nth-child()\n  'nth-col', // nth-col()\n  'nth-last-child', // nth-last-child()\n  'nth-last-col', // nth-last-col()\n  'nth-last-of-type', //nth-last-of-type()\n  'nth-of-type', //nth-of-type()\n  'only-child',\n  'only-of-type',\n  'optional',\n  'out-of-range',\n  'past',\n  'placeholder-shown',\n  'read-only',\n  'read-write',\n  'required',\n  'right',\n  'root',\n  'scope',\n  'target',\n  'target-within',\n  'user-invalid',\n  'valid',\n  'visited',\n  'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n  'after',\n  'backdrop',\n  'before',\n  'cue',\n  'cue-region',\n  'first-letter',\n  'first-line',\n  'grammar-error',\n  'marker',\n  'part',\n  'placeholder',\n  'selection',\n  'slotted',\n  'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n  'accent-color',\n  'align-content',\n  'align-items',\n  'align-self',\n  'alignment-baseline',\n  'all',\n  'anchor-name',\n  'animation',\n  'animation-composition',\n  'animation-delay',\n  'animation-direction',\n  'animation-duration',\n  'animation-fill-mode',\n  'animation-iteration-count',\n  'animation-name',\n  'animation-play-state',\n  'animation-range',\n  'animation-range-end',\n  'animation-range-start',\n  'animation-timeline',\n  'animation-timing-function',\n  'appearance',\n  'aspect-ratio',\n  'backdrop-filter',\n  'backface-visibility',\n  'background',\n  'background-attachment',\n  'background-blend-mode',\n  'background-clip',\n  'background-color',\n  'background-image',\n  'background-origin',\n  'background-position',\n  'background-position-x',\n  'background-position-y',\n  'background-repeat',\n  'background-size',\n  'baseline-shift',\n  'block-size',\n  'border',\n  'border-block',\n  'border-block-color',\n  'border-block-end',\n  'border-block-end-color',\n  'border-block-end-style',\n  'border-block-end-width',\n  'border-block-start',\n  'border-block-start-color',\n  'border-block-start-style',\n  'border-block-start-width',\n  'border-block-style',\n  'border-block-width',\n  'border-bottom',\n  'border-bottom-color',\n  'border-bottom-left-radius',\n  'border-bottom-right-radius',\n  'border-bottom-style',\n  'border-bottom-width',\n  'border-collapse',\n  'border-color',\n  'border-end-end-radius',\n  'border-end-start-radius',\n  'border-image',\n  'border-image-outset',\n  'border-image-repeat',\n  'border-image-slice',\n  'border-image-source',\n  'border-image-width',\n  'border-inline',\n  'border-inline-color',\n  'border-inline-end',\n  'border-inline-end-color',\n  'border-inline-end-style',\n  'border-inline-end-width',\n  'border-inline-start',\n  'border-inline-start-color',\n  'border-inline-start-style',\n  'border-inline-start-width',\n  'border-inline-style',\n  'border-inline-width',\n  'border-left',\n  'border-left-color',\n  'border-left-style',\n  'border-left-width',\n  'border-radius',\n  'border-right',\n  'border-right-color',\n  'border-right-style',\n  'border-right-width',\n  'border-spacing',\n  'border-start-end-radius',\n  'border-start-start-radius',\n  'border-style',\n  'border-top',\n  'border-top-color',\n  'border-top-left-radius',\n  'border-top-right-radius',\n  'border-top-style',\n  'border-top-width',\n  'border-width',\n  'bottom',\n  'box-align',\n  'box-decoration-break',\n  'box-direction',\n  'box-flex',\n  'box-flex-group',\n  'box-lines',\n  'box-ordinal-group',\n  'box-orient',\n  'box-pack',\n  'box-shadow',\n  'box-sizing',\n  'break-after',\n  'break-before',\n  'break-inside',\n  'caption-side',\n  'caret-color',\n  'clear',\n  'clip',\n  'clip-path',\n  'clip-rule',\n  'color',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'color-scheme',\n  'column-count',\n  'column-fill',\n  'column-gap',\n  'column-rule',\n  'column-rule-color',\n  'column-rule-style',\n  'column-rule-width',\n  'column-span',\n  'column-width',\n  'columns',\n  'contain',\n  'contain-intrinsic-block-size',\n  'contain-intrinsic-height',\n  'contain-intrinsic-inline-size',\n  'contain-intrinsic-size',\n  'contain-intrinsic-width',\n  'container',\n  'container-name',\n  'container-type',\n  'content',\n  'content-visibility',\n  'counter-increment',\n  'counter-reset',\n  'counter-set',\n  'cue',\n  'cue-after',\n  'cue-before',\n  'cursor',\n  'cx',\n  'cy',\n  'direction',\n  'display',\n  'dominant-baseline',\n  'empty-cells',\n  'enable-background',\n  'field-sizing',\n  'fill',\n  'fill-opacity',\n  'fill-rule',\n  'filter',\n  'flex',\n  'flex-basis',\n  'flex-direction',\n  'flex-flow',\n  'flex-grow',\n  'flex-shrink',\n  'flex-wrap',\n  'float',\n  'flood-color',\n  'flood-opacity',\n  'flow',\n  'font',\n  'font-display',\n  'font-family',\n  'font-feature-settings',\n  'font-kerning',\n  'font-language-override',\n  'font-optical-sizing',\n  'font-palette',\n  'font-size',\n  'font-size-adjust',\n  'font-smooth',\n  'font-smoothing',\n  'font-stretch',\n  'font-style',\n  'font-synthesis',\n  'font-synthesis-position',\n  'font-synthesis-small-caps',\n  'font-synthesis-style',\n  'font-synthesis-weight',\n  'font-variant',\n  'font-variant-alternates',\n  'font-variant-caps',\n  'font-variant-east-asian',\n  'font-variant-emoji',\n  'font-variant-ligatures',\n  'font-variant-numeric',\n  'font-variant-position',\n  'font-variation-settings',\n  'font-weight',\n  'forced-color-adjust',\n  'gap',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'grid',\n  'grid-area',\n  'grid-auto-columns',\n  'grid-auto-flow',\n  'grid-auto-rows',\n  'grid-column',\n  'grid-column-end',\n  'grid-column-start',\n  'grid-gap',\n  'grid-row',\n  'grid-row-end',\n  'grid-row-start',\n  'grid-template',\n  'grid-template-areas',\n  'grid-template-columns',\n  'grid-template-rows',\n  'hanging-punctuation',\n  'height',\n  'hyphenate-character',\n  'hyphenate-limit-chars',\n  'hyphens',\n  'icon',\n  'image-orientation',\n  'image-rendering',\n  'image-resolution',\n  'ime-mode',\n  'initial-letter',\n  'initial-letter-align',\n  'inline-size',\n  'inset',\n  'inset-area',\n  'inset-block',\n  'inset-block-end',\n  'inset-block-start',\n  'inset-inline',\n  'inset-inline-end',\n  'inset-inline-start',\n  'isolation',\n  'justify-content',\n  'justify-items',\n  'justify-self',\n  'kerning',\n  'left',\n  'letter-spacing',\n  'lighting-color',\n  'line-break',\n  'line-height',\n  'line-height-step',\n  'list-style',\n  'list-style-image',\n  'list-style-position',\n  'list-style-type',\n  'margin',\n  'margin-block',\n  'margin-block-end',\n  'margin-block-start',\n  'margin-bottom',\n  'margin-inline',\n  'margin-inline-end',\n  'margin-inline-start',\n  'margin-left',\n  'margin-right',\n  'margin-top',\n  'margin-trim',\n  'marker',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'marks',\n  'mask',\n  'mask-border',\n  'mask-border-mode',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-border-slice',\n  'mask-border-source',\n  'mask-border-width',\n  'mask-clip',\n  'mask-composite',\n  'mask-image',\n  'mask-mode',\n  'mask-origin',\n  'mask-position',\n  'mask-repeat',\n  'mask-size',\n  'mask-type',\n  'masonry-auto-flow',\n  'math-depth',\n  'math-shift',\n  'math-style',\n  'max-block-size',\n  'max-height',\n  'max-inline-size',\n  'max-width',\n  'min-block-size',\n  'min-height',\n  'min-inline-size',\n  'min-width',\n  'mix-blend-mode',\n  'nav-down',\n  'nav-index',\n  'nav-left',\n  'nav-right',\n  'nav-up',\n  'none',\n  'normal',\n  'object-fit',\n  'object-position',\n  'offset',\n  'offset-anchor',\n  'offset-distance',\n  'offset-path',\n  'offset-position',\n  'offset-rotate',\n  'opacity',\n  'order',\n  'orphans',\n  'outline',\n  'outline-color',\n  'outline-offset',\n  'outline-style',\n  'outline-width',\n  'overflow',\n  'overflow-anchor',\n  'overflow-block',\n  'overflow-clip-margin',\n  'overflow-inline',\n  'overflow-wrap',\n  'overflow-x',\n  'overflow-y',\n  'overlay',\n  'overscroll-behavior',\n  'overscroll-behavior-block',\n  'overscroll-behavior-inline',\n  'overscroll-behavior-x',\n  'overscroll-behavior-y',\n  'padding',\n  'padding-block',\n  'padding-block-end',\n  'padding-block-start',\n  'padding-bottom',\n  'padding-inline',\n  'padding-inline-end',\n  'padding-inline-start',\n  'padding-left',\n  'padding-right',\n  'padding-top',\n  'page',\n  'page-break-after',\n  'page-break-before',\n  'page-break-inside',\n  'paint-order',\n  'pause',\n  'pause-after',\n  'pause-before',\n  'perspective',\n  'perspective-origin',\n  'place-content',\n  'place-items',\n  'place-self',\n  'pointer-events',\n  'position',\n  'position-anchor',\n  'position-visibility',\n  'print-color-adjust',\n  'quotes',\n  'r',\n  'resize',\n  'rest',\n  'rest-after',\n  'rest-before',\n  'right',\n  'rotate',\n  'row-gap',\n  'ruby-align',\n  'ruby-position',\n  'scale',\n  'scroll-behavior',\n  'scroll-margin',\n  'scroll-margin-block',\n  'scroll-margin-block-end',\n  'scroll-margin-block-start',\n  'scroll-margin-bottom',\n  'scroll-margin-inline',\n  'scroll-margin-inline-end',\n  'scroll-margin-inline-start',\n  'scroll-margin-left',\n  'scroll-margin-right',\n  'scroll-margin-top',\n  'scroll-padding',\n  'scroll-padding-block',\n  'scroll-padding-block-end',\n  'scroll-padding-block-start',\n  'scroll-padding-bottom',\n  'scroll-padding-inline',\n  'scroll-padding-inline-end',\n  'scroll-padding-inline-start',\n  'scroll-padding-left',\n  'scroll-padding-right',\n  'scroll-padding-top',\n  'scroll-snap-align',\n  'scroll-snap-stop',\n  'scroll-snap-type',\n  'scroll-timeline',\n  'scroll-timeline-axis',\n  'scroll-timeline-name',\n  'scrollbar-color',\n  'scrollbar-gutter',\n  'scrollbar-width',\n  'shape-image-threshold',\n  'shape-margin',\n  'shape-outside',\n  'shape-rendering',\n  'speak',\n  'speak-as',\n  'src', // @font-face\n  'stop-color',\n  'stop-opacity',\n  'stroke',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'tab-size',\n  'table-layout',\n  'text-align',\n  'text-align-all',\n  'text-align-last',\n  'text-anchor',\n  'text-combine-upright',\n  'text-decoration',\n  'text-decoration-color',\n  'text-decoration-line',\n  'text-decoration-skip',\n  'text-decoration-skip-ink',\n  'text-decoration-style',\n  'text-decoration-thickness',\n  'text-emphasis',\n  'text-emphasis-color',\n  'text-emphasis-position',\n  'text-emphasis-style',\n  'text-indent',\n  'text-justify',\n  'text-orientation',\n  'text-overflow',\n  'text-rendering',\n  'text-shadow',\n  'text-size-adjust',\n  'text-transform',\n  'text-underline-offset',\n  'text-underline-position',\n  'text-wrap',\n  'text-wrap-mode',\n  'text-wrap-style',\n  'timeline-scope',\n  'top',\n  'touch-action',\n  'transform',\n  'transform-box',\n  'transform-origin',\n  'transform-style',\n  'transition',\n  'transition-behavior',\n  'transition-delay',\n  'transition-duration',\n  'transition-property',\n  'transition-timing-function',\n  'translate',\n  'unicode-bidi',\n  'user-modify',\n  'user-select',\n  'vector-effect',\n  'vertical-align',\n  'view-timeline',\n  'view-timeline-axis',\n  'view-timeline-inset',\n  'view-timeline-name',\n  'view-transition-name',\n  'visibility',\n  'voice-balance',\n  'voice-duration',\n  'voice-family',\n  'voice-pitch',\n  'voice-range',\n  'voice-rate',\n  'voice-stress',\n  'voice-volume',\n  'white-space',\n  'white-space-collapse',\n  'widows',\n  'width',\n  'will-change',\n  'word-break',\n  'word-spacing',\n  'word-wrap',\n  'writing-mode',\n  'x',\n  'y',\n  'z-index',\n  'zoom'\n].sort().reverse();\n\n/*\nLanguage: SCSS\nDescription: Scss is an extension of the syntax of CSS.\nAuthor: Kurt Emch <kurt@kurtemch.com>\nWebsite: https://sass-lang.com\nCategory: common, css, web\n*/\n\n\n/** @type LanguageFn */\nfunction scss(hljs) {\n  const modes = MODES(hljs);\n  const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS;\n  const PSEUDO_CLASSES$1 = PSEUDO_CLASSES;\n\n  const AT_IDENTIFIER = '@[a-z-]+'; // @font-face\n  const AT_MODIFIERS = \"and or not only\";\n  const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  const VARIABLE = {\n    className: 'variable',\n    begin: '(\\\\$' + IDENT_RE + ')\\\\b',\n    relevance: 0\n  };\n\n  return {\n    name: 'SCSS',\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      // to recognize keyframe 40% etc which are outside the scope of our\n      // attribute value mode\n      modes.CSS_NUMBER_MODE,\n      {\n        className: 'selector-id',\n        begin: '#[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'selector-class',\n        begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      modes.ATTRIBUTE_SELECTOR_MODE,\n      {\n        className: 'selector-tag',\n        begin: '\\\\b(' + TAGS.join('|') + ')\\\\b',\n        // was there, before, but why?\n        relevance: 0\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(' + PSEUDO_CLASSES$1.join('|') + ')'\n      },\n      {\n        className: 'selector-pseudo',\n        begin: ':(:)?(' + PSEUDO_ELEMENTS$1.join('|') + ')'\n      },\n      VARIABLE,\n      { // pseudo-selector params\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [ modes.CSS_NUMBER_MODE ]\n      },\n      modes.CSS_VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n      },\n      { begin: '\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b' },\n      {\n        begin: /:/,\n        end: /[;}{]/,\n        relevance: 0,\n        contains: [\n          modes.BLOCK_COMMENT,\n          VARIABLE,\n          modes.HEXCOLOR,\n          modes.CSS_NUMBER_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          modes.IMPORTANT,\n          modes.FUNCTION_DISPATCH\n        ]\n      },\n      // matching these here allows us to treat them more like regular CSS\n      // rules so everything between the {} gets regular rule highlighting,\n      // which is what we want for page and font-face\n      {\n        begin: '@(page|font-face)',\n        keywords: {\n          $pattern: AT_IDENTIFIER,\n          keyword: '@page @font-face'\n        }\n      },\n      {\n        begin: '@',\n        end: '[{;]',\n        returnBegin: true,\n        keywords: {\n          $pattern: /[a-z-]+/,\n          keyword: AT_MODIFIERS,\n          attribute: MEDIA_FEATURES.join(\" \")\n        },\n        contains: [\n          {\n            begin: AT_IDENTIFIER,\n            className: \"keyword\"\n          },\n          {\n            begin: /[a-z-]+(?=:)/,\n            className: \"attribute\"\n          },\n          VARIABLE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          modes.HEXCOLOR,\n          modes.CSS_NUMBER_MODE\n        ]\n      },\n      modes.FUNCTION_DISPATCH\n    ]\n  };\n}\n\nmodule.exports = scss;\n","/*\nLanguage: Shell Session\nRequires: bash.js\nAuthor: TSUYUSATO Kitsune <make.just.on@gmail.com>\nCategory: common\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction shell(hljs) {\n  return {\n    name: 'Shell Session',\n    aliases: [\n      'console',\n      'shellsession'\n    ],\n    contains: [\n      {\n        className: 'meta.prompt',\n        // We cannot add \\s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result.\n        // For instance, in the following example, it would match \"echo /path/to/home >\" as a prompt:\n        // echo /path/to/home > t.exe\n        begin: /^\\s{0,3}[/~\\w\\d[\\]()@-]*[>%$#][ ]?/,\n        starts: {\n          end: /[^\\\\](?=\\s*$)/,\n          subLanguage: 'bash'\n        }\n      }\n    ]\n  };\n}\n\nmodule.exports = shell;\n","/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n  PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n  - PostgreSQL and PL/pgSQL - core\n  - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n  - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n  const regex = hljs.regex;\n  const COMMENT_MODE = hljs.COMMENT('--', '$');\n  const STRING = {\n    scope: 'string',\n    variants: [\n      {\n        begin: /'/,\n        end: /'/,\n        contains: [ { match: /''/ } ]\n      }\n    ]\n  };\n  const QUOTED_IDENTIFIER = {\n    begin: /\"/,\n    end: /\"/,\n    contains: [ { match: /\"\"/ } ]\n  };\n\n  const LITERALS = [\n    \"true\",\n    \"false\",\n    // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n    // \"null\",\n    \"unknown\"\n  ];\n\n  const MULTI_WORD_TYPES = [\n    \"double precision\",\n    \"large object\",\n    \"with timezone\",\n    \"without timezone\"\n  ];\n\n  const TYPES = [\n    'bigint',\n    'binary',\n    'blob',\n    'boolean',\n    'char',\n    'character',\n    'clob',\n    'date',\n    'dec',\n    'decfloat',\n    'decimal',\n    'float',\n    'int',\n    'integer',\n    'interval',\n    'nchar',\n    'nclob',\n    'national',\n    'numeric',\n    'real',\n    'row',\n    'smallint',\n    'time',\n    'timestamp',\n    'varchar',\n    'varying', // modifier (character varying)\n    'varbinary'\n  ];\n\n  const NON_RESERVED_WORDS = [\n    \"add\",\n    \"asc\",\n    \"collation\",\n    \"desc\",\n    \"final\",\n    \"first\",\n    \"last\",\n    \"view\"\n  ];\n\n  // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n  const RESERVED_WORDS = [\n    \"abs\",\n    \"acos\",\n    \"all\",\n    \"allocate\",\n    \"alter\",\n    \"and\",\n    \"any\",\n    \"are\",\n    \"array\",\n    \"array_agg\",\n    \"array_max_cardinality\",\n    \"as\",\n    \"asensitive\",\n    \"asin\",\n    \"asymmetric\",\n    \"at\",\n    \"atan\",\n    \"atomic\",\n    \"authorization\",\n    \"avg\",\n    \"begin\",\n    \"begin_frame\",\n    \"begin_partition\",\n    \"between\",\n    \"bigint\",\n    \"binary\",\n    \"blob\",\n    \"boolean\",\n    \"both\",\n    \"by\",\n    \"call\",\n    \"called\",\n    \"cardinality\",\n    \"cascaded\",\n    \"case\",\n    \"cast\",\n    \"ceil\",\n    \"ceiling\",\n    \"char\",\n    \"char_length\",\n    \"character\",\n    \"character_length\",\n    \"check\",\n    \"classifier\",\n    \"clob\",\n    \"close\",\n    \"coalesce\",\n    \"collate\",\n    \"collect\",\n    \"column\",\n    \"commit\",\n    \"condition\",\n    \"connect\",\n    \"constraint\",\n    \"contains\",\n    \"convert\",\n    \"copy\",\n    \"corr\",\n    \"corresponding\",\n    \"cos\",\n    \"cosh\",\n    \"count\",\n    \"covar_pop\",\n    \"covar_samp\",\n    \"create\",\n    \"cross\",\n    \"cube\",\n    \"cume_dist\",\n    \"current\",\n    \"current_catalog\",\n    \"current_date\",\n    \"current_default_transform_group\",\n    \"current_path\",\n    \"current_role\",\n    \"current_row\",\n    \"current_schema\",\n    \"current_time\",\n    \"current_timestamp\",\n    \"current_path\",\n    \"current_role\",\n    \"current_transform_group_for_type\",\n    \"current_user\",\n    \"cursor\",\n    \"cycle\",\n    \"date\",\n    \"day\",\n    \"deallocate\",\n    \"dec\",\n    \"decimal\",\n    \"decfloat\",\n    \"declare\",\n    \"default\",\n    \"define\",\n    \"delete\",\n    \"dense_rank\",\n    \"deref\",\n    \"describe\",\n    \"deterministic\",\n    \"disconnect\",\n    \"distinct\",\n    \"double\",\n    \"drop\",\n    \"dynamic\",\n    \"each\",\n    \"element\",\n    \"else\",\n    \"empty\",\n    \"end\",\n    \"end_frame\",\n    \"end_partition\",\n    \"end-exec\",\n    \"equals\",\n    \"escape\",\n    \"every\",\n    \"except\",\n    \"exec\",\n    \"execute\",\n    \"exists\",\n    \"exp\",\n    \"external\",\n    \"extract\",\n    \"false\",\n    \"fetch\",\n    \"filter\",\n    \"first_value\",\n    \"float\",\n    \"floor\",\n    \"for\",\n    \"foreign\",\n    \"frame_row\",\n    \"free\",\n    \"from\",\n    \"full\",\n    \"function\",\n    \"fusion\",\n    \"get\",\n    \"global\",\n    \"grant\",\n    \"group\",\n    \"grouping\",\n    \"groups\",\n    \"having\",\n    \"hold\",\n    \"hour\",\n    \"identity\",\n    \"in\",\n    \"indicator\",\n    \"initial\",\n    \"inner\",\n    \"inout\",\n    \"insensitive\",\n    \"insert\",\n    \"int\",\n    \"integer\",\n    \"intersect\",\n    \"intersection\",\n    \"interval\",\n    \"into\",\n    \"is\",\n    \"join\",\n    \"json_array\",\n    \"json_arrayagg\",\n    \"json_exists\",\n    \"json_object\",\n    \"json_objectagg\",\n    \"json_query\",\n    \"json_table\",\n    \"json_table_primitive\",\n    \"json_value\",\n    \"lag\",\n    \"language\",\n    \"large\",\n    \"last_value\",\n    \"lateral\",\n    \"lead\",\n    \"leading\",\n    \"left\",\n    \"like\",\n    \"like_regex\",\n    \"listagg\",\n    \"ln\",\n    \"local\",\n    \"localtime\",\n    \"localtimestamp\",\n    \"log\",\n    \"log10\",\n    \"lower\",\n    \"match\",\n    \"match_number\",\n    \"match_recognize\",\n    \"matches\",\n    \"max\",\n    \"member\",\n    \"merge\",\n    \"method\",\n    \"min\",\n    \"minute\",\n    \"mod\",\n    \"modifies\",\n    \"module\",\n    \"month\",\n    \"multiset\",\n    \"national\",\n    \"natural\",\n    \"nchar\",\n    \"nclob\",\n    \"new\",\n    \"no\",\n    \"none\",\n    \"normalize\",\n    \"not\",\n    \"nth_value\",\n    \"ntile\",\n    \"null\",\n    \"nullif\",\n    \"numeric\",\n    \"octet_length\",\n    \"occurrences_regex\",\n    \"of\",\n    \"offset\",\n    \"old\",\n    \"omit\",\n    \"on\",\n    \"one\",\n    \"only\",\n    \"open\",\n    \"or\",\n    \"order\",\n    \"out\",\n    \"outer\",\n    \"over\",\n    \"overlaps\",\n    \"overlay\",\n    \"parameter\",\n    \"partition\",\n    \"pattern\",\n    \"per\",\n    \"percent\",\n    \"percent_rank\",\n    \"percentile_cont\",\n    \"percentile_disc\",\n    \"period\",\n    \"portion\",\n    \"position\",\n    \"position_regex\",\n    \"power\",\n    \"precedes\",\n    \"precision\",\n    \"prepare\",\n    \"primary\",\n    \"procedure\",\n    \"ptf\",\n    \"range\",\n    \"rank\",\n    \"reads\",\n    \"real\",\n    \"recursive\",\n    \"ref\",\n    \"references\",\n    \"referencing\",\n    \"regr_avgx\",\n    \"regr_avgy\",\n    \"regr_count\",\n    \"regr_intercept\",\n    \"regr_r2\",\n    \"regr_slope\",\n    \"regr_sxx\",\n    \"regr_sxy\",\n    \"regr_syy\",\n    \"release\",\n    \"result\",\n    \"return\",\n    \"returns\",\n    \"revoke\",\n    \"right\",\n    \"rollback\",\n    \"rollup\",\n    \"row\",\n    \"row_number\",\n    \"rows\",\n    \"running\",\n    \"savepoint\",\n    \"scope\",\n    \"scroll\",\n    \"search\",\n    \"second\",\n    \"seek\",\n    \"select\",\n    \"sensitive\",\n    \"session_user\",\n    \"set\",\n    \"show\",\n    \"similar\",\n    \"sin\",\n    \"sinh\",\n    \"skip\",\n    \"smallint\",\n    \"some\",\n    \"specific\",\n    \"specifictype\",\n    \"sql\",\n    \"sqlexception\",\n    \"sqlstate\",\n    \"sqlwarning\",\n    \"sqrt\",\n    \"start\",\n    \"static\",\n    \"stddev_pop\",\n    \"stddev_samp\",\n    \"submultiset\",\n    \"subset\",\n    \"substring\",\n    \"substring_regex\",\n    \"succeeds\",\n    \"sum\",\n    \"symmetric\",\n    \"system\",\n    \"system_time\",\n    \"system_user\",\n    \"table\",\n    \"tablesample\",\n    \"tan\",\n    \"tanh\",\n    \"then\",\n    \"time\",\n    \"timestamp\",\n    \"timezone_hour\",\n    \"timezone_minute\",\n    \"to\",\n    \"trailing\",\n    \"translate\",\n    \"translate_regex\",\n    \"translation\",\n    \"treat\",\n    \"trigger\",\n    \"trim\",\n    \"trim_array\",\n    \"true\",\n    \"truncate\",\n    \"uescape\",\n    \"union\",\n    \"unique\",\n    \"unknown\",\n    \"unnest\",\n    \"update\",\n    \"upper\",\n    \"user\",\n    \"using\",\n    \"value\",\n    \"values\",\n    \"value_of\",\n    \"var_pop\",\n    \"var_samp\",\n    \"varbinary\",\n    \"varchar\",\n    \"varying\",\n    \"versioning\",\n    \"when\",\n    \"whenever\",\n    \"where\",\n    \"width_bucket\",\n    \"window\",\n    \"with\",\n    \"within\",\n    \"without\",\n    \"year\",\n  ];\n\n  // these are reserved words we have identified to be functions\n  // and should only be highlighted in a dispatch-like context\n  // ie, array_agg(...), etc.\n  const RESERVED_FUNCTIONS = [\n    \"abs\",\n    \"acos\",\n    \"array_agg\",\n    \"asin\",\n    \"atan\",\n    \"avg\",\n    \"cast\",\n    \"ceil\",\n    \"ceiling\",\n    \"coalesce\",\n    \"corr\",\n    \"cos\",\n    \"cosh\",\n    \"count\",\n    \"covar_pop\",\n    \"covar_samp\",\n    \"cume_dist\",\n    \"dense_rank\",\n    \"deref\",\n    \"element\",\n    \"exp\",\n    \"extract\",\n    \"first_value\",\n    \"floor\",\n    \"json_array\",\n    \"json_arrayagg\",\n    \"json_exists\",\n    \"json_object\",\n    \"json_objectagg\",\n    \"json_query\",\n    \"json_table\",\n    \"json_table_primitive\",\n    \"json_value\",\n    \"lag\",\n    \"last_value\",\n    \"lead\",\n    \"listagg\",\n    \"ln\",\n    \"log\",\n    \"log10\",\n    \"lower\",\n    \"max\",\n    \"min\",\n    \"mod\",\n    \"nth_value\",\n    \"ntile\",\n    \"nullif\",\n    \"percent_rank\",\n    \"percentile_cont\",\n    \"percentile_disc\",\n    \"position\",\n    \"position_regex\",\n    \"power\",\n    \"rank\",\n    \"regr_avgx\",\n    \"regr_avgy\",\n    \"regr_count\",\n    \"regr_intercept\",\n    \"regr_r2\",\n    \"regr_slope\",\n    \"regr_sxx\",\n    \"regr_sxy\",\n    \"regr_syy\",\n    \"row_number\",\n    \"sin\",\n    \"sinh\",\n    \"sqrt\",\n    \"stddev_pop\",\n    \"stddev_samp\",\n    \"substring\",\n    \"substring_regex\",\n    \"sum\",\n    \"tan\",\n    \"tanh\",\n    \"translate\",\n    \"translate_regex\",\n    \"treat\",\n    \"trim\",\n    \"trim_array\",\n    \"unnest\",\n    \"upper\",\n    \"value_of\",\n    \"var_pop\",\n    \"var_samp\",\n    \"width_bucket\",\n  ];\n\n  // these functions can\n  const POSSIBLE_WITHOUT_PARENS = [\n    \"current_catalog\",\n    \"current_date\",\n    \"current_default_transform_group\",\n    \"current_path\",\n    \"current_role\",\n    \"current_schema\",\n    \"current_transform_group_for_type\",\n    \"current_user\",\n    \"session_user\",\n    \"system_time\",\n    \"system_user\",\n    \"current_time\",\n    \"localtime\",\n    \"current_timestamp\",\n    \"localtimestamp\"\n  ];\n\n  // those exist to boost relevance making these very\n  // \"SQL like\" keyword combos worth +1 extra relevance\n  const COMBOS = [\n    \"create table\",\n    \"insert into\",\n    \"primary key\",\n    \"foreign key\",\n    \"not null\",\n    \"alter table\",\n    \"add constraint\",\n    \"grouping sets\",\n    \"on overflow\",\n    \"character set\",\n    \"respect nulls\",\n    \"ignore nulls\",\n    \"nulls first\",\n    \"nulls last\",\n    \"depth first\",\n    \"breadth first\"\n  ];\n\n  const FUNCTIONS = RESERVED_FUNCTIONS;\n\n  const KEYWORDS = [\n    ...RESERVED_WORDS,\n    ...NON_RESERVED_WORDS\n  ].filter((keyword) => {\n    return !RESERVED_FUNCTIONS.includes(keyword);\n  });\n\n  const VARIABLE = {\n    scope: \"variable\",\n    match: /@[a-z0-9][a-z0-9_]*/,\n  };\n\n  const OPERATOR = {\n    scope: \"operator\",\n    match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n    relevance: 0,\n  };\n\n  const FUNCTION_CALL = {\n    match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n    relevance: 0,\n    keywords: { built_in: FUNCTIONS }\n  };\n\n  // turns a multi-word keyword combo into a regex that doesn't\n  // care about extra whitespace etc.\n  // input: \"START QUERY\"\n  // output: /\\bSTART\\s+QUERY\\b/\n  function kws_to_regex(list) {\n    return regex.concat(\n      /\\b/,\n      regex.either(...list.map((kw) => {\n        return kw.replace(/\\s+/, \"\\\\s+\")\n      })),\n      /\\b/\n    )\n  }\n\n  const MULTI_WORD_KEYWORDS = {\n    scope: \"keyword\",\n    match: kws_to_regex(COMBOS),\n    relevance: 0,\n  };\n\n  // keywords with less than 3 letters are reduced in relevancy\n  function reduceRelevancy(list, {\n    exceptions, when\n  } = {}) {\n    const qualifyFn = when;\n    exceptions = exceptions || [];\n    return list.map((item) => {\n      if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n        return item;\n      } else if (qualifyFn(item)) {\n        return `${item}|0`;\n      } else {\n        return item;\n      }\n    });\n  }\n\n  return {\n    name: 'SQL',\n    case_insensitive: true,\n    // does not include {} or HTML tags `</`\n    illegal: /[{}]|<\\//,\n    keywords: {\n      $pattern: /\\b[\\w\\.]+/,\n      keyword:\n        reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),\n      literal: LITERALS,\n      type: TYPES,\n      built_in: POSSIBLE_WITHOUT_PARENS\n    },\n    contains: [\n      {\n        scope: \"type\",\n        match: kws_to_regex(MULTI_WORD_TYPES)\n      },\n      MULTI_WORD_KEYWORDS,\n      FUNCTION_CALL,\n      VARIABLE,\n      STRING,\n      QUOTED_IDENTIFIER,\n      hljs.C_NUMBER_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      COMMENT_MODE,\n      OPERATOR\n    ]\n  };\n}\n\nmodule.exports = sql;\n","/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n  if (!re) return null;\n  if (typeof re === \"string\") return re;\n\n  return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n  return concat('(?=', re, ')');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n  const joined = args.map((x) => source(x)).join(\"\");\n  return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n  const opts = args[args.length - 1];\n\n  if (typeof opts === 'object' && opts.constructor === Object) {\n    args.splice(args.length - 1, 1);\n    return opts;\n  } else {\n    return {};\n  }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n  /** @type { object & {capture?: boolean} }  */\n  const opts = stripOptionsFromArgs(args);\n  const joined = '('\n    + (opts.capture ? \"\" : \"?:\")\n    + args.map((x) => source(x)).join(\"|\") + \")\";\n  return joined;\n}\n\nconst keywordWrapper = keyword => concat(\n  /\\b/,\n  keyword,\n  /\\w$/.test(keyword) ? /\\b/ : /\\B/\n);\n\n// Keywords that require a leading dot.\nconst dotKeywords = [\n  'Protocol', // contextual\n  'Type' // contextual\n].map(keywordWrapper);\n\n// Keywords that may have a leading dot.\nconst optionalDotKeywords = [\n  'init',\n  'self'\n].map(keywordWrapper);\n\n// should register as keyword, not type\nconst keywordTypes = [\n  'Any',\n  'Self'\n];\n\n// Regular keywords and literals.\nconst keywords = [\n  // strings below will be fed into the regular `keywords` engine while regex\n  // will result in additional modes being created to scan for those keywords to\n  // avoid conflicts with other rules\n  'actor',\n  'any', // contextual\n  'associatedtype',\n  'async',\n  'await',\n  /as\\?/, // operator\n  /as!/, // operator\n  'as', // operator\n  'borrowing', // contextual\n  'break',\n  'case',\n  'catch',\n  'class',\n  'consume', // contextual\n  'consuming', // contextual\n  'continue',\n  'convenience', // contextual\n  'copy', // contextual\n  'default',\n  'defer',\n  'deinit',\n  'didSet', // contextual\n  'distributed',\n  'do',\n  'dynamic', // contextual\n  'each',\n  'else',\n  'enum',\n  'extension',\n  'fallthrough',\n  /fileprivate\\(set\\)/,\n  'fileprivate',\n  'final', // contextual\n  'for',\n  'func',\n  'get', // contextual\n  'guard',\n  'if',\n  'import',\n  'indirect', // contextual\n  'infix', // contextual\n  /init\\?/,\n  /init!/,\n  'inout',\n  /internal\\(set\\)/,\n  'internal',\n  'in',\n  'is', // operator\n  'isolated', // contextual\n  'nonisolated', // contextual\n  'lazy', // contextual\n  'let',\n  'macro',\n  'mutating', // contextual\n  'nonmutating', // contextual\n  /open\\(set\\)/, // contextual\n  'open', // contextual\n  'operator',\n  'optional', // contextual\n  'override', // contextual\n  'package',\n  'postfix', // contextual\n  'precedencegroup',\n  'prefix', // contextual\n  /private\\(set\\)/,\n  'private',\n  'protocol',\n  /public\\(set\\)/,\n  'public',\n  'repeat',\n  'required', // contextual\n  'rethrows',\n  'return',\n  'set', // contextual\n  'some', // contextual\n  'static',\n  'struct',\n  'subscript',\n  'super',\n  'switch',\n  'throws',\n  'throw',\n  /try\\?/, // operator\n  /try!/, // operator\n  'try', // operator\n  'typealias',\n  /unowned\\(safe\\)/, // contextual\n  /unowned\\(unsafe\\)/, // contextual\n  'unowned', // contextual\n  'var',\n  'weak', // contextual\n  'where',\n  'while',\n  'willSet' // contextual\n];\n\n// NOTE: Contextual keywords are reserved only in specific contexts.\n// Ideally, these should be matched using modes to avoid false positives.\n\n// Literals.\nconst literals = [\n  'false',\n  'nil',\n  'true'\n];\n\n// Keywords used in precedence groups.\nconst precedencegroupKeywords = [\n  'assignment',\n  'associativity',\n  'higherThan',\n  'left',\n  'lowerThan',\n  'none',\n  'right'\n];\n\n// Keywords that start with a number sign (#).\n// #(un)available is handled separately.\nconst numberSignKeywords = [\n  '#colorLiteral',\n  '#column',\n  '#dsohandle',\n  '#else',\n  '#elseif',\n  '#endif',\n  '#error',\n  '#file',\n  '#fileID',\n  '#fileLiteral',\n  '#filePath',\n  '#function',\n  '#if',\n  '#imageLiteral',\n  '#keyPath',\n  '#line',\n  '#selector',\n  '#sourceLocation',\n  '#warning'\n];\n\n// Global functions in the Standard Library.\nconst builtIns = [\n  'abs',\n  'all',\n  'any',\n  'assert',\n  'assertionFailure',\n  'debugPrint',\n  'dump',\n  'fatalError',\n  'getVaList',\n  'isKnownUniquelyReferenced',\n  'max',\n  'min',\n  'numericCast',\n  'pointwiseMax',\n  'pointwiseMin',\n  'precondition',\n  'preconditionFailure',\n  'print',\n  'readLine',\n  'repeatElement',\n  'sequence',\n  'stride',\n  'swap',\n  'swift_unboxFromSwiftValueWithType',\n  'transcode',\n  'type',\n  'unsafeBitCast',\n  'unsafeDowncast',\n  'withExtendedLifetime',\n  'withUnsafeMutablePointer',\n  'withUnsafePointer',\n  'withVaList',\n  'withoutActuallyEscaping',\n  'zip'\n];\n\n// Valid first characters for operators.\nconst operatorHead = either(\n  /[/=\\-+!*%<>&|^~?]/,\n  /[\\u00A1-\\u00A7]/,\n  /[\\u00A9\\u00AB]/,\n  /[\\u00AC\\u00AE]/,\n  /[\\u00B0\\u00B1]/,\n  /[\\u00B6\\u00BB\\u00BF\\u00D7\\u00F7]/,\n  /[\\u2016-\\u2017]/,\n  /[\\u2020-\\u2027]/,\n  /[\\u2030-\\u203E]/,\n  /[\\u2041-\\u2053]/,\n  /[\\u2055-\\u205E]/,\n  /[\\u2190-\\u23FF]/,\n  /[\\u2500-\\u2775]/,\n  /[\\u2794-\\u2BFF]/,\n  /[\\u2E00-\\u2E7F]/,\n  /[\\u3001-\\u3003]/,\n  /[\\u3008-\\u3020]/,\n  /[\\u3030]/\n);\n\n// Valid characters for operators.\nconst operatorCharacter = either(\n  operatorHead,\n  /[\\u0300-\\u036F]/,\n  /[\\u1DC0-\\u1DFF]/,\n  /[\\u20D0-\\u20FF]/,\n  /[\\uFE00-\\uFE0F]/,\n  /[\\uFE20-\\uFE2F]/\n  // TODO: The following characters are also allowed, but the regex isn't supported yet.\n  // /[\\u{E0100}-\\u{E01EF}]/u\n);\n\n// Valid operator.\nconst operator = concat(operatorHead, operatorCharacter, '*');\n\n// Valid first characters for identifiers.\nconst identifierHead = either(\n  /[a-zA-Z_]/,\n  /[\\u00A8\\u00AA\\u00AD\\u00AF\\u00B2-\\u00B5\\u00B7-\\u00BA]/,\n  /[\\u00BC-\\u00BE\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF]/,\n  /[\\u0100-\\u02FF\\u0370-\\u167F\\u1681-\\u180D\\u180F-\\u1DBF]/,\n  /[\\u1E00-\\u1FFF]/,\n  /[\\u200B-\\u200D\\u202A-\\u202E\\u203F-\\u2040\\u2054\\u2060-\\u206F]/,\n  /[\\u2070-\\u20CF\\u2100-\\u218F\\u2460-\\u24FF\\u2776-\\u2793]/,\n  /[\\u2C00-\\u2DFF\\u2E80-\\u2FFF]/,\n  /[\\u3004-\\u3007\\u3021-\\u302F\\u3031-\\u303F\\u3040-\\uD7FF]/,\n  /[\\uF900-\\uFD3D\\uFD40-\\uFDCF\\uFDF0-\\uFE1F\\uFE30-\\uFE44]/,\n  /[\\uFE47-\\uFEFE\\uFF00-\\uFFFD]/ // Should be /[\\uFE47-\\uFFFD]/, but we have to exclude FEFF.\n  // The following characters are also allowed, but the regexes aren't supported yet.\n  // /[\\u{10000}-\\u{1FFFD}\\u{20000-\\u{2FFFD}\\u{30000}-\\u{3FFFD}\\u{40000}-\\u{4FFFD}]/u,\n  // /[\\u{50000}-\\u{5FFFD}\\u{60000-\\u{6FFFD}\\u{70000}-\\u{7FFFD}\\u{80000}-\\u{8FFFD}]/u,\n  // /[\\u{90000}-\\u{9FFFD}\\u{A0000-\\u{AFFFD}\\u{B0000}-\\u{BFFFD}\\u{C0000}-\\u{CFFFD}]/u,\n  // /[\\u{D0000}-\\u{DFFFD}\\u{E0000-\\u{EFFFD}]/u\n);\n\n// Valid characters for identifiers.\nconst identifierCharacter = either(\n  identifierHead,\n  /\\d/,\n  /[\\u0300-\\u036F\\u1DC0-\\u1DFF\\u20D0-\\u20FF\\uFE20-\\uFE2F]/\n);\n\n// Valid identifier.\nconst identifier = concat(identifierHead, identifierCharacter, '*');\n\n// Valid type identifier.\nconst typeIdentifier = concat(/[A-Z]/, identifierCharacter, '*');\n\n// Built-in attributes, which are highlighted as keywords.\n// @available is handled separately.\n// https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes\nconst keywordAttributes = [\n  'attached',\n  'autoclosure',\n  concat(/convention\\(/, either('swift', 'block', 'c'), /\\)/),\n  'discardableResult',\n  'dynamicCallable',\n  'dynamicMemberLookup',\n  'escaping',\n  'freestanding',\n  'frozen',\n  'GKInspectable',\n  'IBAction',\n  'IBDesignable',\n  'IBInspectable',\n  'IBOutlet',\n  'IBSegueAction',\n  'inlinable',\n  'main',\n  'nonobjc',\n  'NSApplicationMain',\n  'NSCopying',\n  'NSManaged',\n  concat(/objc\\(/, identifier, /\\)/),\n  'objc',\n  'objcMembers',\n  'propertyWrapper',\n  'requires_stored_property_inits',\n  'resultBuilder',\n  'Sendable',\n  'testable',\n  'UIApplicationMain',\n  'unchecked',\n  'unknown',\n  'usableFromInline',\n  'warn_unqualified_access'\n];\n\n// Contextual keywords used in @available and #(un)available.\nconst availabilityKeywords = [\n  'iOS',\n  'iOSApplicationExtension',\n  'macOS',\n  'macOSApplicationExtension',\n  'macCatalyst',\n  'macCatalystApplicationExtension',\n  'watchOS',\n  'watchOSApplicationExtension',\n  'tvOS',\n  'tvOSApplicationExtension',\n  'swift'\n];\n\n/*\nLanguage: Swift\nDescription: Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.\nAuthor: Steven Van Impe <steven.vanimpe@icloud.com>\nContributors: Chris Eidhof <chris@eidhof.nl>, Nate Cook <natecook@gmail.com>, Alexander Lichter <manniL@gmx.net>, Richard Gibson <gibson042@github>\nWebsite: https://swift.org\nCategory: common, system\n*/\n\n\n/** @type LanguageFn */\nfunction swift(hljs) {\n  const WHITESPACE = {\n    match: /\\s+/,\n    relevance: 0\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID411\n  const BLOCK_COMMENT = hljs.COMMENT(\n    '/\\\\*',\n    '\\\\*/',\n    { contains: [ 'self' ] }\n  );\n  const COMMENTS = [\n    hljs.C_LINE_COMMENT_MODE,\n    BLOCK_COMMENT\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID413\n  // https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html\n  const DOT_KEYWORD = {\n    match: [\n      /\\./,\n      either(...dotKeywords, ...optionalDotKeywords)\n    ],\n    className: { 2: \"keyword\" }\n  };\n  const KEYWORD_GUARD = {\n    // Consume .keyword to prevent highlighting properties and methods as keywords.\n    match: concat(/\\./, either(...keywords)),\n    relevance: 0\n  };\n  const PLAIN_KEYWORDS = keywords\n    .filter(kw => typeof kw === 'string')\n    .concat([ \"_|0\" ]); // seems common, so 0 relevance\n  const REGEX_KEYWORDS = keywords\n    .filter(kw => typeof kw !== 'string') // find regex\n    .concat(keywordTypes)\n    .map(keywordWrapper);\n  const KEYWORD = { variants: [\n    {\n      className: 'keyword',\n      match: either(...REGEX_KEYWORDS, ...optionalDotKeywords)\n    }\n  ] };\n  // find all the regular keywords\n  const KEYWORDS = {\n    $pattern: either(\n      /\\b\\w+/, // regular keywords\n      /#\\w+/ // number keywords\n    ),\n    keyword: PLAIN_KEYWORDS\n      .concat(numberSignKeywords),\n    literal: literals\n  };\n  const KEYWORD_MODES = [\n    DOT_KEYWORD,\n    KEYWORD_GUARD,\n    KEYWORD\n  ];\n\n  // https://github.com/apple/swift/tree/main/stdlib/public/core\n  const BUILT_IN_GUARD = {\n    // Consume .built_in to prevent highlighting properties and methods.\n    match: concat(/\\./, either(...builtIns)),\n    relevance: 0\n  };\n  const BUILT_IN = {\n    className: 'built_in',\n    match: concat(/\\b/, either(...builtIns), /(?=\\()/)\n  };\n  const BUILT_INS = [\n    BUILT_IN_GUARD,\n    BUILT_IN\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID418\n  const OPERATOR_GUARD = {\n    // Prevent -> from being highlighting as an operator.\n    match: /->/,\n    relevance: 0\n  };\n  const OPERATOR = {\n    className: 'operator',\n    relevance: 0,\n    variants: [\n      { match: operator },\n      {\n        // dot-operator: only operators that start with a dot are allowed to use dots as\n        // characters (..., ...<, .*, etc). So there rule here is: a dot followed by one or more\n        // characters that may also include dots.\n        match: `\\\\.(\\\\.|${operatorCharacter})+` }\n    ]\n  };\n  const OPERATORS = [\n    OPERATOR_GUARD,\n    OPERATOR\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal\n  // TODO: Update for leading `-` after lookbehind is supported everywhere\n  const decimalDigits = '([0-9]_*)+';\n  const hexDigits = '([0-9a-fA-F]_*)+';\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      // decimal floating-point-literal (subsumes decimal-literal)\n      { match: `\\\\b(${decimalDigits})(\\\\.(${decimalDigits}))?` + `([eE][+-]?(${decimalDigits}))?\\\\b` },\n      // hexadecimal floating-point-literal (subsumes hexadecimal-literal)\n      { match: `\\\\b0x(${hexDigits})(\\\\.(${hexDigits}))?` + `([pP][+-]?(${decimalDigits}))?\\\\b` },\n      // octal-literal\n      { match: /\\b0o([0-7]_*)+\\b/ },\n      // binary-literal\n      { match: /\\b0b([01]_*)+\\b/ }\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal\n  const ESCAPED_CHARACTER = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    variants: [\n      { match: concat(/\\\\/, rawDelimiter, /[0\\\\tnr\"']/) },\n      { match: concat(/\\\\/, rawDelimiter, /u\\{[0-9a-fA-F]{1,8}\\}/) }\n    ]\n  });\n  const ESCAPED_NEWLINE = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    match: concat(/\\\\/, rawDelimiter, /[\\t ]*(?:[\\r\\n]|\\r\\n)/)\n  });\n  const INTERPOLATION = (rawDelimiter = \"\") => ({\n    className: 'subst',\n    label: \"interpol\",\n    begin: concat(/\\\\/, rawDelimiter, /\\(/),\n    end: /\\)/\n  });\n  const MULTILINE_STRING = (rawDelimiter = \"\") => ({\n    begin: concat(rawDelimiter, /\"\"\"/),\n    end: concat(/\"\"\"/, rawDelimiter),\n    contains: [\n      ESCAPED_CHARACTER(rawDelimiter),\n      ESCAPED_NEWLINE(rawDelimiter),\n      INTERPOLATION(rawDelimiter)\n    ]\n  });\n  const SINGLE_LINE_STRING = (rawDelimiter = \"\") => ({\n    begin: concat(rawDelimiter, /\"/),\n    end: concat(/\"/, rawDelimiter),\n    contains: [\n      ESCAPED_CHARACTER(rawDelimiter),\n      INTERPOLATION(rawDelimiter)\n    ]\n  });\n  const STRING = {\n    className: 'string',\n    variants: [\n      MULTILINE_STRING(),\n      MULTILINE_STRING(\"#\"),\n      MULTILINE_STRING(\"##\"),\n      MULTILINE_STRING(\"###\"),\n      SINGLE_LINE_STRING(),\n      SINGLE_LINE_STRING(\"#\"),\n      SINGLE_LINE_STRING(\"##\"),\n      SINGLE_LINE_STRING(\"###\")\n    ]\n  };\n\n  const REGEXP_CONTENTS = [\n    hljs.BACKSLASH_ESCAPE,\n    {\n      begin: /\\[/,\n      end: /\\]/,\n      relevance: 0,\n      contains: [ hljs.BACKSLASH_ESCAPE ]\n    }\n  ];\n\n  const BARE_REGEXP_LITERAL = {\n    begin: /\\/[^\\s](?=[^/\\n]*\\/)/,\n    end: /\\//,\n    contains: REGEXP_CONTENTS\n  };\n\n  const EXTENDED_REGEXP_LITERAL = (rawDelimiter) => {\n    const begin = concat(rawDelimiter, /\\//);\n    const end = concat(/\\//, rawDelimiter);\n    return {\n      begin,\n      end,\n      contains: [\n        ...REGEXP_CONTENTS,\n        {\n          scope: \"comment\",\n          begin: `#(?!.*${end})`,\n          end: /$/,\n        },\n      ],\n    };\n  };\n\n  // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/#Regular-Expression-Literals\n  const REGEXP = {\n    scope: \"regexp\",\n    variants: [\n      EXTENDED_REGEXP_LITERAL('###'),\n      EXTENDED_REGEXP_LITERAL('##'),\n      EXTENDED_REGEXP_LITERAL('#'),\n      BARE_REGEXP_LITERAL\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID412\n  const QUOTED_IDENTIFIER = { match: concat(/`/, identifier, /`/) };\n  const IMPLICIT_PARAMETER = {\n    className: 'variable',\n    match: /\\$\\d+/\n  };\n  const PROPERTY_WRAPPER_PROJECTION = {\n    className: 'variable',\n    match: `\\\\$${identifierCharacter}+`\n  };\n  const IDENTIFIERS = [\n    QUOTED_IDENTIFIER,\n    IMPLICIT_PARAMETER,\n    PROPERTY_WRAPPER_PROJECTION\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Attributes.html\n  const AVAILABLE_ATTRIBUTE = {\n    match: /(@|#(un)?)available/,\n    scope: 'keyword',\n    starts: { contains: [\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        keywords: availabilityKeywords,\n        contains: [\n          ...OPERATORS,\n          NUMBER,\n          STRING\n        ]\n      }\n    ] }\n  };\n\n  const KEYWORD_ATTRIBUTE = {\n    scope: 'keyword',\n    match: concat(/@/, either(...keywordAttributes), lookahead(either(/\\(/, /\\s+/))),\n  };\n\n  const USER_DEFINED_ATTRIBUTE = {\n    scope: 'meta',\n    match: concat(/@/, identifier)\n  };\n\n  const ATTRIBUTES = [\n    AVAILABLE_ATTRIBUTE,\n    KEYWORD_ATTRIBUTE,\n    USER_DEFINED_ATTRIBUTE\n  ];\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Types.html\n  const TYPE = {\n    match: lookahead(/\\b[A-Z]/),\n    relevance: 0,\n    contains: [\n      { // Common Apple frameworks, for relevance boost\n        className: 'type',\n        match: concat(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, identifierCharacter, '+')\n      },\n      { // Type identifier\n        className: 'type',\n        match: typeIdentifier,\n        relevance: 0\n      },\n      { // Optional type\n        match: /[?!]+/,\n        relevance: 0\n      },\n      { // Variadic parameter\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      { // Protocol composition\n        match: concat(/\\s+&\\s+/, lookahead(typeIdentifier)),\n        relevance: 0\n      }\n    ]\n  };\n  const GENERIC_ARGUMENTS = {\n    begin: /</,\n    end: />/,\n    keywords: KEYWORDS,\n    contains: [\n      ...COMMENTS,\n      ...KEYWORD_MODES,\n      ...ATTRIBUTES,\n      OPERATOR_GUARD,\n      TYPE\n    ]\n  };\n  TYPE.contains.push(GENERIC_ARGUMENTS);\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#ID552\n  // Prevents element names from being highlighted as keywords.\n  const TUPLE_ELEMENT_NAME = {\n    match: concat(identifier, /\\s*:/),\n    keywords: \"_|0\",\n    relevance: 0\n  };\n  // Matches tuples as well as the parameter list of a function type.\n  const TUPLE = {\n    begin: /\\(/,\n    end: /\\)/,\n    relevance: 0,\n    keywords: KEYWORDS,\n    contains: [\n      'self',\n      TUPLE_ELEMENT_NAME,\n      ...COMMENTS,\n      REGEXP,\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS,\n      ...ATTRIBUTES,\n      TYPE\n    ]\n  };\n\n  const GENERIC_PARAMETERS = {\n    begin: /</,\n    end: />/,\n    keywords: 'repeat each',\n    contains: [\n      ...COMMENTS,\n      TYPE\n    ]\n  };\n  const FUNCTION_PARAMETER_NAME = {\n    begin: either(\n      lookahead(concat(identifier, /\\s*:/)),\n      lookahead(concat(identifier, /\\s+/, identifier, /\\s*:/))\n    ),\n    end: /:/,\n    relevance: 0,\n    contains: [\n      {\n        className: 'keyword',\n        match: /\\b_\\b/\n      },\n      {\n        className: 'params',\n        match: identifier\n      }\n    ]\n  };\n  const FUNCTION_PARAMETERS = {\n    begin: /\\(/,\n    end: /\\)/,\n    keywords: KEYWORDS,\n    contains: [\n      FUNCTION_PARAMETER_NAME,\n      ...COMMENTS,\n      ...KEYWORD_MODES,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...ATTRIBUTES,\n      TYPE,\n      TUPLE\n    ],\n    endsParent: true,\n    illegal: /[\"']/\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID362\n  // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/declarations/#Macro-Declaration\n  const FUNCTION_OR_MACRO = {\n    match: [\n      /(func|macro)/,\n      /\\s+/,\n      either(QUOTED_IDENTIFIER.match, identifier, operator)\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      GENERIC_PARAMETERS,\n      FUNCTION_PARAMETERS,\n      WHITESPACE\n    ],\n    illegal: [\n      /\\[/,\n      /%/\n    ]\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID375\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID379\n  const INIT_SUBSCRIPT = {\n    match: [\n      /\\b(?:subscript|init[?!]?)/,\n      /\\s*(?=[<(])/,\n    ],\n    className: { 1: \"keyword\" },\n    contains: [\n      GENERIC_PARAMETERS,\n      FUNCTION_PARAMETERS,\n      WHITESPACE\n    ],\n    illegal: /\\[|%/\n  };\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID380\n  const OPERATOR_DECLARATION = {\n    match: [\n      /operator/,\n      /\\s+/,\n      operator\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title\"\n    }\n  };\n\n  // https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID550\n  const PRECEDENCEGROUP = {\n    begin: [\n      /precedencegroup/,\n      /\\s+/,\n      typeIdentifier\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title\"\n    },\n    contains: [ TYPE ],\n    keywords: [\n      ...precedencegroupKeywords,\n      ...literals\n    ],\n    end: /}/\n  };\n\n  const CLASS_FUNC_DECLARATION = {\n    match: [\n      /class\\b/,          \n      /\\s+/,\n      /func\\b/,\n      /\\s+/,\n      /\\b[A-Za-z_][A-Za-z0-9_]*\\b/ \n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"keyword\",\n      5: \"title.function\"\n    }\n  };\n\n  const CLASS_VAR_DECLARATION = {\n    match: [\n      /class\\b/,\n      /\\s+/,          \n      /var\\b/, \n    ],\n    scope: {\n      1: \"keyword\",\n      3: \"keyword\"\n    }\n  };\n\n  const TYPE_DECLARATION = {\n    begin: [\n      /(struct|protocol|class|extension|enum|actor)/,\n      /\\s+/,\n      identifier,\n      /\\s*/,\n    ],\n    beginScope: {\n      1: \"keyword\",\n      3: \"title.class\"\n    },\n    keywords: KEYWORDS,\n    contains: [\n      GENERIC_PARAMETERS,\n      ...KEYWORD_MODES,\n      {\n        begin: /:/,\n        end: /\\{/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            scope: \"title.class.inherited\",\n            match: typeIdentifier,\n          },\n          ...KEYWORD_MODES,\n        ],\n        relevance: 0,\n      },\n    ]\n  };\n\n  // Add supported submodes to string interpolation.\n  for (const variant of STRING.variants) {\n    const interpolation = variant.contains.find(mode => mode.label === \"interpol\");\n    // TODO: Interpolation can contain any expression, so there's room for improvement here.\n    interpolation.keywords = KEYWORDS;\n    const submodes = [\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS\n    ];\n    interpolation.contains = [\n      ...submodes,\n      {\n        begin: /\\(/,\n        end: /\\)/,\n        contains: [\n          'self',\n          ...submodes\n        ]\n      }\n    ];\n  }\n\n  return {\n    name: 'Swift',\n    keywords: KEYWORDS,\n    contains: [\n      ...COMMENTS,\n      FUNCTION_OR_MACRO,\n      INIT_SUBSCRIPT,\n      CLASS_FUNC_DECLARATION,\n      CLASS_VAR_DECLARATION,\n      TYPE_DECLARATION,\n      OPERATOR_DECLARATION,\n      PRECEDENCEGROUP,\n      {\n        beginKeywords: 'import',\n        end: /$/,\n        contains: [ ...COMMENTS ],\n        relevance: 0\n      },\n      REGEXP,\n      ...KEYWORD_MODES,\n      ...BUILT_INS,\n      ...OPERATORS,\n      NUMBER,\n      STRING,\n      ...IDENTIFIERS,\n      ...ATTRIBUTES,\n      TYPE,\n      TUPLE\n    ]\n  };\n}\n\nmodule.exports = swift;\n","/*\nLanguage: YAML\nDescription: Yet Another Markdown Language\nAuthor: Stefan Wienert <stwienert@gmail.com>\nContributors: Carl Baxter <carl@cbax.tech>\nRequires: ruby.js\nWebsite: https://yaml.org\nCategory: common, config\n*/\nfunction yaml(hljs) {\n  const LITERALS = 'true false yes no null';\n\n  // YAML spec allows non-reserved URI characters in tags.\n  const URI_CHARACTERS = '[\\\\w#;/?:@&=+$,.~*\\'()[\\\\]]+';\n\n  // Define keys as starting with a word character\n  // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods\n  // ...and ending with a colon followed immediately by a space, tab or newline.\n  // The YAML spec allows for much more than this, but this covers most use-cases.\n  const KEY = {\n    className: 'attr',\n    variants: [\n      // added brackets support and special char support\n      { begin: /[\\w*@][\\w*@ :()\\./-]*:(?=[ \\t]|$)/ },\n      { // double quoted keys - with brackets and special char support\n        begin: /\"[\\w*@][\\w*@ :()\\./-]*\":(?=[ \\t]|$)/ },\n      { // single quoted keys - with brackets and special char support\n        begin: /'[\\w*@][\\w*@ :()\\./-]*':(?=[ \\t]|$)/ },\n    ]\n  };\n  \n  const TEMPLATE_VARIABLES = {\n    className: 'template-variable',\n    variants: [\n      { // jinja templates Ansible\n        begin: /\\{\\{/,\n        end: /\\}\\}/\n      },\n      { // Ruby i18n\n        begin: /%\\{/,\n        end: /\\}/\n      }\n    ]\n  };\n\n  const SINGLE_QUOTE_STRING = {\n    className: 'string',\n    relevance: 0,\n    begin: /'/,\n    end: /'/,\n    contains: [\n      {\n        match: /''/,\n        scope: 'char.escape',\n        relevance: 0\n      }\n    ]\n  };\n\n  const STRING = {\n    className: 'string',\n    relevance: 0,\n    variants: [\n      {\n        begin: /\"/,\n        end: /\"/\n      },\n      { begin: /\\S+/ }\n    ],\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      TEMPLATE_VARIABLES\n    ]\n  };\n\n  // Strings inside of value containers (objects) can't contain braces,\n  // brackets, or commas\n  const CONTAINER_STRING = hljs.inherit(STRING, { variants: [\n    {\n      begin: /'/,\n      end: /'/,\n      contains: [\n        {\n          begin: /''/,\n          relevance: 0\n        }\n      ]\n    },\n    {\n      begin: /\"/,\n      end: /\"/\n    },\n    { begin: /[^\\s,{}[\\]]+/ }\n  ] });\n\n  const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';\n  const TIME_RE = '([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?';\n  const FRACTION_RE = '(\\\\.[0-9]*)?';\n  const ZONE_RE = '([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';\n  const TIMESTAMP = {\n    className: 'number',\n    begin: '\\\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\\\b'\n  };\n\n  const VALUE_CONTAINER = {\n    end: ',',\n    endsWithParent: true,\n    excludeEnd: true,\n    keywords: LITERALS,\n    relevance: 0\n  };\n  const OBJECT = {\n    begin: /\\{/,\n    end: /\\}/,\n    contains: [ VALUE_CONTAINER ],\n    illegal: '\\\\n',\n    relevance: 0\n  };\n  const ARRAY = {\n    begin: '\\\\[',\n    end: '\\\\]',\n    contains: [ VALUE_CONTAINER ],\n    illegal: '\\\\n',\n    relevance: 0\n  };\n\n  const MODES = [\n    KEY,\n    {\n      className: 'meta',\n      begin: '^---\\\\s*$',\n      relevance: 10\n    },\n    { // multi line string\n      // Blocks start with a | or > followed by a newline\n      //\n      // Indentation of subsequent lines must be the same to\n      // be considered part of the block\n      className: 'string',\n      begin: '[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*'\n    },\n    { // Ruby/Rails erb\n      begin: '<%[%=-]?',\n      end: '[%-]?%>',\n      subLanguage: 'ruby',\n      excludeBegin: true,\n      excludeEnd: true,\n      relevance: 0\n    },\n    { // named tags\n      className: 'type',\n      begin: '!\\\\w+!' + URI_CHARACTERS\n    },\n    // https://yaml.org/spec/1.2/spec.html#id2784064\n    { // verbatim tags\n      className: 'type',\n      begin: '!<' + URI_CHARACTERS + \">\"\n    },\n    { // primary tags\n      className: 'type',\n      begin: '!' + URI_CHARACTERS\n    },\n    { // secondary tags\n      className: 'type',\n      begin: '!!' + URI_CHARACTERS\n    },\n    { // fragment id &ref\n      className: 'meta',\n      begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$'\n    },\n    { // fragment reference *ref\n      className: 'meta',\n      begin: '\\\\*' + hljs.UNDERSCORE_IDENT_RE + '$'\n    },\n    { // array listing\n      className: 'bullet',\n      // TODO: remove |$ hack when we have proper look-ahead support\n      begin: '-(?=[ ]|$)',\n      relevance: 0\n    },\n    hljs.HASH_COMMENT_MODE,\n    {\n      beginKeywords: LITERALS,\n      keywords: { literal: LITERALS }\n    },\n    TIMESTAMP,\n    // numbers are any valid C-style number that\n    // sit isolated from other words\n    {\n      className: 'number',\n      begin: hljs.C_NUMBER_RE + '\\\\b',\n      relevance: 0\n    },\n    OBJECT,\n    ARRAY,\n    SINGLE_QUOTE_STRING,\n    STRING\n  ];\n\n  const VALUE_MODES = [ ...MODES ];\n  VALUE_MODES.pop();\n  VALUE_MODES.push(CONTAINER_STRING);\n  VALUE_CONTAINER.contains = VALUE_MODES;\n\n  return {\n    name: 'YAML',\n    case_insensitive: true,\n    aliases: [ 'yml' ],\n    contains: MODES\n  };\n}\n\nmodule.exports = yaml;\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n  \"as\", // for exports\n  \"in\",\n  \"of\",\n  \"if\",\n  \"for\",\n  \"while\",\n  \"finally\",\n  \"var\",\n  \"new\",\n  \"function\",\n  \"do\",\n  \"return\",\n  \"void\",\n  \"else\",\n  \"break\",\n  \"catch\",\n  \"instanceof\",\n  \"with\",\n  \"throw\",\n  \"case\",\n  \"default\",\n  \"try\",\n  \"switch\",\n  \"continue\",\n  \"typeof\",\n  \"delete\",\n  \"let\",\n  \"yield\",\n  \"const\",\n  \"class\",\n  // JS handles these with a special rule\n  // \"get\",\n  // \"set\",\n  \"debugger\",\n  \"async\",\n  \"await\",\n  \"static\",\n  \"import\",\n  \"from\",\n  \"export\",\n  \"extends\",\n  // It's reached stage 3, which is \"recommended for implementation\":\n  \"using\"\n];\nconst LITERALS = [\n  \"true\",\n  \"false\",\n  \"null\",\n  \"undefined\",\n  \"NaN\",\n  \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n  // Fundamental objects\n  \"Object\",\n  \"Function\",\n  \"Boolean\",\n  \"Symbol\",\n  // numbers and dates\n  \"Math\",\n  \"Date\",\n  \"Number\",\n  \"BigInt\",\n  // text\n  \"String\",\n  \"RegExp\",\n  // Indexed collections\n  \"Array\",\n  \"Float32Array\",\n  \"Float64Array\",\n  \"Int8Array\",\n  \"Uint8Array\",\n  \"Uint8ClampedArray\",\n  \"Int16Array\",\n  \"Int32Array\",\n  \"Uint16Array\",\n  \"Uint32Array\",\n  \"BigInt64Array\",\n  \"BigUint64Array\",\n  // Keyed collections\n  \"Set\",\n  \"Map\",\n  \"WeakSet\",\n  \"WeakMap\",\n  // Structured data\n  \"ArrayBuffer\",\n  \"SharedArrayBuffer\",\n  \"Atomics\",\n  \"DataView\",\n  \"JSON\",\n  // Control abstraction objects\n  \"Promise\",\n  \"Generator\",\n  \"GeneratorFunction\",\n  \"AsyncFunction\",\n  // Reflection\n  \"Reflect\",\n  \"Proxy\",\n  // Internationalization\n  \"Intl\",\n  // WebAssembly\n  \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n  \"Error\",\n  \"EvalError\",\n  \"InternalError\",\n  \"RangeError\",\n  \"ReferenceError\",\n  \"SyntaxError\",\n  \"TypeError\",\n  \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n  \"setInterval\",\n  \"setTimeout\",\n  \"clearInterval\",\n  \"clearTimeout\",\n\n  \"require\",\n  \"exports\",\n\n  \"eval\",\n  \"isFinite\",\n  \"isNaN\",\n  \"parseFloat\",\n  \"parseInt\",\n  \"decodeURI\",\n  \"decodeURIComponent\",\n  \"encodeURI\",\n  \"encodeURIComponent\",\n  \"escape\",\n  \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n  \"arguments\",\n  \"this\",\n  \"super\",\n  \"console\",\n  \"window\",\n  \"document\",\n  \"localStorage\",\n  \"sessionStorage\",\n  \"module\",\n  \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n  BUILT_IN_GLOBALS,\n  TYPES,\n  ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Takes a string like \"<Booger\" and checks to see\n   * if we can find a matching \"</Booger\" later in the\n   * content.\n   * @param {RegExpMatchArray} match\n   * @param {{after:number}} param1\n   */\n  const hasClosingTag = (match, { after }) => {\n    const tag = \"</\" + match[0].slice(1);\n    const pos = match.input.indexOf(tag, after);\n    return pos !== -1;\n  };\n\n  const IDENT_RE$1 = IDENT_RE;\n  const FRAGMENT = {\n    begin: '<>',\n    end: '</>'\n  };\n  // to avoid some special cases inside isTrulyOpeningTag\n  const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n  const XML_TAG = {\n    begin: /<[A-Za-z0-9\\\\._:-]+/,\n    end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n    /**\n     * @param {RegExpMatchArray} match\n     * @param {CallbackResponse} response\n     */\n    isTrulyOpeningTag: (match, response) => {\n      const afterMatchIndex = match[0].length + match.index;\n      const nextChar = match.input[afterMatchIndex];\n      if (\n        // HTML should not include another raw `<` inside a tag\n        // nested type?\n        // `<Array<Array<number>>`, etc.\n        nextChar === \"<\" ||\n        // the , gives away that this is not HTML\n        // `<T, A extends keyof T, V>`\n        nextChar === \",\"\n        ) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<something>`\n      // Quite possibly a tag, lets look for a matching closing tag...\n      if (nextChar === \">\") {\n        // if we cannot find a matching closing tag, then we\n        // will ignore it\n        if (!hasClosingTag(match, { after: afterMatchIndex })) {\n          response.ignoreMatch();\n        }\n      }\n\n      // `<blah />` (self-closing)\n      // handled by simpleSelfClosing rule\n\n      let m;\n      const afterMatch = match.input.substring(afterMatchIndex);\n\n      // some more template typing stuff\n      //  <T = any>(key?: string) => Modify<\n      if ((m = afterMatch.match(/^\\s*=/))) {\n        response.ignoreMatch();\n        return;\n      }\n\n      // `<From extends string>`\n      // technically this could be HTML, but it smells like a type\n      // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n      if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n        if (m.index === 0) {\n          response.ignoreMatch();\n          // eslint-disable-next-line no-useless-return\n          return;\n        }\n      }\n    }\n  };\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS,\n    literal: LITERALS,\n    built_in: BUILT_INS,\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  // https://tc39.es/ecma262/#sec-literals-numeric-literals\n  const decimalDigits = '[0-9](_?[0-9])*';\n  const frac = `\\\\.(${decimalDigits})`;\n  // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n  // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n  const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n  const NUMBER = {\n    className: 'number',\n    variants: [\n      // DecimalLiteral\n      { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n        `[eE][+-]?(${decimalDigits})\\\\b` },\n      { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n      // DecimalBigIntegerLiteral\n      { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n      // NonDecimalIntegerLiteral\n      { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n      { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n      { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n      // LegacyOctalIntegerLiteral (does not include underscore separators)\n      // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n      { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n    ],\n    relevance: 0\n  };\n\n  const SUBST = {\n    className: 'subst',\n    begin: '\\\\$\\\\{',\n    end: '\\\\}',\n    keywords: KEYWORDS$1,\n    contains: [] // defined later\n  };\n  const HTML_TEMPLATE = {\n    begin: '\\.?html`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'xml'\n    }\n  };\n  const CSS_TEMPLATE = {\n    begin: '\\.?css`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'css'\n    }\n  };\n  const GRAPHQL_TEMPLATE = {\n    begin: '\\.?gql`',\n    end: '',\n    starts: {\n      end: '`',\n      returnEnd: false,\n      contains: [\n        hljs.BACKSLASH_ESCAPE,\n        SUBST\n      ],\n      subLanguage: 'graphql'\n    }\n  };\n  const TEMPLATE_STRING = {\n    className: 'string',\n    begin: '`',\n    end: '`',\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      SUBST\n    ]\n  };\n  const JSDOC_COMMENT = hljs.COMMENT(\n    /\\/\\*\\*(?!\\/)/,\n    '\\\\*/',\n    {\n      relevance: 0,\n      contains: [\n        {\n          begin: '(?=@[A-Za-z]+)',\n          relevance: 0,\n          contains: [\n            {\n              className: 'doctag',\n              begin: '@[A-Za-z]+'\n            },\n            {\n              className: 'type',\n              begin: '\\\\{',\n              end: '\\\\}',\n              excludeEnd: true,\n              excludeBegin: true,\n              relevance: 0\n            },\n            {\n              className: 'variable',\n              begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n              endsParent: true,\n              relevance: 0\n            },\n            // eat spaces (not newlines) so we can find\n            // types or variables\n            {\n              begin: /(?=[^\\n])\\s/,\n              relevance: 0\n            }\n          ]\n        }\n      ]\n    }\n  );\n  const COMMENT = {\n    className: \"comment\",\n    variants: [\n      JSDOC_COMMENT,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_LINE_COMMENT_MODE\n    ]\n  };\n  const SUBST_INTERNALS = [\n    hljs.APOS_STRING_MODE,\n    hljs.QUOTE_STRING_MODE,\n    HTML_TEMPLATE,\n    CSS_TEMPLATE,\n    GRAPHQL_TEMPLATE,\n    TEMPLATE_STRING,\n    // Skip numbers when they are part of a variable name\n    { match: /\\$\\d+/ },\n    NUMBER,\n    // This is intentional:\n    // See https://github.com/highlightjs/highlight.js/issues/3288\n    // hljs.REGEXP_MODE\n  ];\n  SUBST.contains = SUBST_INTERNALS\n    .concat({\n      // we need to pair up {} inside our subst to prevent\n      // it from ending too early by matching another }\n      begin: /\\{/,\n      end: /\\}/,\n      keywords: KEYWORDS$1,\n      contains: [\n        \"self\"\n      ].concat(SUBST_INTERNALS)\n    });\n  const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n  const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n    // eat recursive parens in sub expressions\n    {\n      begin: /(\\s*)\\(/,\n      end: /\\)/,\n      keywords: KEYWORDS$1,\n      contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n    }\n  ]);\n  const PARAMS = {\n    className: 'params',\n    // convert this to negative lookbehind in v12\n    begin: /(\\s*)\\(/, // to match the parms with\n    end: /\\)/,\n    excludeBegin: true,\n    excludeEnd: true,\n    keywords: KEYWORDS$1,\n    contains: PARAMS_CONTAINS\n  };\n\n  // ES6 classes\n  const CLASS_OR_EXTENDS = {\n    variants: [\n      // class Car extends vehicle\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1,\n          /\\s+/,\n          /extends/,\n          /\\s+/,\n          regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\",\n          5: \"keyword\",\n          7: \"title.class.inherited\"\n        }\n      },\n      // class Car\n      {\n        match: [\n          /class/,\n          /\\s+/,\n          IDENT_RE$1\n        ],\n        scope: {\n          1: \"keyword\",\n          3: \"title.class\"\n        }\n      },\n\n    ]\n  };\n\n  const CLASS_REFERENCE = {\n    relevance: 0,\n    match:\n    regex.either(\n      // Hard coded exceptions\n      /\\bJSON/,\n      // Float32Array, OutT\n      /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n      // CSSFactory, CSSFactoryT\n      /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n      // FPs, FPsT\n      /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n      // P\n      // single letters are not highlighted\n      // BLAH\n      // this will be flagged as a UPPER_CASE_CONSTANT instead\n    ),\n    className: \"title.class\",\n    keywords: {\n      _: [\n        // se we still get relevance credit for JS library classes\n        ...TYPES,\n        ...ERROR_TYPES\n      ]\n    }\n  };\n\n  const USE_STRICT = {\n    label: \"use_strict\",\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use (strict|asm)['\"]/\n  };\n\n  const FUNCTION_DEFINITION = {\n    variants: [\n      {\n        match: [\n          /function/,\n          /\\s+/,\n          IDENT_RE$1,\n          /(?=\\s*\\()/\n        ]\n      },\n      // anonymous function\n      {\n        match: [\n          /function/,\n          /\\s*(?=\\()/\n        ]\n      }\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    label: \"func.def\",\n    contains: [ PARAMS ],\n    illegal: /%/\n  };\n\n  const UPPER_CASE_CONSTANT = {\n    relevance: 0,\n    match: /\\b[A-Z][A-Z_0-9]+\\b/,\n    className: \"variable.constant\"\n  };\n\n  function noneOf(list) {\n    return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n  }\n\n  const FUNCTION_CALL = {\n    match: regex.concat(\n      /\\b/,\n      noneOf([\n        ...BUILT_IN_GLOBALS,\n        \"super\",\n        \"import\"\n      ].map(x => `${x}\\\\s*\\\\(`)),\n      IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n    className: \"title.function\",\n    relevance: 0\n  };\n\n  const PROPERTY_ACCESS = {\n    begin: regex.concat(/\\./, regex.lookahead(\n      regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n    )),\n    end: IDENT_RE$1,\n    excludeBegin: true,\n    keywords: \"prototype\",\n    className: \"property\",\n    relevance: 0\n  };\n\n  const GETTER_OR_SETTER = {\n    match: [\n      /get|set/,\n      /\\s+/,\n      IDENT_RE$1,\n      /(?=\\()/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      { // eat to avoid empty params\n        begin: /\\(\\)/\n      },\n      PARAMS\n    ]\n  };\n\n  const FUNC_LEAD_IN_RE = '(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*(\\\\(' +\n    '[^()]*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)[^()]*)*' +\n    '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n  const FUNCTION_VARIABLE = {\n    match: [\n      /const|var|let/, /\\s+/,\n      IDENT_RE$1, /\\s*/,\n      /=\\s*/,\n      /(async\\s*)?/, // async is optional\n      regex.lookahead(FUNC_LEAD_IN_RE)\n    ],\n    keywords: \"async\",\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    },\n    contains: [\n      PARAMS\n    ]\n  };\n\n  return {\n    name: 'JavaScript',\n    aliases: ['js', 'jsx', 'mjs', 'cjs'],\n    keywords: KEYWORDS$1,\n    // this will be extended by TypeScript\n    exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n    illegal: /#(?![$_A-z])/,\n    contains: [\n      hljs.SHEBANG({\n        label: \"shebang\",\n        binary: \"node\",\n        relevance: 5\n      }),\n      USE_STRICT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      HTML_TEMPLATE,\n      CSS_TEMPLATE,\n      GRAPHQL_TEMPLATE,\n      TEMPLATE_STRING,\n      COMMENT,\n      // Skip numbers when they are part of a variable name\n      { match: /\\$\\d+/ },\n      NUMBER,\n      CLASS_REFERENCE,\n      {\n        scope: 'attr',\n        match: IDENT_RE$1 + regex.lookahead(':'),\n        relevance: 0\n      },\n      FUNCTION_VARIABLE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        relevance: 0,\n        contains: [\n          COMMENT,\n          hljs.REGEXP_MODE,\n          {\n            className: 'function',\n            // we have to count the parens to make sure we actually have the\n            // correct bounding ( ) before the =>.  There could be any number of\n            // sub-expressions inside also surrounded by parens.\n            begin: FUNC_LEAD_IN_RE,\n            returnBegin: true,\n            end: '\\\\s*=>',\n            contains: [\n              {\n                className: 'params',\n                variants: [\n                  {\n                    begin: hljs.UNDERSCORE_IDENT_RE,\n                    relevance: 0\n                  },\n                  {\n                    className: null,\n                    begin: /\\(\\s*\\)/,\n                    skip: true\n                  },\n                  {\n                    begin: /(\\s*)\\(/,\n                    end: /\\)/,\n                    excludeBegin: true,\n                    excludeEnd: true,\n                    keywords: KEYWORDS$1,\n                    contains: PARAMS_CONTAINS\n                  }\n                ]\n              }\n            ]\n          },\n          { // could be a comma delimited list of params to a function call\n            begin: /,/,\n            relevance: 0\n          },\n          {\n            match: /\\s+/,\n            relevance: 0\n          },\n          { // JSX\n            variants: [\n              { begin: FRAGMENT.begin, end: FRAGMENT.end },\n              { match: XML_SELF_CLOSING },\n              {\n                begin: XML_TAG.begin,\n                // we carefully check the opening tag to see if it truly\n                // is a tag and not a false positive\n                'on:begin': XML_TAG.isTrulyOpeningTag,\n                end: XML_TAG.end\n              }\n            ],\n            subLanguage: 'xml',\n            contains: [\n              {\n                begin: XML_TAG.begin,\n                end: XML_TAG.end,\n                skip: true,\n                contains: ['self']\n              }\n            ]\n          }\n        ],\n      },\n      FUNCTION_DEFINITION,\n      {\n        // prevent this from getting swallowed up by function\n        // since they appear \"function like\"\n        beginKeywords: \"while if switch catch for\"\n      },\n      {\n        // we have to count the parens to make sure we actually have the correct\n        // bounding ( ).  There could be any number of sub-expressions inside\n        // also surrounded by parens.\n        begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n          '\\\\(' + // first parens\n          '[^()]*(\\\\(' +\n            '[^()]*(\\\\(' +\n              '[^()]*' +\n            '\\\\)[^()]*)*' +\n          '\\\\)[^()]*)*' +\n          '\\\\)\\\\s*\\\\{', // end parens\n        returnBegin:true,\n        label: \"func.def\",\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n        ]\n      },\n      // catch ... so it won't trigger the property rule below\n      {\n        match: /\\.\\.\\./,\n        relevance: 0\n      },\n      PROPERTY_ACCESS,\n      // hack: prevents detection of keywords in some circumstances\n      // .keyword()\n      // $keyword = x\n      {\n        match: '\\\\$' + IDENT_RE$1,\n        relevance: 0\n      },\n      {\n        match: [ /\\bconstructor(?=\\s*\\()/ ],\n        className: { 1: \"title.function\" },\n        contains: [ PARAMS ]\n      },\n      FUNCTION_CALL,\n      UPPER_CASE_CONSTANT,\n      CLASS_OR_EXTENDS,\n      GETTER_OR_SETTER,\n      {\n        match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      }\n    ]\n  };\n}\n\n/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nContributors: Ike Ku <dempfi@yahoo.com>\nDescription: TypeScript is a strict superset of JavaScript\nWebsite: https://www.typescriptlang.org\nCategory: common, scripting\n*/\n\n\n/** @type LanguageFn */\nfunction typescript(hljs) {\n  const regex = hljs.regex;\n  const tsLanguage = javascript(hljs);\n\n  const IDENT_RE$1 = IDENT_RE;\n  const TYPES = [\n    \"any\",\n    \"void\",\n    \"number\",\n    \"boolean\",\n    \"string\",\n    \"object\",\n    \"never\",\n    \"symbol\",\n    \"bigint\",\n    \"unknown\"\n  ];\n  const NAMESPACE = {\n    begin: [\n      /namespace/,\n      /\\s+/,\n      hljs.IDENT_RE\n    ],\n    beginScope: {\n      1: \"keyword\",\n      3: \"title.class\"\n    }\n  };\n  const INTERFACE = {\n    beginKeywords: 'interface',\n    end: /\\{/,\n    excludeEnd: true,\n    keywords: {\n      keyword: 'interface extends',\n      built_in: TYPES\n    },\n    contains: [ tsLanguage.exports.CLASS_REFERENCE ]\n  };\n  const USE_STRICT = {\n    className: 'meta',\n    relevance: 10,\n    begin: /^\\s*['\"]use strict['\"]/\n  };\n  const TS_SPECIFIC_KEYWORDS = [\n    \"type\",\n    // \"namespace\",\n    \"interface\",\n    \"public\",\n    \"private\",\n    \"protected\",\n    \"implements\",\n    \"declare\",\n    \"abstract\",\n    \"readonly\",\n    \"enum\",\n    \"override\",\n    \"satisfies\"\n  ];\n  /*\n    namespace is a TS keyword but it's fine to use it as a variable name too.\n    const message = 'foo';\n    const namespace = 'bar';\n  */\n  const KEYWORDS$1 = {\n    $pattern: IDENT_RE,\n    keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),\n    literal: LITERALS,\n    built_in: BUILT_INS.concat(TYPES),\n    \"variable.language\": BUILT_IN_VARIABLES\n  };\n\n  const DECORATOR = {\n    className: 'meta',\n    begin: '@' + IDENT_RE$1,\n  };\n\n  const swapMode = (mode, label, replacement) => {\n    const indx = mode.contains.findIndex(m => m.label === label);\n    if (indx === -1) { throw new Error(\"can not find mode to replace\"); }\n\n    mode.contains.splice(indx, 1, replacement);\n  };\n\n\n  // this should update anywhere keywords is used since\n  // it will be the same actual JS object\n  Object.assign(tsLanguage.keywords, KEYWORDS$1);\n\n  tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);\n\n  // highlight the function params\n  const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === \"attr\");\n\n  // take default attr rule and extend it to support optionals\n  const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},\n    ATTRIBUTE_HIGHLIGHT,\n    { match: regex.concat(IDENT_RE$1, regex.lookahead(/\\s*\\?:/)) }\n  );\n  tsLanguage.exports.PARAMS_CONTAINS.push([\n    tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types\n    ATTRIBUTE_HIGHLIGHT, // highlight the params key\n    OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n  ]);\n\n  // Add the optional property assignment highlighting for objects or classes\n  tsLanguage.contains = tsLanguage.contains.concat([\n    DECORATOR,\n    NAMESPACE,\n    INTERFACE,\n    OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n  ]);\n\n  // TS gets a simpler shebang rule than JS\n  swapMode(tsLanguage, \"shebang\", hljs.SHEBANG());\n  // JS use strict rule purposely excludes `asm` which makes no sense\n  swapMode(tsLanguage, \"use_strict\", USE_STRICT);\n\n  const functionDeclaration = tsLanguage.contains.find(m => m.label === \"func.def\");\n  functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript\n\n  Object.assign(tsLanguage, {\n    name: 'TypeScript',\n    aliases: [\n      'ts',\n      'tsx',\n      'mts',\n      'cts'\n    ]\n  });\n\n  return tsLanguage;\n}\n\nmodule.exports = typescript;\n","/*\nLanguage: Visual Basic .NET\nDescription: Visual Basic .NET (VB.NET) is a multi-paradigm, object-oriented programming language, implemented on the .NET Framework.\nAuthors: Poren Chiang <ren.chiang@gmail.com>, Jan Pilzer\nWebsite: https://docs.microsoft.com/dotnet/visual-basic/getting-started\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction vbnet(hljs) {\n  const regex = hljs.regex;\n  /**\n   * Character Literal\n   * Either a single character (\"a\"C) or an escaped double quote (\"\"\"\"C).\n   */\n  const CHARACTER = {\n    className: 'string',\n    begin: /\"(\"\"|[^/n])\"C\\b/\n  };\n\n  const STRING = {\n    className: 'string',\n    begin: /\"/,\n    end: /\"/,\n    illegal: /\\n/,\n    contains: [\n      {\n        // double quote escape\n        begin: /\"\"/ }\n    ]\n  };\n\n  /** Date Literals consist of a date, a time, or both separated by whitespace, surrounded by # */\n  const MM_DD_YYYY = /\\d{1,2}\\/\\d{1,2}\\/\\d{4}/;\n  const YYYY_MM_DD = /\\d{4}-\\d{1,2}-\\d{1,2}/;\n  const TIME_12H = /(\\d|1[012])(:\\d+){0,2} *(AM|PM)/;\n  const TIME_24H = /\\d{1,2}(:\\d{1,2}){1,2}/;\n  const DATE = {\n    className: 'literal',\n    variants: [\n      {\n        // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date)\n        begin: regex.concat(/# */, regex.either(YYYY_MM_DD, MM_DD_YYYY), / *#/) },\n      {\n        // #H:mm[:ss]# (24h Time)\n        begin: regex.concat(/# */, TIME_24H, / *#/) },\n      {\n        // #h[:mm[:ss]] A# (12h Time)\n        begin: regex.concat(/# */, TIME_12H, / *#/) },\n      {\n        // date plus time\n        begin: regex.concat(\n          /# */,\n          regex.either(YYYY_MM_DD, MM_DD_YYYY),\n          / +/,\n          regex.either(TIME_12H, TIME_24H),\n          / *#/\n        ) }\n    ]\n  };\n\n  const NUMBER = {\n    className: 'number',\n    relevance: 0,\n    variants: [\n      {\n        // Float\n        begin: /\\b\\d[\\d_]*((\\.[\\d_]+(E[+-]?[\\d_]+)?)|(E[+-]?[\\d_]+))[RFD@!#]?/ },\n      {\n        // Integer (base 10)\n        begin: /\\b\\d[\\d_]*((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 16)\n        begin: /&H[\\dA-F_]+((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 8)\n        begin: /&O[0-7_]+((U?[SIL])|[%&])?/ },\n      {\n        // Integer (base 2)\n        begin: /&B[01_]+((U?[SIL])|[%&])?/ }\n    ]\n  };\n\n  const LABEL = {\n    className: 'label',\n    begin: /^\\w+:/\n  };\n\n  const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, { contains: [\n    {\n      className: 'doctag',\n      begin: /<\\/?/,\n      end: />/\n    }\n  ] });\n\n  const COMMENT = hljs.COMMENT(null, /$/, { variants: [\n    { begin: /'/ },\n    {\n      // TODO: Use multi-class for leading spaces\n      begin: /([\\t ]|^)REM(?=\\s)/ }\n  ] });\n\n  const DIRECTIVES = {\n    className: 'meta',\n    // TODO: Use multi-class for indentation once available\n    begin: /[\\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\\b/,\n    end: /$/,\n    keywords: { keyword:\n        'const disable else elseif enable end externalsource if region then' },\n    contains: [ COMMENT ]\n  };\n\n  return {\n    name: 'Visual Basic .NET',\n    aliases: [ 'vb' ],\n    case_insensitive: true,\n    classNameAliases: { label: 'symbol' },\n    keywords: {\n      keyword:\n        'addhandler alias aggregate ansi as async assembly auto binary by byref byval ' /* a-b */\n        + 'call case catch class compare const continue custom declare default delegate dim distinct do ' /* c-d */\n        + 'each equals else elseif end enum erase error event exit explicit finally for friend from function ' /* e-f */\n        + 'get global goto group handles if implements imports in inherits interface into iterator ' /* g-i */\n        + 'join key let lib loop me mid module mustinherit mustoverride mybase myclass ' /* j-m */\n        + 'namespace narrowing new next notinheritable notoverridable ' /* n */\n        + 'of off on operator option optional order overloads overridable overrides ' /* o */\n        + 'paramarray partial preserve private property protected public ' /* p */\n        + 'raiseevent readonly redim removehandler resume return ' /* r */\n        + 'select set shadows shared skip static step stop structure strict sub synclock ' /* s */\n        + 'take text then throw to try unicode until using when where while widening with withevents writeonly yield' /* t-y */,\n      built_in:\n        // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators\n        'addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor '\n        // Type Conversion Functions https://docs.microsoft.com/dotnet/visual-basic/language-reference/functions/type-conversion-functions\n        + 'cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort',\n      type:\n        // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types\n        'boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort',\n      literal: 'true false nothing'\n    },\n    illegal:\n      '//|\\\\{|\\\\}|endif|gosub|variant|wend|^\\\\$ ' /* reserved deprecated keywords */,\n    contains: [\n      CHARACTER,\n      STRING,\n      DATE,\n      NUMBER,\n      LABEL,\n      DOC_COMMENT,\n      COMMENT,\n      DIRECTIVES\n    ]\n  };\n}\n\nmodule.exports = vbnet;\n","/*\nLanguage: WebAssembly\nWebsite: https://webassembly.org\nDescription:  Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.\nCategory: web, common\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction wasm(hljs) {\n  hljs.regex;\n  const BLOCK_COMMENT = hljs.COMMENT(/\\(;/, /;\\)/);\n  BLOCK_COMMENT.contains.push(\"self\");\n  const LINE_COMMENT = hljs.COMMENT(/;;/, /$/);\n\n  const KWS = [\n    \"anyfunc\",\n    \"block\",\n    \"br\",\n    \"br_if\",\n    \"br_table\",\n    \"call\",\n    \"call_indirect\",\n    \"data\",\n    \"drop\",\n    \"elem\",\n    \"else\",\n    \"end\",\n    \"export\",\n    \"func\",\n    \"global.get\",\n    \"global.set\",\n    \"local.get\",\n    \"local.set\",\n    \"local.tee\",\n    \"get_global\",\n    \"get_local\",\n    \"global\",\n    \"if\",\n    \"import\",\n    \"local\",\n    \"loop\",\n    \"memory\",\n    \"memory.grow\",\n    \"memory.size\",\n    \"module\",\n    \"mut\",\n    \"nop\",\n    \"offset\",\n    \"param\",\n    \"result\",\n    \"return\",\n    \"select\",\n    \"set_global\",\n    \"set_local\",\n    \"start\",\n    \"table\",\n    \"tee_local\",\n    \"then\",\n    \"type\",\n    \"unreachable\"\n  ];\n\n  const FUNCTION_REFERENCE = {\n    begin: [\n      /(?:func|call|call_indirect)/,\n      /\\s+/,\n      /\\$[^\\s)]+/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"title.function\"\n    }\n  };\n\n  const ARGUMENT = {\n    className: \"variable\",\n    begin: /\\$[\\w_]+/\n  };\n\n  const PARENS = {\n    match: /(\\((?!;)|\\))+/,\n    className: \"punctuation\",\n    relevance: 0\n  };\n\n  const NUMBER = {\n    className: \"number\",\n    relevance: 0,\n    // borrowed from Prism, TODO: split out into variants\n    match: /[+-]?\\b(?:\\d(?:_?\\d)*(?:\\.\\d(?:_?\\d)*)?(?:[eE][+-]?\\d(?:_?\\d)*)?|0x[\\da-fA-F](?:_?[\\da-fA-F])*(?:\\.[\\da-fA-F](?:_?[\\da-fA-D])*)?(?:[pP][+-]?\\d(?:_?\\d)*)?)\\b|\\binf\\b|\\bnan(?::0x[\\da-fA-F](?:_?[\\da-fA-D])*)?\\b/\n  };\n\n  const TYPE = {\n    // look-ahead prevents us from gobbling up opcodes\n    match: /(i32|i64|f32|f64)(?!\\.)/,\n    className: \"type\"\n  };\n\n  const MATH_OPERATIONS = {\n    className: \"keyword\",\n    // borrowed from Prism, TODO: split out into variants\n    match: /\\b(f32|f64|i32|i64)(?:\\.(?:abs|add|and|ceil|clz|const|convert_[su]\\/i(?:32|64)|copysign|ctz|demote\\/f64|div(?:_[su])?|eqz?|extend_[su]\\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\\/f32|reinterpret\\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\\/f(?:32|64))?|wrap\\/i64|xor))\\b/\n  };\n\n  const OFFSET_ALIGN = {\n    match: [\n      /(?:offset|align)/,\n      /\\s*/,\n      /=/\n    ],\n    className: {\n      1: \"keyword\",\n      3: \"operator\"\n    }\n  };\n\n  return {\n    name: 'WebAssembly',\n    keywords: {\n      $pattern: /[\\w.]+/,\n      keyword: KWS\n    },\n    contains: [\n      LINE_COMMENT,\n      BLOCK_COMMENT,\n      OFFSET_ALIGN,\n      ARGUMENT,\n      PARENS,\n      FUNCTION_REFERENCE,\n      hljs.QUOTE_STRING_MODE,\n      TYPE,\n      MATH_OPERATIONS,\n      NUMBER\n    ]\n  };\n}\n\nmodule.exports = wasm;\n","var hljs = require('./core');\n\nhljs.registerLanguage('xml', require('./languages/xml'));\nhljs.registerLanguage('bash', require('./languages/bash'));\nhljs.registerLanguage('c', require('./languages/c'));\nhljs.registerLanguage('cpp', require('./languages/cpp'));\nhljs.registerLanguage('csharp', require('./languages/csharp'));\nhljs.registerLanguage('css', require('./languages/css'));\nhljs.registerLanguage('markdown', require('./languages/markdown'));\nhljs.registerLanguage('diff', require('./languages/diff'));\nhljs.registerLanguage('ruby', require('./languages/ruby'));\nhljs.registerLanguage('go', require('./languages/go'));\nhljs.registerLanguage('graphql', require('./languages/graphql'));\nhljs.registerLanguage('ini', require('./languages/ini'));\nhljs.registerLanguage('java', require('./languages/java'));\nhljs.registerLanguage('javascript', require('./languages/javascript'));\nhljs.registerLanguage('json', require('./languages/json'));\nhljs.registerLanguage('kotlin', require('./languages/kotlin'));\nhljs.registerLanguage('less', require('./languages/less'));\nhljs.registerLanguage('lua', require('./languages/lua'));\nhljs.registerLanguage('makefile', require('./languages/makefile'));\nhljs.registerLanguage('perl', require('./languages/perl'));\nhljs.registerLanguage('objectivec', require('./languages/objectivec'));\nhljs.registerLanguage('php', require('./languages/php'));\nhljs.registerLanguage('php-template', require('./languages/php-template'));\nhljs.registerLanguage('plaintext', require('./languages/plaintext'));\nhljs.registerLanguage('python', require('./languages/python'));\nhljs.registerLanguage('python-repl', require('./languages/python-repl'));\nhljs.registerLanguage('r', require('./languages/r'));\nhljs.registerLanguage('rust', require('./languages/rust'));\nhljs.registerLanguage('scss', require('./languages/scss'));\nhljs.registerLanguage('shell', require('./languages/shell'));\nhljs.registerLanguage('sql', require('./languages/sql'));\nhljs.registerLanguage('swift', require('./languages/swift'));\nhljs.registerLanguage('yaml', require('./languages/yaml'));\nhljs.registerLanguage('typescript', require('./languages/typescript'));\nhljs.registerLanguage('vbnet', require('./languages/vbnet'));\nhljs.registerLanguage('wasm', require('./languages/wasm'));\n\nhljs.HighlightJS = hljs\nhljs.default = hljs\nmodule.exports = hljs;","<script setup lang=\"ts\">\n/**\n * Viewer3D — 3D model preview via `@google/model-viewer`.\n *\n * Lazy-imports the `@google/model-viewer` web component (~80 KB).\n *\n * Format support: model-viewer **only** understands glTF (`.gltf`,\n * `.glb`) and USDZ (iOS). For unsupported formats (`.stl`, `.obj`,\n * `.fbx`, `.3ds`) we deliberately render a download fallback instead\n * of feeding them to model-viewer — earlier code did the latter,\n * which surfaced as `JSON.parse(<ascii STL>)` SyntaxError because\n * model-viewer parses the response body as glTF JSON. (sweep-2026-05-09\n * bugs 19-20.)\n *\n * GLB rendering size: model-viewer mounts its canvas inside a\n * shadow root that doesn't always inherit `height: 100%` from\n * flexbox parents — we pin explicit sizing on the host element\n * to avoid the \"Framebuffer is incomplete: zero size\" warning.\n * (sweep-2026-05-09 bug 21.)\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  /** Locale-aware error/loading messages. */\n  t?: (key: string) => string;\n}>();\n\nconst SUPPORTED_EXTS = new Set(['glb', 'gltf', 'usdz']);\n\nconst isSupported = computed(() => SUPPORTED_EXTS.has((props.ext || '').toLowerCase()));\n\nconst error = ref<string | null>(null);\nconst ready = ref(false);\n\nasync function load(): Promise<void> {\n  ready.value = false;\n  error.value = null;\n  // Bail out early for formats model-viewer can't parse — feeding\n  // them to <model-viewer> triggers JSON.parse SyntaxError because\n  // it expects glTF JSON.\n  if (!isSupported.value) {\n    error.value = props.t\n      ? props.t('viewer.format_unsupported_3d')\n      : `3D format \".${props.ext}\" not supported in browser preview — please download.`;\n    return;\n  }\n  try {\n    await import(/* @vite-ignore */ '@google/model-viewer');\n    ready.value = true;\n  } catch {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : '3D viewer requires `@google/model-viewer` — install or use download.';\n  }\n}\n\n/**\n * model-viewer failed to FETCH or PARSE the model.\n *\n * ⚠ `ready` only means the ~80 KB web component imported. The model itself is\n * fetched and decoded by model-viewer AFTER it mounts, and when that throws\n * (a truncated or non-glTF file) it renders an empty canvas and reports the\n * failure only on this event. Without the listener the person got a silent\n * black rectangle and nothing else — measured 2026-09-13 on an 8-byte\n * `turbine.glb`, where the console had `RangeError: Invalid DataView length 12`\n * and the pane had no text at all.\n */\nfunction onModelError(): void {\n  ready.value = false;\n  error.value = props.t ? props.t('viewer.failed_to_load') : 'Failed to load file';\n}\n\nonMounted(load);\n\nwatch(() => props.url, () => {\n  // Re-evaluate on URL change (different file may need different\n  // fallback message).\n  load();\n});\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-3d\">\n    <model-viewer\n      v-if=\"ready && !error\"\n      :src=\"url\"\n      auto-rotate\n      camera-controls\n      touch-action=\"pan-y\"\n      shadow-intensity=\"1\"\n      :alt=\"ext + ' model'\"\n      style=\"width: 100%; height: 100%; min-height: 480px; display: block\"\n      @error=\"onModelError\"\n    />\n    <div v-else-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <div v-else class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n      <p>{{ t ? t('viewer.loading') : 'Loading…' }}</p>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-3d {\n  width: 100%;\n  height: 100%;\n  min-height: 480px;\n  background: #1a1a1a;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.filex-viewer-3d model-viewer {\n  width: 100%;\n  height: 100%;\n  min-height: 480px;\n  background: #1a1a1a;\n  display: block;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  color: #c8cdd6;\n  padding: 32px;\n  max-width: 480px;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * EpubViewer — flowable EPUB reader via `epubjs`.\n *\n * Lazy-imports `epubjs` (~80 KB gzipped). epub.js renders the publication\n * inside an iframe (default `flow: 'paginated'`), but we use it in\n * scrolled-doc mode only when the user toggles the \"fit-width\" flag — by\n * default we keep paginated since that matches reader-app expectations.\n *\n * UX:\n *   - prev/next page buttons (also keyboard arrow keys via composable)\n *   - collapsible TOC sidebar (built from `book.loaded.navigation`)\n *   - font size +/- (Themes API)\n *   - graceful fallback if peer not installed\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface TocNode {\n  href: string;\n  label: string;\n  subitems?: TocNode[];\n}\n\nconst root = ref<HTMLDivElement | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\nconst error = ref<string | null>(null);\nconst toc = ref<TocNode[]>([]);\nconst tocOpen = ref(false);\nconst fontSize = ref(100);\nconst ready = ref(false);\nconst loading = ref(true);\n\nlet book: any = null;\nlet rendition: any = null;\n\n/**\n * How long an epub.js step may hang before we call it a failure.\n *\n * Generous on purpose: a large publication on a slow disk legitimately takes\n * seconds, and a false \"cannot open\" on a book that would have rendered is a\n * worse bug than the one this guards against.\n */\nconst EPUB_STEP_TIMEOUT_MS = 15000;\n\n/** Reject if `p` has not settled within `EPUB_STEP_TIMEOUT_MS`. */\nfunction withTimeout<T>(p: Promise<T>, label: string): Promise<T> {\n  let timer: ReturnType<typeof setTimeout>;\n  return Promise.race([\n    p,\n    new Promise<never>((_, reject) => {\n      timer = setTimeout(\n        () => reject(new Error(`EPUB ${label} timed out after ${EPUB_STEP_TIMEOUT_MS}ms`)),\n        EPUB_STEP_TIMEOUT_MS,\n      );\n    }),\n  ]).finally(() => clearTimeout(timer)) as Promise<T>;\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  ready.value = false;\n  error.value = null;\n  let mod: any = null;\n  try {\n    mod = await import(/* @vite-ignore */ 'epubjs');\n  } catch {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : 'EPUB viewer requires `epubjs` — install or use download.';\n    loading.value = false;\n    return;\n  }\n  try {\n    const Epub = mod.default ?? mod;\n    // epub.js wants a URL (it then fetches with XHR). When the host\n    // site requires auth headers we have to load the file ourselves\n    // and pass an ArrayBuffer instead.\n    let source: string | ArrayBuffer = props.url;\n    if (props.authHeaders) {\n      const headers = await props.authHeaders();\n      const res = await fetch(props.url, {\n        headers,\n        credentials: props.authCredentials || 'same-origin',\n      });\n      if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n      source = await res.arrayBuffer();\n    }\n    book = Epub(source);\n    if (!containerRef.value) {\n      throw new Error('EPUB mount target missing');\n    }\n    rendition = book.renderTo(containerRef.value, {\n      width: '100%',\n      height: '100%',\n      flow: 'paginated',\n      manager: 'default',\n    });\n    // ⚠⚠ Both of these have to be raced against a clock. epub.js resolves\n    // `display()` and `loaded.navigation` from its own internal promises, and\n    // when the archive is not a readable EPUB it simply NEVER settles —\n    // neither resolve nor reject — so the `catch` below can't fire and\n    // `finally` never runs. Measured 2026-09-13 on an 8-byte `handbook.epub`:\n    // the pane sat on \"Yükleniyor…\" forever with no error anywhere.\n    await withTimeout(rendition.display(), 'display');\n    rendition.themes.fontSize(fontSize.value + '%');\n    // `<any>` explicitly: `book` is `any`, so without it `T` infers as `{}`\n    // and `nav.toc` stops type-checking.\n    const nav = await withTimeout<any>(book.loaded.navigation, 'navigation');\n    toc.value = (nav?.toc ?? []) as TocNode[];\n    ready.value = true;\n  } catch (err) {\n    // The reader gets the localized sentence; epub.js's own wording (and the\n    // timeout marker) goes to the console for whoever is debugging.\n    console.warn('[filex] EPUB load failed:', err);\n    error.value = tt('viewer.failed_to_load', 'Failed to load file');\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction next(): void {\n  rendition?.next?.();\n}\nfunction prev(): void {\n  rendition?.prev?.();\n}\nfunction gotoHref(href: string): void {\n  rendition?.display?.(href);\n  tocOpen.value = false;\n}\nfunction bigger(): void {\n  fontSize.value = Math.min(200, fontSize.value + 10);\n  rendition?.themes?.fontSize(fontSize.value + '%');\n}\nfunction smaller(): void {\n  fontSize.value = Math.max(60, fontSize.value - 10);\n  rendition?.themes?.fontSize(fontSize.value + '%');\n}\n\nfunction onKey(ev: KeyboardEvent): void {\n  if (ev.key === 'ArrowRight' || ev.key === 'PageDown') next();\n  else if (ev.key === 'ArrowLeft' || ev.key === 'PageUp') prev();\n}\n\nonMounted(() => {\n  load();\n  window.addEventListener('keydown', onKey);\n});\n\nonBeforeUnmount(() => {\n  window.removeEventListener('keydown', onKey);\n  try {\n    rendition?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  try {\n    book?.destroy?.();\n  } catch {\n    /* ignore */\n  }\n  rendition = null;\n  book = null;\n});\n\nwatch(\n  () => props.url,\n  () => {\n    if (rendition) {\n      try {\n        rendition.destroy();\n      } catch {\n        /* ignore */\n      }\n    }\n    if (book) {\n      try {\n        book.destroy();\n      } catch {\n        /* ignore */\n      }\n    }\n    book = null;\n    rendition = null;\n    load();\n  },\n);\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div ref=\"root\" class=\"filex-viewer-epub\">\n    <div v-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <template v-else>\n      <div ref=\"containerRef\" class=\"filex-viewer-epub__rendition\" />\n      <div v-if=\"ready\" class=\"filex-viewer-epub__nav\">\n        <button type=\"button\" class=\"filex-viewer-btn\" @click=\"prev\" :disabled=\"!ready\">‹</button>\n        <button type=\"button\" class=\"filex-viewer-btn\" @click=\"next\" :disabled=\"!ready\">›</button>\n      </div>\n      <div v-if=\"loading\" class=\"filex-viewer-epub__loading\">\n        {{ tt('viewer.loading', 'Loading…') }}\n      </div>\n    </template>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-epub__nav {\n  position: absolute;\n  bottom: 12px;\n  left: 50%;\n  transform: translateX(-50%);\n  display: flex;\n  gap: 8px;\n  padding: 4px 8px;\n  background: var(--fe-bg-elev, rgba(255, 255, 255, 0.9));\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  backdrop-filter: blur(4px);\n}\n.filex-viewer-epub {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  position: relative;\n}\n.filex-viewer-epub__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-epub__fs {\n  display: inline-block;\n  min-width: 40px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-epub__main {\n  flex: 1;\n  min-height: 0;\n  display: flex;\n}\n.filex-viewer-epub__rendition {\n  flex: 1;\n  min-height: 0;\n}\n.filex-viewer-epub__toc {\n  width: 260px;\n  border-right: 1px solid var(--fe-border, #e2e6ed);\n  overflow-y: auto;\n  padding: 12px 0;\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-epub__toc ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-viewer-epub__toc-link {\n  display: block;\n  width: 100%;\n  text-align: left;\n  background: transparent;\n  border: 0;\n  padding: 6px 14px;\n  font: inherit;\n  color: inherit;\n  cursor: pointer;\n}\n.filex-viewer-epub__toc-link:hover {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-epub__toc-link.is-child {\n  padding-left: 28px;\n  color: var(--fe-text-muted, #5a6475);\n  font-size: 12px;\n}\n.filex-viewer-epub__loading {\n  position: absolute;\n  inset: auto 0 0 0;\n  text-align: center;\n  padding: 6px;\n  background: rgba(0, 0, 0, 0.05);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n</style>\n","/**\n * useViewerFetch — tiny wrapper around `fetch` for the rich viewers.\n *\n * The PreviewModal already builds and pushes `authHeaders` + the\n * configured `credentials` mode into every viewer. The viewers need\n * binary access (ArrayBuffer for utif/ag-psd/pdfjs, Blob for EPUB,\n * text for CSV/Mermaid/ipynb), and they all want to honour the same\n * auth strategy.\n *\n * Each helper uses the URL the modal hands down (`previewUrl(path)`)\n * and merges in the same headers + credentials so a CSRF/Bearer host\n * doesn't reject the request when the viewer fetches the file body\n * directly (instead of letting the browser do it via `<img src>` etc).\n */\nexport interface ViewerFetchOptions {\n  url: string;\n  headers?: Record<string, string>;\n  credentials?: RequestCredentials;\n  signal?: AbortSignal;\n}\n\nasync function fetchOk(opts: ViewerFetchOptions): Promise<Response> {\n  const res = await fetch(opts.url, {\n    headers: opts.headers ?? {},\n    credentials: opts.credentials ?? 'same-origin',\n    signal: opts.signal,\n  });\n  if (!res.ok) {\n    const text = await res.text().catch(() => '');\n    throw new Error(\n      `${res.status} ${res.statusText}${text ? ' — ' + text.slice(0, 200) : ''}`,\n    );\n  }\n  return res;\n}\n\nexport async function fetchViewerArrayBuffer(\n  opts: ViewerFetchOptions,\n): Promise<ArrayBuffer> {\n  const res = await fetchOk(opts);\n  return res.arrayBuffer();\n}\n\nexport async function fetchViewerBlob(\n  opts: ViewerFetchOptions,\n): Promise<{ blob: Blob; objectUrl: string; mime: string }> {\n  const res = await fetchOk(opts);\n  const blob = await res.blob();\n  const mime = blob.type || res.headers.get('content-type') || '';\n  return { blob, objectUrl: URL.createObjectURL(blob), mime };\n}\n\nexport async function fetchViewerText(\n  opts: ViewerFetchOptions,\n): Promise<string> {\n  const res = await fetchOk(opts);\n  return res.text();\n}\n","<script setup lang=\"ts\">\n/**\n * MermaidViewer — render a `.mmd` / `.mermaid` source file.\n *\n * Lazy-imports the `mermaid` library (~150 KB gzipped). Source text is\n * fetched from `props.url` (with the auth headers from PreviewModal),\n * then rendered to SVG via `mermaid.render('id', src)`. The resulting\n * SVG node is inserted into a wrapper that supports pan + scale via\n * pure CSS transforms (no extra panzoom dep).\n */\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst surface = ref<HTMLDivElement | null>(null);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst scale = ref(1);\nconst tx = ref(0);\nconst ty = ref(0);\n\nlet dragging = false;\nlet dragStart: { x: number; y: number; tx: number; ty: number } | null = null;\nlet renderToken = 0;\n\nlet cachedMermaid: any = null;\nasync function ensureMermaid(): Promise<any | null> {\n  if (cachedMermaid) return cachedMermaid;\n  try {\n    const mod = await import(/* @vite-ignore */ 'mermaid');\n    cachedMermaid = mod.default ?? mod;\n    cachedMermaid.initialize?.({\n      startOnLoad: false,\n      securityLevel: 'strict',\n      theme: window.matchMedia?.('(prefers-color-scheme: dark)').matches\n        ? 'dark'\n        : 'default',\n    });\n    return cachedMermaid;\n  } catch {\n    return null;\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  const myToken = ++renderToken;\n\n  const mermaid = await ensureMermaid();\n  if (myToken !== renderToken) return;\n  if (!mermaid) {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : 'Mermaid viewer requires `mermaid` — install or use download.';\n    loading.value = false;\n    return;\n  }\n\n  let src: string;\n  try {\n    src = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'fetch failed';\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  try {\n    const id = `filex-mermaid-${Date.now()}`;\n    const { svg } = await mermaid.render(id, src);\n    if (myToken !== renderToken) return;\n    if (surface.value) {\n      surface.value.innerHTML = svg;\n      const svgEl = surface.value.querySelector('svg');\n      if (svgEl) {\n        svgEl.style.maxWidth = '100%';\n        svgEl.style.height = 'auto';\n      }\n    }\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'render failed';\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.2, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n  tx.value = 0;\n  ty.value = 0;\n}\n\nfunction onWheel(ev: WheelEvent): void {\n  if (!ev.ctrlKey && !ev.metaKey) return;\n  ev.preventDefault();\n  const delta = -ev.deltaY;\n  const factor = delta > 0 ? 1.1 : 1 / 1.1;\n  scale.value = Math.max(0.2, Math.min(8, scale.value * factor));\n}\n\nfunction onPointerDown(ev: PointerEvent): void {\n  dragging = true;\n  dragStart = { x: ev.clientX, y: ev.clientY, tx: tx.value, ty: ty.value };\n  (ev.target as HTMLElement).setPointerCapture?.(ev.pointerId);\n}\nfunction onPointerMove(ev: PointerEvent): void {\n  if (!dragging || !dragStart) return;\n  tx.value = dragStart.tx + (ev.clientX - dragStart.x);\n  ty.value = dragStart.ty + (ev.clientY - dragStart.y);\n}\nfunction onPointerUp(): void {\n  dragging = false;\n  dragStart = null;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-mermaid\">\n    <div\n      class=\"filex-viewer-mermaid__pane\"\n      @wheel=\"onWheel\"\n      @pointerdown=\"onPointerDown\"\n      @pointermove=\"onPointerMove\"\n      @pointerup=\"onPointerUp\"\n      @pointercancel=\"onPointerUp\"\n    >\n      <div\n        v-if=\"error\"\n        class=\"filex-viewer-fallback\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div\n        v-else-if=\"loading\"\n        class=\"filex-viewer-fallback\"\n      >\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <div\n        v-show=\"!loading && !error\"\n        ref=\"surface\"\n        class=\"filex-viewer-mermaid__surface\"\n        :style=\"{ transform: `translate(${tx}px, ${ty}px) scale(${scale})` }\"\n      />\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-mermaid {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-mermaid__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-mermaid__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-mermaid__pane {\n  flex: 1;\n  overflow: hidden;\n  position: relative;\n  cursor: grab;\n  background: var(--fe-bg-elev, #f7f8fa);\n  touch-action: none;\n}\n.filex-viewer-mermaid__pane:active {\n  cursor: grabbing;\n}\n.filex-viewer-mermaid__surface {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transform-origin: center center;\n  transition: transform 0.05s linear;\n  user-select: none;\n}\n.filex-viewer-mermaid__surface svg {\n  max-width: 90%;\n  max-height: 90%;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * DrawioViewer — embed diagrams.net via iframe + postMessage handshake.\n *\n * The diagrams.net embed mode (`?embed=1&proto=json`) handshakes via\n * window.postMessage:\n *\n *   1. iframe sends {event:'init'}                   ← bootstrap\n *   2. parent sends {action:'load', xml}             ← our payload\n *   3. iframe sends {event:'save', xml} on save      ← we POST back\n *\n * No external library required — diagrams.net hosts the entire editor\n * inside the iframe. We just fetch the source XML on mount and route\n * `save` events back to the configured `pdfSaveUrl`-style endpoint\n * (drawio uses the same shape: POST `{path, content}` body).\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  filePath: string;\n  ext: string;\n  drawioUrl?: string;\n  /** Optional save endpoint. When unset the iframe stays read-only. */\n  saveUrl?: string;\n  readOnly?: boolean;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst error = ref<string | null>(null);\nconst status = ref<'loading' | 'ready' | 'saving' | 'saved' | 'error'>('loading');\nconst readOnly = ref(!!props.readOnly || !props.saveUrl);\n\n// drawioUrl=null is the operator's \"off\" signal — FileExplorer wipes it\n// when the capabilities probe reports drawio offline. Don't silently fall\n// back to the public embed.diagrams.net iframe, that defeats the point of\n// gating: render a \"not configured\" pane instead so the user understands\n// why the editor isn't loading.\n//\n// `drawioBase` MUST be a computed (not a const), otherwise a stale null\n// at mount time (capabilities probe still inflight) gets cached for the\n// component's lifetime — leading to the spurious\n// \"viewer.drawio.disabled\" fallback after the capability flips to \"ok\".\nconst drawioBase = computed<string | null>(() =>\n  props.drawioUrl ? props.drawioUrl.replace(/\\/$/, '') : null,\n);\nconst iframeSrc = computed<string>(() => {\n  if (!drawioBase.value) return '';\n  const params = new URLSearchParams({\n    embed: '1',\n    proto: 'json',\n    spin: '1',\n    saveAndExit: '0',\n    noSaveBtn: readOnly.value ? '1' : '0',\n    noExitBtn: '1',\n    ui: 'kennedy',\n    modified: 'unsavedChanges',\n  });\n  return `${drawioBase.value}/?${params.toString()}`;\n});\n\nlet pendingXml: string = '';\n\nasync function loadXml(): Promise<void> {\n  status.value = 'loading';\n  error.value = null;\n  try {\n    pendingXml = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'fetch failed';\n    status.value = 'error';\n  }\n}\n\nfunction send(msg: unknown): void {\n  iframeRef.value?.contentWindow?.postMessage(JSON.stringify(msg), '*');\n}\n\nasync function persist(xml: string): Promise<void> {\n  if (!props.saveUrl) return;\n  status.value = 'saving';\n  try {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...((await props.authHeaders?.()) ?? {}),\n    };\n    const res = await fetch(props.saveUrl, {\n      method: 'POST',\n      headers,\n      credentials: props.authCredentials || 'same-origin',\n      body: JSON.stringify({ path: props.filePath, content: xml }),\n    });\n    if (!res.ok) {\n      throw new Error(`${res.status} ${res.statusText}`);\n    }\n    status.value = 'saved';\n    setTimeout(() => {\n      if (status.value === 'saved') status.value = 'ready';\n    }, 2500);\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'save failed';\n    status.value = 'error';\n  }\n}\n\nfunction onMessage(ev: MessageEvent): void {\n  if (typeof ev.data !== 'string' || ev.data.length === 0) return;\n  // Drawio messages always start with '{' or '<'. Ignore anything else\n  // (devtools / unrelated postMessage senders inside the same window).\n  const first = ev.data[0];\n  if (first !== '{' && first !== '<') return;\n  let payload: any;\n  try {\n    payload = JSON.parse(ev.data);\n  } catch {\n    return;\n  }\n  if (!payload || typeof payload !== 'object') return;\n  switch (payload.event) {\n    case 'init':\n      send({\n        action: 'load',\n        xml: pendingXml,\n        autosave: 0,\n      });\n      status.value = 'ready';\n      break;\n    case 'save':\n      if (typeof payload.xml === 'string') {\n        persist(payload.xml);\n      }\n      break;\n    case 'export':\n      // Could persist a PNG/SVG render; out of V1 scope.\n      break;\n    case 'autosave':\n      if (typeof payload.xml === 'string' && !readOnly.value) {\n        persist(payload.xml);\n      }\n      break;\n    default:\n      break;\n  }\n}\n\nfunction bootIfReady(): void {\n  if (!drawioBase.value) {\n    error.value = tt('viewer.drawio.disabled', 'diagrams.net is not configured for this filex instance.');\n    status.value = 'error';\n    return;\n  }\n  // Clear a previous \"disabled\" error in case the prop just became\n  // available (capability probe finished after mount).\n  if (error.value === tt('viewer.drawio.disabled', 'diagrams.net is not configured for this filex instance.')) {\n    error.value = null;\n    status.value = 'loading';\n  }\n  loadXml();\n}\n\nonMounted(() => {\n  window.addEventListener('message', onMessage);\n  bootIfReady();\n});\n\nwatch(() => props.drawioUrl, bootIfReady);\n\nonBeforeUnmount(() => {\n  window.removeEventListener('message', onMessage);\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-drawio\">\n    <div v-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <iframe\n      v-else\n      ref=\"iframeRef\"\n      :src=\"iframeSrc\"\n      class=\"filex-viewer-drawio__frame\"\n      title=\"diagrams.net editor\"\n    />\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-drawio {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-drawio__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 6px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-drawio__status[data-state=\"error\"] { color: var(--fe-danger, #dc2626); }\n.filex-viewer-drawio__status[data-state=\"saved\"] { color: #059669; }\n.filex-viewer-drawio__readonly {\n  font-style: italic;\n  margin-left: auto;\n}\n.filex-viewer-drawio__frame {\n  flex: 1;\n  width: 100%;\n  border: 0;\n  background: #fafafa;\n  min-height: 0;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * TiffViewer — multi-page TIFF preview via `utif`.\n *\n * Lazy-imports `utif` (~50 KB). Decodes IFDs once, paints the active\n * page to a `<canvas>` via `UTIF.toRGBA8`. Page navigation (1/N) +\n * zoom in/out controls. Browser <img> can't render TIFF natively, so\n * the canvas pipeline is the only option short of server-side\n * conversion.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerArrayBuffer } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst canvasEl = ref<HTMLCanvasElement | null>(null);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst scale = ref(1);\nconst pageIndex = ref(0);\nconst pageCount = ref(0);\nconst pageDims = ref<{ width: number; height: number }>({ width: 0, height: 0 });\n\nlet UTIF: any = null;\nlet ifds: any[] | null = null;\nlet renderToken = 0;\n\nasync function ensureUtif(): Promise<any | null> {\n  if (UTIF) return UTIF;\n  try {\n    const mod = await import(/* @vite-ignore */ 'utif');\n    UTIF = mod.default ?? mod;\n    return UTIF;\n  } catch {\n    return null;\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  ifds = null;\n  pageIndex.value = 0;\n  pageCount.value = 0;\n  const myToken = ++renderToken;\n\n  const lib = await ensureUtif();\n  if (myToken !== renderToken) return;\n  if (!lib) {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : 'TIFF viewer requires `utif` — install or use download.';\n    loading.value = false;\n    return;\n  }\n\n  try {\n    const buf = await fetchViewerArrayBuffer({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n    if (myToken !== renderToken) return;\n    ifds = lib.decode(buf);\n    pageCount.value = ifds?.length ?? 0;\n    if (pageCount.value === 0) {\n      throw new Error('No pages decoded');\n    }\n    paint();\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'TIFF decode failed';\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction paint(): void {\n  if (!UTIF || !ifds || !canvasEl.value) return;\n  const idx = Math.max(0, Math.min(pageIndex.value, ifds.length - 1));\n  const ifd = ifds[idx];\n  try {\n    UTIF.decodeImage(undefined, ifd);\n  } catch {\n    // some images already decoded — UTIF.decodeImage is idempotent on\n    // older versions.\n  }\n  const rgba = UTIF.toRGBA8(ifd);\n  const w = ifd.width;\n  const h = ifd.height;\n  pageDims.value = { width: w, height: h };\n  const canvas = canvasEl.value;\n  canvas.width = w;\n  canvas.height = h;\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return;\n  const imageData = ctx.createImageData(w, h);\n  imageData.data.set(rgba);\n  ctx.putImageData(imageData, 0, 0);\n}\n\nfunction next(): void {\n  if (pageIndex.value < pageCount.value - 1) {\n    pageIndex.value++;\n    paint();\n  }\n}\nfunction prev(): void {\n  if (pageIndex.value > 0) {\n    pageIndex.value--;\n    paint();\n  }\n}\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.1, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n  ifds = null;\n});\n\nwatch(() => props.url, load);\n\nconst pageLabel = computed(() => {\n  const m = (props.t && props.t('viewer.page_n_of_m')) || 'Page {n} of {m}';\n  return m.replace('{n}', String(pageIndex.value + 1)).replace('{m}', String(pageCount.value));\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-tiff\">\n    <div class=\"filex-viewer-tiff__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <canvas\n        v-show=\"!loading && !error\"\n        ref=\"canvasEl\"\n        :style=\"{ imageRendering: 'pixelated' }\"\n      />\n      <div v-if=\"!loading && !error && pageCount > 1\" class=\"filex-viewer-tiff__pager\">\n        <button\n          type=\"button\"\n          class=\"filex-viewer-btn\"\n          :disabled=\"pageIndex === 0\"\n          @click=\"prev\"\n        >‹</button>\n        <span class=\"filex-viewer-tiff__pages\">{{ pageLabel }}</span>\n        <button\n          type=\"button\"\n          class=\"filex-viewer-btn\"\n          :disabled=\"pageIndex >= pageCount - 1\"\n          @click=\"next\"\n        >›</button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-tiff__pager {\n  position: absolute;\n  bottom: 12px;\n  left: 50%;\n  transform: translateX(-50%);\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 4px 8px;\n  background: var(--fe-bg-elev, rgba(255, 255, 255, 0.9));\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  backdrop-filter: blur(4px);\n}\n.filex-viewer-tiff__pages {\n  font-size: 12px;\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-tiff {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-tiff__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-tiff__pages {\n  min-width: 110px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-tiff__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-tiff__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px;\n  background: #2a2d33;\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n.filex-viewer-tiff__pane canvas {\n  background: #fff;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: #c8cdd6;\n  margin: auto;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * PsdViewer — Photoshop document preview via `ag-psd`.\n *\n * Lazy-imports `ag-psd` (~150 KB). Renders the flattened composite to\n * a canvas via `psd.canvas`. A simple layer panel toggles the rendered\n * preview (V1: just lists names + visibility; full composite swap on\n * toggle requires re-rendering with `applyOpacity`/`composite` logic\n * — left as TODO for V2 since `ag-psd` doesn't ship a composite\n * pipeline of its own).\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerArrayBuffer } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  mime?: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface FlatLayer {\n  index: number;\n  name: string;\n  hidden: boolean;\n}\n\nconst canvasEl = ref<HTMLCanvasElement | null>(null);\nconst layers = ref<FlatLayer[]>([]);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst showLayerPanel = ref(false);\nconst dims = ref<{ width: number; height: number }>({ width: 0, height: 0 });\nconst scale = ref(1);\n\nlet renderToken = 0;\n\nlet agPsd: any = null;\nasync function ensureAgPsd(): Promise<any | null> {\n  if (agPsd) return agPsd;\n  try {\n    const mod = await import(/* @vite-ignore */ 'ag-psd');\n    agPsd = mod;\n    return agPsd;\n  } catch {\n    return null;\n  }\n}\n\nfunction flattenLayers(node: any, list: FlatLayer[]): void {\n  if (!node) return;\n  if (Array.isArray(node.children)) {\n    for (const child of node.children) {\n      list.push({\n        index: list.length,\n        name: child.name ?? '(unnamed)',\n        hidden: !!child.hidden,\n      });\n      if (child.children) flattenLayers(child, list);\n    }\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  layers.value = [];\n  const myToken = ++renderToken;\n\n  const lib = await ensureAgPsd();\n  if (myToken !== renderToken) return;\n  if (!lib) {\n    error.value = props.t\n      ? props.t('viewer.peer_not_installed')\n      : 'PSD viewer requires `ag-psd` — install or use download.';\n    loading.value = false;\n    return;\n  }\n\n  try {\n    const buf = await fetchViewerArrayBuffer({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n    if (myToken !== renderToken) return;\n    const psd = lib.readPsd(buf, {\n      skipLayerImageData: false,\n      skipCompositeImageData: false,\n      skipThumbnail: true,\n    });\n    dims.value = { width: psd.width, height: psd.height };\n\n    const composite = psd.canvas;\n    if (composite && canvasEl.value) {\n      const target = canvasEl.value;\n      target.width = psd.width;\n      target.height = psd.height;\n      const ctx = target.getContext('2d');\n      ctx?.drawImage(composite, 0, 0);\n    } else {\n      throw new Error('PSD has no composite image (skipCompositeImageData?)');\n    }\n\n    const flat: FlatLayer[] = [];\n    flattenLayers(psd, flat);\n    layers.value = flat;\n  } catch (err) {\n    // ⚠ The person gets the localized sentence; the decoder's own words go to\n    // the console for whoever is debugging. `ag-psd` throws raw internals\n    // (\"Offset is outside the bounds of the DataView\" on a truncated file),\n    // and printing that verbatim put an untranslated English stack message in\n    // the middle of a Turkish UI — measured 2026-09-13 on a 6-byte\n    // `mockup.psd`.\n    console.warn('[filex] PSD decode failed:', err);\n    error.value = tt('viewer.failed_to_load', 'Failed to load file');\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction zoomIn(): void {\n  scale.value = Math.min(8, scale.value * 1.25);\n}\nfunction zoomOut(): void {\n  scale.value = Math.max(0.1, scale.value / 1.25);\n}\nfunction reset(): void {\n  scale.value = 1;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\nwatch(() => props.url, load);\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-psd\">\n    <div class=\"filex-viewer-psd__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <canvas\n        v-show=\"!loading && !error\"\n        ref=\"canvasEl\"\n      />\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-psd {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n}\n.filex-viewer-psd__bar {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 13px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-psd__dim {\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-psd__zoom {\n  min-width: 50px;\n  text-align: center;\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-psd__main {\n  flex: 1;\n  display: flex;\n  min-height: 0;\n}\n.filex-viewer-psd__layers {\n  width: 240px;\n  border-right: 1px solid var(--fe-border, #e2e6ed);\n  overflow-y: auto;\n  padding: 8px 0;\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-psd__layers ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.filex-viewer-psd__layers li {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  padding: 4px 12px;\n  font-size: 12px;\n}\n.filex-viewer-psd__layer-vis {\n  width: 14px;\n  text-align: center;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-psd__layer-vis[data-hidden=\"1\"] { color: var(--fe-border-strong, #c7ced9); }\n.filex-viewer-psd__layer-name {\n  flex: 1;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.filex-viewer-psd__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px;\n  background: #2a2d33;\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n.filex-viewer-psd__pane canvas {\n  background: #fff\n    repeating-conic-gradient(#e0e0e0 0% 25%, transparent 0% 50%) 50% / 16px 16px;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: #c8cdd6;\n  margin: auto;\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn.is-active {\n  background: var(--fe-bg-selected, #dfe8ff);\n  border-color: var(--fe-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * IpynbViewer — Jupyter notebook (.ipynb JSON) renderer.\n *\n * Pure-JS render — no peer dependency required:\n *   - code cells     → `<pre><code>` (highlight.js when available)\n *   - markdown cells → markdown-it when available, plain `<pre>` otherwise\n *   - output cells   → text (stream / display_data 'text/plain'),\n *                      images (display_data 'image/png' base64),\n *                      HTML (display_data 'text/html', sanitized via\n *                      element-only insertion — no script tags)\n *\n * Source list / output count counters at the top so a 200-cell\n * notebook doesn't surprise the user.\n */\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\nimport { ensureHighlight } from '../composables/useMonacoLoader';\n\nconst props = defineProps<{\n  url: string;\n  ext: string;\n  t?: (key: string) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\ninterface Cell {\n  cell_type: 'code' | 'markdown' | 'raw' | string;\n  source: string | string[];\n  outputs?: any[];\n  execution_count?: number | null;\n  metadata?: Record<string, unknown>;\n}\n\ninterface Notebook {\n  cells: Cell[];\n  metadata?: { kernelspec?: { language?: string; name?: string } };\n}\n\nconst cells = ref<Cell[]>([]);\nconst language = ref<string>('python');\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst renderedSources = ref<Map<number, string>>(new Map());\nconst renderedMarkdown = ref<Map<number, string>>(new Map());\n\nlet renderToken = 0;\nlet highlight: any = null;\nlet mdRenderer: any = null;\n\nasync function ensureMd(): Promise<any | null> {\n  if (mdRenderer !== null) return mdRenderer || null;\n  try {\n    const mod = await import(/* @vite-ignore */ 'markdown-it');\n    const Md = (mod as any).default ?? mod;\n    mdRenderer = new Md({ html: false, linkify: true, breaks: true });\n    return mdRenderer;\n  } catch {\n    mdRenderer = false;\n    return null;\n  }\n}\n\nfunction joinSource(source: string | string[]): string {\n  return Array.isArray(source) ? source.join('') : (source ?? '');\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  cells.value = [];\n  renderedSources.value = new Map();\n  renderedMarkdown.value = new Map();\n  const myToken = ++renderToken;\n\n  let raw: string;\n  try {\n    raw = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'fetch failed';\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  let nb: Notebook;\n  try {\n    nb = JSON.parse(raw);\n  } catch (err) {\n    error.value = 'Invalid notebook JSON';\n    loading.value = false;\n    return;\n  }\n  cells.value = Array.isArray(nb.cells) ? nb.cells : [];\n  language.value = nb.metadata?.kernelspec?.language || 'python';\n\n  // Best-effort hljs highlight per code cell.\n  highlight = (await ensureHighlight()) as any;\n  if (myToken !== renderToken) return;\n  if (highlight) {\n    const hljs = highlight.default ?? highlight;\n    const langOk = hljs.getLanguage?.(language.value) ? language.value : null;\n    cells.value.forEach((cell, idx) => {\n      if (cell.cell_type === 'code') {\n        const text = joinSource(cell.source);\n        try {\n          const result = langOk\n            ? hljs.highlight(text, { language: langOk, ignoreIllegals: true })\n            : hljs.highlightAuto(text);\n          renderedSources.value.set(idx, result.value);\n        } catch {\n          /* leave unrendered */\n        }\n      }\n    });\n  }\n\n  const md = await ensureMd();\n  if (myToken !== renderToken) return;\n  if (md) {\n    cells.value.forEach((cell, idx) => {\n      if (cell.cell_type === 'markdown') {\n        try {\n          renderedMarkdown.value.set(idx, md.render(joinSource(cell.source)));\n        } catch {\n          /* leave plain */\n        }\n      }\n    });\n  }\n\n  loading.value = false;\n}\n\nfunction outputText(out: any): string | null {\n  if (!out) return null;\n  if (out.output_type === 'stream') {\n    return joinSource(out.text);\n  }\n  if (out.output_type === 'error') {\n    return [out.ename, out.evalue, ...(out.traceback || [])]\n      .filter(Boolean)\n      .join('\\n');\n  }\n  if (out.output_type === 'execute_result' || out.output_type === 'display_data') {\n    if (out.data?.['text/plain']) {\n      return joinSource(out.data['text/plain']);\n    }\n  }\n  return null;\n}\n\nfunction outputImage(out: any): string | null {\n  if (!out?.data) return null;\n  if (out.data['image/png']) return `data:image/png;base64,${out.data['image/png']}`;\n  if (out.data['image/jpeg']) return `data:image/jpeg;base64,${out.data['image/jpeg']}`;\n  if (out.data['image/svg+xml']) {\n    const svg = joinSource(out.data['image/svg+xml']);\n    return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n  }\n  return null;\n}\n\nfunction outputHtml(out: any): string | null {\n  if (!out?.data) return null;\n  if (out.data['text/html']) {\n    const html = joinSource(out.data['text/html']);\n    // Strip <script> for safety — outputs from arbitrary notebooks.\n    return html.replace(/<script[\\s\\S]*?<\\/script>/gi, '');\n  }\n  return null;\n}\n\nonMounted(load);\nonBeforeUnmount(() => {\n  renderToken++;\n});\nwatch(() => props.url, load);\n\nconst stats = computed(() => {\n  const codeCount = cells.value.filter((c) => c.cell_type === 'code').length;\n  const mdCount = cells.value.filter((c) => c.cell_type === 'markdown').length;\n  return { code: codeCount, md: mdCount, total: cells.value.length };\n});\n\nfunction tt(key: string, fallback: string): string {\n  return props.t ? props.t(key) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-ipynb\">\n    <div class=\"filex-viewer-ipynb__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <div v-else>\n        <div\n          v-for=\"(cell, idx) in cells\"\n          :key=\"idx\"\n          class=\"filex-viewer-ipynb__cell\"\n          :data-type=\"cell.cell_type\"\n        >\n          <template v-if=\"cell.cell_type === 'code'\">\n            <div class=\"filex-viewer-ipynb__exec\">\n              In [{{ cell.execution_count ?? ' ' }}]:\n            </div>\n            <pre class=\"filex-viewer-ipynb__src hljs\"><code\n              v-if=\"renderedSources.get(idx)\"\n              v-html=\"renderedSources.get(idx)\"\n            /><code v-else>{{ joinSource(cell.source) }}</code></pre>\n            <div v-if=\"cell.outputs && cell.outputs.length\" class=\"filex-viewer-ipynb__outputs\">\n              <template v-for=\"(out, j) in cell.outputs\" :key=\"j\">\n                <img\n                  v-if=\"outputImage(out)\"\n                  :src=\"outputImage(out) || ''\"\n                  class=\"filex-viewer-ipynb__img\"\n                  :alt=\"`output ${j}`\"\n                />\n                <div\n                  v-else-if=\"outputHtml(out)\"\n                  class=\"filex-viewer-ipynb__html\"\n                  v-html=\"outputHtml(out)\"\n                />\n                <pre\n                  v-else-if=\"outputText(out)\"\n                  class=\"filex-viewer-ipynb__out\"\n                  :data-type=\"out.output_type\"\n                >{{ outputText(out) }}</pre>\n              </template>\n            </div>\n          </template>\n\n          <template v-else-if=\"cell.cell_type === 'markdown'\">\n            <div\n              v-if=\"renderedMarkdown.get(idx)\"\n              class=\"filex-viewer-ipynb__md\"\n              v-html=\"renderedMarkdown.get(idx)\"\n            />\n            <pre v-else class=\"filex-viewer-ipynb__md-raw\">{{ joinSource(cell.source) }}</pre>\n          </template>\n\n          <template v-else>\n            <pre class=\"filex-viewer-ipynb__src\">{{ joinSource(cell.source) }}</pre>\n          </template>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-ipynb {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-ipynb__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-ipynb__lang {\n  font-family: var(--fe-font-mono, monospace);\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n}\n.filex-viewer-ipynb__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px 24px;\n}\n.filex-viewer-ipynb__cell {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  border-radius: 6px;\n  margin-bottom: 16px;\n  overflow: hidden;\n}\n.filex-viewer-ipynb__cell[data-type=\"code\"] {\n  background: var(--fe-bg-elev, #f7f8fa);\n}\n.filex-viewer-ipynb__exec {\n  padding: 4px 12px;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 11px;\n  color: var(--fe-text-muted, #5a6475);\n  background: rgba(0, 0, 0, 0.04);\n}\n.filex-viewer-ipynb__src {\n  margin: 0;\n  padding: 12px;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  line-height: 1.5;\n  white-space: pre;\n  overflow-x: auto;\n}\n.filex-viewer-ipynb__outputs {\n  border-top: 1px dashed var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  padding: 8px 12px;\n}\n.filex-viewer-ipynb__out {\n  margin: 0;\n  padding: 4px 0;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n.filex-viewer-ipynb__out[data-type=\"error\"] {\n  color: var(--fe-danger, #dc2626);\n}\n.filex-viewer-ipynb__img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n  margin: 8px 0;\n}\n.filex-viewer-ipynb__html {\n  font-size: 13px;\n}\n.filex-viewer-ipynb__md {\n  padding: 12px 16px;\n  font-size: 14px;\n  line-height: 1.6;\n}\n.filex-viewer-ipynb__md-raw {\n  padding: 12px;\n  margin: 0;\n  font-family: var(--fe-font-mono, monospace);\n  font-size: 12px;\n  white-space: pre-wrap;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * CsvViewer — lightweight CSV / TSV table preview.\n *\n * Lazy-imports `papaparse` when available (best-quality parser — handles\n * embedded quotes, multi-line cells, etc). Falls back to a simple\n * `split` parser when the peer is missing — workable for the trivial\n * \"first 1000 rows\" preview case but loses fidelity on complex files.\n *\n * UX:\n *   - first-row-as-header toggle\n *   - filter input that case-insensitively matches any cell\n *   - 100-rows-per-page pagination\n *   - tab vs comma auto-detection (manual override via toolbar)\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\nimport { fetchViewerText } from '../composables/useViewerFetch';\n\nconst props = defineProps<{\n  url: string;\n  ext: string;\n  t?: (key: string, vars?: Record<string, string | number>) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n}>();\n\nconst PAGE_SIZE = 100;\nconst ROW_LIMIT = 1000;\n\nconst rows = ref<string[][]>([]);\nconst error = ref<string | null>(null);\nconst loading = ref(true);\nconst firstRowHeader = ref(true);\nconst filter = ref('');\nconst page = ref(1);\nconst detectedDelim = ref<',' | '\\t' | ';'>(',');\nconst userDelim = ref<'auto' | ',' | '\\t' | ';'>('auto');\n\nlet renderToken = 0;\n\nfunction detectDelimiter(sample: string): ',' | '\\t' | ';' {\n  const sampleLines = sample.split(/\\r?\\n/).slice(0, 5).join('\\n');\n  const tab = (sampleLines.match(/\\t/g) || []).length;\n  const semi = (sampleLines.match(/;/g) || []).length;\n  const comma = (sampleLines.match(/,/g) || []).length;\n  if (tab > comma && tab > semi) return '\\t';\n  if (semi > comma && semi > tab) return ';';\n  return ',';\n}\n\nasync function parseWith(text: string, delim: string): Promise<string[][]> {\n  try {\n    const mod = await import(/* @vite-ignore */ 'papaparse');\n    const Papa = (mod as any).default ?? mod;\n    const result = Papa.parse(text, {\n      delimiter: delim,\n      skipEmptyLines: true,\n      header: false,\n    });\n    return (result.data as string[][]).slice(0, ROW_LIMIT);\n  } catch {\n    // Fallback: naive line/column split. Loses quoted-comma support\n    // but renders something reasonable.\n    return text\n      .split(/\\r?\\n/)\n      .filter((l) => l.length > 0)\n      .slice(0, ROW_LIMIT)\n      .map((line) => line.split(delim));\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  rows.value = [];\n  page.value = 1;\n  const myToken = ++renderToken;\n\n  let text: string;\n  try {\n    text = await fetchViewerText({\n      url: props.url,\n      headers: (await props.authHeaders?.()) ?? {},\n      credentials: props.authCredentials,\n    });\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : 'fetch failed';\n    loading.value = false;\n    return;\n  }\n\n  if (myToken !== renderToken) return;\n\n  if (props.ext === 'tsv') {\n    detectedDelim.value = '\\t';\n  } else {\n    detectedDelim.value = detectDelimiter(text.slice(0, 4096));\n  }\n\n  const delim = userDelim.value === 'auto' ? detectedDelim.value : userDelim.value;\n  rows.value = await parseWith(text, delim);\n  loading.value = false;\n}\n\nonMounted(load);\nwatch(() => props.url, load);\nwatch(() => userDelim.value, () => {\n  if (rows.value.length === 0) return;\n  // Re-parse with the new delimiter using the cached source — but we\n  // didn't keep it. Cheapest path is a refetch.\n  load();\n});\n\nconst headers = computed<string[]>(() => {\n  if (!firstRowHeader.value || rows.value.length === 0) {\n    if (rows.value.length === 0) return [];\n    return rows.value[0].map((_, i) => `Col ${i + 1}`);\n  }\n  return rows.value[0];\n});\n\nconst dataRows = computed<string[][]>(() => {\n  return firstRowHeader.value ? rows.value.slice(1) : rows.value;\n});\n\nconst filtered = computed<string[][]>(() => {\n  const q = filter.value.trim().toLowerCase();\n  if (!q) return dataRows.value;\n  return dataRows.value.filter((r) =>\n    r.some((c) => (c || '').toLowerCase().includes(q)),\n  );\n});\n\nconst totalPages = computed(() =>\n  Math.max(1, Math.ceil(filtered.value.length / PAGE_SIZE)),\n);\n\nconst visibleRows = computed<string[][]>(() => {\n  const start = (page.value - 1) * PAGE_SIZE;\n  return filtered.value.slice(start, start + PAGE_SIZE);\n});\n\nwatch(filter, () => {\n  page.value = 1;\n});\n\nfunction tt(key: string, fallback: string, vars?: Record<string, string | number>): string {\n  return props.t ? props.t(key, vars) : fallback;\n}\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n</script>\n\n<template>\n  <div class=\"filex-viewer-csv\">\n    <div class=\"filex-viewer-csv__pane\">\n      <div v-if=\"error\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n        <p>{{ error }}</p>\n      </div>\n      <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n        <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n        <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n      </div>\n      <table v-else class=\"filex-viewer-csv__table\">\n        <thead>\n          <tr>\n            <th class=\"filex-viewer-csv__rownum\">#</th>\n            <th v-for=\"(h, i) in headers\" :key=\"i\">{{ h }}</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"(row, ri) in visibleRows\" :key=\"ri\">\n            <td class=\"filex-viewer-csv__rownum\">{{ (page - 1) * 100 + ri + 1 }}</td>\n            <td v-for=\"(c, ci) in row\" :key=\"ci\">{{ c }}</td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n    <div v-if=\"!loading && !error && totalPages > 1\" class=\"filex-viewer-csv__pager\">\n      <button\n        type=\"button\"\n        class=\"filex-viewer-btn\"\n        :disabled=\"page <= 1\"\n        @click=\"page--\"\n      >‹</button>\n      <span class=\"filex-viewer-csv__pageno\">{{ page }} / {{ totalPages }} ({{ tt('viewer.csv_rows', `${filtered.length} rows`, { n: filtered.length }) }})</span>\n      <button\n        type=\"button\"\n        class=\"filex-viewer-btn\"\n        :disabled=\"page >= totalPages\"\n        @click=\"page++\"\n      >›</button>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-csv {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-csv__bar {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 8px 12px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n}\n.filex-viewer-csv__check {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  font-size: 12px;\n}\n.filex-viewer-csv__select,\n.filex-viewer-csv__filter {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: inherit;\n  padding: 4px 8px;\n  border-radius: 4px;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-csv__filter {\n  flex: 0 1 240px;\n}\n.filex-viewer-spacer { flex: 1; }\n.filex-viewer-csv__count {\n  font-size: 11px;\n  color: var(--fe-text-muted, #5a6475);\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-csv__pane {\n  flex: 1;\n  overflow: auto;\n}\n.filex-viewer-csv__table {\n  border-collapse: collapse;\n  width: max-content;\n  min-width: 100%;\n  font-size: 12px;\n  font-family: var(--fe-font-mono, monospace);\n}\n.filex-viewer-csv__table th,\n.filex-viewer-csv__table td {\n  padding: 4px 10px;\n  border: 1px solid var(--fe-border, #e2e6ed);\n  white-space: nowrap;\n  max-width: 320px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.filex-viewer-csv__table th {\n  background: var(--fe-bg-elev, #f7f8fa);\n  position: sticky;\n  top: 0;\n  font-weight: 600;\n  text-align: left;\n}\n.filex-viewer-csv__table tbody tr:nth-child(even) {\n  background: var(--fe-bg-hover, rgba(0, 0, 0, 0.02));\n}\n.filex-viewer-csv__rownum {\n  color: var(--fe-text-muted, #5a6475);\n  text-align: right;\n  background: var(--fe-bg-elev, #f7f8fa);\n  font-variant-numeric: tabular-nums;\n  position: sticky;\n  left: 0;\n}\n.filex-viewer-csv__pager {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 8px;\n  padding: 6px;\n  background: var(--fe-bg-elev, #f7f8fa);\n  border-top: 1px solid var(--fe-border, #e2e6ed);\n  font-size: 12px;\n}\n.filex-viewer-csv__pageno {\n  font-variant-numeric: tabular-nums;\n  font-size: 12px;\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n.filex-viewer-btn {\n  border: 1px solid var(--fe-border, #e2e6ed);\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n  padding: 4px 10px;\n  border-radius: 4px;\n  cursor: pointer;\n  font: inherit;\n  font-size: 12px;\n}\n.filex-viewer-btn:hover:not(:disabled) {\n  background: var(--fe-bg-hover, #edf0f5);\n}\n.filex-viewer-btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * ArchiveViewer — minimal zip / archive contents preview.\n *\n * Hits the configured archive-list endpoint (`archiveListUrl`, default\n * `POST /api/files/archive/list`) with the adapter-qualified path\n * and renders the member list as a flat table (name, size, mtime).\n * Read-only — extraction is exposed elsewhere (context menu / actions\n * panel). The viewer's job is just \"what's inside?\" so the user can\n * decide whether to extract or download.\n */\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { actionIconSvg } from '../lib/actionIcons'; /* ikon:emoji */\nimport { fileIconTile } from '../lib/fileIcons'; /* ikon:emoji */\n\ninterface ArchiveEntry {\n  name: string;\n  size: number;\n  mtime?: string;\n  is_dir?: boolean;\n}\n\nconst props = defineProps<{\n  url: string;\n  filePath?: string;\n  ext: string;\n  t?: (key: string, vars?: Record<string, string | number>) => string;\n  authHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n  authCredentials?: RequestCredentials;\n  /** ⚠ Where to ask. This used to be the literal '/api/files/archive/list',\n   *  which is the ONE thing an embed cannot assume: with `apiBase` pointing at\n   *  another origin the request went to the host page instead and 404'd, while\n   *  every other call in the package honoured the configured base. The default\n   *  keeps a same-origin install working unchanged. */\n  archiveListUrl?: string;\n}>();\n\nconst entries = ref<ArchiveEntry[]>([]);\nconst loading = ref(true);\nconst error = ref<string | null>(null);\n\n/** ⚠ `vars` go THROUGH `t()`, not into a `.replace()` afterwards: `t()` is what\n *  picks the singular (`viewer.archive.entries_one`) from the count, and it can\n *  only do that if it is told the count. Same shape CsvViewer's helper has. */\nfunction tt(key: string, fallback: string, vars?: Record<string, string | number>): string {\n  return props.t ? props.t(key, vars) : fallback;\n}\n\nfunction fmtSize(n: number): string {\n  if (n < 1024) return `${n} B`;\n  if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n  if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n  return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = null;\n  entries.value = [];\n  // The viewer is mounted with the resolved file path. Hit the API\n  // endpoint with the same adapter-qualified path the preview URL\n  // points at — the backend resolves storage + relative path itself.\n  if (!props.filePath) {\n    error.value = tt('viewer.archive.error', 'Could not read archive contents.');\n    loading.value = false;\n    return;\n  }\n  try {\n    const res = await fetch(props.archiveListUrl || '/api/files/archive/list', {\n      method: 'POST',\n      credentials: props.authCredentials || 'same-origin',\n      headers: {\n        'Content-Type': 'application/json',\n        ...(props.authHeaders ? await props.authHeaders() : {}),\n      },\n      body: JSON.stringify({ path: props.filePath }),\n    });\n    if (!res.ok) {\n      throw new Error(`${res.status} ${res.statusText}`);\n    }\n    const body = (await res.json()) as { entries?: ArchiveEntry[] };\n    entries.value = body.entries ?? [];\n  } catch (err) {\n    error.value = err instanceof Error ? err.message : tt('viewer.archive.error', 'Could not read archive contents.');\n  } finally {\n    loading.value = false;\n  }\n}\n\nonMounted(load);\nwatch(() => props.filePath, load);\n\nconst totalSize = computed(() => entries.value.reduce((sum, e) => sum + (e.size || 0), 0));\nconst fileCount = computed(() => entries.value.filter((e) => !e.is_dir).length);\n\n/* === ikon:emoji — the fallback screen's mark ==========================\n * Every viewer opened its \"cannot show this\" / \"still loading\" screen with a\n * 48px colour emoji, one per format, each from whatever emoji font the OS\n * shipped. The format mark is `lib/fileIcons`'s tile — the SAME tile the row\n * the person just clicked is wearing, so the fallback is recognisably about\n * that file — and \"loading\" is the stroked ring, spun by CSS, because no\n * still picture can say \"still going\". */\nconst typeTile = computed(() => fileIconTile({ type: 'file', extension: props.ext }));\n\n/** A row inside the archive, drawn the way the listing draws the same kind. */\nfunction entryTile(e: ArchiveEntry): string {\n  const name = e.name || '';\n  const dot = name.lastIndexOf('.');\n  return fileIconTile({\n    type: e.is_dir ? 'dir' : 'file',\n    extension: dot > 0 ? name.slice(dot + 1) : '',\n    basename: name,\n  });\n}\n</script>\n\n<template>\n  <div class=\"filex-viewer-archive\">\n    <div v-if=\"error\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ error }}</p>\n    </div>\n    <div v-else-if=\"loading\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span\n        class=\"filex-viewer-fallback__icon filex-viewer-fallback__icon--spin\"\n        aria-hidden=\"true\"\n        v-html=\"actionIconSvg('progress')\"\n      ></span>\n      <p>{{ tt('viewer.loading', 'Loading…') }}</p>\n    </div>\n    <div v-else-if=\"entries.length === 0\" class=\"filex-viewer-fallback\">\n      <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons + lib/actionIcons -->\n      <span class=\"filex-viewer-fallback__icon\" aria-hidden=\"true\" v-html=\"typeTile\"></span>\n      <p>{{ tt('viewer.archive.empty', 'Archive is empty.') }}</p>\n    </div>\n    <div v-else class=\"filex-viewer-archive__pane\">\n      <div class=\"filex-viewer-archive__summary\">\n        <!-- ⚠ The count is IN the message (\"{n} files\"). A `{{ fileCount }}`\n             printed in front of it read \"3 3 files\". -->\n        {{ tt('viewer.archive.entries', `${fileCount} files`, { n: fileCount }) }}\n        · {{ fmtSize(totalSize) }}\n      </div>\n      <table class=\"filex-viewer-archive__table\">\n        <thead>\n          <tr>\n            <th>{{ tt('viewer.name', 'Name') }}</th>\n            <th class=\"filex-viewer-archive__size\">{{ tt('viewer.size', 'Size') }}</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"(e, i) in entries\" :key=\"i\" :data-dir=\"e.is_dir ? '1' : '0'\">\n            <td>\n              <!-- ikon:emoji — the same tile the listing draws for the same\n                   kind of file, so an archive's contents and the folder it\n                   came from read as one product. -->\n              <!-- eslint-disable-next-line vue/no-v-html -- static markup from lib/fileIcons -->\n              <span class=\"filex-viewer-archive__icon\" aria-hidden=\"true\" v-html=\"entryTile(e)\"></span>\n              {{ e.name }}\n            </td>\n            <td class=\"filex-viewer-archive__size\">{{ e.is_dir ? '' : fmtSize(e.size) }}</td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n  </div>\n</template>\n\n<style>\n/* ⚠ NOT `scoped`, deliberately. Vue's scoped styles compile to\n   `.cls[data-v-HASH]`, and in the web-component build the hash baked into\n   this CSS does not match the one Vue stamps onto the DOM — so every rule\n   here silently stopped applying. Measured in the desktop app: the share\n   dialog had `position: static`, no background and no radius, i.e. raw\n   unstyled HTML, in EVERY embedded surface.\n   Safe to drop: every selector below is prefixed (fx-/fe-/filex-), so\n   there is nothing here that can leak into a host page. */\n.filex-viewer-archive {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 100%;\n  min-height: 70vh;\n  background: var(--fe-bg, #fff);\n  color: var(--fe-text, #1a1e27);\n}\n.filex-viewer-archive__pane {\n  flex: 1;\n  overflow: auto;\n  padding: 16px 20px;\n}\n.filex-viewer-archive__summary {\n  font-size: 12px;\n  color: var(--fe-text-muted, #5a6475);\n  margin-bottom: 12px;\n  font-variant-numeric: tabular-nums;\n}\n.filex-viewer-archive__table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: 13px;\n  font-family: var(--fe-font-mono, monospace);\n}\n.filex-viewer-archive__table th,\n.filex-viewer-archive__table td {\n  padding: 6px 12px;\n  border-bottom: 1px solid var(--fe-border, #e2e6ed);\n  text-align: left;\n}\n.filex-viewer-archive__table th {\n  background: var(--fe-bg-elev, #f7f8fa);\n  font-weight: 600;\n  position: sticky;\n  top: 0;\n}\n.filex-viewer-archive__size {\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-archive__icon {\n  margin-right: 6px;\n}\n.filex-viewer-archive__table tr[data-dir=\"1\"] {\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback {\n  text-align: center;\n  padding: 32px;\n  color: var(--fe-text-muted, #5a6475);\n}\n.filex-viewer-fallback__icon {\n  font-size: 48px;\n  display: block;\n  margin-bottom: 12px;\n}\n</style>\n","/* eslint-disable no-bitwise */\n\nconst decodeCache = {}\n\nfunction getDecodeCache (exclude) {\n  let cache = decodeCache[exclude]\n  if (cache) { return cache }\n\n  cache = decodeCache[exclude] = []\n\n  for (let i = 0; i < 128; i++) {\n    const ch = String.fromCharCode(i)\n    cache.push(ch)\n  }\n\n  for (let i = 0; i < exclude.length; i++) {\n    const ch = exclude.charCodeAt(i)\n    cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2)\n  }\n\n  return cache\n}\n\n// Decode percent-encoded string.\n//\nfunction decode (string, exclude) {\n  if (typeof exclude !== 'string') {\n    exclude = decode.defaultChars\n  }\n\n  const cache = getDecodeCache(exclude)\n\n  return string.replace(/(%[a-f0-9]{2})+/gi, function (seq) {\n    let result = ''\n\n    for (let i = 0, l = seq.length; i < l; i += 3) {\n      const b1 = parseInt(seq.slice(i + 1, i + 3), 16)\n\n      if (b1 < 0x80) {\n        result += cache[b1]\n        continue\n      }\n\n      if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n        // 110xxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n\n        if ((b2 & 0xC0) === 0x80) {\n          const chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F)\n\n          if (chr < 0x80) {\n            result += '\\ufffd\\ufffd'\n          } else {\n            result += String.fromCharCode(chr)\n          }\n\n          i += 3\n          continue\n        }\n      }\n\n      if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n        // 1110xxxx 10xxxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n        const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n          const chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F)\n\n          if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n            result += '\\ufffd\\ufffd\\ufffd'\n          } else {\n            result += String.fromCharCode(chr)\n          }\n\n          i += 6\n          continue\n        }\n      }\n\n      if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n        // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n        const b2 = parseInt(seq.slice(i + 4, i + 6), 16)\n        const b3 = parseInt(seq.slice(i + 7, i + 9), 16)\n        const b4 = parseInt(seq.slice(i + 10, i + 12), 16)\n\n        if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n          let chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F)\n\n          if (chr < 0x10000 || chr > 0x10FFFF) {\n            result += '\\ufffd\\ufffd\\ufffd\\ufffd'\n          } else {\n            chr -= 0x10000\n            result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF))\n          }\n\n          i += 9\n          continue\n        }\n      }\n\n      result += '\\ufffd'\n    }\n\n    return result\n  })\n}\n\ndecode.defaultChars = ';/?:@&=+$,#'\ndecode.componentChars = ''\n\nexport default decode\n","const encodeCache = {}\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache (exclude) {\n  let cache = encodeCache[exclude]\n  if (cache) { return cache }\n\n  cache = encodeCache[exclude] = []\n\n  for (let i = 0; i < 128; i++) {\n    const ch = String.fromCharCode(i)\n\n    if (/^[0-9a-z]$/i.test(ch)) {\n      // always allow unencoded alphanumeric characters\n      cache.push(ch)\n    } else {\n      cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2))\n    }\n  }\n\n  for (let i = 0; i < exclude.length; i++) {\n    cache[exclude.charCodeAt(i)] = exclude[i]\n  }\n\n  return cache\n}\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n//  - string       - string to encode\n//  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)\n//  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode (string, exclude, keepEscaped) {\n  if (typeof exclude !== 'string') {\n    // encode(string, keepEscaped)\n    keepEscaped = exclude\n    exclude = encode.defaultChars\n  }\n\n  if (typeof keepEscaped === 'undefined') {\n    keepEscaped = true\n  }\n\n  const cache = getEncodeCache(exclude)\n  let result = ''\n\n  for (let i = 0, l = string.length; i < l; i++) {\n    const code = string.charCodeAt(i)\n\n    if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n      if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n        result += string.slice(i, i + 3)\n        i += 2\n        continue\n      }\n    }\n\n    if (code < 128) {\n      result += cache[code]\n      continue\n    }\n\n    if (code >= 0xD800 && code <= 0xDFFF) {\n      if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n        const nextCode = string.charCodeAt(i + 1)\n        if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n          result += encodeURIComponent(string[i] + string[i + 1])\n          i++\n          continue\n        }\n      }\n      result += '%EF%BF%BD'\n      continue\n    }\n\n    result += encodeURIComponent(string[i])\n  }\n\n  return result\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\"\nencode.componentChars = \"-_.!~*'()\"\n\nexport default encode\n","export default function format (url) {\n  let result = ''\n\n  result += url.protocol || ''\n  result += url.slashes ? '//' : ''\n  result += url.auth ? url.auth + '@' : ''\n\n  if (url.hostname && url.hostname.indexOf(':') !== -1) {\n    // ipv6 address\n    result += '[' + url.hostname + ']'\n  } else {\n    result += url.hostname || ''\n  }\n\n  result += url.port ? ':' + url.port : ''\n  result += url.pathname || ''\n  result += url.search || ''\n  result += url.hash || ''\n\n  return result\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n//    e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n//    so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n//    i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n//    (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n//    which can be constructed using other parts of the url.\n//\n\nfunction Url () {\n  this.protocol = null\n  this.slashes = null\n  this.auth = null\n  this.port = null\n  this.hostname = null\n  this.hash = null\n  this.search = null\n  this.pathname = null\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nconst protocolPattern = /^([a-z0-9.+-]+:)/i\nconst portPattern = /:[0-9]*$/\n\n// Special case for a simple path URL\n/* eslint-disable-next-line no-useless-escape */\nconst simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/\n\n// RFC 2396: characters reserved for delimiting URLs.\n// We actually just auto-escape these.\nconst delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t']\n\n// RFC 2396: characters not allowed for various reasons.\nconst unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims)\n\n// Allowed by RFCs, but cause of XSS attacks.  Always escape these.\nconst autoEscape = ['\\''].concat(unwise)\n// Characters that are never ever allowed in a hostname.\n// Note that any invalid chars are also handled, but these\n// are the ones that are *expected* to be seen, so we fast-path\n// them.\nconst nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape)\nconst hostEndingChars = ['/', '?', '#']\nconst hostnameMaxLen = 255\nconst hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/\nconst hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/\n// protocols that can allow \"unsafe\" and \"unwise\" chars.\n// protocols that never have a hostname.\nconst hostlessProtocol = {\n  javascript: true,\n  'javascript:': true\n}\n// protocols that always contain a // bit.\nconst slashedProtocol = {\n  http: true,\n  https: true,\n  ftp: true,\n  gopher: true,\n  file: true,\n  'http:': true,\n  'https:': true,\n  'ftp:': true,\n  'gopher:': true,\n  'file:': true\n}\n\nfunction urlParse (url, slashesDenoteHost) {\n  if (url && url instanceof Url) return url\n\n  const u = new Url()\n  u.parse(url, slashesDenoteHost)\n  return u\n}\n\nUrl.prototype.parse = function (url, slashesDenoteHost) {\n  let lowerProto, hec, slashes\n  let rest = url\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim()\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    const simplePath = simplePathPattern.exec(rest)\n    if (simplePath) {\n      this.pathname = simplePath[1]\n      if (simplePath[2]) {\n        this.search = simplePath[2]\n      }\n      return this\n    }\n  }\n\n  let proto = protocolPattern.exec(rest)\n  if (proto) {\n    proto = proto[0]\n    lowerProto = proto.toLowerCase()\n    this.protocol = proto\n    rest = rest.substr(proto.length)\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  /* eslint-disable-next-line no-useless-escape */\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    slashes = rest.substr(0, 2) === '//'\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2)\n      this.slashes = true\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    let hostEnd = -1\n    for (let i = 0; i < hostEndingChars.length; i++) {\n      hec = rest.indexOf(hostEndingChars[i])\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec\n      }\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    let auth, atSign\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@')\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd)\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign)\n      rest = rest.slice(atSign + 1)\n      this.auth = auth\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1\n    for (let i = 0; i < nonHostChars.length; i++) {\n      hec = rest.indexOf(nonHostChars[i])\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n        hostEnd = hec\n      }\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1) {\n      hostEnd = rest.length\n    }\n\n    if (rest[hostEnd - 1] === ':') { hostEnd-- }\n    const host = rest.slice(0, hostEnd)\n    rest = rest.slice(hostEnd)\n\n    // pull out port.\n    this.parseHost(host)\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || ''\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    const ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']'\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      const hostparts = this.hostname.split(/\\./)\n      for (let i = 0, l = hostparts.length; i < l; i++) {\n        const part = hostparts[i]\n        if (!part) { continue }\n        if (!part.match(hostnamePartPattern)) {\n          let newpart = ''\n          for (let j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x'\n            } else {\n              newpart += part[j]\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            const validParts = hostparts.slice(0, i)\n            const notHost = hostparts.slice(i + 1)\n            const bit = part.match(hostnamePartStart)\n            if (bit) {\n              validParts.push(bit[1])\n              notHost.unshift(bit[2])\n            }\n            if (notHost.length) {\n              rest = notHost.join('.') + rest\n            }\n            this.hostname = validParts.join('.')\n            break\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = ''\n    }\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2)\n    }\n  }\n\n  // chop off from the tail first.\n  const hash = rest.indexOf('#')\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash)\n    rest = rest.slice(0, hash)\n  }\n  const qm = rest.indexOf('?')\n  if (qm !== -1) {\n    this.search = rest.substr(qm)\n    rest = rest.slice(0, qm)\n  }\n  if (rest) { this.pathname = rest }\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = ''\n  }\n\n  return this\n}\n\nUrl.prototype.parseHost = function (host) {\n  let port = portPattern.exec(host)\n  if (port) {\n    port = port[0]\n    if (port !== ':') {\n      this.port = port.substr(1)\n    }\n    host = host.substr(0, host.length - port.length)\n  }\n  if (host) { this.hostname = host }\n}\n\nexport default urlParse\n","export default /[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","export default /[\\0-\\x1F\\x7F-\\x9F]/","export default /[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u0890\\u0891\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC3F]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","export default /[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061D-\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C77\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1B7D\\u1B7E\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4F\\u2E52-\\u2E5D\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDEAD\\uDF55-\\uDF59\\uDF86-\\uDF89]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDEB9\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDD44-\\uDD46\\uDDE2\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2\\uDF00-\\uDF09]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8\\uDF43-\\uDF4F\\uDFFF]|\\uD809[\\uDC70-\\uDC74]|\\uD80B[\\uDFF1\\uDFF2]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A\\uDFE2]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","export default /[\\$\\+<->\\^`\\|~\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u07FE\\u07FF\\u0888\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20C0\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFF\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u31EF\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uAB6A\\uAB6B\\uFB29\\uFBB2-\\uFBC2\\uFD40-\\uFD4F\\uFDCF\\uFDFC-\\uFDFF\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD]|\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9C\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD807[\\uDFD5-\\uDFF1]|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD833[\\uDF50-\\uDFC3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDEA\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD838[\\uDD4F\\uDEFF]|\\uD83B[\\uDCAC\\uDCB0\\uDD2E\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD0D-\\uDDAD\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDE60-\\uDE65\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED7\\uDEDC-\\uDEEC\\uDEF0-\\uDEFC\\uDF00-\\uDF76\\uDF7B-\\uDFD9\\uDFE0-\\uDFEB\\uDFF0]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDCB0\\uDCB1\\uDD00-\\uDE53\\uDE60-\\uDE6D\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC5\\uDECE-\\uDEDB\\uDEE0-\\uDEE8\\uDEF0-\\uDEF8\\uDF00-\\uDF92\\uDF94-\\uDFCA]/","export default /[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","// Generated using scripts/write-decode-map.ts\nexport default new Uint16Array(\n// prettier-ignore\n\"\\u1d41<\\xd5\\u0131\\u028a\\u049d\\u057b\\u05d0\\u0675\\u06de\\u07a2\\u07d6\\u080f\\u0a4a\\u0a91\\u0da1\\u0e6d\\u0f09\\u0f26\\u10ca\\u1228\\u12e1\\u1415\\u149d\\u14c3\\u14df\\u1525\\0\\0\\0\\0\\0\\0\\u156b\\u16cd\\u198d\\u1c12\\u1ddd\\u1f7e\\u2060\\u21b0\\u228d\\u23c0\\u23fb\\u2442\\u2824\\u2912\\u2d08\\u2e48\\u2fce\\u3016\\u32ba\\u3639\\u37ac\\u38fe\\u3a28\\u3a71\\u3ae0\\u3b2e\\u0800EMabcfglmnoprstu\\\\bfms\\x7f\\x84\\x8b\\x90\\x95\\x98\\xa6\\xb3\\xb9\\xc8\\xcflig\\u803b\\xc6\\u40c6P\\u803b&\\u4026cute\\u803b\\xc1\\u40c1reve;\\u4102\\u0100iyx}rc\\u803b\\xc2\\u40c2;\\u4410r;\\uc000\\ud835\\udd04rave\\u803b\\xc0\\u40c0pha;\\u4391acr;\\u4100d;\\u6a53\\u0100gp\\x9d\\xa1on;\\u4104f;\\uc000\\ud835\\udd38plyFunction;\\u6061ing\\u803b\\xc5\\u40c5\\u0100cs\\xbe\\xc3r;\\uc000\\ud835\\udc9cign;\\u6254ilde\\u803b\\xc3\\u40c3ml\\u803b\\xc4\\u40c4\\u0400aceforsu\\xe5\\xfb\\xfe\\u0117\\u011c\\u0122\\u0127\\u012a\\u0100cr\\xea\\xf2kslash;\\u6216\\u0176\\xf6\\xf8;\\u6ae7ed;\\u6306y;\\u4411\\u0180crt\\u0105\\u010b\\u0114ause;\\u6235noullis;\\u612ca;\\u4392r;\\uc000\\ud835\\udd05pf;\\uc000\\ud835\\udd39eve;\\u42d8c\\xf2\\u0113mpeq;\\u624e\\u0700HOacdefhilorsu\\u014d\\u0151\\u0156\\u0180\\u019e\\u01a2\\u01b5\\u01b7\\u01ba\\u01dc\\u0215\\u0273\\u0278\\u027ecy;\\u4427PY\\u803b\\xa9\\u40a9\\u0180cpy\\u015d\\u0162\\u017aute;\\u4106\\u0100;i\\u0167\\u0168\\u62d2talDifferentialD;\\u6145leys;\\u612d\\u0200aeio\\u0189\\u018e\\u0194\\u0198ron;\\u410cdil\\u803b\\xc7\\u40c7rc;\\u4108nint;\\u6230ot;\\u410a\\u0100dn\\u01a7\\u01adilla;\\u40b8terDot;\\u40b7\\xf2\\u017fi;\\u43a7rcle\\u0200DMPT\\u01c7\\u01cb\\u01d1\\u01d6ot;\\u6299inus;\\u6296lus;\\u6295imes;\\u6297o\\u0100cs\\u01e2\\u01f8kwiseContourIntegral;\\u6232eCurly\\u0100DQ\\u0203\\u020foubleQuote;\\u601duote;\\u6019\\u0200lnpu\\u021e\\u0228\\u0247\\u0255on\\u0100;e\\u0225\\u0226\\u6237;\\u6a74\\u0180git\\u022f\\u0236\\u023aruent;\\u6261nt;\\u622fourIntegral;\\u622e\\u0100fr\\u024c\\u024e;\\u6102oduct;\\u6210nterClockwiseContourIntegral;\\u6233oss;\\u6a2fcr;\\uc000\\ud835\\udc9ep\\u0100;C\\u0284\\u0285\\u62d3ap;\\u624d\\u0580DJSZacefios\\u02a0\\u02ac\\u02b0\\u02b4\\u02b8\\u02cb\\u02d7\\u02e1\\u02e6\\u0333\\u048d\\u0100;o\\u0179\\u02a5trahd;\\u6911cy;\\u4402cy;\\u4405cy;\\u440f\\u0180grs\\u02bf\\u02c4\\u02c7ger;\\u6021r;\\u61a1hv;\\u6ae4\\u0100ay\\u02d0\\u02d5ron;\\u410e;\\u4414l\\u0100;t\\u02dd\\u02de\\u6207a;\\u4394r;\\uc000\\ud835\\udd07\\u0100af\\u02eb\\u0327\\u0100cm\\u02f0\\u0322ritical\\u0200ADGT\\u0300\\u0306\\u0316\\u031ccute;\\u40b4o\\u0174\\u030b\\u030d;\\u42d9bleAcute;\\u42ddrave;\\u4060ilde;\\u42dcond;\\u62c4ferentialD;\\u6146\\u0470\\u033d\\0\\0\\0\\u0342\\u0354\\0\\u0405f;\\uc000\\ud835\\udd3b\\u0180;DE\\u0348\\u0349\\u034d\\u40a8ot;\\u60dcqual;\\u6250ble\\u0300CDLRUV\\u0363\\u0372\\u0382\\u03cf\\u03e2\\u03f8ontourIntegra\\xec\\u0239o\\u0274\\u0379\\0\\0\\u037b\\xbb\\u0349nArrow;\\u61d3\\u0100eo\\u0387\\u03a4ft\\u0180ART\\u0390\\u0396\\u03a1rrow;\\u61d0ightArrow;\\u61d4e\\xe5\\u02cang\\u0100LR\\u03ab\\u03c4eft\\u0100AR\\u03b3\\u03b9rrow;\\u67f8ightArrow;\\u67faightArrow;\\u67f9ight\\u0100AT\\u03d8\\u03derrow;\\u61d2ee;\\u62a8p\\u0241\\u03e9\\0\\0\\u03efrrow;\\u61d1ownArrow;\\u61d5erticalBar;\\u6225n\\u0300ABLRTa\\u0412\\u042a\\u0430\\u045e\\u047f\\u037crrow\\u0180;BU\\u041d\\u041e\\u0422\\u6193ar;\\u6913pArrow;\\u61f5reve;\\u4311eft\\u02d2\\u043a\\0\\u0446\\0\\u0450ightVector;\\u6950eeVector;\\u695eector\\u0100;B\\u0459\\u045a\\u61bdar;\\u6956ight\\u01d4\\u0467\\0\\u0471eeVector;\\u695fector\\u0100;B\\u047a\\u047b\\u61c1ar;\\u6957ee\\u0100;A\\u0486\\u0487\\u62a4rrow;\\u61a7\\u0100ct\\u0492\\u0497r;\\uc000\\ud835\\udc9frok;\\u4110\\u0800NTacdfglmopqstux\\u04bd\\u04c0\\u04c4\\u04cb\\u04de\\u04e2\\u04e7\\u04ee\\u04f5\\u0521\\u052f\\u0536\\u0552\\u055d\\u0560\\u0565G;\\u414aH\\u803b\\xd0\\u40d0cute\\u803b\\xc9\\u40c9\\u0180aiy\\u04d2\\u04d7\\u04dcron;\\u411arc\\u803b\\xca\\u40ca;\\u442dot;\\u4116r;\\uc000\\ud835\\udd08rave\\u803b\\xc8\\u40c8ement;\\u6208\\u0100ap\\u04fa\\u04fecr;\\u4112ty\\u0253\\u0506\\0\\0\\u0512mallSquare;\\u65fberySmallSquare;\\u65ab\\u0100gp\\u0526\\u052aon;\\u4118f;\\uc000\\ud835\\udd3csilon;\\u4395u\\u0100ai\\u053c\\u0549l\\u0100;T\\u0542\\u0543\\u6a75ilde;\\u6242librium;\\u61cc\\u0100ci\\u0557\\u055ar;\\u6130m;\\u6a73a;\\u4397ml\\u803b\\xcb\\u40cb\\u0100ip\\u056a\\u056fsts;\\u6203onentialE;\\u6147\\u0280cfios\\u0585\\u0588\\u058d\\u05b2\\u05ccy;\\u4424r;\\uc000\\ud835\\udd09lled\\u0253\\u0597\\0\\0\\u05a3mallSquare;\\u65fcerySmallSquare;\\u65aa\\u0370\\u05ba\\0\\u05bf\\0\\0\\u05c4f;\\uc000\\ud835\\udd3dAll;\\u6200riertrf;\\u6131c\\xf2\\u05cb\\u0600JTabcdfgorst\\u05e8\\u05ec\\u05ef\\u05fa\\u0600\\u0612\\u0616\\u061b\\u061d\\u0623\\u066c\\u0672cy;\\u4403\\u803b>\\u403emma\\u0100;d\\u05f7\\u05f8\\u4393;\\u43dcreve;\\u411e\\u0180eiy\\u0607\\u060c\\u0610dil;\\u4122rc;\\u411c;\\u4413ot;\\u4120r;\\uc000\\ud835\\udd0a;\\u62d9pf;\\uc000\\ud835\\udd3eeater\\u0300EFGLST\\u0635\\u0644\\u064e\\u0656\\u065b\\u0666qual\\u0100;L\\u063e\\u063f\\u6265ess;\\u62dbullEqual;\\u6267reater;\\u6aa2ess;\\u6277lantEqual;\\u6a7eilde;\\u6273cr;\\uc000\\ud835\\udca2;\\u626b\\u0400Aacfiosu\\u0685\\u068b\\u0696\\u069b\\u069e\\u06aa\\u06be\\u06caRDcy;\\u442a\\u0100ct\\u0690\\u0694ek;\\u42c7;\\u405eirc;\\u4124r;\\u610clbertSpace;\\u610b\\u01f0\\u06af\\0\\u06b2f;\\u610dizontalLine;\\u6500\\u0100ct\\u06c3\\u06c5\\xf2\\u06a9rok;\\u4126mp\\u0144\\u06d0\\u06d8ownHum\\xf0\\u012fqual;\\u624f\\u0700EJOacdfgmnostu\\u06fa\\u06fe\\u0703\\u0707\\u070e\\u071a\\u071e\\u0721\\u0728\\u0744\\u0778\\u078b\\u078f\\u0795cy;\\u4415lig;\\u4132cy;\\u4401cute\\u803b\\xcd\\u40cd\\u0100iy\\u0713\\u0718rc\\u803b\\xce\\u40ce;\\u4418ot;\\u4130r;\\u6111rave\\u803b\\xcc\\u40cc\\u0180;ap\\u0720\\u072f\\u073f\\u0100cg\\u0734\\u0737r;\\u412ainaryI;\\u6148lie\\xf3\\u03dd\\u01f4\\u0749\\0\\u0762\\u0100;e\\u074d\\u074e\\u622c\\u0100gr\\u0753\\u0758ral;\\u622bsection;\\u62c2isible\\u0100CT\\u076c\\u0772omma;\\u6063imes;\\u6062\\u0180gpt\\u077f\\u0783\\u0788on;\\u412ef;\\uc000\\ud835\\udd40a;\\u4399cr;\\u6110ilde;\\u4128\\u01eb\\u079a\\0\\u079ecy;\\u4406l\\u803b\\xcf\\u40cf\\u0280cfosu\\u07ac\\u07b7\\u07bc\\u07c2\\u07d0\\u0100iy\\u07b1\\u07b5rc;\\u4134;\\u4419r;\\uc000\\ud835\\udd0dpf;\\uc000\\ud835\\udd41\\u01e3\\u07c7\\0\\u07ccr;\\uc000\\ud835\\udca5rcy;\\u4408kcy;\\u4404\\u0380HJacfos\\u07e4\\u07e8\\u07ec\\u07f1\\u07fd\\u0802\\u0808cy;\\u4425cy;\\u440cppa;\\u439a\\u0100ey\\u07f6\\u07fbdil;\\u4136;\\u441ar;\\uc000\\ud835\\udd0epf;\\uc000\\ud835\\udd42cr;\\uc000\\ud835\\udca6\\u0580JTaceflmost\\u0825\\u0829\\u082c\\u0850\\u0863\\u09b3\\u09b8\\u09c7\\u09cd\\u0a37\\u0a47cy;\\u4409\\u803b<\\u403c\\u0280cmnpr\\u0837\\u083c\\u0841\\u0844\\u084dute;\\u4139bda;\\u439bg;\\u67ealacetrf;\\u6112r;\\u619e\\u0180aey\\u0857\\u085c\\u0861ron;\\u413ddil;\\u413b;\\u441b\\u0100fs\\u0868\\u0970t\\u0500ACDFRTUVar\\u087e\\u08a9\\u08b1\\u08e0\\u08e6\\u08fc\\u092f\\u095b\\u0390\\u096a\\u0100nr\\u0883\\u088fgleBracket;\\u67e8row\\u0180;BR\\u0899\\u089a\\u089e\\u6190ar;\\u61e4ightArrow;\\u61c6eiling;\\u6308o\\u01f5\\u08b7\\0\\u08c3bleBracket;\\u67e6n\\u01d4\\u08c8\\0\\u08d2eeVector;\\u6961ector\\u0100;B\\u08db\\u08dc\\u61c3ar;\\u6959loor;\\u630aight\\u0100AV\\u08ef\\u08f5rrow;\\u6194ector;\\u694e\\u0100er\\u0901\\u0917e\\u0180;AV\\u0909\\u090a\\u0910\\u62a3rrow;\\u61a4ector;\\u695aiangle\\u0180;BE\\u0924\\u0925\\u0929\\u62b2ar;\\u69cfqual;\\u62b4p\\u0180DTV\\u0937\\u0942\\u094cownVector;\\u6951eeVector;\\u6960ector\\u0100;B\\u0956\\u0957\\u61bfar;\\u6958ector\\u0100;B\\u0965\\u0966\\u61bcar;\\u6952ight\\xe1\\u039cs\\u0300EFGLST\\u097e\\u098b\\u0995\\u099d\\u09a2\\u09adqualGreater;\\u62daullEqual;\\u6266reater;\\u6276ess;\\u6aa1lantEqual;\\u6a7dilde;\\u6272r;\\uc000\\ud835\\udd0f\\u0100;e\\u09bd\\u09be\\u62d8ftarrow;\\u61daidot;\\u413f\\u0180npw\\u09d4\\u0a16\\u0a1bg\\u0200LRlr\\u09de\\u09f7\\u0a02\\u0a10eft\\u0100AR\\u09e6\\u09ecrrow;\\u67f5ightArrow;\\u67f7ightArrow;\\u67f6eft\\u0100ar\\u03b3\\u0a0aight\\xe1\\u03bfight\\xe1\\u03caf;\\uc000\\ud835\\udd43er\\u0100LR\\u0a22\\u0a2ceftArrow;\\u6199ightArrow;\\u6198\\u0180cht\\u0a3e\\u0a40\\u0a42\\xf2\\u084c;\\u61b0rok;\\u4141;\\u626a\\u0400acefiosu\\u0a5a\\u0a5d\\u0a60\\u0a77\\u0a7c\\u0a85\\u0a8b\\u0a8ep;\\u6905y;\\u441c\\u0100dl\\u0a65\\u0a6fiumSpace;\\u605flintrf;\\u6133r;\\uc000\\ud835\\udd10nusPlus;\\u6213pf;\\uc000\\ud835\\udd44c\\xf2\\u0a76;\\u439c\\u0480Jacefostu\\u0aa3\\u0aa7\\u0aad\\u0ac0\\u0b14\\u0b19\\u0d91\\u0d97\\u0d9ecy;\\u440acute;\\u4143\\u0180aey\\u0ab4\\u0ab9\\u0aberon;\\u4147dil;\\u4145;\\u441d\\u0180gsw\\u0ac7\\u0af0\\u0b0eative\\u0180MTV\\u0ad3\\u0adf\\u0ae8ediumSpace;\\u600bhi\\u0100cn\\u0ae6\\u0ad8\\xeb\\u0ad9eryThi\\xee\\u0ad9ted\\u0100GL\\u0af8\\u0b06reaterGreate\\xf2\\u0673essLes\\xf3\\u0a48Line;\\u400ar;\\uc000\\ud835\\udd11\\u0200Bnpt\\u0b22\\u0b28\\u0b37\\u0b3areak;\\u6060BreakingSpace;\\u40a0f;\\u6115\\u0680;CDEGHLNPRSTV\\u0b55\\u0b56\\u0b6a\\u0b7c\\u0ba1\\u0beb\\u0c04\\u0c5e\\u0c84\\u0ca6\\u0cd8\\u0d61\\u0d85\\u6aec\\u0100ou\\u0b5b\\u0b64ngruent;\\u6262pCap;\\u626doubleVerticalBar;\\u6226\\u0180lqx\\u0b83\\u0b8a\\u0b9bement;\\u6209ual\\u0100;T\\u0b92\\u0b93\\u6260ilde;\\uc000\\u2242\\u0338ists;\\u6204reater\\u0380;EFGLST\\u0bb6\\u0bb7\\u0bbd\\u0bc9\\u0bd3\\u0bd8\\u0be5\\u626fqual;\\u6271ullEqual;\\uc000\\u2267\\u0338reater;\\uc000\\u226b\\u0338ess;\\u6279lantEqual;\\uc000\\u2a7e\\u0338ilde;\\u6275ump\\u0144\\u0bf2\\u0bfdownHump;\\uc000\\u224e\\u0338qual;\\uc000\\u224f\\u0338e\\u0100fs\\u0c0a\\u0c27tTriangle\\u0180;BE\\u0c1a\\u0c1b\\u0c21\\u62eaar;\\uc000\\u29cf\\u0338qual;\\u62ecs\\u0300;EGLST\\u0c35\\u0c36\\u0c3c\\u0c44\\u0c4b\\u0c58\\u626equal;\\u6270reater;\\u6278ess;\\uc000\\u226a\\u0338lantEqual;\\uc000\\u2a7d\\u0338ilde;\\u6274ested\\u0100GL\\u0c68\\u0c79reaterGreater;\\uc000\\u2aa2\\u0338essLess;\\uc000\\u2aa1\\u0338recedes\\u0180;ES\\u0c92\\u0c93\\u0c9b\\u6280qual;\\uc000\\u2aaf\\u0338lantEqual;\\u62e0\\u0100ei\\u0cab\\u0cb9verseElement;\\u620cghtTriangle\\u0180;BE\\u0ccb\\u0ccc\\u0cd2\\u62ebar;\\uc000\\u29d0\\u0338qual;\\u62ed\\u0100qu\\u0cdd\\u0d0cuareSu\\u0100bp\\u0ce8\\u0cf9set\\u0100;E\\u0cf0\\u0cf3\\uc000\\u228f\\u0338qual;\\u62e2erset\\u0100;E\\u0d03\\u0d06\\uc000\\u2290\\u0338qual;\\u62e3\\u0180bcp\\u0d13\\u0d24\\u0d4eset\\u0100;E\\u0d1b\\u0d1e\\uc000\\u2282\\u20d2qual;\\u6288ceeds\\u0200;EST\\u0d32\\u0d33\\u0d3b\\u0d46\\u6281qual;\\uc000\\u2ab0\\u0338lantEqual;\\u62e1ilde;\\uc000\\u227f\\u0338erset\\u0100;E\\u0d58\\u0d5b\\uc000\\u2283\\u20d2qual;\\u6289ilde\\u0200;EFT\\u0d6e\\u0d6f\\u0d75\\u0d7f\\u6241qual;\\u6244ullEqual;\\u6247ilde;\\u6249erticalBar;\\u6224cr;\\uc000\\ud835\\udca9ilde\\u803b\\xd1\\u40d1;\\u439d\\u0700Eacdfgmoprstuv\\u0dbd\\u0dc2\\u0dc9\\u0dd5\\u0ddb\\u0de0\\u0de7\\u0dfc\\u0e02\\u0e20\\u0e22\\u0e32\\u0e3f\\u0e44lig;\\u4152cute\\u803b\\xd3\\u40d3\\u0100iy\\u0dce\\u0dd3rc\\u803b\\xd4\\u40d4;\\u441eblac;\\u4150r;\\uc000\\ud835\\udd12rave\\u803b\\xd2\\u40d2\\u0180aei\\u0dee\\u0df2\\u0df6cr;\\u414cga;\\u43a9cron;\\u439fpf;\\uc000\\ud835\\udd46enCurly\\u0100DQ\\u0e0e\\u0e1aoubleQuote;\\u601cuote;\\u6018;\\u6a54\\u0100cl\\u0e27\\u0e2cr;\\uc000\\ud835\\udcaaash\\u803b\\xd8\\u40d8i\\u016c\\u0e37\\u0e3cde\\u803b\\xd5\\u40d5es;\\u6a37ml\\u803b\\xd6\\u40d6er\\u0100BP\\u0e4b\\u0e60\\u0100ar\\u0e50\\u0e53r;\\u603eac\\u0100ek\\u0e5a\\u0e5c;\\u63deet;\\u63b4arenthesis;\\u63dc\\u0480acfhilors\\u0e7f\\u0e87\\u0e8a\\u0e8f\\u0e92\\u0e94\\u0e9d\\u0eb0\\u0efcrtialD;\\u6202y;\\u441fr;\\uc000\\ud835\\udd13i;\\u43a6;\\u43a0usMinus;\\u40b1\\u0100ip\\u0ea2\\u0eadncareplan\\xe5\\u069df;\\u6119\\u0200;eio\\u0eb9\\u0eba\\u0ee0\\u0ee4\\u6abbcedes\\u0200;EST\\u0ec8\\u0ec9\\u0ecf\\u0eda\\u627aqual;\\u6aaflantEqual;\\u627cilde;\\u627eme;\\u6033\\u0100dp\\u0ee9\\u0eeeuct;\\u620fortion\\u0100;a\\u0225\\u0ef9l;\\u621d\\u0100ci\\u0f01\\u0f06r;\\uc000\\ud835\\udcab;\\u43a8\\u0200Ufos\\u0f11\\u0f16\\u0f1b\\u0f1fOT\\u803b\\\"\\u4022r;\\uc000\\ud835\\udd14pf;\\u611acr;\\uc000\\ud835\\udcac\\u0600BEacefhiorsu\\u0f3e\\u0f43\\u0f47\\u0f60\\u0f73\\u0fa7\\u0faa\\u0fad\\u1096\\u10a9\\u10b4\\u10bearr;\\u6910G\\u803b\\xae\\u40ae\\u0180cnr\\u0f4e\\u0f53\\u0f56ute;\\u4154g;\\u67ebr\\u0100;t\\u0f5c\\u0f5d\\u61a0l;\\u6916\\u0180aey\\u0f67\\u0f6c\\u0f71ron;\\u4158dil;\\u4156;\\u4420\\u0100;v\\u0f78\\u0f79\\u611cerse\\u0100EU\\u0f82\\u0f99\\u0100lq\\u0f87\\u0f8eement;\\u620builibrium;\\u61cbpEquilibrium;\\u696fr\\xbb\\u0f79o;\\u43a1ght\\u0400ACDFTUVa\\u0fc1\\u0feb\\u0ff3\\u1022\\u1028\\u105b\\u1087\\u03d8\\u0100nr\\u0fc6\\u0fd2gleBracket;\\u67e9row\\u0180;BL\\u0fdc\\u0fdd\\u0fe1\\u6192ar;\\u61e5eftArrow;\\u61c4eiling;\\u6309o\\u01f5\\u0ff9\\0\\u1005bleBracket;\\u67e7n\\u01d4\\u100a\\0\\u1014eeVector;\\u695dector\\u0100;B\\u101d\\u101e\\u61c2ar;\\u6955loor;\\u630b\\u0100er\\u102d\\u1043e\\u0180;AV\\u1035\\u1036\\u103c\\u62a2rrow;\\u61a6ector;\\u695biangle\\u0180;BE\\u1050\\u1051\\u1055\\u62b3ar;\\u69d0qual;\\u62b5p\\u0180DTV\\u1063\\u106e\\u1078ownVector;\\u694feeVector;\\u695cector\\u0100;B\\u1082\\u1083\\u61bear;\\u6954ector\\u0100;B\\u1091\\u1092\\u61c0ar;\\u6953\\u0100pu\\u109b\\u109ef;\\u611dndImplies;\\u6970ightarrow;\\u61db\\u0100ch\\u10b9\\u10bcr;\\u611b;\\u61b1leDelayed;\\u69f4\\u0680HOacfhimoqstu\\u10e4\\u10f1\\u10f7\\u10fd\\u1119\\u111e\\u1151\\u1156\\u1161\\u1167\\u11b5\\u11bb\\u11bf\\u0100Cc\\u10e9\\u10eeHcy;\\u4429y;\\u4428FTcy;\\u442ccute;\\u415a\\u0280;aeiy\\u1108\\u1109\\u110e\\u1113\\u1117\\u6abcron;\\u4160dil;\\u415erc;\\u415c;\\u4421r;\\uc000\\ud835\\udd16ort\\u0200DLRU\\u112a\\u1134\\u113e\\u1149ownArrow\\xbb\\u041eeftArrow\\xbb\\u089aightArrow\\xbb\\u0fddpArrow;\\u6191gma;\\u43a3allCircle;\\u6218pf;\\uc000\\ud835\\udd4a\\u0272\\u116d\\0\\0\\u1170t;\\u621aare\\u0200;ISU\\u117b\\u117c\\u1189\\u11af\\u65a1ntersection;\\u6293u\\u0100bp\\u118f\\u119eset\\u0100;E\\u1197\\u1198\\u628fqual;\\u6291erset\\u0100;E\\u11a8\\u11a9\\u6290qual;\\u6292nion;\\u6294cr;\\uc000\\ud835\\udcaear;\\u62c6\\u0200bcmp\\u11c8\\u11db\\u1209\\u120b\\u0100;s\\u11cd\\u11ce\\u62d0et\\u0100;E\\u11cd\\u11d5qual;\\u6286\\u0100ch\\u11e0\\u1205eeds\\u0200;EST\\u11ed\\u11ee\\u11f4\\u11ff\\u627bqual;\\u6ab0lantEqual;\\u627dilde;\\u627fTh\\xe1\\u0f8c;\\u6211\\u0180;es\\u1212\\u1213\\u1223\\u62d1rset\\u0100;E\\u121c\\u121d\\u6283qual;\\u6287et\\xbb\\u1213\\u0580HRSacfhiors\\u123e\\u1244\\u1249\\u1255\\u125e\\u1271\\u1276\\u129f\\u12c2\\u12c8\\u12d1ORN\\u803b\\xde\\u40deADE;\\u6122\\u0100Hc\\u124e\\u1252cy;\\u440by;\\u4426\\u0100bu\\u125a\\u125c;\\u4009;\\u43a4\\u0180aey\\u1265\\u126a\\u126fron;\\u4164dil;\\u4162;\\u4422r;\\uc000\\ud835\\udd17\\u0100ei\\u127b\\u1289\\u01f2\\u1280\\0\\u1287efore;\\u6234a;\\u4398\\u0100cn\\u128e\\u1298kSpace;\\uc000\\u205f\\u200aSpace;\\u6009lde\\u0200;EFT\\u12ab\\u12ac\\u12b2\\u12bc\\u623cqual;\\u6243ullEqual;\\u6245ilde;\\u6248pf;\\uc000\\ud835\\udd4bipleDot;\\u60db\\u0100ct\\u12d6\\u12dbr;\\uc000\\ud835\\udcafrok;\\u4166\\u0ae1\\u12f7\\u130e\\u131a\\u1326\\0\\u132c\\u1331\\0\\0\\0\\0\\0\\u1338\\u133d\\u1377\\u1385\\0\\u13ff\\u1404\\u140a\\u1410\\u0100cr\\u12fb\\u1301ute\\u803b\\xda\\u40dar\\u0100;o\\u1307\\u1308\\u619fcir;\\u6949r\\u01e3\\u1313\\0\\u1316y;\\u440eve;\\u416c\\u0100iy\\u131e\\u1323rc\\u803b\\xdb\\u40db;\\u4423blac;\\u4170r;\\uc000\\ud835\\udd18rave\\u803b\\xd9\\u40d9acr;\\u416a\\u0100di\\u1341\\u1369er\\u0100BP\\u1348\\u135d\\u0100ar\\u134d\\u1350r;\\u405fac\\u0100ek\\u1357\\u1359;\\u63dfet;\\u63b5arenthesis;\\u63ddon\\u0100;P\\u1370\\u1371\\u62c3lus;\\u628e\\u0100gp\\u137b\\u137fon;\\u4172f;\\uc000\\ud835\\udd4c\\u0400ADETadps\\u1395\\u13ae\\u13b8\\u13c4\\u03e8\\u13d2\\u13d7\\u13f3rrow\\u0180;BD\\u1150\\u13a0\\u13a4ar;\\u6912ownArrow;\\u61c5ownArrow;\\u6195quilibrium;\\u696eee\\u0100;A\\u13cb\\u13cc\\u62a5rrow;\\u61a5own\\xe1\\u03f3er\\u0100LR\\u13de\\u13e8eftArrow;\\u6196ightArrow;\\u6197i\\u0100;l\\u13f9\\u13fa\\u43d2on;\\u43a5ing;\\u416ecr;\\uc000\\ud835\\udcb0ilde;\\u4168ml\\u803b\\xdc\\u40dc\\u0480Dbcdefosv\\u1427\\u142c\\u1430\\u1433\\u143e\\u1485\\u148a\\u1490\\u1496ash;\\u62abar;\\u6aeby;\\u4412ash\\u0100;l\\u143b\\u143c\\u62a9;\\u6ae6\\u0100er\\u1443\\u1445;\\u62c1\\u0180bty\\u144c\\u1450\\u147aar;\\u6016\\u0100;i\\u144f\\u1455cal\\u0200BLST\\u1461\\u1465\\u146a\\u1474ar;\\u6223ine;\\u407ceparator;\\u6758ilde;\\u6240ThinSpace;\\u600ar;\\uc000\\ud835\\udd19pf;\\uc000\\ud835\\udd4dcr;\\uc000\\ud835\\udcb1dash;\\u62aa\\u0280cefos\\u14a7\\u14ac\\u14b1\\u14b6\\u14bcirc;\\u4174dge;\\u62c0r;\\uc000\\ud835\\udd1apf;\\uc000\\ud835\\udd4ecr;\\uc000\\ud835\\udcb2\\u0200fios\\u14cb\\u14d0\\u14d2\\u14d8r;\\uc000\\ud835\\udd1b;\\u439epf;\\uc000\\ud835\\udd4fcr;\\uc000\\ud835\\udcb3\\u0480AIUacfosu\\u14f1\\u14f5\\u14f9\\u14fd\\u1504\\u150f\\u1514\\u151a\\u1520cy;\\u442fcy;\\u4407cy;\\u442ecute\\u803b\\xdd\\u40dd\\u0100iy\\u1509\\u150drc;\\u4176;\\u442br;\\uc000\\ud835\\udd1cpf;\\uc000\\ud835\\udd50cr;\\uc000\\ud835\\udcb4ml;\\u4178\\u0400Hacdefos\\u1535\\u1539\\u153f\\u154b\\u154f\\u155d\\u1560\\u1564cy;\\u4416cute;\\u4179\\u0100ay\\u1544\\u1549ron;\\u417d;\\u4417ot;\\u417b\\u01f2\\u1554\\0\\u155boWidt\\xe8\\u0ad9a;\\u4396r;\\u6128pf;\\u6124cr;\\uc000\\ud835\\udcb5\\u0be1\\u1583\\u158a\\u1590\\0\\u15b0\\u15b6\\u15bf\\0\\0\\0\\0\\u15c6\\u15db\\u15eb\\u165f\\u166d\\0\\u1695\\u169b\\u16b2\\u16b9\\0\\u16becute\\u803b\\xe1\\u40e1reve;\\u4103\\u0300;Ediuy\\u159c\\u159d\\u15a1\\u15a3\\u15a8\\u15ad\\u623e;\\uc000\\u223e\\u0333;\\u623frc\\u803b\\xe2\\u40e2te\\u80bb\\xb4\\u0306;\\u4430lig\\u803b\\xe6\\u40e6\\u0100;r\\xb2\\u15ba;\\uc000\\ud835\\udd1erave\\u803b\\xe0\\u40e0\\u0100ep\\u15ca\\u15d6\\u0100fp\\u15cf\\u15d4sym;\\u6135\\xe8\\u15d3ha;\\u43b1\\u0100ap\\u15dfc\\u0100cl\\u15e4\\u15e7r;\\u4101g;\\u6a3f\\u0264\\u15f0\\0\\0\\u160a\\u0280;adsv\\u15fa\\u15fb\\u15ff\\u1601\\u1607\\u6227nd;\\u6a55;\\u6a5clope;\\u6a58;\\u6a5a\\u0380;elmrsz\\u1618\\u1619\\u161b\\u161e\\u163f\\u164f\\u1659\\u6220;\\u69a4e\\xbb\\u1619sd\\u0100;a\\u1625\\u1626\\u6221\\u0461\\u1630\\u1632\\u1634\\u1636\\u1638\\u163a\\u163c\\u163e;\\u69a8;\\u69a9;\\u69aa;\\u69ab;\\u69ac;\\u69ad;\\u69ae;\\u69aft\\u0100;v\\u1645\\u1646\\u621fb\\u0100;d\\u164c\\u164d\\u62be;\\u699d\\u0100pt\\u1654\\u1657h;\\u6222\\xbb\\xb9arr;\\u637c\\u0100gp\\u1663\\u1667on;\\u4105f;\\uc000\\ud835\\udd52\\u0380;Eaeiop\\u12c1\\u167b\\u167d\\u1682\\u1684\\u1687\\u168a;\\u6a70cir;\\u6a6f;\\u624ad;\\u624bs;\\u4027rox\\u0100;e\\u12c1\\u1692\\xf1\\u1683ing\\u803b\\xe5\\u40e5\\u0180cty\\u16a1\\u16a6\\u16a8r;\\uc000\\ud835\\udcb6;\\u402amp\\u0100;e\\u12c1\\u16af\\xf1\\u0288ilde\\u803b\\xe3\\u40e3ml\\u803b\\xe4\\u40e4\\u0100ci\\u16c2\\u16c8onin\\xf4\\u0272nt;\\u6a11\\u0800Nabcdefiklnoprsu\\u16ed\\u16f1\\u1730\\u173c\\u1743\\u1748\\u1778\\u177d\\u17e0\\u17e6\\u1839\\u1850\\u170d\\u193d\\u1948\\u1970ot;\\u6aed\\u0100cr\\u16f6\\u171ek\\u0200ceps\\u1700\\u1705\\u170d\\u1713ong;\\u624cpsilon;\\u43f6rime;\\u6035im\\u0100;e\\u171a\\u171b\\u623dq;\\u62cd\\u0176\\u1722\\u1726ee;\\u62bded\\u0100;g\\u172c\\u172d\\u6305e\\xbb\\u172drk\\u0100;t\\u135c\\u1737brk;\\u63b6\\u0100oy\\u1701\\u1741;\\u4431quo;\\u601e\\u0280cmprt\\u1753\\u175b\\u1761\\u1764\\u1768aus\\u0100;e\\u010a\\u0109ptyv;\\u69b0s\\xe9\\u170cno\\xf5\\u0113\\u0180ahw\\u176f\\u1771\\u1773;\\u43b2;\\u6136een;\\u626cr;\\uc000\\ud835\\udd1fg\\u0380costuvw\\u178d\\u179d\\u17b3\\u17c1\\u17d5\\u17db\\u17de\\u0180aiu\\u1794\\u1796\\u179a\\xf0\\u0760rc;\\u65efp\\xbb\\u1371\\u0180dpt\\u17a4\\u17a8\\u17adot;\\u6a00lus;\\u6a01imes;\\u6a02\\u0271\\u17b9\\0\\0\\u17becup;\\u6a06ar;\\u6605riangle\\u0100du\\u17cd\\u17d2own;\\u65bdp;\\u65b3plus;\\u6a04e\\xe5\\u1444\\xe5\\u14adarow;\\u690d\\u0180ako\\u17ed\\u1826\\u1835\\u0100cn\\u17f2\\u1823k\\u0180lst\\u17fa\\u05ab\\u1802ozenge;\\u69ebriangle\\u0200;dlr\\u1812\\u1813\\u1818\\u181d\\u65b4own;\\u65beeft;\\u65c2ight;\\u65b8k;\\u6423\\u01b1\\u182b\\0\\u1833\\u01b2\\u182f\\0\\u1831;\\u6592;\\u65914;\\u6593ck;\\u6588\\u0100eo\\u183e\\u184d\\u0100;q\\u1843\\u1846\\uc000=\\u20e5uiv;\\uc000\\u2261\\u20e5t;\\u6310\\u0200ptwx\\u1859\\u185e\\u1867\\u186cf;\\uc000\\ud835\\udd53\\u0100;t\\u13cb\\u1863om\\xbb\\u13cctie;\\u62c8\\u0600DHUVbdhmptuv\\u1885\\u1896\\u18aa\\u18bb\\u18d7\\u18db\\u18ec\\u18ff\\u1905\\u190a\\u1910\\u1921\\u0200LRlr\\u188e\\u1890\\u1892\\u1894;\\u6557;\\u6554;\\u6556;\\u6553\\u0280;DUdu\\u18a1\\u18a2\\u18a4\\u18a6\\u18a8\\u6550;\\u6566;\\u6569;\\u6564;\\u6567\\u0200LRlr\\u18b3\\u18b5\\u18b7\\u18b9;\\u655d;\\u655a;\\u655c;\\u6559\\u0380;HLRhlr\\u18ca\\u18cb\\u18cd\\u18cf\\u18d1\\u18d3\\u18d5\\u6551;\\u656c;\\u6563;\\u6560;\\u656b;\\u6562;\\u655fox;\\u69c9\\u0200LRlr\\u18e4\\u18e6\\u18e8\\u18ea;\\u6555;\\u6552;\\u6510;\\u650c\\u0280;DUdu\\u06bd\\u18f7\\u18f9\\u18fb\\u18fd;\\u6565;\\u6568;\\u652c;\\u6534inus;\\u629flus;\\u629eimes;\\u62a0\\u0200LRlr\\u1919\\u191b\\u191d\\u191f;\\u655b;\\u6558;\\u6518;\\u6514\\u0380;HLRhlr\\u1930\\u1931\\u1933\\u1935\\u1937\\u1939\\u193b\\u6502;\\u656a;\\u6561;\\u655e;\\u653c;\\u6524;\\u651c\\u0100ev\\u0123\\u1942bar\\u803b\\xa6\\u40a6\\u0200ceio\\u1951\\u1956\\u195a\\u1960r;\\uc000\\ud835\\udcb7mi;\\u604fm\\u0100;e\\u171a\\u171cl\\u0180;bh\\u1968\\u1969\\u196b\\u405c;\\u69c5sub;\\u67c8\\u016c\\u1974\\u197el\\u0100;e\\u1979\\u197a\\u6022t\\xbb\\u197ap\\u0180;Ee\\u012f\\u1985\\u1987;\\u6aae\\u0100;q\\u06dc\\u06db\\u0ce1\\u19a7\\0\\u19e8\\u1a11\\u1a15\\u1a32\\0\\u1a37\\u1a50\\0\\0\\u1ab4\\0\\0\\u1ac1\\0\\0\\u1b21\\u1b2e\\u1b4d\\u1b52\\0\\u1bfd\\0\\u1c0c\\u0180cpr\\u19ad\\u19b2\\u19ddute;\\u4107\\u0300;abcds\\u19bf\\u19c0\\u19c4\\u19ca\\u19d5\\u19d9\\u6229nd;\\u6a44rcup;\\u6a49\\u0100au\\u19cf\\u19d2p;\\u6a4bp;\\u6a47ot;\\u6a40;\\uc000\\u2229\\ufe00\\u0100eo\\u19e2\\u19e5t;\\u6041\\xee\\u0693\\u0200aeiu\\u19f0\\u19fb\\u1a01\\u1a05\\u01f0\\u19f5\\0\\u19f8s;\\u6a4don;\\u410ddil\\u803b\\xe7\\u40e7rc;\\u4109ps\\u0100;s\\u1a0c\\u1a0d\\u6a4cm;\\u6a50ot;\\u410b\\u0180dmn\\u1a1b\\u1a20\\u1a26il\\u80bb\\xb8\\u01adptyv;\\u69b2t\\u8100\\xa2;e\\u1a2d\\u1a2e\\u40a2r\\xe4\\u01b2r;\\uc000\\ud835\\udd20\\u0180cei\\u1a3d\\u1a40\\u1a4dy;\\u4447ck\\u0100;m\\u1a47\\u1a48\\u6713ark\\xbb\\u1a48;\\u43c7r\\u0380;Ecefms\\u1a5f\\u1a60\\u1a62\\u1a6b\\u1aa4\\u1aaa\\u1aae\\u65cb;\\u69c3\\u0180;el\\u1a69\\u1a6a\\u1a6d\\u42c6q;\\u6257e\\u0261\\u1a74\\0\\0\\u1a88rrow\\u0100lr\\u1a7c\\u1a81eft;\\u61baight;\\u61bb\\u0280RSacd\\u1a92\\u1a94\\u1a96\\u1a9a\\u1a9f\\xbb\\u0f47;\\u64c8st;\\u629birc;\\u629aash;\\u629dnint;\\u6a10id;\\u6aefcir;\\u69c2ubs\\u0100;u\\u1abb\\u1abc\\u6663it\\xbb\\u1abc\\u02ec\\u1ac7\\u1ad4\\u1afa\\0\\u1b0aon\\u0100;e\\u1acd\\u1ace\\u403a\\u0100;q\\xc7\\xc6\\u026d\\u1ad9\\0\\0\\u1ae2a\\u0100;t\\u1ade\\u1adf\\u402c;\\u4040\\u0180;fl\\u1ae8\\u1ae9\\u1aeb\\u6201\\xee\\u1160e\\u0100mx\\u1af1\\u1af6ent\\xbb\\u1ae9e\\xf3\\u024d\\u01e7\\u1afe\\0\\u1b07\\u0100;d\\u12bb\\u1b02ot;\\u6a6dn\\xf4\\u0246\\u0180fry\\u1b10\\u1b14\\u1b17;\\uc000\\ud835\\udd54o\\xe4\\u0254\\u8100\\xa9;s\\u0155\\u1b1dr;\\u6117\\u0100ao\\u1b25\\u1b29rr;\\u61b5ss;\\u6717\\u0100cu\\u1b32\\u1b37r;\\uc000\\ud835\\udcb8\\u0100bp\\u1b3c\\u1b44\\u0100;e\\u1b41\\u1b42\\u6acf;\\u6ad1\\u0100;e\\u1b49\\u1b4a\\u6ad0;\\u6ad2dot;\\u62ef\\u0380delprvw\\u1b60\\u1b6c\\u1b77\\u1b82\\u1bac\\u1bd4\\u1bf9arr\\u0100lr\\u1b68\\u1b6a;\\u6938;\\u6935\\u0270\\u1b72\\0\\0\\u1b75r;\\u62dec;\\u62dfarr\\u0100;p\\u1b7f\\u1b80\\u61b6;\\u693d\\u0300;bcdos\\u1b8f\\u1b90\\u1b96\\u1ba1\\u1ba5\\u1ba8\\u622arcap;\\u6a48\\u0100au\\u1b9b\\u1b9ep;\\u6a46p;\\u6a4aot;\\u628dr;\\u6a45;\\uc000\\u222a\\ufe00\\u0200alrv\\u1bb5\\u1bbf\\u1bde\\u1be3rr\\u0100;m\\u1bbc\\u1bbd\\u61b7;\\u693cy\\u0180evw\\u1bc7\\u1bd4\\u1bd8q\\u0270\\u1bce\\0\\0\\u1bd2re\\xe3\\u1b73u\\xe3\\u1b75ee;\\u62ceedge;\\u62cfen\\u803b\\xa4\\u40a4earrow\\u0100lr\\u1bee\\u1bf3eft\\xbb\\u1b80ight\\xbb\\u1bbde\\xe4\\u1bdd\\u0100ci\\u1c01\\u1c07onin\\xf4\\u01f7nt;\\u6231lcty;\\u632d\\u0980AHabcdefhijlorstuwz\\u1c38\\u1c3b\\u1c3f\\u1c5d\\u1c69\\u1c75\\u1c8a\\u1c9e\\u1cac\\u1cb7\\u1cfb\\u1cff\\u1d0d\\u1d7b\\u1d91\\u1dab\\u1dbb\\u1dc6\\u1dcdr\\xf2\\u0381ar;\\u6965\\u0200glrs\\u1c48\\u1c4d\\u1c52\\u1c54ger;\\u6020eth;\\u6138\\xf2\\u1133h\\u0100;v\\u1c5a\\u1c5b\\u6010\\xbb\\u090a\\u016b\\u1c61\\u1c67arow;\\u690fa\\xe3\\u0315\\u0100ay\\u1c6e\\u1c73ron;\\u410f;\\u4434\\u0180;ao\\u0332\\u1c7c\\u1c84\\u0100gr\\u02bf\\u1c81r;\\u61catseq;\\u6a77\\u0180glm\\u1c91\\u1c94\\u1c98\\u803b\\xb0\\u40b0ta;\\u43b4ptyv;\\u69b1\\u0100ir\\u1ca3\\u1ca8sht;\\u697f;\\uc000\\ud835\\udd21ar\\u0100lr\\u1cb3\\u1cb5\\xbb\\u08dc\\xbb\\u101e\\u0280aegsv\\u1cc2\\u0378\\u1cd6\\u1cdc\\u1ce0m\\u0180;os\\u0326\\u1cca\\u1cd4nd\\u0100;s\\u0326\\u1cd1uit;\\u6666amma;\\u43ddin;\\u62f2\\u0180;io\\u1ce7\\u1ce8\\u1cf8\\u40f7de\\u8100\\xf7;o\\u1ce7\\u1cf0ntimes;\\u62c7n\\xf8\\u1cf7cy;\\u4452c\\u026f\\u1d06\\0\\0\\u1d0arn;\\u631eop;\\u630d\\u0280lptuw\\u1d18\\u1d1d\\u1d22\\u1d49\\u1d55lar;\\u4024f;\\uc000\\ud835\\udd55\\u0280;emps\\u030b\\u1d2d\\u1d37\\u1d3d\\u1d42q\\u0100;d\\u0352\\u1d33ot;\\u6251inus;\\u6238lus;\\u6214quare;\\u62a1blebarwedg\\xe5\\xfan\\u0180adh\\u112e\\u1d5d\\u1d67ownarrow\\xf3\\u1c83arpoon\\u0100lr\\u1d72\\u1d76ef\\xf4\\u1cb4igh\\xf4\\u1cb6\\u0162\\u1d7f\\u1d85karo\\xf7\\u0f42\\u026f\\u1d8a\\0\\0\\u1d8ern;\\u631fop;\\u630c\\u0180cot\\u1d98\\u1da3\\u1da6\\u0100ry\\u1d9d\\u1da1;\\uc000\\ud835\\udcb9;\\u4455l;\\u69f6rok;\\u4111\\u0100dr\\u1db0\\u1db4ot;\\u62f1i\\u0100;f\\u1dba\\u1816\\u65bf\\u0100ah\\u1dc0\\u1dc3r\\xf2\\u0429a\\xf2\\u0fa6angle;\\u69a6\\u0100ci\\u1dd2\\u1dd5y;\\u445fgrarr;\\u67ff\\u0900Dacdefglmnopqrstux\\u1e01\\u1e09\\u1e19\\u1e38\\u0578\\u1e3c\\u1e49\\u1e61\\u1e7e\\u1ea5\\u1eaf\\u1ebd\\u1ee1\\u1f2a\\u1f37\\u1f44\\u1f4e\\u1f5a\\u0100Do\\u1e06\\u1d34o\\xf4\\u1c89\\u0100cs\\u1e0e\\u1e14ute\\u803b\\xe9\\u40e9ter;\\u6a6e\\u0200aioy\\u1e22\\u1e27\\u1e31\\u1e36ron;\\u411br\\u0100;c\\u1e2d\\u1e2e\\u6256\\u803b\\xea\\u40ealon;\\u6255;\\u444dot;\\u4117\\u0100Dr\\u1e41\\u1e45ot;\\u6252;\\uc000\\ud835\\udd22\\u0180;rs\\u1e50\\u1e51\\u1e57\\u6a9aave\\u803b\\xe8\\u40e8\\u0100;d\\u1e5c\\u1e5d\\u6a96ot;\\u6a98\\u0200;ils\\u1e6a\\u1e6b\\u1e72\\u1e74\\u6a99nters;\\u63e7;\\u6113\\u0100;d\\u1e79\\u1e7a\\u6a95ot;\\u6a97\\u0180aps\\u1e85\\u1e89\\u1e97cr;\\u4113ty\\u0180;sv\\u1e92\\u1e93\\u1e95\\u6205et\\xbb\\u1e93p\\u01001;\\u1e9d\\u1ea4\\u0133\\u1ea1\\u1ea3;\\u6004;\\u6005\\u6003\\u0100gs\\u1eaa\\u1eac;\\u414bp;\\u6002\\u0100gp\\u1eb4\\u1eb8on;\\u4119f;\\uc000\\ud835\\udd56\\u0180als\\u1ec4\\u1ece\\u1ed2r\\u0100;s\\u1eca\\u1ecb\\u62d5l;\\u69e3us;\\u6a71i\\u0180;lv\\u1eda\\u1edb\\u1edf\\u43b5on\\xbb\\u1edb;\\u43f5\\u0200csuv\\u1eea\\u1ef3\\u1f0b\\u1f23\\u0100io\\u1eef\\u1e31rc\\xbb\\u1e2e\\u0269\\u1ef9\\0\\0\\u1efb\\xed\\u0548ant\\u0100gl\\u1f02\\u1f06tr\\xbb\\u1e5dess\\xbb\\u1e7a\\u0180aei\\u1f12\\u1f16\\u1f1als;\\u403dst;\\u625fv\\u0100;D\\u0235\\u1f20D;\\u6a78parsl;\\u69e5\\u0100Da\\u1f2f\\u1f33ot;\\u6253rr;\\u6971\\u0180cdi\\u1f3e\\u1f41\\u1ef8r;\\u612fo\\xf4\\u0352\\u0100ah\\u1f49\\u1f4b;\\u43b7\\u803b\\xf0\\u40f0\\u0100mr\\u1f53\\u1f57l\\u803b\\xeb\\u40ebo;\\u60ac\\u0180cip\\u1f61\\u1f64\\u1f67l;\\u4021s\\xf4\\u056e\\u0100eo\\u1f6c\\u1f74ctatio\\xee\\u0559nential\\xe5\\u0579\\u09e1\\u1f92\\0\\u1f9e\\0\\u1fa1\\u1fa7\\0\\0\\u1fc6\\u1fcc\\0\\u1fd3\\0\\u1fe6\\u1fea\\u2000\\0\\u2008\\u205allingdotse\\xf1\\u1e44y;\\u4444male;\\u6640\\u0180ilr\\u1fad\\u1fb3\\u1fc1lig;\\u8000\\ufb03\\u0269\\u1fb9\\0\\0\\u1fbdg;\\u8000\\ufb00ig;\\u8000\\ufb04;\\uc000\\ud835\\udd23lig;\\u8000\\ufb01lig;\\uc000fj\\u0180alt\\u1fd9\\u1fdc\\u1fe1t;\\u666dig;\\u8000\\ufb02ns;\\u65b1of;\\u4192\\u01f0\\u1fee\\0\\u1ff3f;\\uc000\\ud835\\udd57\\u0100ak\\u05bf\\u1ff7\\u0100;v\\u1ffc\\u1ffd\\u62d4;\\u6ad9artint;\\u6a0d\\u0100ao\\u200c\\u2055\\u0100cs\\u2011\\u2052\\u03b1\\u201a\\u2030\\u2038\\u2045\\u2048\\0\\u2050\\u03b2\\u2022\\u2025\\u2027\\u202a\\u202c\\0\\u202e\\u803b\\xbd\\u40bd;\\u6153\\u803b\\xbc\\u40bc;\\u6155;\\u6159;\\u615b\\u01b3\\u2034\\0\\u2036;\\u6154;\\u6156\\u02b4\\u203e\\u2041\\0\\0\\u2043\\u803b\\xbe\\u40be;\\u6157;\\u615c5;\\u6158\\u01b6\\u204c\\0\\u204e;\\u615a;\\u615d8;\\u615el;\\u6044wn;\\u6322cr;\\uc000\\ud835\\udcbb\\u0880Eabcdefgijlnorstv\\u2082\\u2089\\u209f\\u20a5\\u20b0\\u20b4\\u20f0\\u20f5\\u20fa\\u20ff\\u2103\\u2112\\u2138\\u0317\\u213e\\u2152\\u219e\\u0100;l\\u064d\\u2087;\\u6a8c\\u0180cmp\\u2090\\u2095\\u209dute;\\u41f5ma\\u0100;d\\u209c\\u1cda\\u43b3;\\u6a86reve;\\u411f\\u0100iy\\u20aa\\u20aerc;\\u411d;\\u4433ot;\\u4121\\u0200;lqs\\u063e\\u0642\\u20bd\\u20c9\\u0180;qs\\u063e\\u064c\\u20c4lan\\xf4\\u0665\\u0200;cdl\\u0665\\u20d2\\u20d5\\u20e5c;\\u6aa9ot\\u0100;o\\u20dc\\u20dd\\u6a80\\u0100;l\\u20e2\\u20e3\\u6a82;\\u6a84\\u0100;e\\u20ea\\u20ed\\uc000\\u22db\\ufe00s;\\u6a94r;\\uc000\\ud835\\udd24\\u0100;g\\u0673\\u061bmel;\\u6137cy;\\u4453\\u0200;Eaj\\u065a\\u210c\\u210e\\u2110;\\u6a92;\\u6aa5;\\u6aa4\\u0200Eaes\\u211b\\u211d\\u2129\\u2134;\\u6269p\\u0100;p\\u2123\\u2124\\u6a8arox\\xbb\\u2124\\u0100;q\\u212e\\u212f\\u6a88\\u0100;q\\u212e\\u211bim;\\u62e7pf;\\uc000\\ud835\\udd58\\u0100ci\\u2143\\u2146r;\\u610am\\u0180;el\\u066b\\u214e\\u2150;\\u6a8e;\\u6a90\\u8300>;cdlqr\\u05ee\\u2160\\u216a\\u216e\\u2173\\u2179\\u0100ci\\u2165\\u2167;\\u6aa7r;\\u6a7aot;\\u62d7Par;\\u6995uest;\\u6a7c\\u0280adels\\u2184\\u216a\\u2190\\u0656\\u219b\\u01f0\\u2189\\0\\u218epro\\xf8\\u209er;\\u6978q\\u0100lq\\u063f\\u2196les\\xf3\\u2088i\\xed\\u066b\\u0100en\\u21a3\\u21adrtneqq;\\uc000\\u2269\\ufe00\\xc5\\u21aa\\u0500Aabcefkosy\\u21c4\\u21c7\\u21f1\\u21f5\\u21fa\\u2218\\u221d\\u222f\\u2268\\u227dr\\xf2\\u03a0\\u0200ilmr\\u21d0\\u21d4\\u21d7\\u21dbrs\\xf0\\u1484f\\xbb\\u2024il\\xf4\\u06a9\\u0100dr\\u21e0\\u21e4cy;\\u444a\\u0180;cw\\u08f4\\u21eb\\u21efir;\\u6948;\\u61adar;\\u610firc;\\u4125\\u0180alr\\u2201\\u220e\\u2213rts\\u0100;u\\u2209\\u220a\\u6665it\\xbb\\u220alip;\\u6026con;\\u62b9r;\\uc000\\ud835\\udd25s\\u0100ew\\u2223\\u2229arow;\\u6925arow;\\u6926\\u0280amopr\\u223a\\u223e\\u2243\\u225e\\u2263rr;\\u61fftht;\\u623bk\\u0100lr\\u2249\\u2253eftarrow;\\u61a9ightarrow;\\u61aaf;\\uc000\\ud835\\udd59bar;\\u6015\\u0180clt\\u226f\\u2274\\u2278r;\\uc000\\ud835\\udcbdas\\xe8\\u21f4rok;\\u4127\\u0100bp\\u2282\\u2287ull;\\u6043hen\\xbb\\u1c5b\\u0ae1\\u22a3\\0\\u22aa\\0\\u22b8\\u22c5\\u22ce\\0\\u22d5\\u22f3\\0\\0\\u22f8\\u2322\\u2367\\u2362\\u237f\\0\\u2386\\u23aa\\u23b4cute\\u803b\\xed\\u40ed\\u0180;iy\\u0771\\u22b0\\u22b5rc\\u803b\\xee\\u40ee;\\u4438\\u0100cx\\u22bc\\u22bfy;\\u4435cl\\u803b\\xa1\\u40a1\\u0100fr\\u039f\\u22c9;\\uc000\\ud835\\udd26rave\\u803b\\xec\\u40ec\\u0200;ino\\u073e\\u22dd\\u22e9\\u22ee\\u0100in\\u22e2\\u22e6nt;\\u6a0ct;\\u622dfin;\\u69dcta;\\u6129lig;\\u4133\\u0180aop\\u22fe\\u231a\\u231d\\u0180cgt\\u2305\\u2308\\u2317r;\\u412b\\u0180elp\\u071f\\u230f\\u2313in\\xe5\\u078ear\\xf4\\u0720h;\\u4131f;\\u62b7ed;\\u41b5\\u0280;cfot\\u04f4\\u232c\\u2331\\u233d\\u2341are;\\u6105in\\u0100;t\\u2338\\u2339\\u621eie;\\u69dddo\\xf4\\u2319\\u0280;celp\\u0757\\u234c\\u2350\\u235b\\u2361al;\\u62ba\\u0100gr\\u2355\\u2359er\\xf3\\u1563\\xe3\\u234darhk;\\u6a17rod;\\u6a3c\\u0200cgpt\\u236f\\u2372\\u2376\\u237by;\\u4451on;\\u412ff;\\uc000\\ud835\\udd5aa;\\u43b9uest\\u803b\\xbf\\u40bf\\u0100ci\\u238a\\u238fr;\\uc000\\ud835\\udcben\\u0280;Edsv\\u04f4\\u239b\\u239d\\u23a1\\u04f3;\\u62f9ot;\\u62f5\\u0100;v\\u23a6\\u23a7\\u62f4;\\u62f3\\u0100;i\\u0777\\u23aelde;\\u4129\\u01eb\\u23b8\\0\\u23bccy;\\u4456l\\u803b\\xef\\u40ef\\u0300cfmosu\\u23cc\\u23d7\\u23dc\\u23e1\\u23e7\\u23f5\\u0100iy\\u23d1\\u23d5rc;\\u4135;\\u4439r;\\uc000\\ud835\\udd27ath;\\u4237pf;\\uc000\\ud835\\udd5b\\u01e3\\u23ec\\0\\u23f1r;\\uc000\\ud835\\udcbfrcy;\\u4458kcy;\\u4454\\u0400acfghjos\\u240b\\u2416\\u2422\\u2427\\u242d\\u2431\\u2435\\u243bppa\\u0100;v\\u2413\\u2414\\u43ba;\\u43f0\\u0100ey\\u241b\\u2420dil;\\u4137;\\u443ar;\\uc000\\ud835\\udd28reen;\\u4138cy;\\u4445cy;\\u445cpf;\\uc000\\ud835\\udd5ccr;\\uc000\\ud835\\udcc0\\u0b80ABEHabcdefghjlmnoprstuv\\u2470\\u2481\\u2486\\u248d\\u2491\\u250e\\u253d\\u255a\\u2580\\u264e\\u265e\\u2665\\u2679\\u267d\\u269a\\u26b2\\u26d8\\u275d\\u2768\\u278b\\u27c0\\u2801\\u2812\\u0180art\\u2477\\u247a\\u247cr\\xf2\\u09c6\\xf2\\u0395ail;\\u691barr;\\u690e\\u0100;g\\u0994\\u248b;\\u6a8bar;\\u6962\\u0963\\u24a5\\0\\u24aa\\0\\u24b1\\0\\0\\0\\0\\0\\u24b5\\u24ba\\0\\u24c6\\u24c8\\u24cd\\0\\u24f9ute;\\u413amptyv;\\u69b4ra\\xee\\u084cbda;\\u43bbg\\u0180;dl\\u088e\\u24c1\\u24c3;\\u6991\\xe5\\u088e;\\u6a85uo\\u803b\\xab\\u40abr\\u0400;bfhlpst\\u0899\\u24de\\u24e6\\u24e9\\u24eb\\u24ee\\u24f1\\u24f5\\u0100;f\\u089d\\u24e3s;\\u691fs;\\u691d\\xeb\\u2252p;\\u61abl;\\u6939im;\\u6973l;\\u61a2\\u0180;ae\\u24ff\\u2500\\u2504\\u6aabil;\\u6919\\u0100;s\\u2509\\u250a\\u6aad;\\uc000\\u2aad\\ufe00\\u0180abr\\u2515\\u2519\\u251drr;\\u690crk;\\u6772\\u0100ak\\u2522\\u252cc\\u0100ek\\u2528\\u252a;\\u407b;\\u405b\\u0100es\\u2531\\u2533;\\u698bl\\u0100du\\u2539\\u253b;\\u698f;\\u698d\\u0200aeuy\\u2546\\u254b\\u2556\\u2558ron;\\u413e\\u0100di\\u2550\\u2554il;\\u413c\\xec\\u08b0\\xe2\\u2529;\\u443b\\u0200cqrs\\u2563\\u2566\\u256d\\u257da;\\u6936uo\\u0100;r\\u0e19\\u1746\\u0100du\\u2572\\u2577har;\\u6967shar;\\u694bh;\\u61b2\\u0280;fgqs\\u258b\\u258c\\u0989\\u25f3\\u25ff\\u6264t\\u0280ahlrt\\u2598\\u25a4\\u25b7\\u25c2\\u25e8rrow\\u0100;t\\u0899\\u25a1a\\xe9\\u24f6arpoon\\u0100du\\u25af\\u25b4own\\xbb\\u045ap\\xbb\\u0966eftarrows;\\u61c7ight\\u0180ahs\\u25cd\\u25d6\\u25derrow\\u0100;s\\u08f4\\u08a7arpoon\\xf3\\u0f98quigarro\\xf7\\u21f0hreetimes;\\u62cb\\u0180;qs\\u258b\\u0993\\u25falan\\xf4\\u09ac\\u0280;cdgs\\u09ac\\u260a\\u260d\\u261d\\u2628c;\\u6aa8ot\\u0100;o\\u2614\\u2615\\u6a7f\\u0100;r\\u261a\\u261b\\u6a81;\\u6a83\\u0100;e\\u2622\\u2625\\uc000\\u22da\\ufe00s;\\u6a93\\u0280adegs\\u2633\\u2639\\u263d\\u2649\\u264bppro\\xf8\\u24c6ot;\\u62d6q\\u0100gq\\u2643\\u2645\\xf4\\u0989gt\\xf2\\u248c\\xf4\\u099bi\\xed\\u09b2\\u0180ilr\\u2655\\u08e1\\u265asht;\\u697c;\\uc000\\ud835\\udd29\\u0100;E\\u099c\\u2663;\\u6a91\\u0161\\u2669\\u2676r\\u0100du\\u25b2\\u266e\\u0100;l\\u0965\\u2673;\\u696alk;\\u6584cy;\\u4459\\u0280;acht\\u0a48\\u2688\\u268b\\u2691\\u2696r\\xf2\\u25c1orne\\xf2\\u1d08ard;\\u696bri;\\u65fa\\u0100io\\u269f\\u26a4dot;\\u4140ust\\u0100;a\\u26ac\\u26ad\\u63b0che\\xbb\\u26ad\\u0200Eaes\\u26bb\\u26bd\\u26c9\\u26d4;\\u6268p\\u0100;p\\u26c3\\u26c4\\u6a89rox\\xbb\\u26c4\\u0100;q\\u26ce\\u26cf\\u6a87\\u0100;q\\u26ce\\u26bbim;\\u62e6\\u0400abnoptwz\\u26e9\\u26f4\\u26f7\\u271a\\u272f\\u2741\\u2747\\u2750\\u0100nr\\u26ee\\u26f1g;\\u67ecr;\\u61fdr\\xeb\\u08c1g\\u0180lmr\\u26ff\\u270d\\u2714eft\\u0100ar\\u09e6\\u2707ight\\xe1\\u09f2apsto;\\u67fcight\\xe1\\u09fdparrow\\u0100lr\\u2725\\u2729ef\\xf4\\u24edight;\\u61ac\\u0180afl\\u2736\\u2739\\u273dr;\\u6985;\\uc000\\ud835\\udd5dus;\\u6a2dimes;\\u6a34\\u0161\\u274b\\u274fst;\\u6217\\xe1\\u134e\\u0180;ef\\u2757\\u2758\\u1800\\u65cange\\xbb\\u2758ar\\u0100;l\\u2764\\u2765\\u4028t;\\u6993\\u0280achmt\\u2773\\u2776\\u277c\\u2785\\u2787r\\xf2\\u08a8orne\\xf2\\u1d8car\\u0100;d\\u0f98\\u2783;\\u696d;\\u600eri;\\u62bf\\u0300achiqt\\u2798\\u279d\\u0a40\\u27a2\\u27ae\\u27bbquo;\\u6039r;\\uc000\\ud835\\udcc1m\\u0180;eg\\u09b2\\u27aa\\u27ac;\\u6a8d;\\u6a8f\\u0100bu\\u252a\\u27b3o\\u0100;r\\u0e1f\\u27b9;\\u601arok;\\u4142\\u8400<;cdhilqr\\u082b\\u27d2\\u2639\\u27dc\\u27e0\\u27e5\\u27ea\\u27f0\\u0100ci\\u27d7\\u27d9;\\u6aa6r;\\u6a79re\\xe5\\u25f2mes;\\u62c9arr;\\u6976uest;\\u6a7b\\u0100Pi\\u27f5\\u27f9ar;\\u6996\\u0180;ef\\u2800\\u092d\\u181b\\u65c3r\\u0100du\\u2807\\u280dshar;\\u694ahar;\\u6966\\u0100en\\u2817\\u2821rtneqq;\\uc000\\u2268\\ufe00\\xc5\\u281e\\u0700Dacdefhilnopsu\\u2840\\u2845\\u2882\\u288e\\u2893\\u28a0\\u28a5\\u28a8\\u28da\\u28e2\\u28e4\\u0a83\\u28f3\\u2902Dot;\\u623a\\u0200clpr\\u284e\\u2852\\u2863\\u287dr\\u803b\\xaf\\u40af\\u0100et\\u2857\\u2859;\\u6642\\u0100;e\\u285e\\u285f\\u6720se\\xbb\\u285f\\u0100;s\\u103b\\u2868to\\u0200;dlu\\u103b\\u2873\\u2877\\u287bow\\xee\\u048cef\\xf4\\u090f\\xf0\\u13d1ker;\\u65ae\\u0100oy\\u2887\\u288cmma;\\u6a29;\\u443cash;\\u6014asuredangle\\xbb\\u1626r;\\uc000\\ud835\\udd2ao;\\u6127\\u0180cdn\\u28af\\u28b4\\u28c9ro\\u803b\\xb5\\u40b5\\u0200;acd\\u1464\\u28bd\\u28c0\\u28c4s\\xf4\\u16a7ir;\\u6af0ot\\u80bb\\xb7\\u01b5us\\u0180;bd\\u28d2\\u1903\\u28d3\\u6212\\u0100;u\\u1d3c\\u28d8;\\u6a2a\\u0163\\u28de\\u28e1p;\\u6adb\\xf2\\u2212\\xf0\\u0a81\\u0100dp\\u28e9\\u28eeels;\\u62a7f;\\uc000\\ud835\\udd5e\\u0100ct\\u28f8\\u28fdr;\\uc000\\ud835\\udcc2pos\\xbb\\u159d\\u0180;lm\\u2909\\u290a\\u290d\\u43bctimap;\\u62b8\\u0c00GLRVabcdefghijlmoprstuvw\\u2942\\u2953\\u297e\\u2989\\u2998\\u29da\\u29e9\\u2a15\\u2a1a\\u2a58\\u2a5d\\u2a83\\u2a95\\u2aa4\\u2aa8\\u2b04\\u2b07\\u2b44\\u2b7f\\u2bae\\u2c34\\u2c67\\u2c7c\\u2ce9\\u0100gt\\u2947\\u294b;\\uc000\\u22d9\\u0338\\u0100;v\\u2950\\u0bcf\\uc000\\u226b\\u20d2\\u0180elt\\u295a\\u2972\\u2976ft\\u0100ar\\u2961\\u2967rrow;\\u61cdightarrow;\\u61ce;\\uc000\\u22d8\\u0338\\u0100;v\\u297b\\u0c47\\uc000\\u226a\\u20d2ightarrow;\\u61cf\\u0100Dd\\u298e\\u2993ash;\\u62afash;\\u62ae\\u0280bcnpt\\u29a3\\u29a7\\u29ac\\u29b1\\u29ccla\\xbb\\u02deute;\\u4144g;\\uc000\\u2220\\u20d2\\u0280;Eiop\\u0d84\\u29bc\\u29c0\\u29c5\\u29c8;\\uc000\\u2a70\\u0338d;\\uc000\\u224b\\u0338s;\\u4149ro\\xf8\\u0d84ur\\u0100;a\\u29d3\\u29d4\\u666el\\u0100;s\\u29d3\\u0b38\\u01f3\\u29df\\0\\u29e3p\\u80bb\\xa0\\u0b37mp\\u0100;e\\u0bf9\\u0c00\\u0280aeouy\\u29f4\\u29fe\\u2a03\\u2a10\\u2a13\\u01f0\\u29f9\\0\\u29fb;\\u6a43on;\\u4148dil;\\u4146ng\\u0100;d\\u0d7e\\u2a0aot;\\uc000\\u2a6d\\u0338p;\\u6a42;\\u443dash;\\u6013\\u0380;Aadqsx\\u0b92\\u2a29\\u2a2d\\u2a3b\\u2a41\\u2a45\\u2a50rr;\\u61d7r\\u0100hr\\u2a33\\u2a36k;\\u6924\\u0100;o\\u13f2\\u13f0ot;\\uc000\\u2250\\u0338ui\\xf6\\u0b63\\u0100ei\\u2a4a\\u2a4ear;\\u6928\\xed\\u0b98ist\\u0100;s\\u0ba0\\u0b9fr;\\uc000\\ud835\\udd2b\\u0200Eest\\u0bc5\\u2a66\\u2a79\\u2a7c\\u0180;qs\\u0bbc\\u2a6d\\u0be1\\u0180;qs\\u0bbc\\u0bc5\\u2a74lan\\xf4\\u0be2i\\xed\\u0bea\\u0100;r\\u0bb6\\u2a81\\xbb\\u0bb7\\u0180Aap\\u2a8a\\u2a8d\\u2a91r\\xf2\\u2971rr;\\u61aear;\\u6af2\\u0180;sv\\u0f8d\\u2a9c\\u0f8c\\u0100;d\\u2aa1\\u2aa2\\u62fc;\\u62facy;\\u445a\\u0380AEadest\\u2ab7\\u2aba\\u2abe\\u2ac2\\u2ac5\\u2af6\\u2af9r\\xf2\\u2966;\\uc000\\u2266\\u0338rr;\\u619ar;\\u6025\\u0200;fqs\\u0c3b\\u2ace\\u2ae3\\u2aeft\\u0100ar\\u2ad4\\u2ad9rro\\xf7\\u2ac1ightarro\\xf7\\u2a90\\u0180;qs\\u0c3b\\u2aba\\u2aealan\\xf4\\u0c55\\u0100;s\\u0c55\\u2af4\\xbb\\u0c36i\\xed\\u0c5d\\u0100;r\\u0c35\\u2afei\\u0100;e\\u0c1a\\u0c25i\\xe4\\u0d90\\u0100pt\\u2b0c\\u2b11f;\\uc000\\ud835\\udd5f\\u8180\\xac;in\\u2b19\\u2b1a\\u2b36\\u40acn\\u0200;Edv\\u0b89\\u2b24\\u2b28\\u2b2e;\\uc000\\u22f9\\u0338ot;\\uc000\\u22f5\\u0338\\u01e1\\u0b89\\u2b33\\u2b35;\\u62f7;\\u62f6i\\u0100;v\\u0cb8\\u2b3c\\u01e1\\u0cb8\\u2b41\\u2b43;\\u62fe;\\u62fd\\u0180aor\\u2b4b\\u2b63\\u2b69r\\u0200;ast\\u0b7b\\u2b55\\u2b5a\\u2b5flle\\xec\\u0b7bl;\\uc000\\u2afd\\u20e5;\\uc000\\u2202\\u0338lint;\\u6a14\\u0180;ce\\u0c92\\u2b70\\u2b73u\\xe5\\u0ca5\\u0100;c\\u0c98\\u2b78\\u0100;e\\u0c92\\u2b7d\\xf1\\u0c98\\u0200Aait\\u2b88\\u2b8b\\u2b9d\\u2ba7r\\xf2\\u2988rr\\u0180;cw\\u2b94\\u2b95\\u2b99\\u619b;\\uc000\\u2933\\u0338;\\uc000\\u219d\\u0338ghtarrow\\xbb\\u2b95ri\\u0100;e\\u0ccb\\u0cd6\\u0380chimpqu\\u2bbd\\u2bcd\\u2bd9\\u2b04\\u0b78\\u2be4\\u2bef\\u0200;cer\\u0d32\\u2bc6\\u0d37\\u2bc9u\\xe5\\u0d45;\\uc000\\ud835\\udcc3ort\\u026d\\u2b05\\0\\0\\u2bd6ar\\xe1\\u2b56m\\u0100;e\\u0d6e\\u2bdf\\u0100;q\\u0d74\\u0d73su\\u0100bp\\u2beb\\u2bed\\xe5\\u0cf8\\xe5\\u0d0b\\u0180bcp\\u2bf6\\u2c11\\u2c19\\u0200;Ees\\u2bff\\u2c00\\u0d22\\u2c04\\u6284;\\uc000\\u2ac5\\u0338et\\u0100;e\\u0d1b\\u2c0bq\\u0100;q\\u0d23\\u2c00c\\u0100;e\\u0d32\\u2c17\\xf1\\u0d38\\u0200;Ees\\u2c22\\u2c23\\u0d5f\\u2c27\\u6285;\\uc000\\u2ac6\\u0338et\\u0100;e\\u0d58\\u2c2eq\\u0100;q\\u0d60\\u2c23\\u0200gilr\\u2c3d\\u2c3f\\u2c45\\u2c47\\xec\\u0bd7lde\\u803b\\xf1\\u40f1\\xe7\\u0c43iangle\\u0100lr\\u2c52\\u2c5ceft\\u0100;e\\u0c1a\\u2c5a\\xf1\\u0c26ight\\u0100;e\\u0ccb\\u2c65\\xf1\\u0cd7\\u0100;m\\u2c6c\\u2c6d\\u43bd\\u0180;es\\u2c74\\u2c75\\u2c79\\u4023ro;\\u6116p;\\u6007\\u0480DHadgilrs\\u2c8f\\u2c94\\u2c99\\u2c9e\\u2ca3\\u2cb0\\u2cb6\\u2cd3\\u2ce3ash;\\u62adarr;\\u6904p;\\uc000\\u224d\\u20d2ash;\\u62ac\\u0100et\\u2ca8\\u2cac;\\uc000\\u2265\\u20d2;\\uc000>\\u20d2nfin;\\u69de\\u0180Aet\\u2cbd\\u2cc1\\u2cc5rr;\\u6902;\\uc000\\u2264\\u20d2\\u0100;r\\u2cca\\u2ccd\\uc000<\\u20d2ie;\\uc000\\u22b4\\u20d2\\u0100At\\u2cd8\\u2cdcrr;\\u6903rie;\\uc000\\u22b5\\u20d2im;\\uc000\\u223c\\u20d2\\u0180Aan\\u2cf0\\u2cf4\\u2d02rr;\\u61d6r\\u0100hr\\u2cfa\\u2cfdk;\\u6923\\u0100;o\\u13e7\\u13e5ear;\\u6927\\u1253\\u1a95\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\u2d2d\\0\\u2d38\\u2d48\\u2d60\\u2d65\\u2d72\\u2d84\\u1b07\\0\\0\\u2d8d\\u2dab\\0\\u2dc8\\u2dce\\0\\u2ddc\\u2e19\\u2e2b\\u2e3e\\u2e43\\u0100cs\\u2d31\\u1a97ute\\u803b\\xf3\\u40f3\\u0100iy\\u2d3c\\u2d45r\\u0100;c\\u1a9e\\u2d42\\u803b\\xf4\\u40f4;\\u443e\\u0280abios\\u1aa0\\u2d52\\u2d57\\u01c8\\u2d5alac;\\u4151v;\\u6a38old;\\u69bclig;\\u4153\\u0100cr\\u2d69\\u2d6dir;\\u69bf;\\uc000\\ud835\\udd2c\\u036f\\u2d79\\0\\0\\u2d7c\\0\\u2d82n;\\u42dbave\\u803b\\xf2\\u40f2;\\u69c1\\u0100bm\\u2d88\\u0df4ar;\\u69b5\\u0200acit\\u2d95\\u2d98\\u2da5\\u2da8r\\xf2\\u1a80\\u0100ir\\u2d9d\\u2da0r;\\u69beoss;\\u69bbn\\xe5\\u0e52;\\u69c0\\u0180aei\\u2db1\\u2db5\\u2db9cr;\\u414dga;\\u43c9\\u0180cdn\\u2dc0\\u2dc5\\u01cdron;\\u43bf;\\u69b6pf;\\uc000\\ud835\\udd60\\u0180ael\\u2dd4\\u2dd7\\u01d2r;\\u69b7rp;\\u69b9\\u0380;adiosv\\u2dea\\u2deb\\u2dee\\u2e08\\u2e0d\\u2e10\\u2e16\\u6228r\\xf2\\u1a86\\u0200;efm\\u2df7\\u2df8\\u2e02\\u2e05\\u6a5dr\\u0100;o\\u2dfe\\u2dff\\u6134f\\xbb\\u2dff\\u803b\\xaa\\u40aa\\u803b\\xba\\u40bagof;\\u62b6r;\\u6a56lope;\\u6a57;\\u6a5b\\u0180clo\\u2e1f\\u2e21\\u2e27\\xf2\\u2e01ash\\u803b\\xf8\\u40f8l;\\u6298i\\u016c\\u2e2f\\u2e34de\\u803b\\xf5\\u40f5es\\u0100;a\\u01db\\u2e3as;\\u6a36ml\\u803b\\xf6\\u40f6bar;\\u633d\\u0ae1\\u2e5e\\0\\u2e7d\\0\\u2e80\\u2e9d\\0\\u2ea2\\u2eb9\\0\\0\\u2ecb\\u0e9c\\0\\u2f13\\0\\0\\u2f2b\\u2fbc\\0\\u2fc8r\\u0200;ast\\u0403\\u2e67\\u2e72\\u0e85\\u8100\\xb6;l\\u2e6d\\u2e6e\\u40b6le\\xec\\u0403\\u0269\\u2e78\\0\\0\\u2e7bm;\\u6af3;\\u6afdy;\\u443fr\\u0280cimpt\\u2e8b\\u2e8f\\u2e93\\u1865\\u2e97nt;\\u4025od;\\u402eil;\\u6030enk;\\u6031r;\\uc000\\ud835\\udd2d\\u0180imo\\u2ea8\\u2eb0\\u2eb4\\u0100;v\\u2ead\\u2eae\\u43c6;\\u43d5ma\\xf4\\u0a76ne;\\u660e\\u0180;tv\\u2ebf\\u2ec0\\u2ec8\\u43c0chfork\\xbb\\u1ffd;\\u43d6\\u0100au\\u2ecf\\u2edfn\\u0100ck\\u2ed5\\u2eddk\\u0100;h\\u21f4\\u2edb;\\u610e\\xf6\\u21f4s\\u0480;abcdemst\\u2ef3\\u2ef4\\u1908\\u2ef9\\u2efd\\u2f04\\u2f06\\u2f0a\\u2f0e\\u402bcir;\\u6a23ir;\\u6a22\\u0100ou\\u1d40\\u2f02;\\u6a25;\\u6a72n\\u80bb\\xb1\\u0e9dim;\\u6a26wo;\\u6a27\\u0180ipu\\u2f19\\u2f20\\u2f25ntint;\\u6a15f;\\uc000\\ud835\\udd61nd\\u803b\\xa3\\u40a3\\u0500;Eaceinosu\\u0ec8\\u2f3f\\u2f41\\u2f44\\u2f47\\u2f81\\u2f89\\u2f92\\u2f7e\\u2fb6;\\u6ab3p;\\u6ab7u\\xe5\\u0ed9\\u0100;c\\u0ece\\u2f4c\\u0300;acens\\u0ec8\\u2f59\\u2f5f\\u2f66\\u2f68\\u2f7eppro\\xf8\\u2f43urlye\\xf1\\u0ed9\\xf1\\u0ece\\u0180aes\\u2f6f\\u2f76\\u2f7approx;\\u6ab9qq;\\u6ab5im;\\u62e8i\\xed\\u0edfme\\u0100;s\\u2f88\\u0eae\\u6032\\u0180Eas\\u2f78\\u2f90\\u2f7a\\xf0\\u2f75\\u0180dfp\\u0eec\\u2f99\\u2faf\\u0180als\\u2fa0\\u2fa5\\u2faalar;\\u632eine;\\u6312urf;\\u6313\\u0100;t\\u0efb\\u2fb4\\xef\\u0efbrel;\\u62b0\\u0100ci\\u2fc0\\u2fc5r;\\uc000\\ud835\\udcc5;\\u43c8ncsp;\\u6008\\u0300fiopsu\\u2fda\\u22e2\\u2fdf\\u2fe5\\u2feb\\u2ff1r;\\uc000\\ud835\\udd2epf;\\uc000\\ud835\\udd62rime;\\u6057cr;\\uc000\\ud835\\udcc6\\u0180aeo\\u2ff8\\u3009\\u3013t\\u0100ei\\u2ffe\\u3005rnion\\xf3\\u06b0nt;\\u6a16st\\u0100;e\\u3010\\u3011\\u403f\\xf1\\u1f19\\xf4\\u0f14\\u0a80ABHabcdefhilmnoprstux\\u3040\\u3051\\u3055\\u3059\\u30e0\\u310e\\u312b\\u3147\\u3162\\u3172\\u318e\\u3206\\u3215\\u3224\\u3229\\u3258\\u326e\\u3272\\u3290\\u32b0\\u32b7\\u0180art\\u3047\\u304a\\u304cr\\xf2\\u10b3\\xf2\\u03ddail;\\u691car\\xf2\\u1c65ar;\\u6964\\u0380cdenqrt\\u3068\\u3075\\u3078\\u307f\\u308f\\u3094\\u30cc\\u0100eu\\u306d\\u3071;\\uc000\\u223d\\u0331te;\\u4155i\\xe3\\u116emptyv;\\u69b3g\\u0200;del\\u0fd1\\u3089\\u308b\\u308d;\\u6992;\\u69a5\\xe5\\u0fd1uo\\u803b\\xbb\\u40bbr\\u0580;abcfhlpstw\\u0fdc\\u30ac\\u30af\\u30b7\\u30b9\\u30bc\\u30be\\u30c0\\u30c3\\u30c7\\u30cap;\\u6975\\u0100;f\\u0fe0\\u30b4s;\\u6920;\\u6933s;\\u691e\\xeb\\u225d\\xf0\\u272el;\\u6945im;\\u6974l;\\u61a3;\\u619d\\u0100ai\\u30d1\\u30d5il;\\u691ao\\u0100;n\\u30db\\u30dc\\u6236al\\xf3\\u0f1e\\u0180abr\\u30e7\\u30ea\\u30eer\\xf2\\u17e5rk;\\u6773\\u0100ak\\u30f3\\u30fdc\\u0100ek\\u30f9\\u30fb;\\u407d;\\u405d\\u0100es\\u3102\\u3104;\\u698cl\\u0100du\\u310a\\u310c;\\u698e;\\u6990\\u0200aeuy\\u3117\\u311c\\u3127\\u3129ron;\\u4159\\u0100di\\u3121\\u3125il;\\u4157\\xec\\u0ff2\\xe2\\u30fa;\\u4440\\u0200clqs\\u3134\\u3137\\u313d\\u3144a;\\u6937dhar;\\u6969uo\\u0100;r\\u020e\\u020dh;\\u61b3\\u0180acg\\u314e\\u315f\\u0f44l\\u0200;ips\\u0f78\\u3158\\u315b\\u109cn\\xe5\\u10bbar\\xf4\\u0fa9t;\\u65ad\\u0180ilr\\u3169\\u1023\\u316esht;\\u697d;\\uc000\\ud835\\udd2f\\u0100ao\\u3177\\u3186r\\u0100du\\u317d\\u317f\\xbb\\u047b\\u0100;l\\u1091\\u3184;\\u696c\\u0100;v\\u318b\\u318c\\u43c1;\\u43f1\\u0180gns\\u3195\\u31f9\\u31fcht\\u0300ahlrst\\u31a4\\u31b0\\u31c2\\u31d8\\u31e4\\u31eerrow\\u0100;t\\u0fdc\\u31ada\\xe9\\u30c8arpoon\\u0100du\\u31bb\\u31bfow\\xee\\u317ep\\xbb\\u1092eft\\u0100ah\\u31ca\\u31d0rrow\\xf3\\u0feaarpoon\\xf3\\u0551ightarrows;\\u61c9quigarro\\xf7\\u30cbhreetimes;\\u62ccg;\\u42daingdotse\\xf1\\u1f32\\u0180ahm\\u320d\\u3210\\u3213r\\xf2\\u0feaa\\xf2\\u0551;\\u600foust\\u0100;a\\u321e\\u321f\\u63b1che\\xbb\\u321fmid;\\u6aee\\u0200abpt\\u3232\\u323d\\u3240\\u3252\\u0100nr\\u3237\\u323ag;\\u67edr;\\u61fer\\xeb\\u1003\\u0180afl\\u3247\\u324a\\u324er;\\u6986;\\uc000\\ud835\\udd63us;\\u6a2eimes;\\u6a35\\u0100ap\\u325d\\u3267r\\u0100;g\\u3263\\u3264\\u4029t;\\u6994olint;\\u6a12ar\\xf2\\u31e3\\u0200achq\\u327b\\u3280\\u10bc\\u3285quo;\\u603ar;\\uc000\\ud835\\udcc7\\u0100bu\\u30fb\\u328ao\\u0100;r\\u0214\\u0213\\u0180hir\\u3297\\u329b\\u32a0re\\xe5\\u31f8mes;\\u62cai\\u0200;efl\\u32aa\\u1059\\u1821\\u32ab\\u65b9tri;\\u69celuhar;\\u6968;\\u611e\\u0d61\\u32d5\\u32db\\u32df\\u332c\\u3338\\u3371\\0\\u337a\\u33a4\\0\\0\\u33ec\\u33f0\\0\\u3428\\u3448\\u345a\\u34ad\\u34b1\\u34ca\\u34f1\\0\\u3616\\0\\0\\u3633cute;\\u415bqu\\xef\\u27ba\\u0500;Eaceinpsy\\u11ed\\u32f3\\u32f5\\u32ff\\u3302\\u330b\\u330f\\u331f\\u3326\\u3329;\\u6ab4\\u01f0\\u32fa\\0\\u32fc;\\u6ab8on;\\u4161u\\xe5\\u11fe\\u0100;d\\u11f3\\u3307il;\\u415frc;\\u415d\\u0180Eas\\u3316\\u3318\\u331b;\\u6ab6p;\\u6abaim;\\u62e9olint;\\u6a13i\\xed\\u1204;\\u4441ot\\u0180;be\\u3334\\u1d47\\u3335\\u62c5;\\u6a66\\u0380Aacmstx\\u3346\\u334a\\u3357\\u335b\\u335e\\u3363\\u336drr;\\u61d8r\\u0100hr\\u3350\\u3352\\xeb\\u2228\\u0100;o\\u0a36\\u0a34t\\u803b\\xa7\\u40a7i;\\u403bwar;\\u6929m\\u0100in\\u3369\\xf0nu\\xf3\\xf1t;\\u6736r\\u0100;o\\u3376\\u2055\\uc000\\ud835\\udd30\\u0200acoy\\u3382\\u3386\\u3391\\u33a0rp;\\u666f\\u0100hy\\u338b\\u338fcy;\\u4449;\\u4448rt\\u026d\\u3399\\0\\0\\u339ci\\xe4\\u1464ara\\xec\\u2e6f\\u803b\\xad\\u40ad\\u0100gm\\u33a8\\u33b4ma\\u0180;fv\\u33b1\\u33b2\\u33b2\\u43c3;\\u43c2\\u0400;deglnpr\\u12ab\\u33c5\\u33c9\\u33ce\\u33d6\\u33de\\u33e1\\u33e6ot;\\u6a6a\\u0100;q\\u12b1\\u12b0\\u0100;E\\u33d3\\u33d4\\u6a9e;\\u6aa0\\u0100;E\\u33db\\u33dc\\u6a9d;\\u6a9fe;\\u6246lus;\\u6a24arr;\\u6972ar\\xf2\\u113d\\u0200aeit\\u33f8\\u3408\\u340f\\u3417\\u0100ls\\u33fd\\u3404lsetm\\xe9\\u336ahp;\\u6a33parsl;\\u69e4\\u0100dl\\u1463\\u3414e;\\u6323\\u0100;e\\u341c\\u341d\\u6aaa\\u0100;s\\u3422\\u3423\\u6aac;\\uc000\\u2aac\\ufe00\\u0180flp\\u342e\\u3433\\u3442tcy;\\u444c\\u0100;b\\u3438\\u3439\\u402f\\u0100;a\\u343e\\u343f\\u69c4r;\\u633ff;\\uc000\\ud835\\udd64a\\u0100dr\\u344d\\u0402es\\u0100;u\\u3454\\u3455\\u6660it\\xbb\\u3455\\u0180csu\\u3460\\u3479\\u349f\\u0100au\\u3465\\u346fp\\u0100;s\\u1188\\u346b;\\uc000\\u2293\\ufe00p\\u0100;s\\u11b4\\u3475;\\uc000\\u2294\\ufe00u\\u0100bp\\u347f\\u348f\\u0180;es\\u1197\\u119c\\u3486et\\u0100;e\\u1197\\u348d\\xf1\\u119d\\u0180;es\\u11a8\\u11ad\\u3496et\\u0100;e\\u11a8\\u349d\\xf1\\u11ae\\u0180;af\\u117b\\u34a6\\u05b0r\\u0165\\u34ab\\u05b1\\xbb\\u117car\\xf2\\u1148\\u0200cemt\\u34b9\\u34be\\u34c2\\u34c5r;\\uc000\\ud835\\udcc8tm\\xee\\xf1i\\xec\\u3415ar\\xe6\\u11be\\u0100ar\\u34ce\\u34d5r\\u0100;f\\u34d4\\u17bf\\u6606\\u0100an\\u34da\\u34edight\\u0100ep\\u34e3\\u34eapsilo\\xee\\u1ee0h\\xe9\\u2eafs\\xbb\\u2852\\u0280bcmnp\\u34fb\\u355e\\u1209\\u358b\\u358e\\u0480;Edemnprs\\u350e\\u350f\\u3511\\u3515\\u351e\\u3523\\u352c\\u3531\\u3536\\u6282;\\u6ac5ot;\\u6abd\\u0100;d\\u11da\\u351aot;\\u6ac3ult;\\u6ac1\\u0100Ee\\u3528\\u352a;\\u6acb;\\u628alus;\\u6abfarr;\\u6979\\u0180eiu\\u353d\\u3552\\u3555t\\u0180;en\\u350e\\u3545\\u354bq\\u0100;q\\u11da\\u350feq\\u0100;q\\u352b\\u3528m;\\u6ac7\\u0100bp\\u355a\\u355c;\\u6ad5;\\u6ad3c\\u0300;acens\\u11ed\\u356c\\u3572\\u3579\\u357b\\u3326ppro\\xf8\\u32faurlye\\xf1\\u11fe\\xf1\\u11f3\\u0180aes\\u3582\\u3588\\u331bppro\\xf8\\u331aq\\xf1\\u3317g;\\u666a\\u0680123;Edehlmnps\\u35a9\\u35ac\\u35af\\u121c\\u35b2\\u35b4\\u35c0\\u35c9\\u35d5\\u35da\\u35df\\u35e8\\u35ed\\u803b\\xb9\\u40b9\\u803b\\xb2\\u40b2\\u803b\\xb3\\u40b3;\\u6ac6\\u0100os\\u35b9\\u35bct;\\u6abeub;\\u6ad8\\u0100;d\\u1222\\u35c5ot;\\u6ac4s\\u0100ou\\u35cf\\u35d2l;\\u67c9b;\\u6ad7arr;\\u697bult;\\u6ac2\\u0100Ee\\u35e4\\u35e6;\\u6acc;\\u628blus;\\u6ac0\\u0180eiu\\u35f4\\u3609\\u360ct\\u0180;en\\u121c\\u35fc\\u3602q\\u0100;q\\u1222\\u35b2eq\\u0100;q\\u35e7\\u35e4m;\\u6ac8\\u0100bp\\u3611\\u3613;\\u6ad4;\\u6ad6\\u0180Aan\\u361c\\u3620\\u362drr;\\u61d9r\\u0100hr\\u3626\\u3628\\xeb\\u222e\\u0100;o\\u0a2b\\u0a29war;\\u692alig\\u803b\\xdf\\u40df\\u0be1\\u3651\\u365d\\u3660\\u12ce\\u3673\\u3679\\0\\u367e\\u36c2\\0\\0\\0\\0\\0\\u36db\\u3703\\0\\u3709\\u376c\\0\\0\\0\\u3787\\u0272\\u3656\\0\\0\\u365bget;\\u6316;\\u43c4r\\xeb\\u0e5f\\u0180aey\\u3666\\u366b\\u3670ron;\\u4165dil;\\u4163;\\u4442lrec;\\u6315r;\\uc000\\ud835\\udd31\\u0200eiko\\u3686\\u369d\\u36b5\\u36bc\\u01f2\\u368b\\0\\u3691e\\u01004f\\u1284\\u1281a\\u0180;sv\\u3698\\u3699\\u369b\\u43b8ym;\\u43d1\\u0100cn\\u36a2\\u36b2k\\u0100as\\u36a8\\u36aeppro\\xf8\\u12c1im\\xbb\\u12acs\\xf0\\u129e\\u0100as\\u36ba\\u36ae\\xf0\\u12c1rn\\u803b\\xfe\\u40fe\\u01ec\\u031f\\u36c6\\u22e7es\\u8180\\xd7;bd\\u36cf\\u36d0\\u36d8\\u40d7\\u0100;a\\u190f\\u36d5r;\\u6a31;\\u6a30\\u0180eps\\u36e1\\u36e3\\u3700\\xe1\\u2a4d\\u0200;bcf\\u0486\\u36ec\\u36f0\\u36f4ot;\\u6336ir;\\u6af1\\u0100;o\\u36f9\\u36fc\\uc000\\ud835\\udd65rk;\\u6ada\\xe1\\u3362rime;\\u6034\\u0180aip\\u370f\\u3712\\u3764d\\xe5\\u1248\\u0380adempst\\u3721\\u374d\\u3740\\u3751\\u3757\\u375c\\u375fngle\\u0280;dlqr\\u3730\\u3731\\u3736\\u3740\\u3742\\u65b5own\\xbb\\u1dbbeft\\u0100;e\\u2800\\u373e\\xf1\\u092e;\\u625cight\\u0100;e\\u32aa\\u374b\\xf1\\u105aot;\\u65ecinus;\\u6a3alus;\\u6a39b;\\u69cdime;\\u6a3bezium;\\u63e2\\u0180cht\\u3772\\u377d\\u3781\\u0100ry\\u3777\\u377b;\\uc000\\ud835\\udcc9;\\u4446cy;\\u445brok;\\u4167\\u0100io\\u378b\\u378ex\\xf4\\u1777head\\u0100lr\\u3797\\u37a0eftarro\\xf7\\u084fightarrow\\xbb\\u0f5d\\u0900AHabcdfghlmoprstuw\\u37d0\\u37d3\\u37d7\\u37e4\\u37f0\\u37fc\\u380e\\u381c\\u3823\\u3834\\u3851\\u385d\\u386b\\u38a9\\u38cc\\u38d2\\u38ea\\u38f6r\\xf2\\u03edar;\\u6963\\u0100cr\\u37dc\\u37e2ute\\u803b\\xfa\\u40fa\\xf2\\u1150r\\u01e3\\u37ea\\0\\u37edy;\\u445eve;\\u416d\\u0100iy\\u37f5\\u37farc\\u803b\\xfb\\u40fb;\\u4443\\u0180abh\\u3803\\u3806\\u380br\\xf2\\u13adlac;\\u4171a\\xf2\\u13c3\\u0100ir\\u3813\\u3818sht;\\u697e;\\uc000\\ud835\\udd32rave\\u803b\\xf9\\u40f9\\u0161\\u3827\\u3831r\\u0100lr\\u382c\\u382e\\xbb\\u0957\\xbb\\u1083lk;\\u6580\\u0100ct\\u3839\\u384d\\u026f\\u383f\\0\\0\\u384arn\\u0100;e\\u3845\\u3846\\u631cr\\xbb\\u3846op;\\u630fri;\\u65f8\\u0100al\\u3856\\u385acr;\\u416b\\u80bb\\xa8\\u0349\\u0100gp\\u3862\\u3866on;\\u4173f;\\uc000\\ud835\\udd66\\u0300adhlsu\\u114b\\u3878\\u387d\\u1372\\u3891\\u38a0own\\xe1\\u13b3arpoon\\u0100lr\\u3888\\u388cef\\xf4\\u382digh\\xf4\\u382fi\\u0180;hl\\u3899\\u389a\\u389c\\u43c5\\xbb\\u13faon\\xbb\\u389aparrows;\\u61c8\\u0180cit\\u38b0\\u38c4\\u38c8\\u026f\\u38b6\\0\\0\\u38c1rn\\u0100;e\\u38bc\\u38bd\\u631dr\\xbb\\u38bdop;\\u630eng;\\u416fri;\\u65f9cr;\\uc000\\ud835\\udcca\\u0180dir\\u38d9\\u38dd\\u38e2ot;\\u62f0lde;\\u4169i\\u0100;f\\u3730\\u38e8\\xbb\\u1813\\u0100am\\u38ef\\u38f2r\\xf2\\u38a8l\\u803b\\xfc\\u40fcangle;\\u69a7\\u0780ABDacdeflnoprsz\\u391c\\u391f\\u3929\\u392d\\u39b5\\u39b8\\u39bd\\u39df\\u39e4\\u39e8\\u39f3\\u39f9\\u39fd\\u3a01\\u3a20r\\xf2\\u03f7ar\\u0100;v\\u3926\\u3927\\u6ae8;\\u6ae9as\\xe8\\u03e1\\u0100nr\\u3932\\u3937grt;\\u699c\\u0380eknprst\\u34e3\\u3946\\u394b\\u3952\\u395d\\u3964\\u3996app\\xe1\\u2415othin\\xe7\\u1e96\\u0180hir\\u34eb\\u2ec8\\u3959op\\xf4\\u2fb5\\u0100;h\\u13b7\\u3962\\xef\\u318d\\u0100iu\\u3969\\u396dgm\\xe1\\u33b3\\u0100bp\\u3972\\u3984setneq\\u0100;q\\u397d\\u3980\\uc000\\u228a\\ufe00;\\uc000\\u2acb\\ufe00setneq\\u0100;q\\u398f\\u3992\\uc000\\u228b\\ufe00;\\uc000\\u2acc\\ufe00\\u0100hr\\u399b\\u399fet\\xe1\\u369ciangle\\u0100lr\\u39aa\\u39afeft\\xbb\\u0925ight\\xbb\\u1051y;\\u4432ash\\xbb\\u1036\\u0180elr\\u39c4\\u39d2\\u39d7\\u0180;be\\u2dea\\u39cb\\u39cfar;\\u62bbq;\\u625alip;\\u62ee\\u0100bt\\u39dc\\u1468a\\xf2\\u1469r;\\uc000\\ud835\\udd33tr\\xe9\\u39aesu\\u0100bp\\u39ef\\u39f1\\xbb\\u0d1c\\xbb\\u0d59pf;\\uc000\\ud835\\udd67ro\\xf0\\u0efbtr\\xe9\\u39b4\\u0100cu\\u3a06\\u3a0br;\\uc000\\ud835\\udccb\\u0100bp\\u3a10\\u3a18n\\u0100Ee\\u3980\\u3a16\\xbb\\u397en\\u0100Ee\\u3992\\u3a1e\\xbb\\u3990igzag;\\u699a\\u0380cefoprs\\u3a36\\u3a3b\\u3a56\\u3a5b\\u3a54\\u3a61\\u3a6airc;\\u4175\\u0100di\\u3a40\\u3a51\\u0100bg\\u3a45\\u3a49ar;\\u6a5fe\\u0100;q\\u15fa\\u3a4f;\\u6259erp;\\u6118r;\\uc000\\ud835\\udd34pf;\\uc000\\ud835\\udd68\\u0100;e\\u1479\\u3a66at\\xe8\\u1479cr;\\uc000\\ud835\\udccc\\u0ae3\\u178e\\u3a87\\0\\u3a8b\\0\\u3a90\\u3a9b\\0\\0\\u3a9d\\u3aa8\\u3aab\\u3aaf\\0\\0\\u3ac3\\u3ace\\0\\u3ad8\\u17dc\\u17dftr\\xe9\\u17d1r;\\uc000\\ud835\\udd35\\u0100Aa\\u3a94\\u3a97r\\xf2\\u03c3r\\xf2\\u09f6;\\u43be\\u0100Aa\\u3aa1\\u3aa4r\\xf2\\u03b8r\\xf2\\u09eba\\xf0\\u2713is;\\u62fb\\u0180dpt\\u17a4\\u3ab5\\u3abe\\u0100fl\\u3aba\\u17a9;\\uc000\\ud835\\udd69im\\xe5\\u17b2\\u0100Aa\\u3ac7\\u3acar\\xf2\\u03cer\\xf2\\u0a01\\u0100cq\\u3ad2\\u17b8r;\\uc000\\ud835\\udccd\\u0100pt\\u17d6\\u3adcr\\xe9\\u17d4\\u0400acefiosu\\u3af0\\u3afd\\u3b08\\u3b0c\\u3b11\\u3b15\\u3b1b\\u3b21c\\u0100uy\\u3af6\\u3afbte\\u803b\\xfd\\u40fd;\\u444f\\u0100iy\\u3b02\\u3b06rc;\\u4177;\\u444bn\\u803b\\xa5\\u40a5r;\\uc000\\ud835\\udd36cy;\\u4457pf;\\uc000\\ud835\\udd6acr;\\uc000\\ud835\\udcce\\u0100cm\\u3b26\\u3b29y;\\u444el\\u803b\\xff\\u40ff\\u0500acdefhiosw\\u3b42\\u3b48\\u3b54\\u3b58\\u3b64\\u3b69\\u3b6d\\u3b74\\u3b7a\\u3b80cute;\\u417a\\u0100ay\\u3b4d\\u3b52ron;\\u417e;\\u4437ot;\\u417c\\u0100et\\u3b5d\\u3b61tr\\xe6\\u155fa;\\u43b6r;\\uc000\\ud835\\udd37cy;\\u4436grarr;\\u61ddpf;\\uc000\\ud835\\udd6bcr;\\uc000\\ud835\\udccf\\u0100jn\\u3b85\\u3b87;\\u600dj;\\u600c\"\n    .split(\"\")\n    .map((c) => c.charCodeAt(0)));\n//# sourceMappingURL=decode-data-html.js.map","// Generated using scripts/write-decode-map.ts\nexport default new Uint16Array(\n// prettier-ignore\n\"\\u0200aglq\\t\\x15\\x18\\x1b\\u026d\\x0f\\0\\0\\x12p;\\u4026os;\\u4027t;\\u403et;\\u403cuot;\\u4022\"\n    .split(\"\")\n    .map((c) => c.charCodeAt(0)));\n//# sourceMappingURL=decode-data-xml.js.map","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nvar _a;\nconst decodeMap = new Map([\n    [0, 65533],\n    // C1 Unicode control character reference replacements\n    [128, 8364],\n    [130, 8218],\n    [131, 402],\n    [132, 8222],\n    [133, 8230],\n    [134, 8224],\n    [135, 8225],\n    [136, 710],\n    [137, 8240],\n    [138, 352],\n    [139, 8249],\n    [140, 338],\n    [142, 381],\n    [145, 8216],\n    [146, 8217],\n    [147, 8220],\n    [148, 8221],\n    [149, 8226],\n    [150, 8211],\n    [151, 8212],\n    [152, 732],\n    [153, 8482],\n    [154, 353],\n    [155, 8250],\n    [156, 339],\n    [158, 382],\n    [159, 376],\n]);\n/**\n * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.\n */\nexport const fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins\n(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) {\n    let output = \"\";\n    if (codePoint > 0xffff) {\n        codePoint -= 0x10000;\n        output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n        codePoint = 0xdc00 | (codePoint & 0x3ff);\n    }\n    output += String.fromCharCode(codePoint);\n    return output;\n};\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n */\nexport function replaceCodePoint(codePoint) {\n    var _a;\n    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n        return 0xfffd;\n    }\n    return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint;\n}\n/**\n * Replace the code point if relevant, then convert it to a string.\n *\n * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.\n * @param codePoint The code point to decode.\n * @returns The decoded code point.\n */\nexport default function decodeCodePoint(codePoint) {\n    return fromCodePoint(replaceCodePoint(codePoint));\n}\n//# sourceMappingURL=decode_codepoint.js.map","import htmlDecodeTree from \"./generated/decode-data-html.js\";\nimport xmlDecodeTree from \"./generated/decode-data-xml.js\";\nimport decodeCodePoint, { replaceCodePoint, fromCodePoint, } from \"./decode_codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree, xmlDecodeTree, decodeCodePoint };\nexport { replaceCodePoint, fromCodePoint } from \"./decode_codepoint.js\";\nvar CharCodes;\n(function (CharCodes) {\n    CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n    CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n    CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n    CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n    CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n    CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n    CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n    CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n    CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n    CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n    CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n    CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b100000;\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n    BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n    BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 16256] = \"BRANCH_LENGTH\";\n    BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\nfunction isNumber(code) {\n    return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n    return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n    return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n        (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n        isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n    return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n    EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n    EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n    EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n    EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n    EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\nexport var DecodingMode;\n(function (DecodingMode) {\n    /** Entities in text nodes that can end with any character. */\n    DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n    /** Only allow entities terminated with a semicolon. */\n    DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n    /** Entities in attributes have limitations on ending characters. */\n    DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n    constructor(\n    /** The tree used to decode entities. */\n    decodeTree, \n    /**\n     * The function that is called when a codepoint is decoded.\n     *\n     * For multi-byte named entities, this will be called multiple times,\n     * with the second codepoint, and the same `consumed` value.\n     *\n     * @param codepoint The decoded codepoint.\n     * @param consumed The number of bytes consumed by the decoder.\n     */\n    emitCodePoint, \n    /** An object that is used to produce errors. */\n    errors) {\n        this.decodeTree = decodeTree;\n        this.emitCodePoint = emitCodePoint;\n        this.errors = errors;\n        /** The current state of the decoder. */\n        this.state = EntityDecoderState.EntityStart;\n        /** Characters that were consumed while parsing an entity. */\n        this.consumed = 1;\n        /**\n         * The result of the entity.\n         *\n         * Either the result index of a numeric entity, or the codepoint of a\n         * numeric entity.\n         */\n        this.result = 0;\n        /** The current index in the decode tree. */\n        this.treeIndex = 0;\n        /** The number of characters that were consumed in excess. */\n        this.excess = 1;\n        /** The mode in which the decoder is operating. */\n        this.decodeMode = DecodingMode.Strict;\n    }\n    /** Resets the instance to make it reusable. */\n    startEntity(decodeMode) {\n        this.decodeMode = decodeMode;\n        this.state = EntityDecoderState.EntityStart;\n        this.result = 0;\n        this.treeIndex = 0;\n        this.excess = 1;\n        this.consumed = 1;\n    }\n    /**\n     * Write an entity to the decoder. This can be called multiple times with partial entities.\n     * If the entity is incomplete, the decoder will return -1.\n     *\n     * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n     * entity is incomplete, and resume when the next string is written.\n     *\n     * @param string The string containing the entity (or a continuation of the entity).\n     * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    write(str, offset) {\n        switch (this.state) {\n            case EntityDecoderState.EntityStart: {\n                if (str.charCodeAt(offset) === CharCodes.NUM) {\n                    this.state = EntityDecoderState.NumericStart;\n                    this.consumed += 1;\n                    return this.stateNumericStart(str, offset + 1);\n                }\n                this.state = EntityDecoderState.NamedEntity;\n                return this.stateNamedEntity(str, offset);\n            }\n            case EntityDecoderState.NumericStart: {\n                return this.stateNumericStart(str, offset);\n            }\n            case EntityDecoderState.NumericDecimal: {\n                return this.stateNumericDecimal(str, offset);\n            }\n            case EntityDecoderState.NumericHex: {\n                return this.stateNumericHex(str, offset);\n            }\n            case EntityDecoderState.NamedEntity: {\n                return this.stateNamedEntity(str, offset);\n            }\n        }\n    }\n    /**\n     * Switches between the numeric decimal and hexadecimal states.\n     *\n     * Equivalent to the `Numeric character reference state` in the HTML spec.\n     *\n     * @param str The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericStart(str, offset) {\n        if (offset >= str.length) {\n            return -1;\n        }\n        if ((str.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n            this.state = EntityDecoderState.NumericHex;\n            this.consumed += 1;\n            return this.stateNumericHex(str, offset + 1);\n        }\n        this.state = EntityDecoderState.NumericDecimal;\n        return this.stateNumericDecimal(str, offset);\n    }\n    addToNumericResult(str, start, end, base) {\n        if (start !== end) {\n            const digitCount = end - start;\n            this.result =\n                this.result * Math.pow(base, digitCount) +\n                    parseInt(str.substr(start, digitCount), base);\n            this.consumed += digitCount;\n        }\n    }\n    /**\n     * Parses a hexadecimal numeric entity.\n     *\n     * Equivalent to the `Hexademical character reference state` in the HTML spec.\n     *\n     * @param str The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericHex(str, offset) {\n        const startIdx = offset;\n        while (offset < str.length) {\n            const char = str.charCodeAt(offset);\n            if (isNumber(char) || isHexadecimalCharacter(char)) {\n                offset += 1;\n            }\n            else {\n                this.addToNumericResult(str, startIdx, offset, 16);\n                return this.emitNumericEntity(char, 3);\n            }\n        }\n        this.addToNumericResult(str, startIdx, offset, 16);\n        return -1;\n    }\n    /**\n     * Parses a decimal numeric entity.\n     *\n     * Equivalent to the `Decimal character reference state` in the HTML spec.\n     *\n     * @param str The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNumericDecimal(str, offset) {\n        const startIdx = offset;\n        while (offset < str.length) {\n            const char = str.charCodeAt(offset);\n            if (isNumber(char)) {\n                offset += 1;\n            }\n            else {\n                this.addToNumericResult(str, startIdx, offset, 10);\n                return this.emitNumericEntity(char, 2);\n            }\n        }\n        this.addToNumericResult(str, startIdx, offset, 10);\n        return -1;\n    }\n    /**\n     * Validate and emit a numeric entity.\n     *\n     * Implements the logic from the `Hexademical character reference start\n     * state` and `Numeric character reference end state` in the HTML spec.\n     *\n     * @param lastCp The last code point of the entity. Used to see if the\n     *               entity was terminated with a semicolon.\n     * @param expectedLength The minimum number of characters that should be\n     *                       consumed. Used to validate that at least one digit\n     *                       was consumed.\n     * @returns The number of characters that were consumed.\n     */\n    emitNumericEntity(lastCp, expectedLength) {\n        var _a;\n        // Ensure we consumed at least one digit.\n        if (this.consumed <= expectedLength) {\n            (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed);\n            return 0;\n        }\n        // Figure out if this is a legit end of the entity\n        if (lastCp === CharCodes.SEMI) {\n            this.consumed += 1;\n        }\n        else if (this.decodeMode === DecodingMode.Strict) {\n            return 0;\n        }\n        this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n        if (this.errors) {\n            if (lastCp !== CharCodes.SEMI) {\n                this.errors.missingSemicolonAfterCharacterReference();\n            }\n            this.errors.validateNumericCharacterReference(this.result);\n        }\n        return this.consumed;\n    }\n    /**\n     * Parses a named entity.\n     *\n     * Equivalent to the `Named character reference state` in the HTML spec.\n     *\n     * @param str The string containing the entity (or a continuation of the entity).\n     * @param offset The current offset.\n     * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n     */\n    stateNamedEntity(str, offset) {\n        const { decodeTree } = this;\n        let current = decodeTree[this.treeIndex];\n        // The mask is the number of bytes of the value, including the current byte.\n        let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n        for (; offset < str.length; offset++, this.excess++) {\n            const char = str.charCodeAt(offset);\n            this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n            if (this.treeIndex < 0) {\n                return this.result === 0 ||\n                    // If we are parsing an attribute\n                    (this.decodeMode === DecodingMode.Attribute &&\n                        // We shouldn't have consumed any characters after the entity,\n                        (valueLength === 0 ||\n                            // And there should be no invalid characters.\n                            isEntityInAttributeInvalidEnd(char)))\n                    ? 0\n                    : this.emitNotTerminatedNamedEntity();\n            }\n            current = decodeTree[this.treeIndex];\n            valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n            // If the branch is a value, store it and continue\n            if (valueLength !== 0) {\n                // If the entity is terminated by a semicolon, we are done.\n                if (char === CharCodes.SEMI) {\n                    return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n                }\n                // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n                if (this.decodeMode !== DecodingMode.Strict) {\n                    this.result = this.treeIndex;\n                    this.consumed += this.excess;\n                    this.excess = 0;\n                }\n            }\n        }\n        return -1;\n    }\n    /**\n     * Emit a named entity that was not terminated with a semicolon.\n     *\n     * @returns The number of characters consumed.\n     */\n    emitNotTerminatedNamedEntity() {\n        var _a;\n        const { result, decodeTree } = this;\n        const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n        this.emitNamedEntityData(result, valueLength, this.consumed);\n        (_a = this.errors) === null || _a === void 0 ? void 0 : _a.missingSemicolonAfterCharacterReference();\n        return this.consumed;\n    }\n    /**\n     * Emit a named entity.\n     *\n     * @param result The index of the entity in the decode tree.\n     * @param valueLength The number of bytes in the entity.\n     * @param consumed The number of characters consumed.\n     *\n     * @returns The number of characters consumed.\n     */\n    emitNamedEntityData(result, valueLength, consumed) {\n        const { decodeTree } = this;\n        this.emitCodePoint(valueLength === 1\n            ? decodeTree[result] & ~BinTrieFlags.VALUE_LENGTH\n            : decodeTree[result + 1], consumed);\n        if (valueLength === 3) {\n            // For multi-byte values, we need to emit the second byte.\n            this.emitCodePoint(decodeTree[result + 2], consumed);\n        }\n        return consumed;\n    }\n    /**\n     * Signal to the parser that the end of the input was reached.\n     *\n     * Remaining data will be emitted and relevant errors will be produced.\n     *\n     * @returns The number of characters consumed.\n     */\n    end() {\n        var _a;\n        switch (this.state) {\n            case EntityDecoderState.NamedEntity: {\n                // Emit a named entity if we have one.\n                return this.result !== 0 &&\n                    (this.decodeMode !== DecodingMode.Attribute ||\n                        this.result === this.treeIndex)\n                    ? this.emitNotTerminatedNamedEntity()\n                    : 0;\n            }\n            // Otherwise, emit a numeric entity if we have one.\n            case EntityDecoderState.NumericDecimal: {\n                return this.emitNumericEntity(0, 2);\n            }\n            case EntityDecoderState.NumericHex: {\n                return this.emitNumericEntity(0, 3);\n            }\n            case EntityDecoderState.NumericStart: {\n                (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed);\n                return 0;\n            }\n            case EntityDecoderState.EntityStart: {\n                // Return 0 if we have no entity.\n                return 0;\n            }\n        }\n    }\n}\n/**\n * Creates a function that decodes entities in a string.\n *\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n    let ret = \"\";\n    const decoder = new EntityDecoder(decodeTree, (str) => (ret += fromCodePoint(str)));\n    return function decodeWithTrie(str, decodeMode) {\n        let lastIndex = 0;\n        let offset = 0;\n        while ((offset = str.indexOf(\"&\", offset)) >= 0) {\n            ret += str.slice(lastIndex, offset);\n            decoder.startEntity(decodeMode);\n            const len = decoder.write(str, \n            // Skip the \"&\"\n            offset + 1);\n            if (len < 0) {\n                lastIndex = offset + decoder.end();\n                break;\n            }\n            lastIndex = offset + len;\n            // If `len` is 0, skip the current `&` and continue.\n            offset = len === 0 ? lastIndex + 1 : lastIndex;\n        }\n        const result = ret + str.slice(lastIndex);\n        // Make sure we don't keep a reference to the final string.\n        ret = \"\";\n        return result;\n    };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIdx The index right after the current node and its value.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIdx, char) {\n    const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n    const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n    // Case 1: Single branch encoded in jump offset\n    if (branchCount === 0) {\n        return jumpOffset !== 0 && char === jumpOffset ? nodeIdx : -1;\n    }\n    // Case 2: Multiple branches encoded in jump table\n    if (jumpOffset) {\n        const value = char - jumpOffset;\n        return value < 0 || value >= branchCount\n            ? -1\n            : decodeTree[nodeIdx + value] - 1;\n    }\n    // Case 3: Multiple branches encoded in dictionary\n    // Binary search for the character.\n    let lo = nodeIdx;\n    let hi = lo + branchCount - 1;\n    while (lo <= hi) {\n        const mid = (lo + hi) >>> 1;\n        const midVal = decodeTree[mid];\n        if (midVal < char) {\n            lo = mid + 1;\n        }\n        else if (midVal > char) {\n            hi = mid - 1;\n        }\n        else {\n            return decodeTree[mid + branchCount];\n        }\n    }\n    return -1;\n}\nconst htmlDecoder = getDecoder(htmlDecodeTree);\nconst xmlDecoder = getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n *\n * @param str The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(str, mode = DecodingMode.Legacy) {\n    return htmlDecoder(str, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(str) {\n    return htmlDecoder(str, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(str) {\n    return htmlDecoder(str, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(str) {\n    return xmlDecoder(str, DecodingMode.Strict);\n}\n//# sourceMappingURL=decode.js.map","// Utilities\n//\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTML } from 'entities'\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\n\nfunction isString (obj) { return _class(obj) === '[object String]' }\n\nconst _hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction has (object, key) {\n  return _hasOwnProperty.call(object, key)\n}\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n  const sources = Array.prototype.slice.call(arguments, 1)\n\n  sources.forEach(function (source) {\n    if (!source) { return }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be object')\n    }\n\n    Object.keys(source).forEach(function (key) {\n      obj[key] = source[key]\n    })\n  })\n\n  return obj\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt (src, pos, newElements) {\n  return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\nfunction isValidEntityCode (c) {\n  /* eslint no-bitwise:0 */\n  // broken sequence\n  if (c >= 0xD800 && c <= 0xDFFF) { return false }\n  // never used\n  if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n  if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n  // control codes\n  if (c >= 0x00 && c <= 0x08) { return false }\n  if (c === 0x0B) { return false }\n  if (c >= 0x0E && c <= 0x1F) { return false }\n  if (c >= 0x7F && c <= 0x9F) { return false }\n  // out of range\n  if (c > 0x10FFFF) { return false }\n  return true\n}\n\nfunction fromCodePoint (c) {\n  /* eslint no-bitwise:0 */\n  if (c > 0xffff) {\n    c -= 0x10000\n    const surrogate1 = 0xd800 + (c >> 10)\n    const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n    return String.fromCharCode(surrogate1, surrogate2)\n  }\n  return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE  = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE       = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match, name) {\n  if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n    const code = name[1].toLowerCase() === 'x'\n      ? parseInt(name.slice(2), 16)\n      : parseInt(name.slice(1), 10)\n\n    if (isValidEntityCode(code)) {\n      return fromCodePoint(code)\n    }\n\n    return match\n  }\n\n  const decoded = decodeHTML(match)\n  if (decoded !== match) {\n    return decoded\n  }\n\n  return match\n}\n\n/* function replaceEntities(str) {\n  if (str.indexOf('&') < 0) { return str; }\n\n  return str.replace(ENTITY_RE, replaceEntityPattern);\n} */\n\nfunction unescapeMd (str) {\n  if (str.indexOf('\\\\') < 0) { return str }\n  return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\nfunction unescapeAll (str) {\n  if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n  return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n    if (escaped) { return escaped }\n    return replaceEntityPattern(match, entity)\n  })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch) {\n  return HTML_REPLACEMENTS[ch]\n}\n\nfunction escapeHtml (str) {\n  if (HTML_ESCAPE_TEST_RE.test(str)) {\n    return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n  }\n  return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\nfunction escapeRE (str) {\n  return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\nfunction isSpace (code) {\n  switch (code) {\n    case 0x09:\n    case 0x20:\n      return true\n  }\n  return false\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace (code) {\n  if (code >= 0x2000 && code <= 0x200A) { return true }\n  switch (code) {\n    case 0x09: // \\t\n    case 0x0A: // \\n\n    case 0x0B: // \\v\n    case 0x0C: // \\f\n    case 0x0D: // \\r\n    case 0x20:\n    case 0xA0:\n    case 0x1680:\n    case 0x202F:\n    case 0x205F:\n    case 0x3000:\n      return true\n  }\n  return false\n}\n\n/* eslint-disable max-len */\n\n// Currently without astral characters support.\nfunction isPunctChar (ch) {\n  return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct (ch) {\n  switch (ch) {\n    case 0x21/* ! */:\n    case 0x22/* \" */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x27/* ' */:\n    case 0x28/* ( */:\n    case 0x29/* ) */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2C/* , */:\n    case 0x2D/* - */:\n    case 0x2E/* . */:\n    case 0x2F/* / */:\n    case 0x3A/* : */:\n    case 0x3B/* ; */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x3F/* ? */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7C/* | */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference (str) {\n  // Trim and collapse whitespace\n  //\n  str = str.trim().replace(/\\s+/g, ' ')\n\n  // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n  // fixed in v12 (couldn't find any details).\n  //\n  // So treat this one as a special case\n  // (remove this when node v10 is no longer supported).\n  //\n  if ('ẞ'.toLowerCase() === 'Ṿ') {\n    str = str.replace(/ẞ/g, 'ß')\n  }\n\n  // .toLowerCase().toUpperCase() should get rid of all differences\n  // between letter variants.\n  //\n  // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n  // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n  // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n  // uppercased versions).\n  //\n  // Here's an example showing how it happens. Lets take greek letter omega:\n  // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n  //\n  // Unicode entries:\n  // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n  // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n  // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n  // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n  //\n  // Case-insensitive comparison should treat all of them as equivalent.\n  //\n  // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n  // and .toUpperCase() doesn't change ϴ (already uppercase).\n  //\n  // Applying first lower then upper case normalizes any character:\n  // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n  //\n  // Note: this is equivalent to unicode case folding; unicode normalization\n  // is a different step that is not required here.\n  //\n  // Final result should be uppercased, because it's later stored in an object\n  // (this avoid a conflict with Object.prototype members,\n  // most notably, `__proto__`)\n  //\n  return str.toLowerCase().toUpperCase()\n}\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nconst lib = { mdurl, ucmicro }\n\nexport {\n  lib,\n  assign,\n  isString,\n  has,\n  unescapeMd,\n  unescapeAll,\n  isValidEntityCode,\n  fromCodePoint,\n  escapeHtml,\n  arrayReplaceAt,\n  isSpace,\n  isWhiteSpace,\n  isMdAsciiPunct,\n  isPunctChar,\n  escapeRE,\n  normalizeReference\n}\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n\nexport default function parseLinkLabel (state, start, disableNested) {\n  let level, found, marker, prevPos\n\n  const max = state.posMax\n  const oldPos = state.pos\n\n  state.pos = start + 1\n  level = 1\n\n  while (state.pos < max) {\n    marker = state.src.charCodeAt(state.pos)\n    if (marker === 0x5D /* ] */) {\n      level--\n      if (level === 0) {\n        found = true\n        break\n      }\n    }\n\n    prevPos = state.pos\n    state.md.inline.skipToken(state)\n    if (marker === 0x5B /* [ */) {\n      if (prevPos === state.pos - 1) {\n        // increase level if we find text `[`, which is not a part of any token\n        level++\n      } else if (disableNested) {\n        state.pos = oldPos\n        return -1\n      }\n    }\n  }\n\n  let labelEnd = -1\n\n  if (found) {\n    labelEnd = state.pos\n  }\n\n  // restore old state\n  state.pos = oldPos\n\n  return labelEnd\n}\n","// Parse link destination\n//\n\nimport { unescapeAll } from '../common/utils.mjs'\n\nexport default function parseLinkDestination (str, start, max) {\n  let code\n  let pos = start\n\n  const result = {\n    ok: false,\n    pos: 0,\n    str: ''\n  }\n\n  if (str.charCodeAt(pos) === 0x3C /* < */) {\n    pos++\n    while (pos < max) {\n      code = str.charCodeAt(pos)\n      if (code === 0x0A /* \\n */) { return result }\n      if (code === 0x3C /* < */) { return result }\n      if (code === 0x3E /* > */) {\n        result.pos = pos + 1\n        result.str = unescapeAll(str.slice(start + 1, pos))\n        result.ok = true\n        return result\n      }\n      if (code === 0x5C /* \\ */ && pos + 1 < max) {\n        pos += 2\n        continue\n      }\n\n      pos++\n    }\n\n    // no closing '>'\n    return result\n  }\n\n  // this should be ... } else { ... branch\n\n  let level = 0\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n\n    if (code === 0x20) { break }\n\n    // ascii control characters\n    if (code < 0x20 || code === 0x7F) { break }\n\n    if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      if (str.charCodeAt(pos + 1) === 0x20) { break }\n      pos += 2\n      continue\n    }\n\n    if (code === 0x28 /* ( */) {\n      level++\n      if (level > 32) { return result }\n    }\n\n    if (code === 0x29 /* ) */) {\n      if (level === 0) { break }\n      level--\n    }\n\n    pos++\n  }\n\n  if (start === pos) { return result }\n  if (level !== 0) { return result }\n\n  result.str = unescapeAll(str.slice(start, pos))\n  result.pos = pos\n  result.ok = true\n  return result\n}\n","// Parse link title\n//\n\nimport { unescapeAll } from '../common/utils.mjs'\n\n// Parse link title within `str` in [start, max] range,\n// or continue previous parsing if `prev_state` is defined (equal to result of last execution).\n//\nexport default function parseLinkTitle (str, start, max, prev_state) {\n  let code\n  let pos = start\n\n  const state = {\n    // if `true`, this is a valid link title\n    ok: false,\n    // if `true`, this link can be continued on the next line\n    can_continue: false,\n    // if `ok`, it's the position of the first character after the closing marker\n    pos: 0,\n    // if `ok`, it's the unescaped title\n    str: '',\n    // expected closing marker character code\n    marker: 0\n  }\n\n  if (prev_state) {\n    // this is a continuation of a previous parseLinkTitle call on the next line,\n    // used in reference links only\n    state.str = prev_state.str\n    state.marker = prev_state.marker\n  } else {\n    if (pos >= max) { return state }\n\n    let marker = str.charCodeAt(pos)\n    if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return state }\n\n    start++\n    pos++\n\n    // if opening marker is \"(\", switch it to closing marker \")\"\n    if (marker === 0x28) { marker = 0x29 }\n\n    state.marker = marker\n  }\n\n  while (pos < max) {\n    code = str.charCodeAt(pos)\n    if (code === state.marker) {\n      state.pos = pos + 1\n      state.str += unescapeAll(str.slice(start, pos))\n      state.ok = true\n      return state\n    } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) {\n      return state\n    } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n      pos++\n    }\n\n    pos++\n  }\n\n  // no closing marker found, but this link title may continue on the next line (for references)\n  state.can_continue = true\n  state.str += unescapeAll(str.slice(start, pos))\n  return state\n}\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n\nimport { assign, unescapeAll, escapeHtml } from './common/utils.mjs'\n\nconst default_rules = {}\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  return  '<code' + slf.renderAttrs(token) + '>' +\n          escapeHtml(token.content) +\n          '</code>'\n}\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  return  '<pre' + slf.renderAttrs(token) + '><code>' +\n          escapeHtml(tokens[idx].content) +\n          '</code></pre>\\n'\n}\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n  const info = token.info ? unescapeAll(token.info).trim() : ''\n  let langName = ''\n  let langAttrs = ''\n\n  if (info) {\n    const arr = info.split(/(\\s+)/g)\n    langName = arr[0]\n    langAttrs = arr.slice(2).join('')\n  }\n\n  let highlighted\n  if (options.highlight) {\n    highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content)\n  } else {\n    highlighted = escapeHtml(token.content)\n  }\n\n  if (highlighted.indexOf('<pre') === 0) {\n    return highlighted + '\\n'\n  }\n\n  // If language exists, inject class gently, without modifying original token.\n  // May be, one day we will add .deepClone() for token and simplify this part, but\n  // now we prefer to keep things local.\n  if (info) {\n    const i = token.attrIndex('class')\n    const tmpAttrs = token.attrs ? token.attrs.slice() : []\n\n    if (i < 0) {\n      tmpAttrs.push(['class', options.langPrefix + langName])\n    } else {\n      tmpAttrs[i] = tmpAttrs[i].slice()\n      tmpAttrs[i][1] += ' ' + options.langPrefix + langName\n    }\n\n    // Fake token just to render attributes\n    const tmpToken = {\n      attrs: tmpAttrs\n    }\n\n    return `<pre><code${slf.renderAttrs(tmpToken)}>${highlighted}</code></pre>\\n`\n  }\n\n  return `<pre><code${slf.renderAttrs(token)}>${highlighted}</code></pre>\\n`\n}\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n  const token = tokens[idx]\n\n  // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n  // should be placed on proper position for tests.\n  //\n  // Replace content with actual value\n\n  token.attrs[token.attrIndex('alt')][1] =\n    slf.renderInlineAsText(token.children, options, env)\n\n  return slf.renderToken(tokens, idx, options)\n}\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n  return options.xhtmlOut ? '<br />\\n' : '<br>\\n'\n}\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n  return options.breaks ? (options.xhtmlOut ? '<br />\\n' : '<br>\\n') : '\\n'\n}\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n  return escapeHtml(tokens[idx].content)\n}\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content\n}\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n  return tokens[idx].content\n}\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer () {\n  /**\n   * Renderer#rules -> Object\n   *\n   * Contains render rules for tokens. Can be updated and extended.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * md.renderer.rules.strong_open  = function () { return '<b>'; };\n   * md.renderer.rules.strong_close = function () { return '</b>'; };\n   *\n   * var result = md.renderInline(...);\n   * ```\n   *\n   * Each rule is called as independent static function with fixed signature:\n   *\n   * ```javascript\n   * function my_token_render(tokens, idx, options, env, renderer) {\n   *   // ...\n   *   return renderedHTML;\n   * }\n   * ```\n   *\n   * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs)\n   * for more details and examples.\n   **/\n  this.rules = assign({}, default_rules)\n}\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs (token) {\n  let i, l, result\n\n  if (!token.attrs) { return '' }\n\n  result = ''\n\n  for (i = 0, l = token.attrs.length; i < l; i++) {\n    result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"'\n  }\n\n  return result\n}\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken (tokens, idx, options) {\n  const token = tokens[idx]\n  let result = ''\n\n  // Tight list paragraphs\n  if (token.hidden) {\n    return ''\n  }\n\n  // Insert a newline between hidden paragraph and subsequent opening\n  // block-level tag.\n  //\n  // For example, here we should insert a newline before blockquote:\n  //  - a\n  //    >\n  //\n  if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n    result += '\\n'\n  }\n\n  // Add token name, e.g. `<img`\n  result += (token.nesting === -1 ? '</' : '<') + token.tag\n\n  // Encode attributes, e.g. `<img src=\"foo\"`\n  result += this.renderAttrs(token)\n\n  // Add a slash for self-closing tags, e.g. `<img src=\"foo\" /`\n  if (token.nesting === 0 && options.xhtmlOut) {\n    result += ' /'\n  }\n\n  // Check if we need to add a newline after this tag\n  let needLf = false\n  if (token.block) {\n    needLf = true\n\n    if (token.nesting === 1) {\n      if (idx + 1 < tokens.length) {\n        const nextToken = tokens[idx + 1]\n\n        if (nextToken.type === 'inline' || nextToken.hidden) {\n          // Block-level tag containing an inline tag.\n          //\n          needLf = false\n        } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {\n          // Opening tag + closing tag of the same type. E.g. `<li></li>`.\n          //\n          needLf = false\n        }\n      }\n    }\n  }\n\n  result += needLf ? '>\\n' : '>'\n\n  return result\n}\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n  let result = ''\n  const rules = this.rules\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    const type = tokens[i].type\n\n    if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this)\n    } else {\n      result += this.renderToken(tokens, i, options)\n    }\n  }\n\n  return result\n}\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n  let result = ''\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    switch (tokens[i].type) {\n      case 'text':\n        result += tokens[i].content\n        break\n      case 'image':\n        result += this.renderInlineAsText(tokens[i].children, options, env)\n        break\n      case 'html_inline':\n      case 'html_block':\n        result += tokens[i].content\n        break\n      case 'softbreak':\n      case 'hardbreak':\n        result += '\\n'\n        break\n      default:\n        // all other tokens are skipped\n    }\n  }\n\n  return result\n}\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to render\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n  let result = ''\n  const rules = this.rules\n\n  for (let i = 0, len = tokens.length; i < len; i++) {\n    const type = tokens[i].type\n\n    if (type === 'inline') {\n      result += this.renderInline(tokens[i].children, options, env)\n    } else if (typeof rules[type] !== 'undefined') {\n      result += rules[type](tokens, i, options, env, this)\n    } else {\n      result += this.renderToken(tokens, i, options, env)\n    }\n  }\n\n  return result\n}\n\nexport default Renderer\n","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n\n/**\n * new Ruler()\n **/\nfunction Ruler () {\n  // List of added rules. Each element is:\n  //\n  // {\n  //   name: XXX,\n  //   enabled: Boolean,\n  //   fn: Function(),\n  //   alt: [ name2, name3 ]\n  // }\n  //\n  this.__rules__ = []\n\n  // Cached rule chains.\n  //\n  // First level - chain name, '' for default.\n  // Second level - diginal anchor for fast filtering by charcodes.\n  //\n  this.__cache__ = null\n}\n\n// Helper methods, should not be used directly\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n  for (let i = 0; i < this.__rules__.length; i++) {\n    if (this.__rules__[i].name === name) {\n      return i\n    }\n  }\n  return -1\n}\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n  const self = this\n  const chains = ['']\n\n  // collect unique names\n  self.__rules__.forEach(function (rule) {\n    if (!rule.enabled) { return }\n\n    rule.alt.forEach(function (altName) {\n      if (chains.indexOf(altName) < 0) {\n        chains.push(altName)\n      }\n    })\n  })\n\n  self.__cache__ = {}\n\n  chains.forEach(function (chain) {\n    self.__cache__[chain] = []\n    self.__rules__.forEach(function (rule) {\n      if (!rule.enabled) { return }\n\n      if (chain && rule.alt.indexOf(chain) < 0) { return }\n\n      self.__cache__[chain].push(rule.fn)\n    })\n  })\n}\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n  const index = this.__find__(name)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + name) }\n\n  this.__rules__[index].fn = fn\n  this.__rules__[index].alt = opt.alt || []\n  this.__cache__ = null\n}\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n  const index = this.__find__(beforeName)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + beforeName) }\n\n  this.__rules__.splice(index, 0, {\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n  const index = this.__find__(afterName)\n  const opt = options || {}\n\n  if (index === -1) { throw new Error('Parser rule not found: ' + afterName) }\n\n  this.__rules__.splice(index + 1, 0, {\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n *   //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n  const opt = options || {}\n\n  this.__rules__.push({\n    name: ruleName,\n    enabled: true,\n    fn,\n    alt: opt.alt || []\n  })\n\n  this.__cache__ = null\n}\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  const result = []\n\n  // Search by name and enable\n  list.forEach(function (name) {\n    const idx = this.__find__(name)\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return }\n      throw new Error('Rules manager: invalid rule name ' + name)\n    }\n    this.__rules__[idx].enabled = true\n    result.push(name)\n  }, this)\n\n  this.__cache__ = null\n  return result\n}\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  this.__rules__.forEach(function (rule) { rule.enabled = false })\n\n  this.enable(list, ignoreInvalid)\n}\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n  if (!Array.isArray(list)) { list = [list] }\n\n  const result = []\n\n  // Search by name and disable\n  list.forEach(function (name) {\n    const idx = this.__find__(name)\n\n    if (idx < 0) {\n      if (ignoreInvalid) { return }\n      throw new Error('Rules manager: invalid rule name ' + name)\n    }\n    this.__rules__[idx].enabled = false\n    result.push(name)\n  }, this)\n\n  this.__cache__ = null\n  return result\n}\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n  if (this.__cache__ === null) {\n    this.__compile__()\n  }\n\n  // Chain can be empty, if rules disabled. But we still have to return Array.\n  return this.__cache__[chainName] || []\n}\n\nexport default Ruler\n","// Token class\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token (type, tag, nesting) {\n  /**\n   * Token#type -> String\n   *\n   * Type of the token (string, e.g. \"paragraph_open\")\n   **/\n  this.type     = type\n\n  /**\n   * Token#tag -> String\n   *\n   * html tag name, e.g. \"p\"\n   **/\n  this.tag      = tag\n\n  /**\n   * Token#attrs -> Array\n   *\n   * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n   **/\n  this.attrs    = null\n\n  /**\n   * Token#map -> Array\n   *\n   * Source map info. Format: `[ line_begin, line_end ]`\n   **/\n  this.map      = null\n\n  /**\n   * Token#nesting -> Number\n   *\n   * Level change (number in {-1, 0, 1} set), where:\n   *\n   * -  `1` means the tag is opening\n   * -  `0` means the tag is self-closing\n   * - `-1` means the tag is closing\n   **/\n  this.nesting  = nesting\n\n  /**\n   * Token#level -> Number\n   *\n   * nesting level, the same as `state.level`\n   **/\n  this.level    = 0\n\n  /**\n   * Token#children -> Array\n   *\n   * An array of child nodes (inline and img tokens)\n   **/\n  this.children = null\n\n  /**\n   * Token#content -> String\n   *\n   * In a case of self-closing tag (code, html, fence, etc.),\n   * it has contents of this tag.\n   **/\n  this.content  = ''\n\n  /**\n   * Token#markup -> String\n   *\n   * '*' or '_' for emphasis, fence string for fence, etc.\n   **/\n  this.markup   = ''\n\n  /**\n   * Token#info -> String\n   *\n   * Additional information:\n   *\n   * - Info string for \"fence\" tokens\n   * - The value \"auto\" for autolink \"link_open\" and \"link_close\" tokens\n   * - The string value of the item marker for ordered-list \"list_item_open\" tokens\n   **/\n  this.info     = ''\n\n  /**\n   * Token#meta -> Object\n   *\n   * A place for plugins to store an arbitrary data\n   **/\n  this.meta     = null\n\n  /**\n   * Token#block -> Boolean\n   *\n   * True for block-level tokens, false for inline tokens.\n   * Used in renderer to calculate line breaks\n   **/\n  this.block    = false\n\n  /**\n   * Token#hidden -> Boolean\n   *\n   * If it's true, ignore this element when rendering. Used for tight lists\n   * to hide paragraphs.\n   **/\n  this.hidden   = false\n}\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex (name) {\n  if (!this.attrs) { return -1 }\n\n  const attrs = this.attrs\n\n  for (let i = 0, len = attrs.length; i < len; i++) {\n    if (attrs[i][0] === name) { return i }\n  }\n  return -1\n}\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush (attrData) {\n  if (this.attrs) {\n    this.attrs.push(attrData)\n  } else {\n    this.attrs = [attrData]\n  }\n}\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet (name, value) {\n  const idx = this.attrIndex(name)\n  const attrData = [name, value]\n\n  if (idx < 0) {\n    this.attrPush(attrData)\n  } else {\n    this.attrs[idx] = attrData\n  }\n}\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet (name) {\n  const idx = this.attrIndex(name)\n  let value = null\n  if (idx >= 0) {\n    value = this.attrs[idx][1]\n  }\n  return value\n}\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin (name, value) {\n  const idx = this.attrIndex(name)\n\n  if (idx < 0) {\n    this.attrPush([name, value])\n  } else {\n    this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value\n  }\n}\n\nexport default Token\n","// Core state object\n//\n\nimport Token from '../token.mjs'\n\nfunction StateCore (src, md, env) {\n  this.src = src\n  this.env = env\n  this.tokens = []\n  this.inlineMode = false\n  this.md = md // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token\n\nexport default StateCore\n","// Normalize input string\n\n// https://spec.commonmark.org/0.29/#line-ending\nconst NEWLINES_RE  = /\\r\\n?|\\n/g\nconst NULL_RE      = /\\0/g\n\nexport default function normalize (state) {\n  let str\n\n  // Normalize newlines\n  str = state.src.replace(NEWLINES_RE, '\\n')\n\n  // Replace NULL characters\n  str = str.replace(NULL_RE, '\\uFFFD')\n\n  state.src = str\n}\n","export default function block (state) {\n  let token\n\n  if (state.inlineMode) {\n    token          = new state.Token('inline', '', 0)\n    token.content  = state.src\n    token.map      = [0, 1]\n    token.children = []\n    state.tokens.push(token)\n  } else {\n    state.md.block.parse(state.src, state.md, state.env, state.tokens)\n  }\n}\n","export default function inline (state) {\n  const tokens = state.tokens\n\n  // Parse inlines\n  for (let i = 0, l = tokens.length; i < l; i++) {\n    const tok = tokens[i]\n    if (tok.type === 'inline') {\n      state.md.inline.parse(tok.content, state.md, state.env, tok.children)\n    }\n  }\n}\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n\nimport { arrayReplaceAt } from '../common/utils.mjs'\n\nfunction isLinkOpen (str) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nexport default function linkify (state) {\n  const blockTokens = state.tokens\n\n  if (!state.md.options.linkify) { return }\n\n  for (let j = 0, l = blockTokens.length; j < l; j++) {\n    if (blockTokens[j].type !== 'inline' ||\n        !state.md.linkify.pretest(blockTokens[j].content)) {\n      continue\n    }\n\n    let tokens = blockTokens[j].children\n\n    let htmlLinkLevel = 0\n\n    // We scan from the end, to keep position when new tags added.\n    // Use reversed logic in links start/end match\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      const currentToken = tokens[i]\n\n      // Skip content of markdown links\n      if (currentToken.type === 'link_close') {\n        i--\n        while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n          i--\n        }\n        continue\n      }\n\n      // Skip content of html tag links\n      if (currentToken.type === 'html_inline') {\n        if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n          htmlLinkLevel--\n        }\n        if (isLinkClose(currentToken.content)) {\n          htmlLinkLevel++\n        }\n      }\n      if (htmlLinkLevel > 0) { continue }\n\n      if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n        const text = currentToken.content\n        let links = state.md.linkify.match(text)\n\n        // Now split string to nodes\n        const nodes = []\n        let level = currentToken.level\n        let lastPos = 0\n\n        // forbid escape sequence at the start of the string,\n        // this avoids http\\://example.com/ from being linkified as\n        // http:<a href=\"//example.com/\">//example.com/</a>\n        if (links.length > 0 &&\n            links[0].index === 0 &&\n            i > 0 &&\n            tokens[i - 1].type === 'text_special') {\n          links = links.slice(1)\n        }\n\n        for (let ln = 0; ln < links.length; ln++) {\n          const url = links[ln].url\n          const fullUrl = state.md.normalizeLink(url)\n          if (!state.md.validateLink(fullUrl)) { continue }\n\n          let urlText = links[ln].text\n\n          // Linkifier might send raw hostnames like \"example.com\", where url\n          // starts with domain name. So we prepend http:// in those cases,\n          // and remove it afterwards.\n          //\n          if (!links[ln].schema) {\n            urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '')\n          } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n            urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '')\n          } else {\n            urlText = state.md.normalizeLinkText(urlText)\n          }\n\n          const pos = links[ln].index\n\n          if (pos > lastPos) {\n            const token   = new state.Token('text', '', 0)\n            token.content = text.slice(lastPos, pos)\n            token.level   = level\n            nodes.push(token)\n          }\n\n          const token_o   = new state.Token('link_open', 'a', 1)\n          token_o.attrs   = [['href', fullUrl]]\n          token_o.level   = level++\n          token_o.markup  = 'linkify'\n          token_o.info    = 'auto'\n          nodes.push(token_o)\n\n          const token_t   = new state.Token('text', '', 0)\n          token_t.content = urlText\n          token_t.level   = level\n          nodes.push(token_t)\n\n          const token_c   = new state.Token('link_close', 'a', -1)\n          token_c.level   = --level\n          token_c.markup  = 'linkify'\n          token_c.info    = 'auto'\n          nodes.push(token_c)\n\n          lastPos = links[ln].lastIndex\n        }\n        if (lastPos < text.length) {\n          const token   = new state.Token('text', '', 0)\n          token.content = text.slice(lastPos)\n          token.level   = level\n          nodes.push(token)\n        }\n\n        // replace current node\n        blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes)\n      }\n    }\n  }\n}\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → &ndash;, --- → &mdash;\n//\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - multiplications 2 x 4 -> 2 × 4\n\nconst RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nconst SCOPED_ABBR_TEST_RE = /\\((c|tm|r)\\)/i\n\nconst SCOPED_ABBR_RE = /\\((c|tm|r)\\)/ig\nconst SCOPED_ABBR = {\n  c: '©',\n  r: '®',\n  tm: '™'\n}\n\nfunction replaceFn (match, name) {\n  return SCOPED_ABBR[name.toLowerCase()]\n}\n\nfunction replace_scoped (inlineTokens) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn)\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nfunction replace_rare (inlineTokens) {\n  let inside_autolink = 0\n\n  for (let i = inlineTokens.length - 1; i >= 0; i--) {\n    const token = inlineTokens[i]\n\n    if (token.type === 'text' && !inside_autolink) {\n      if (RARE_RE.test(token.content)) {\n        token.content = token.content\n          .replace(/\\+-/g, '±')\n          // .., ..., ....... -> …\n          // but ?..... & !..... -> ?.. & !..\n          .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n          .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n          // em-dash\n          .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\\u2014')\n          // en-dash\n          .replace(/(^|\\s)--(?=\\s|$)/mg, '$1\\u2013')\n          .replace(/(^|[^-\\s])--(?=[^-\\s]|$)/mg, '$1\\u2013')\n      }\n    }\n\n    if (token.type === 'link_open' && token.info === 'auto') {\n      inside_autolink--\n    }\n\n    if (token.type === 'link_close' && token.info === 'auto') {\n      inside_autolink++\n    }\n  }\n}\n\nexport default function replace (state) {\n  let blkIdx\n\n  if (!state.md.options.typographer) { return }\n\n  for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline') { continue }\n\n    if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n      replace_scoped(state.tokens[blkIdx].children)\n    }\n\n    if (RARE_RE.test(state.tokens[blkIdx].content)) {\n      replace_rare(state.tokens[blkIdx].children)\n    }\n  }\n}\n","// Convert straight quotation marks to typographic ones\n//\n\nimport { isWhiteSpace, isPunctChar, isMdAsciiPunct } from '../common/utils.mjs'\n\nconst QUOTE_TEST_RE = /['\"]/\nconst QUOTE_RE = /['\"]/g\nconst APOSTROPHE = '\\u2019' /* ’ */\n\nfunction replaceAt (str, index, ch) {\n  return str.slice(0, index) + ch + str.slice(index + 1)\n}\n\nfunction process_inlines (tokens, state) {\n  let j\n\n  const stack = []\n\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i]\n\n    const thisLevel = tokens[i].level\n\n    for (j = stack.length - 1; j >= 0; j--) {\n      if (stack[j].level <= thisLevel) { break }\n    }\n    stack.length = j + 1\n\n    if (token.type !== 'text') { continue }\n\n    let text = token.content\n    let pos = 0\n    let max = text.length\n\n    /* eslint no-labels:0,block-scoped-var:0 */\n    OUTER:\n    while (pos < max) {\n      QUOTE_RE.lastIndex = pos\n      const t = QUOTE_RE.exec(text)\n      if (!t) { break }\n\n      let canOpen = true\n      let canClose = true\n      pos = t.index + 1\n      const isSingle = (t[0] === \"'\")\n\n      // Find previous character,\n      // default to space if it's the beginning of the line\n      //\n      let lastChar = 0x20\n\n      if (t.index - 1 >= 0) {\n        lastChar = text.charCodeAt(t.index - 1)\n      } else {\n        for (j = i - 1; j >= 0; j--) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // lastChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1)\n          break\n        }\n      }\n\n      // Find next character,\n      // default to space if it's the end of the line\n      //\n      let nextChar = 0x20\n\n      if (pos < max) {\n        nextChar = text.charCodeAt(pos)\n      } else {\n        for (j = i + 1; j < tokens.length; j++) {\n          if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break // nextChar defaults to 0x20\n          if (!tokens[j].content) continue // should skip all tokens except 'text', 'html_inline' or 'code_inline'\n\n          nextChar = tokens[j].content.charCodeAt(0)\n          break\n        }\n      }\n\n      const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar))\n      const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar))\n\n      const isLastWhiteSpace = isWhiteSpace(lastChar)\n      const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n      if (isNextWhiteSpace) {\n        canOpen = false\n      } else if (isNextPunctChar) {\n        if (!(isLastWhiteSpace || isLastPunctChar)) {\n          canOpen = false\n        }\n      }\n\n      if (isLastWhiteSpace) {\n        canClose = false\n      } else if (isLastPunctChar) {\n        if (!(isNextWhiteSpace || isNextPunctChar)) {\n          canClose = false\n        }\n      }\n\n      if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n        if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n          // special case: 1\"\" - count first quote as an inch\n          canClose = canOpen = false\n        }\n      }\n\n      if (canOpen && canClose) {\n        // Replace quotes in the middle of punctuation sequence, but not\n        // in the middle of the words, i.e.:\n        //\n        // 1. foo \" bar \" baz - not replaced\n        // 2. foo-\"-bar-\"-baz - replaced\n        // 3. foo\"bar\"baz     - not replaced\n        //\n        canOpen = isLastPunctChar\n        canClose = isNextPunctChar\n      }\n\n      if (!canOpen && !canClose) {\n        // middle of word\n        if (isSingle) {\n          token.content = replaceAt(token.content, t.index, APOSTROPHE)\n        }\n        continue\n      }\n\n      if (canClose) {\n        // this could be a closing quote, rewind the stack to get a match\n        for (j = stack.length - 1; j >= 0; j--) {\n          let item = stack[j]\n          if (stack[j].level < thisLevel) { break }\n          if (item.single === isSingle && stack[j].level === thisLevel) {\n            item = stack[j]\n\n            let openQuote\n            let closeQuote\n            if (isSingle) {\n              openQuote = state.md.options.quotes[2]\n              closeQuote = state.md.options.quotes[3]\n            } else {\n              openQuote = state.md.options.quotes[0]\n              closeQuote = state.md.options.quotes[1]\n            }\n\n            // replace token.content *before* tokens[item.token].content,\n            // because, if they are pointing at the same token, replaceAt\n            // could mess up indices when quote length != 1\n            token.content = replaceAt(token.content, t.index, closeQuote)\n            tokens[item.token].content = replaceAt(\n              tokens[item.token].content, item.pos, openQuote)\n\n            pos += closeQuote.length - 1\n            if (item.token === i) { pos += openQuote.length - 1 }\n\n            text = token.content\n            max = text.length\n\n            stack.length = j\n            continue OUTER\n          }\n        }\n      }\n\n      if (canOpen) {\n        stack.push({\n          token: i,\n          pos: t.index,\n          single: isSingle,\n          level: thisLevel\n        })\n      } else if (canClose && isSingle) {\n        token.content = replaceAt(token.content, t.index, APOSTROPHE)\n      }\n    }\n  }\n}\n\nexport default function smartquotes (state) {\n  /* eslint max-depth:0 */\n  if (!state.md.options.typographer) { return }\n\n  for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n    if (state.tokens[blkIdx].type !== 'inline' ||\n        !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n      continue\n    }\n\n    process_inlines(state.tokens[blkIdx].children, state)\n  }\n}\n","// Join raw text tokens with the rest of the text\n//\n// This is set as a separate rule to provide an opportunity for plugins\n// to run text replacements after text join, but before escape join.\n//\n// For example, `\\:)` shouldn't be replaced with an emoji.\n//\n\nexport default function text_join (state) {\n  let curr, last\n  const blockTokens = state.tokens\n  const l = blockTokens.length\n\n  for (let j = 0; j < l; j++) {\n    if (blockTokens[j].type !== 'inline') continue\n\n    const tokens = blockTokens[j].children\n    const max = tokens.length\n\n    for (curr = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text_special') {\n        tokens[curr].type = 'text'\n      }\n    }\n\n    for (curr = last = 0; curr < max; curr++) {\n      if (tokens[curr].type === 'text' &&\n          curr + 1 < max &&\n          tokens[curr + 1].type === 'text') {\n        // collapse two adjacent text nodes\n        tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n      } else {\n        if (curr !== last) { tokens[last] = tokens[curr] }\n\n        last++\n      }\n    }\n\n    if (curr !== last) {\n      tokens.length = last\n    }\n  }\n}\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateCore from './rules_core/state_core.mjs'\n\nimport r_normalize from './rules_core/normalize.mjs'\nimport r_block from './rules_core/block.mjs'\nimport r_inline from './rules_core/inline.mjs'\nimport r_linkify from './rules_core/linkify.mjs'\nimport r_replacements from './rules_core/replacements.mjs'\nimport r_smartquotes from './rules_core/smartquotes.mjs'\nimport r_text_join from './rules_core/text_join.mjs'\n\nconst _rules = [\n  ['normalize',      r_normalize],\n  ['block',          r_block],\n  ['inline',         r_inline],\n  ['linkify',        r_linkify],\n  ['replacements',   r_replacements],\n  ['smartquotes',    r_smartquotes],\n  // `text_join` finds `text_special` tokens (for escape sequences)\n  // and joins them with the rest of the text\n  ['text_join',      r_text_join]\n]\n\n/**\n * new Core()\n **/\nfunction Core () {\n  /**\n   * Core#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of core rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1])\n  }\n}\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n  const rules = this.ruler.getRules('')\n\n  for (let i = 0, l = rules.length; i < l; i++) {\n    rules[i](state)\n  }\n}\n\nCore.prototype.State = StateCore\n\nexport default Core\n","// Parser state class\n\nimport Token from '../token.mjs'\nimport { isSpace } from '../common/utils.mjs'\n\nfunction StateBlock (src, md, env, tokens) {\n  this.src = src\n\n  // link to parser instance\n  this.md     = md\n\n  this.env = env\n\n  //\n  // Internal state vartiables\n  //\n\n  this.tokens = tokens\n\n  this.bMarks = []  // line begin offsets for fast jumps\n  this.eMarks = []  // line end offsets for fast jumps\n  this.tShift = []  // offsets of the first non-space characters (tabs not expanded)\n  this.sCount = []  // indents for each line (tabs expanded)\n\n  // An amount of virtual spaces (tabs expanded) between beginning\n  // of each line (bMarks) and real beginning of that line.\n  //\n  // It exists only as a hack because blockquotes override bMarks\n  // losing information in the process.\n  //\n  // It's used only when expanding tabs, you can think about it as\n  // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n  // means first tab should be expanded to 4-21%4 === 3 spaces.\n  //\n  this.bsCount = []\n\n  // block parser variables\n\n  // required block content indent (for example, if we are\n  // inside a list, it would be positioned after list marker)\n  this.blkIndent  = 0\n  this.line       = 0 // line index in src\n  this.lineMax    = 0 // lines count\n  this.tight      = false  // loose/tight mode for lists\n  this.ddIndent   = -1 // indent of the current dd block (-1 if there isn't any)\n  this.listIndent = -1 // indent of the current list block (-1 if there isn't any)\n\n  // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n  // used in lists to determine if they interrupt a paragraph\n  this.parentType = 'root'\n\n  this.level = 0\n\n  // Create caches\n  // Generate markers.\n  const s = this.src\n\n  for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) {\n    const ch = s.charCodeAt(pos)\n\n    if (!indent_found) {\n      if (isSpace(ch)) {\n        indent++\n\n        if (ch === 0x09) {\n          offset += 4 - offset % 4\n        } else {\n          offset++\n        }\n        continue\n      } else {\n        indent_found = true\n      }\n    }\n\n    if (ch === 0x0A || pos === len - 1) {\n      if (ch !== 0x0A) { pos++ }\n      this.bMarks.push(start)\n      this.eMarks.push(pos)\n      this.tShift.push(indent)\n      this.sCount.push(offset)\n      this.bsCount.push(0)\n\n      indent_found = false\n      indent = 0\n      offset = 0\n      start = pos + 1\n    }\n  }\n\n  // Push fake entry to simplify cache bounds checks\n  this.bMarks.push(s.length)\n  this.eMarks.push(s.length)\n  this.tShift.push(0)\n  this.sCount.push(0)\n  this.bsCount.push(0)\n\n  this.lineMax = this.bMarks.length - 1 // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n  const token = new Token(type, tag, nesting)\n  token.block = true\n\n  if (nesting < 0) this.level-- // closing tag\n  token.level = this.level\n  if (nesting > 0) this.level++ // opening tag\n\n  this.tokens.push(token)\n  return token\n}\n\nStateBlock.prototype.isEmpty = function isEmpty (line) {\n  return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]\n}\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines (from) {\n  for (let max = this.lineMax; from < max; from++) {\n    if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n      break\n    }\n  }\n  return from\n}\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces (pos) {\n  for (let max = this.src.length; pos < max; pos++) {\n    const ch = this.src.charCodeAt(pos)\n    if (!isSpace(ch)) { break }\n  }\n  return pos\n}\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack (pos, min) {\n  if (pos <= min) { return pos }\n\n  while (pos > min) {\n    if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1 }\n  }\n  return pos\n}\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars (pos, code) {\n  for (let max = this.src.length; pos < max; pos++) {\n    if (this.src.charCodeAt(pos) !== code) { break }\n  }\n  return pos\n}\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack (pos, code, min) {\n  if (pos <= min) { return pos }\n\n  while (pos > min) {\n    if (code !== this.src.charCodeAt(--pos)) { return pos + 1 }\n  }\n  return pos\n}\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines (begin, end, indent, keepLastLF) {\n  if (begin >= end) {\n    return ''\n  }\n\n  const queue = new Array(end - begin)\n\n  for (let i = 0, line = begin; line < end; line++, i++) {\n    let lineIndent = 0\n    const lineStart = this.bMarks[line]\n    let first = lineStart\n    let last\n\n    if (line + 1 < end || keepLastLF) {\n      // No need for bounds check because we have fake entry on tail.\n      last = this.eMarks[line] + 1\n    } else {\n      last = this.eMarks[line]\n    }\n\n    while (first < last && lineIndent < indent) {\n      const ch = this.src.charCodeAt(first)\n\n      if (isSpace(ch)) {\n        if (ch === 0x09) {\n          lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4\n        } else {\n          lineIndent++\n        }\n      } else if (first - lineStart < this.tShift[line]) {\n        // patched tShift masked characters to look like spaces (blockquotes, list markers)\n        lineIndent++\n      } else {\n        break\n      }\n\n      first++\n    }\n\n    if (lineIndent > indent) {\n      // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n      // with indent=2 becomes '  \\tfoobar'\n      queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last)\n    } else {\n      queue[i] = this.src.slice(first, last)\n    }\n  }\n\n  return queue.join('')\n}\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token\n\nexport default StateBlock\n","// GFM table, https://github.github.com/gfm/#tables-extension-\n\nimport { isSpace } from '../common/utils.mjs'\n\n// Limit the amount of empty autocompleted cells in a table,\n// see https://github.com/markdown-it/markdown-it/issues/1000,\n//\n// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k.\n// We set it to 65k, which can expand user input by a factor of x370\n// (256x256 square is 1.8kB expanded into 650kB).\nconst MAX_AUTOCOMPLETED_CELLS = 0x10000\n\nfunction getLine (state, line) {\n  const pos = state.bMarks[line] + state.tShift[line]\n  const max = state.eMarks[line]\n\n  return state.src.slice(pos, max)\n}\n\nfunction escapedSplit (str) {\n  const result = []\n  const max = str.length\n\n  let pos = 0\n  let ch = str.charCodeAt(pos)\n  let isEscaped = false\n  let lastPos = 0\n  let current = ''\n\n  while (pos < max) {\n    if (ch === 0x7c/* | */) {\n      if (!isEscaped) {\n        // pipe separating cells, '|'\n        result.push(current + str.substring(lastPos, pos))\n        current = ''\n        lastPos = pos + 1\n      } else {\n        // escaped pipe, '\\|'\n        current += str.substring(lastPos, pos - 1)\n        lastPos = pos\n      }\n    }\n\n    isEscaped = (ch === 0x5c/* \\ */)\n    pos++\n\n    ch = str.charCodeAt(pos)\n  }\n\n  result.push(current + str.substring(lastPos))\n\n  return result\n}\n\nexport default function table (state, startLine, endLine, silent) {\n  // should have at least two lines\n  if (startLine + 2 > endLine) { return false }\n\n  let nextLine = startLine + 1\n\n  if (state.sCount[nextLine] < state.blkIndent) { return false }\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // first character of the second line should be '|', '-', ':',\n  // and no other characters are allowed but spaces;\n  // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n  let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const firstCh = state.src.charCodeAt(pos++)\n  if (firstCh !== 0x7C/* | */ && firstCh !== 0x2D/* - */ && firstCh !== 0x3A/* : */) { return false }\n\n  if (pos >= state.eMarks[nextLine]) { return false }\n\n  const secondCh = state.src.charCodeAt(pos++)\n  if (secondCh !== 0x7C/* | */ && secondCh !== 0x2D/* - */ && secondCh !== 0x3A/* : */ && !isSpace(secondCh)) {\n    return false\n  }\n\n  // if first character is '-', then second character must not be a space\n  // (due to parsing ambiguity with list)\n  if (firstCh === 0x2D/* - */ && isSpace(secondCh)) { return false }\n\n  while (pos < state.eMarks[nextLine]) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false }\n\n    pos++\n  }\n\n  let lineText = getLine(state, startLine + 1)\n  let columns = lineText.split('|')\n  const aligns = []\n  for (let i = 0; i < columns.length; i++) {\n    const t = columns[i].trim()\n    if (!t) {\n      // allow empty columns before and after table, but not in between columns;\n      // e.g. allow ` |---| `, disallow ` ---||--- `\n      if (i === 0 || i === columns.length - 1) {\n        continue\n      } else {\n        return false\n      }\n    }\n\n    if (!/^:?-+:?$/.test(t)) { return false }\n    if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n      aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right')\n    } else if (t.charCodeAt(0) === 0x3A/* : */) {\n      aligns.push('left')\n    } else {\n      aligns.push('')\n    }\n  }\n\n  lineText = getLine(state, startLine).trim()\n  if (lineText.indexOf('|') === -1) { return false }\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n  columns = escapedSplit(lineText)\n  if (columns.length && columns[0] === '') columns.shift()\n  if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n  // header row will define an amount of columns in the entire table,\n  // and align row should be exactly the same (the rest of the rows can differ)\n  const columnCount = columns.length\n  if (columnCount === 0 || columnCount !== aligns.length) { return false }\n\n  if (silent) { return true }\n\n  const oldParentType = state.parentType\n  state.parentType = 'table'\n\n  // use 'blockquote' lists for termination because it's\n  // the most similar to tables\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const token_to = state.push('table_open', 'table', 1)\n  const tableLines = [startLine, 0]\n  token_to.map = tableLines\n\n  const token_tho = state.push('thead_open', 'thead', 1)\n  token_tho.map = [startLine, startLine + 1]\n\n  const token_htro = state.push('tr_open', 'tr', 1)\n  token_htro.map = [startLine, startLine + 1]\n\n  for (let i = 0; i < columns.length; i++) {\n    const token_ho = state.push('th_open', 'th', 1)\n    if (aligns[i]) {\n      token_ho.attrs  = [['style', 'text-align:' + aligns[i]]]\n    }\n\n    const token_il = state.push('inline', '', 0)\n    token_il.content  = columns[i].trim()\n    token_il.children = []\n\n    state.push('th_close', 'th', -1)\n  }\n\n  state.push('tr_close', 'tr', -1)\n  state.push('thead_close', 'thead', -1)\n\n  let tbodyLines\n  let autocompletedCells = 0\n\n  for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) { break }\n    lineText = getLine(state, nextLine).trim()\n    if (!lineText) { break }\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n    columns = escapedSplit(lineText)\n    if (columns.length && columns[0] === '') columns.shift()\n    if (columns.length && columns[columns.length - 1] === '') columns.pop()\n\n    // note: autocomplete count can be negative if user specifies more columns than header,\n    // but that does not affect intended use (which is limiting expansion)\n    autocompletedCells += columnCount - columns.length\n    if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { break }\n\n    if (nextLine === startLine + 2) {\n      const token_tbo = state.push('tbody_open', 'tbody', 1)\n      token_tbo.map = tbodyLines = [startLine + 2, 0]\n    }\n\n    const token_tro = state.push('tr_open', 'tr', 1)\n    token_tro.map = [nextLine, nextLine + 1]\n\n    for (let i = 0; i < columnCount; i++) {\n      const token_tdo = state.push('td_open', 'td', 1)\n      if (aligns[i]) {\n        token_tdo.attrs  = [['style', 'text-align:' + aligns[i]]]\n      }\n\n      const token_il = state.push('inline', '', 0)\n      token_il.content  = columns[i] ? columns[i].trim() : ''\n      token_il.children = []\n\n      state.push('td_close', 'td', -1)\n    }\n    state.push('tr_close', 'tr', -1)\n  }\n\n  if (tbodyLines) {\n    state.push('tbody_close', 'tbody', -1)\n    tbodyLines[1] = nextLine\n  }\n\n  state.push('table_close', 'table', -1)\n  tableLines[1] = nextLine\n\n  state.parentType = oldParentType\n  state.line = nextLine\n  return true\n}\n","// Code block (4 spaces padded)\n\nexport default function code (state, startLine, endLine/*, silent */) {\n  if (state.sCount[startLine] - state.blkIndent < 4) { return false }\n\n  let nextLine = startLine + 1\n  let last = nextLine\n\n  while (nextLine < endLine) {\n    if (state.isEmpty(nextLine)) {\n      nextLine++\n      continue\n    }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      nextLine++\n      last = nextLine\n      continue\n    }\n    break\n  }\n\n  state.line = last\n\n  const token   = state.push('code_block', 'code', 0)\n  token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\\n'\n  token.map     = [startLine, state.line]\n\n  return true\n}\n","// fences (``` lang, ~~~ lang)\n\nexport default function fence (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (pos + 3 > max) { return false }\n\n  const marker = state.src.charCodeAt(pos)\n\n  if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n    return false\n  }\n\n  // scan marker length\n  let mem = pos\n  pos = state.skipChars(pos, marker)\n\n  let len = pos - mem\n\n  if (len < 3) { return false }\n\n  const markup = state.src.slice(mem, pos)\n  const params = state.src.slice(pos, max)\n\n  if (marker === 0x60 /* ` */) {\n    if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n      return false\n    }\n  }\n\n  // Since start is found, we can report success here in validation mode\n  if (silent) { return true }\n\n  // search end of block\n  let nextLine = startLine\n  let haveEndMarker = false\n\n  for (;;) {\n    nextLine++\n    if (nextLine >= endLine) {\n      // unclosed block should be autoclosed by end of document.\n      // also block seems to be autoclosed by end of parent\n      break\n    }\n\n    pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n      // non-empty line with negative indent should stop the list:\n      // - ```\n      //  test\n      break\n    }\n\n    if (state.src.charCodeAt(pos) !== marker) { continue }\n\n    if (state.sCount[nextLine] - state.blkIndent >= 4) {\n      // closing fence should be indented less than 4 spaces\n      continue\n    }\n\n    pos = state.skipChars(pos, marker)\n\n    // closing code fence must be at least as long as the opening one\n    if (pos - mem < len) { continue }\n\n    // make sure tail has spaces only\n    pos = state.skipSpaces(pos)\n\n    if (pos < max) { continue }\n\n    haveEndMarker = true\n    // found!\n    break\n  }\n\n  // If a fence has heading spaces, they should be removed from its inner block\n  len = state.sCount[startLine]\n\n  state.line = nextLine + (haveEndMarker ? 1 : 0)\n\n  const token   = state.push('fence', 'code', 0)\n  token.info    = params\n  token.content = state.getLines(startLine + 1, nextLine, len, true)\n  token.markup  = markup\n  token.map     = [startLine, state.line]\n\n  return true\n}\n","// Block quotes\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function blockquote (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  const oldLineMax = state.lineMax\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  // check the block quote marker\n  if (state.src.charCodeAt(pos) !== 0x3E/* > */) { return false }\n\n  // we know that it's going to be a valid blockquote,\n  // so no point trying to find the end of it in silent mode\n  if (silent) { return true }\n\n  const oldBMarks  = []\n  const oldBSCount = []\n  const oldSCount  = []\n  const oldTShift  = []\n\n  const terminatorRules = state.md.block.ruler.getRules('blockquote')\n\n  const oldParentType = state.parentType\n  state.parentType = 'blockquote'\n  let lastLineEmpty = false\n  let nextLine\n\n  // Search the end of the block\n  //\n  // Block ends with either:\n  //  1. an empty line outside:\n  //     ```\n  //     > test\n  //\n  //     ```\n  //  2. an empty line inside:\n  //     ```\n  //     >\n  //     test\n  //     ```\n  //  3. another tag:\n  //     ```\n  //     > test\n  //      - - -\n  //     ```\n  for (nextLine = startLine; nextLine < endLine; nextLine++) {\n    // check if it's outdented, i.e. it's inside list item and indented\n    // less than said list item:\n    //\n    // ```\n    // 1. anything\n    //    > current blockquote\n    // 2. checking this line\n    // ```\n    const isOutdented = state.sCount[nextLine] < state.blkIndent\n\n    pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    max = state.eMarks[nextLine]\n\n    if (pos >= max) {\n      // Case 1: line is not inside the blockquote, and this line is empty.\n      break\n    }\n\n    if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {\n      // This line is inside the blockquote.\n\n      // set offset past spaces and \">\"\n      let initial = state.sCount[nextLine] + 1\n      let spaceAfterMarker\n      let adjustTab\n\n      // skip one optional space after '>'\n      if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n        // ' >   test '\n        //     ^ -- position start of line here:\n        pos++\n        initial++\n        adjustTab = false\n        spaceAfterMarker = true\n      } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n        spaceAfterMarker = true\n\n        if ((state.bsCount[nextLine] + initial) % 4 === 3) {\n          // '  >\\t  test '\n          //       ^ -- position start of line here (tab has width===1)\n          pos++\n          initial++\n          adjustTab = false\n        } else {\n          // ' >\\t  test '\n          //    ^ -- position start of line here + shift bsCount slightly\n          //         to make extra space appear\n          adjustTab = true\n        }\n      } else {\n        spaceAfterMarker = false\n      }\n\n      let offset = initial\n      oldBMarks.push(state.bMarks[nextLine])\n      state.bMarks[nextLine] = pos\n\n      while (pos < max) {\n        const ch = state.src.charCodeAt(pos)\n\n        if (isSpace(ch)) {\n          if (ch === 0x09) {\n            offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4\n          } else {\n            offset++\n          }\n        } else {\n          break\n        }\n\n        pos++\n      }\n\n      lastLineEmpty = pos >= max\n\n      oldBSCount.push(state.bsCount[nextLine])\n      state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0)\n\n      oldSCount.push(state.sCount[nextLine])\n      state.sCount[nextLine] = offset - initial\n\n      oldTShift.push(state.tShift[nextLine])\n      state.tShift[nextLine] = pos - state.bMarks[nextLine]\n      continue\n    }\n\n    // Case 2: line is not inside the blockquote, and the last line was empty.\n    if (lastLineEmpty) { break }\n\n    // Case 3: another tag found.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n\n    if (terminate) {\n      // Quirk to enforce \"hard termination mode\" for paragraphs;\n      // normally if you call `tokenize(state, startLine, nextLine)`,\n      // paragraphs will look below nextLine for paragraph continuation,\n      // but if blockquote is terminated by another tag, they shouldn't\n      state.lineMax = nextLine\n\n      if (state.blkIndent !== 0) {\n        // state.blkIndent was non-zero, we now set it to zero,\n        // so we need to re-calculate all offsets to appear as\n        // if indent wasn't changed\n        oldBMarks.push(state.bMarks[nextLine])\n        oldBSCount.push(state.bsCount[nextLine])\n        oldTShift.push(state.tShift[nextLine])\n        oldSCount.push(state.sCount[nextLine])\n        state.sCount[nextLine] -= state.blkIndent\n      }\n\n      break\n    }\n\n    oldBMarks.push(state.bMarks[nextLine])\n    oldBSCount.push(state.bsCount[nextLine])\n    oldTShift.push(state.tShift[nextLine])\n    oldSCount.push(state.sCount[nextLine])\n\n    // A negative indentation means that this is a paragraph continuation\n    //\n    state.sCount[nextLine] = -1\n  }\n\n  const oldIndent = state.blkIndent\n  state.blkIndent = 0\n\n  const token_o  = state.push('blockquote_open', 'blockquote', 1)\n  token_o.markup = '>'\n  const lines = [startLine, 0]\n  token_o.map    = lines\n\n  state.md.block.tokenize(state, startLine, nextLine)\n\n  const token_c  = state.push('blockquote_close', 'blockquote', -1)\n  token_c.markup = '>'\n\n  state.lineMax = oldLineMax\n  state.parentType = oldParentType\n  lines[1] = state.line\n\n  // Restore original tShift; this might not be necessary since the parser\n  // has already been here, but just to make sure we can do that.\n  for (let i = 0; i < oldTShift.length; i++) {\n    state.bMarks[i + startLine] = oldBMarks[i]\n    state.tShift[i + startLine] = oldTShift[i]\n    state.sCount[i + startLine] = oldSCount[i]\n    state.bsCount[i + startLine] = oldBSCount[i]\n  }\n  state.blkIndent = oldIndent\n\n  return true\n}\n","// Horizontal rule\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function hr (state, startLine, endLine, silent) {\n  const max = state.eMarks[startLine]\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  const marker = state.src.charCodeAt(pos++)\n\n  // Check hr marker\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x5F/* _ */) {\n    return false\n  }\n\n  // markers can be mixed with spaces, but there should be at least 3 of them\n\n  let cnt = 1\n  while (pos < max) {\n    const ch = state.src.charCodeAt(pos++)\n    if (ch !== marker && !isSpace(ch)) { return false }\n    if (ch === marker) { cnt++ }\n  }\n\n  if (cnt < 3) { return false }\n\n  if (silent) { return true }\n\n  state.line = startLine + 1\n\n  const token  = state.push('hr', 'hr', 0)\n  token.map    = [startLine, state.line]\n  token.markup = Array(cnt + 1).join(String.fromCharCode(marker))\n\n  return true\n}\n","// Lists\n\nimport { isSpace } from '../common/utils.mjs'\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker (state, startLine) {\n  const max = state.eMarks[startLine]\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n\n  const marker = state.src.charCodeAt(pos++)\n  // Check bullet\n  if (marker !== 0x2A/* * */ &&\n      marker !== 0x2D/* - */ &&\n      marker !== 0x2B/* + */) {\n    return -1\n  }\n\n  if (pos < max) {\n    const ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" -test \" - is not a list item\n      return -1\n    }\n  }\n\n  return pos\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker (state, startLine) {\n  const start = state.bMarks[startLine] + state.tShift[startLine]\n  const max = state.eMarks[startLine]\n  let pos = start\n\n  // List marker should have at least 2 chars (digit + dot)\n  if (pos + 1 >= max) { return -1 }\n\n  let ch = state.src.charCodeAt(pos++)\n\n  if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1 }\n\n  for (;;) {\n    // EOL -> fail\n    if (pos >= max) { return -1 }\n\n    ch = state.src.charCodeAt(pos++)\n\n    if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n      // List marker should have no more than 9 digits\n      // (prevents integer overflow in browsers)\n      if (pos - start >= 10) { return -1 }\n\n      continue\n    }\n\n    // found valid marker\n    if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n      break\n    }\n\n    return -1\n  }\n\n  if (pos < max) {\n    ch = state.src.charCodeAt(pos)\n\n    if (!isSpace(ch)) {\n      // \" 1.test \" - is not a list item\n      return -1\n    }\n  }\n  return pos\n}\n\nfunction markTightParagraphs (state, idx) {\n  const level = state.level + 2\n\n  for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n    if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n      state.tokens[i + 2].hidden = true\n      state.tokens[i].hidden = true\n      i += 2\n    }\n  }\n}\n\nexport default function list (state, startLine, endLine, silent) {\n  let max, pos, start, token\n  let nextLine = startLine\n  let tight = true\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[nextLine] - state.blkIndent >= 4) { return false }\n\n  // Special case:\n  //  - item 1\n  //   - item 2\n  //    - item 3\n  //     - item 4\n  //      - this one is a paragraph continuation\n  if (state.listIndent >= 0 &&\n      state.sCount[nextLine] - state.listIndent >= 4 &&\n      state.sCount[nextLine] < state.blkIndent) {\n    return false\n  }\n\n  let isTerminatingParagraph = false\n\n  // limit conditions when list can interrupt\n  // a paragraph (validation mode only)\n  if (silent && state.parentType === 'paragraph') {\n    // Next list item should still terminate previous list item;\n    //\n    // This code can fail if plugins use blkIndent as well as lists,\n    // but I hope the spec gets fixed long before that happens.\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      isTerminatingParagraph = true\n    }\n  }\n\n  // Detect list type and position after marker\n  let isOrdered\n  let markerValue\n  let posAfterMarker\n  if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) {\n    isOrdered = true\n    start = state.bMarks[nextLine] + state.tShift[nextLine]\n    markerValue = Number(state.src.slice(start, posAfterMarker - 1))\n\n    // If we're starting a new ordered list right after\n    // a paragraph, it should start with 1.\n    if (isTerminatingParagraph && markerValue !== 1) return false\n  } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) {\n    isOrdered = false\n  } else {\n    return false\n  }\n\n  // If we're starting a new unordered list right after\n  // a paragraph, first line should not be empty.\n  if (isTerminatingParagraph) {\n    if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false\n  }\n\n  // For validation mode we can terminate immediately\n  if (silent) { return true }\n\n  // We should terminate list on style change. Remember first one to compare.\n  const markerCharCode = state.src.charCodeAt(posAfterMarker - 1)\n\n  // Start list\n  const listTokIdx = state.tokens.length\n\n  if (isOrdered) {\n    token       = state.push('ordered_list_open', 'ol', 1)\n    if (markerValue !== 1) {\n      token.attrs = [['start', markerValue]]\n    }\n  } else {\n    token       = state.push('bullet_list_open', 'ul', 1)\n  }\n\n  const listLines = [nextLine, 0]\n  token.map    = listLines\n  token.markup = String.fromCharCode(markerCharCode)\n\n  //\n  // Iterate list items\n  //\n\n  let prevEmptyEnd = false\n  const terminatorRules = state.md.block.ruler.getRules('list')\n\n  const oldParentType = state.parentType\n  state.parentType = 'list'\n\n  while (nextLine < endLine) {\n    pos = posAfterMarker\n    max = state.eMarks[nextLine]\n\n    const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine])\n    let offset = initial\n\n    while (pos < max) {\n      const ch = state.src.charCodeAt(pos)\n\n      if (ch === 0x09) {\n        offset += 4 - (offset + state.bsCount[nextLine]) % 4\n      } else if (ch === 0x20) {\n        offset++\n      } else {\n        break\n      }\n\n      pos++\n    }\n\n    const contentStart = pos\n    let indentAfterMarker\n\n    if (contentStart >= max) {\n      // trimming space in \"-    \\n  3\" case, indent is 1 here\n      indentAfterMarker = 1\n    } else {\n      indentAfterMarker = offset - initial\n    }\n\n    // If we have more than 4 spaces, the indent is 1\n    // (the rest is just indented code block)\n    if (indentAfterMarker > 4) { indentAfterMarker = 1 }\n\n    // \"  -  test\"\n    //  ^^^^^ - calculating total length of this thing\n    const indent = initial + indentAfterMarker\n\n    // Run subparser & write tokens\n    token        = state.push('list_item_open', 'li', 1)\n    token.markup = String.fromCharCode(markerCharCode)\n    const itemLines = [nextLine, 0]\n    token.map    = itemLines\n    if (isOrdered) {\n      token.info = state.src.slice(start, posAfterMarker - 1)\n    }\n\n    // change current state, then restore it after parser subcall\n    const oldTight = state.tight\n    const oldTShift = state.tShift[nextLine]\n    const oldSCount = state.sCount[nextLine]\n\n    //  - example list\n    // ^ listIndent position will be here\n    //   ^ blkIndent position will be here\n    //\n    const oldListIndent = state.listIndent\n    state.listIndent = state.blkIndent\n    state.blkIndent = indent\n\n    state.tight = true\n    state.tShift[nextLine] = contentStart - state.bMarks[nextLine]\n    state.sCount[nextLine] = offset\n\n    if (contentStart >= max && state.isEmpty(nextLine + 1)) {\n      // workaround for this case\n      // (list item is empty, list terminates before \"foo\"):\n      // ~~~~~~~~\n      //   -\n      //\n      //     foo\n      // ~~~~~~~~\n      state.line = Math.min(state.line + 2, endLine)\n    } else {\n      state.md.block.tokenize(state, nextLine, endLine, true)\n    }\n\n    // If any of list item is tight, mark list as tight\n    if (!state.tight || prevEmptyEnd) {\n      tight = false\n    }\n    // Item become loose if finish with empty line,\n    // but we should filter last element, because it means list finish\n    prevEmptyEnd = (state.line - nextLine) > 1 && state.isEmpty(state.line - 1)\n\n    state.blkIndent = state.listIndent\n    state.listIndent = oldListIndent\n    state.tShift[nextLine] = oldTShift\n    state.sCount[nextLine] = oldSCount\n    state.tight = oldTight\n\n    token        = state.push('list_item_close', 'li', -1)\n    token.markup = String.fromCharCode(markerCharCode)\n\n    nextLine = state.line\n    itemLines[1] = nextLine\n\n    if (nextLine >= endLine) { break }\n\n    //\n    // Try to check if list is terminated or continued.\n    //\n    if (state.sCount[nextLine] < state.blkIndent) { break }\n\n    // if it's indented more than 3 spaces, it should be a code block\n    if (state.sCount[nextLine] - state.blkIndent >= 4) { break }\n\n    // fail if terminating block found\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n\n    // fail if list has another type\n    if (isOrdered) {\n      posAfterMarker = skipOrderedListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n      start = state.bMarks[nextLine] + state.tShift[nextLine]\n    } else {\n      posAfterMarker = skipBulletListMarker(state, nextLine)\n      if (posAfterMarker < 0) { break }\n    }\n\n    if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break }\n  }\n\n  // Finalize list\n  if (isOrdered) {\n    token = state.push('ordered_list_close', 'ol', -1)\n  } else {\n    token = state.push('bullet_list_close', 'ul', -1)\n  }\n  token.markup = String.fromCharCode(markerCharCode)\n\n  listLines[1] = nextLine\n  state.line = nextLine\n\n  state.parentType = oldParentType\n\n  // mark paragraphs tight if needed\n  if (tight) {\n    markTightParagraphs(state, listTokIdx)\n  }\n\n  return true\n}\n","import { isSpace, normalizeReference } from '../common/utils.mjs'\n\nexport default function reference (state, startLine, _endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n  let nextLine = startLine + 1\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false }\n\n  function getNextLine (nextLine) {\n    const endLine = state.lineMax\n\n    if (nextLine >= endLine || state.isEmpty(nextLine)) {\n      // empty line or end of input\n      return null\n    }\n\n    let isContinuation = false\n\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { isContinuation = true }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { isContinuation = true }\n\n    if (!isContinuation) {\n      const terminatorRules = state.md.block.ruler.getRules('reference')\n      const oldParentType = state.parentType\n      state.parentType = 'reference'\n\n      // Some tags can terminate paragraph without empty line.\n      let terminate = false\n      for (let i = 0, l = terminatorRules.length; i < l; i++) {\n        if (terminatorRules[i](state, nextLine, endLine, true)) {\n          terminate = true\n          break\n        }\n      }\n\n      state.parentType = oldParentType\n      if (terminate) {\n        // terminated by another block\n        return null\n      }\n    }\n\n    const pos = state.bMarks[nextLine] + state.tShift[nextLine]\n    const max = state.eMarks[nextLine]\n\n    // max + 1 explicitly includes the newline\n    return state.src.slice(pos, max + 1)\n  }\n\n  let str = state.src.slice(pos, max + 1)\n\n  max = str.length\n  let labelEnd = -1\n\n  for (pos = 1; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x5B /* [ */) {\n      return false\n    } else if (ch === 0x5D /* ] */) {\n      labelEnd = pos\n      break\n    } else if (ch === 0x0A /* \\n */) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (ch === 0x5C /* \\ */) {\n      pos++\n      if (pos < max && str.charCodeAt(pos) === 0x0A) {\n        const lineContent = getNextLine(nextLine)\n        if (lineContent !== null) {\n          str += lineContent\n          max = str.length\n          nextLine++\n        }\n      }\n    }\n  }\n\n  if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false }\n\n  // [label]:   destination   'title'\n  //         ^^^ skip optional whitespace here\n  for (pos = labelEnd + 2; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* eslint no-empty:0 */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //            ^^^^^^^^^^^ parse this\n  const destRes = state.md.helpers.parseLinkDestination(str, pos, max)\n  if (!destRes.ok) { return false }\n\n  const href = state.md.normalizeLink(destRes.str)\n  if (!state.md.validateLink(href)) { return false }\n\n  pos = destRes.pos\n\n  // save cursor state, we could require to rollback later\n  const destEndPos = pos\n  const destEndLineNo = nextLine\n\n  // [label]:   destination   'title'\n  //                       ^^^ skipping those spaces\n  const start = pos\n  for (; pos < max; pos++) {\n    const ch = str.charCodeAt(pos)\n    if (ch === 0x0A) {\n      const lineContent = getNextLine(nextLine)\n      if (lineContent !== null) {\n        str += lineContent\n        max = str.length\n        nextLine++\n      }\n    } else if (isSpace(ch)) {\n      /* eslint no-empty:0 */\n    } else {\n      break\n    }\n  }\n\n  // [label]:   destination   'title'\n  //                          ^^^^^^^ parse this\n  let titleRes = state.md.helpers.parseLinkTitle(str, pos, max)\n  while (titleRes.can_continue) {\n    const lineContent = getNextLine(nextLine)\n    if (lineContent === null) break\n    str += lineContent\n    pos = max\n    max = str.length\n    nextLine++\n    titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes)\n  }\n  let title\n\n  if (pos < max && start !== pos && titleRes.ok) {\n    title = titleRes.str\n    pos = titleRes.pos\n  } else {\n    title = ''\n    pos = destEndPos\n    nextLine = destEndLineNo\n  }\n\n  // skip trailing spaces until the rest of the line\n  while (pos < max) {\n    const ch = str.charCodeAt(pos)\n    if (!isSpace(ch)) { break }\n    pos++\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    if (title) {\n      // garbage at the end of the line after title,\n      // but it could still be a valid reference if we roll back\n      title = ''\n      pos = destEndPos\n      nextLine = destEndLineNo\n      while (pos < max) {\n        const ch = str.charCodeAt(pos)\n        if (!isSpace(ch)) { break }\n        pos++\n      }\n    }\n  }\n\n  if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n    // garbage at the end of the line\n    return false\n  }\n\n  const label = normalizeReference(str.slice(1, labelEnd))\n  if (!label) {\n    // CommonMark 0.20 disallows empty labels\n    return false\n  }\n\n  // Reference can not terminate anything. This check is for safety only.\n  /* istanbul ignore if */\n  if (silent) { return true }\n\n  if (typeof state.env.references === 'undefined') {\n    state.env.references = {}\n  }\n  if (typeof state.env.references[label] === 'undefined') {\n    state.env.references[label] = { title, href }\n  }\n\n  state.line = nextLine\n  return true\n}\n","// List of valid html blocks names, according to commonmark spec\n// https://spec.commonmark.org/0.30/#html-blocks\n\nexport default [\n  'address',\n  'article',\n  'aside',\n  'base',\n  'basefont',\n  'blockquote',\n  'body',\n  'caption',\n  'center',\n  'col',\n  'colgroup',\n  'dd',\n  'details',\n  'dialog',\n  'dir',\n  'div',\n  'dl',\n  'dt',\n  'fieldset',\n  'figcaption',\n  'figure',\n  'footer',\n  'form',\n  'frame',\n  'frameset',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'head',\n  'header',\n  'hr',\n  'html',\n  'iframe',\n  'legend',\n  'li',\n  'link',\n  'main',\n  'menu',\n  'menuitem',\n  'nav',\n  'noframes',\n  'ol',\n  'optgroup',\n  'option',\n  'p',\n  'param',\n  'search',\n  'section',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'tfoot',\n  'th',\n  'thead',\n  'title',\n  'tr',\n  'track',\n  'ul'\n]\n","// Regexps to match html elements\n\nconst attr_name     = '[a-zA-Z_:][a-zA-Z0-9:._-]*'\n\nconst unquoted      = '[^\"\\'=<>`\\\\x00-\\\\x20]+'\nconst single_quoted = \"'[^']*'\"\nconst double_quoted = '\"[^\"]*\"'\n\nconst attr_value  = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')'\n\nconst attribute   = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)'\n\nconst open_tag    = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>'\n\nconst close_tag   = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>'\nconst comment     = '<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->'\nconst processing  = '<[?][\\\\s\\\\S]*?[?]>'\nconst declaration = '<![A-Za-z][^>]*>'\nconst cdata       = '<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>'\n\nconst HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n                        '|' + processing + '|' + declaration + '|' + cdata + ')')\nconst HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')')\n\nexport { HTML_TAG_RE, HTML_OPEN_CLOSE_TAG_RE }\n","// HTML block\n\nimport block_names from '../common/html_blocks.mjs'\nimport { HTML_OPEN_CLOSE_TAG_RE } from '../common/html_re.mjs'\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nconst HTML_SEQUENCES = [\n  [/^<(script|pre|style|textarea)(?=(\\s|>|$))/i, /<\\/(script|pre|style|textarea)>/i, true],\n  [/^<!--/,        /-->/,   true],\n  [/^<\\?/,         /\\?>/,   true],\n  [/^<![A-Z]/,     />/,     true],\n  [/^<!\\[CDATA\\[/, /\\]\\]>/, true],\n  [new RegExp('^</?(' + block_names.join('|') + ')(?=(\\\\s|/?>|$))', 'i'), /^$/, true],\n  [new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'),  /^$/, false]\n]\n\nexport default function html_block (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  if (!state.md.options.html) { return false }\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  let lineText = state.src.slice(pos, max)\n\n  let i = 0\n  for (; i < HTML_SEQUENCES.length; i++) {\n    if (HTML_SEQUENCES[i][0].test(lineText)) { break }\n  }\n  if (i === HTML_SEQUENCES.length) { return false }\n\n  if (silent) {\n    // true if this sequence can be a terminator, false otherwise\n    return HTML_SEQUENCES[i][2]\n  }\n\n  let nextLine = startLine + 1\n\n  // If we are here - we detected HTML block.\n  // Let's roll down till block end.\n  if (!HTML_SEQUENCES[i][1].test(lineText)) {\n    for (; nextLine < endLine; nextLine++) {\n      if (state.sCount[nextLine] < state.blkIndent) { break }\n\n      pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      max = state.eMarks[nextLine]\n      lineText = state.src.slice(pos, max)\n\n      if (HTML_SEQUENCES[i][1].test(lineText)) {\n        if (lineText.length !== 0) { nextLine++ }\n        break\n      }\n    }\n  }\n\n  state.line = nextLine\n\n  const token   = state.push('html_block', '', 0)\n  token.map     = [startLine, nextLine]\n  token.content = state.getLines(startLine, nextLine, state.blkIndent, true)\n\n  return true\n}\n","// heading (#, ##, ...)\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function heading (state, startLine, endLine, silent) {\n  let pos = state.bMarks[startLine] + state.tShift[startLine]\n  let max = state.eMarks[startLine]\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  let ch  = state.src.charCodeAt(pos)\n\n  if (ch !== 0x23/* # */ || pos >= max) { return false }\n\n  // count heading level\n  let level = 1\n  ch = state.src.charCodeAt(++pos)\n  while (ch === 0x23/* # */ && pos < max && level <= 6) {\n    level++\n    ch = state.src.charCodeAt(++pos)\n  }\n\n  if (level > 6 || (pos < max && !isSpace(ch))) { return false }\n\n  if (silent) { return true }\n\n  // Let's cut tails like '    ###  ' from the end of string\n\n  max = state.skipSpacesBack(max, pos)\n  const tmp = state.skipCharsBack(max, 0x23, pos) // #\n  if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n    max = tmp\n  }\n\n  state.line = startLine + 1\n\n  const token_o  = state.push('heading_open', 'h' + String(level), 1)\n  token_o.markup = '########'.slice(0, level)\n  token_o.map    = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = state.src.slice(pos, max).trim()\n  token_i.map      = [startLine, state.line]\n  token_i.children = []\n\n  const token_c  = state.push('heading_close', 'h' + String(level), -1)\n  token_c.markup = '########'.slice(0, level)\n\n  return true\n}\n","// lheading (---, ===)\n\nexport default function lheading (state, startLine, endLine/*, silent */) {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n\n  // if it's indented more than 3 spaces, it should be a code block\n  if (state.sCount[startLine] - state.blkIndent >= 4) { return false }\n\n  const oldParentType = state.parentType\n  state.parentType = 'paragraph' // use paragraph to match terminatorRules\n\n  // jump line-by-line until empty one or EOF\n  let level = 0\n  let marker\n  let nextLine = startLine + 1\n\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    //\n    // Check for underline in setext header\n    //\n    if (state.sCount[nextLine] >= state.blkIndent) {\n      let pos = state.bMarks[nextLine] + state.tShift[nextLine]\n      const max = state.eMarks[nextLine]\n\n      if (pos < max) {\n        marker = state.src.charCodeAt(pos)\n\n        if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n          pos = state.skipChars(pos, marker)\n          pos = state.skipSpaces(pos)\n\n          if (pos >= max) {\n            level = (marker === 0x3D/* = */ ? 1 : 2)\n            break\n          }\n        }\n      }\n    }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  if (!level) {\n    // Didn't find valid underline\n    return false\n  }\n\n  const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim()\n\n  state.line = nextLine + 1\n\n  const token_o    = state.push('heading_open', 'h' + String(level), 1)\n  token_o.markup   = String.fromCharCode(marker)\n  token_o.map      = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = content\n  token_i.map      = [startLine, state.line - 1]\n  token_i.children = []\n\n  const token_c    = state.push('heading_close', 'h' + String(level), -1)\n  token_c.markup   = String.fromCharCode(marker)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","// Paragraph\n\nexport default function paragraph (state, startLine, endLine) {\n  const terminatorRules = state.md.block.ruler.getRules('paragraph')\n  const oldParentType = state.parentType\n  let nextLine = startLine + 1\n  state.parentType = 'paragraph'\n\n  // jump line-by-line until empty one or EOF\n  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n    // this would be a code block normally, but after paragraph\n    // it's considered a lazy continuation regardless of what's there\n    if (state.sCount[nextLine] - state.blkIndent > 3) { continue }\n\n    // quirk for blockquotes, this line should already be checked by that rule\n    if (state.sCount[nextLine] < 0) { continue }\n\n    // Some tags can terminate paragraph without empty line.\n    let terminate = false\n    for (let i = 0, l = terminatorRules.length; i < l; i++) {\n      if (terminatorRules[i](state, nextLine, endLine, true)) {\n        terminate = true\n        break\n      }\n    }\n    if (terminate) { break }\n  }\n\n  const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim()\n\n  state.line = nextLine\n\n  const token_o    = state.push('paragraph_open', 'p', 1)\n  token_o.map      = [startLine, state.line]\n\n  const token_i    = state.push('inline', '', 0)\n  token_i.content  = content\n  token_i.map      = [startLine, state.line]\n  token_i.children = []\n\n  state.push('paragraph_close', 'p', -1)\n\n  state.parentType = oldParentType\n\n  return true\n}\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateBlock from './rules_block/state_block.mjs'\n\nimport r_table from './rules_block/table.mjs'\nimport r_code from './rules_block/code.mjs'\nimport r_fence from './rules_block/fence.mjs'\nimport r_blockquote from './rules_block/blockquote.mjs'\nimport r_hr from './rules_block/hr.mjs'\nimport r_list from './rules_block/list.mjs'\nimport r_reference from './rules_block/reference.mjs'\nimport r_html_block from './rules_block/html_block.mjs'\nimport r_heading from './rules_block/heading.mjs'\nimport r_lheading from './rules_block/lheading.mjs'\nimport r_paragraph from './rules_block/paragraph.mjs'\n\nconst _rules = [\n  // First 2 params - rule name & source. Secondary array - list of rules,\n  // which can be terminated by this one.\n  ['table',      r_table,      ['paragraph', 'reference']],\n  ['code',       r_code],\n  ['fence',      r_fence,      ['paragraph', 'reference', 'blockquote', 'list']],\n  ['blockquote', r_blockquote, ['paragraph', 'reference', 'blockquote', 'list']],\n  ['hr',         r_hr,         ['paragraph', 'reference', 'blockquote', 'list']],\n  ['list',       r_list,       ['paragraph', 'reference', 'blockquote']],\n  ['reference',  r_reference],\n  ['html_block', r_html_block, ['paragraph', 'reference', 'blockquote']],\n  ['heading',    r_heading,    ['paragraph', 'reference', 'blockquote']],\n  ['lheading',   r_lheading],\n  ['paragraph',  r_paragraph]\n]\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock () {\n  /**\n   * ParserBlock#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of block rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() })\n  }\n}\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const maxNesting = state.md.options.maxNesting\n  let line = startLine\n  let hasEmptyLines = false\n\n  while (line < endLine) {\n    state.line = line = state.skipEmptyLines(line)\n    if (line >= endLine) { break }\n\n    // Termination condition for nested calls.\n    // Nested calls currently used for blockquotes & lists\n    if (state.sCount[line] < state.blkIndent) { break }\n\n    // If nesting level exceeded - skip tail to the end. That's not ordinary\n    // situation and we should not care about content.\n    if (state.level >= maxNesting) {\n      state.line = endLine\n      break\n    }\n\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.line`\n    // - update `state.tokens`\n    // - return true\n    const prevLine = state.line\n    let ok = false\n\n    for (let i = 0; i < len; i++) {\n      ok = rules[i](state, line, endLine, false)\n      if (ok) {\n        if (prevLine >= state.line) {\n          throw new Error(\"block rule didn't increment state.line\")\n        }\n        break\n      }\n    }\n\n    // this can only happen if user disables paragraph rule\n    if (!ok) throw new Error('none of the block rules matched')\n\n    // set state.tight if we had an empty line before current tag\n    // i.e. latest empty line should not count\n    state.tight = !hasEmptyLines\n\n    // paragraph might \"eat\" one newline after it in nested lists\n    if (state.isEmpty(state.line - 1)) {\n      hasEmptyLines = true\n    }\n\n    line = state.line\n\n    if (line < endLine && state.isEmpty(line)) {\n      hasEmptyLines = true\n      line++\n      state.line = line\n    }\n  }\n}\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n  if (!src) { return }\n\n  const state = new this.State(src, md, env, outTokens)\n\n  this.tokenize(state, state.line, state.lineMax)\n}\n\nParserBlock.prototype.State = StateBlock\n\nexport default ParserBlock\n","// Inline parser state\n\nimport Token from '../token.mjs'\nimport { isWhiteSpace, isPunctChar, isMdAsciiPunct } from '../common/utils.mjs'\n\nfunction StateInline (src, md, env, outTokens) {\n  this.src = src\n  this.env = env\n  this.md = md\n  this.tokens = outTokens\n  this.tokens_meta = Array(outTokens.length)\n\n  this.pos = 0\n  this.posMax = this.src.length\n  this.level = 0\n  this.pending = ''\n  this.pendingLevel = 0\n\n  // Stores { start: end } pairs. Useful for backtrack\n  // optimization of pairs parse (emphasis, strikes).\n  this.cache = {}\n\n  // List of emphasis-like delimiters for current tag\n  this.delimiters = []\n\n  // Stack of delimiter lists for upper level tags\n  this._prev_delimiters = []\n\n  // backtick length => last seen position\n  this.backticks = {}\n  this.backticksScanned = false\n\n  // Counter used to disable inline linkify-it execution\n  // inside <a> and markdown links\n  this.linkLevel = 0\n}\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n  const token = new Token('text', '', 0)\n  token.content = this.pending\n  token.level = this.pendingLevel\n  this.tokens.push(token)\n  this.pending = ''\n  return token\n}\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n  if (this.pending) {\n    this.pushPending()\n  }\n\n  const token = new Token(type, tag, nesting)\n  let token_meta = null\n\n  if (nesting < 0) {\n    // closing tag\n    this.level--\n    this.delimiters = this._prev_delimiters.pop()\n  }\n\n  token.level = this.level\n\n  if (nesting > 0) {\n    // opening tag\n    this.level++\n    this._prev_delimiters.push(this.delimiters)\n    this.delimiters = []\n    token_meta = { delimiters: this.delimiters }\n  }\n\n  this.pendingLevel = this.level\n  this.tokens.push(token)\n  this.tokens_meta.push(token_meta)\n  return token\n}\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n//  - start - position to scan from (it should point at a valid marker);\n//  - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n  const max = this.posMax\n  const marker = this.src.charCodeAt(start)\n\n  // treat beginning of the line as a whitespace\n  const lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20\n\n  let pos = start\n  while (pos < max && this.src.charCodeAt(pos) === marker) { pos++ }\n\n  const count = pos - start\n\n  // treat end of the line as a whitespace\n  const nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20\n\n  const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar))\n  const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar))\n\n  const isLastWhiteSpace = isWhiteSpace(lastChar)\n  const isNextWhiteSpace = isWhiteSpace(nextChar)\n\n  const left_flanking =\n    !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar)\n  const right_flanking =\n    !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar)\n\n  const can_open  = left_flanking  && (canSplitWord || !right_flanking || isLastPunctChar)\n  const can_close = right_flanking && (canSplitWord || !left_flanking  || isNextPunctChar)\n\n  return { can_open, can_close, length: count }\n}\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token\n\nexport default StateInline\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar (ch) {\n  switch (ch) {\n    case 0x0A/* \\n */:\n    case 0x21/* ! */:\n    case 0x23/* # */:\n    case 0x24/* $ */:\n    case 0x25/* % */:\n    case 0x26/* & */:\n    case 0x2A/* * */:\n    case 0x2B/* + */:\n    case 0x2D/* - */:\n    case 0x3A/* : */:\n    case 0x3C/* < */:\n    case 0x3D/* = */:\n    case 0x3E/* > */:\n    case 0x40/* @ */:\n    case 0x5B/* [ */:\n    case 0x5C/* \\ */:\n    case 0x5D/* ] */:\n    case 0x5E/* ^ */:\n    case 0x5F/* _ */:\n    case 0x60/* ` */:\n    case 0x7B/* { */:\n    case 0x7D/* } */:\n    case 0x7E/* ~ */:\n      return true\n    default:\n      return false\n  }\n}\n\nexport default function text (state, silent) {\n  let pos = state.pos\n\n  while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n    pos++\n  }\n\n  if (pos === state.pos) { return false }\n\n  if (!silent) { state.pending += state.src.slice(state.pos, pos) }\n\n  state.pos = pos\n\n  return true\n}\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParserInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n  var pos = state.pos,\n      idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n  // first char is terminator -> empty text\n  if (idx === 0) { return false; }\n\n  // no terminator -> text till end of string\n  if (idx < 0) {\n    if (!silent) { state.pending += state.src.slice(pos); }\n    state.pos = state.src.length;\n    return true;\n  }\n\n  if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n  state.pos += idx;\n\n  return true;\n}; */\n","// Process links like https://example.org/\n\n// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\nconst SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i\n\nexport default function linkify (state, silent) {\n  if (!state.md.options.linkify) return false\n  if (state.linkLevel > 0) return false\n\n  const pos = state.pos\n  const max = state.posMax\n\n  if (pos + 3 > max) return false\n  if (state.src.charCodeAt(pos) !== 0x3A/* : */) return false\n  if (state.src.charCodeAt(pos + 1) !== 0x2F/* / */) return false\n  if (state.src.charCodeAt(pos + 2) !== 0x2F/* / */) return false\n\n  const match = state.pending.match(SCHEME_RE)\n  if (!match) return false\n\n  const proto = match[1]\n\n  const link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length))\n  if (!link) return false\n\n  let url = link.url\n\n  // invalid link, but still detected by linkify somehow;\n  // need to check to prevent infinite loop below\n  if (url.length <= proto.length) return false\n\n  // disallow '*' at the end of the link (conflicts with emphasis)\n  // do manual backsearch to avoid perf issues with regex /\\*+$/ on \"****...****a\".\n  let urlEnd = url.length\n  while (urlEnd > 0 && url.charCodeAt(urlEnd - 1) === 0x2A/* * */) {\n    urlEnd--\n  }\n  if (urlEnd !== url.length) {\n    url = url.slice(0, urlEnd)\n  }\n\n  const fullUrl = state.md.normalizeLink(url)\n  if (!state.md.validateLink(fullUrl)) return false\n\n  if (!silent) {\n    state.pending = state.pending.slice(0, -proto.length)\n\n    const token_o = state.push('link_open', 'a', 1)\n    token_o.attrs = [['href', fullUrl]]\n    token_o.markup = 'linkify'\n    token_o.info = 'auto'\n\n    const token_t = state.push('text', '', 0)\n    token_t.content = state.md.normalizeLinkText(url)\n\n    const token_c = state.push('link_close', 'a', -1)\n    token_c.markup = 'linkify'\n    token_c.info = 'auto'\n  }\n\n  state.pos += url.length - proto.length\n  return true\n}\n","// Proceess '\\n'\n\nimport { isSpace } from '../common/utils.mjs'\n\nexport default function newline (state, silent) {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false }\n\n  const pmax = state.pending.length - 1\n  const max = state.posMax\n\n  // '  \\n' -> hardbreak\n  // Lookup in pending chars is bad practice! Don't copy to other rules!\n  // Pending string is stored in concat mode, indexed lookups will cause\n  // convertion to flat mode.\n  if (!silent) {\n    if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n      if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n        // Find whitespaces tail of pending chars.\n        let ws = pmax - 1\n        while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--\n\n        state.pending = state.pending.slice(0, ws)\n        state.push('hardbreak', 'br', 0)\n      } else {\n        state.pending = state.pending.slice(0, -1)\n        state.push('softbreak', 'br', 0)\n      }\n    } else {\n      state.push('softbreak', 'br', 0)\n    }\n  }\n\n  pos++\n\n  // skip heading spaces for next line\n  while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++ }\n\n  state.pos = pos\n  return true\n}\n","// Process escaped chars and hardbreaks\n\nimport { isSpace } from '../common/utils.mjs'\n\nconst ESCAPED = []\n\nfor (let i = 0; i < 256; i++) { ESCAPED.push(0) }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n  .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1 })\n\nexport default function escape (state, silent) {\n  let pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) return false\n  pos++\n\n  // '\\' at the end of the inline block\n  if (pos >= max) return false\n\n  let ch1 = state.src.charCodeAt(pos)\n\n  if (ch1 === 0x0A) {\n    if (!silent) {\n      state.push('hardbreak', 'br', 0)\n    }\n\n    pos++\n    // skip leading whitespaces from next line\n    while (pos < max) {\n      ch1 = state.src.charCodeAt(pos)\n      if (!isSpace(ch1)) break\n      pos++\n    }\n\n    state.pos = pos\n    return true\n  }\n\n  let escapedStr = state.src[pos]\n\n  if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) {\n    const ch2 = state.src.charCodeAt(pos + 1)\n\n    if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\n      escapedStr += state.src[pos + 1]\n      pos++\n    }\n  }\n\n  const origStr = '\\\\' + escapedStr\n\n  if (!silent) {\n    const token = state.push('text_special', '', 0)\n\n    if (ch1 < 256 && ESCAPED[ch1] !== 0) {\n      token.content = escapedStr\n    } else {\n      token.content = origStr\n    }\n\n    token.markup = origStr\n    token.info   = 'escape'\n  }\n\n  state.pos = pos + 1\n  return true\n}\n","// Parse backticks\n\nexport default function backtick (state, silent) {\n  let pos = state.pos\n  const ch = state.src.charCodeAt(pos)\n\n  if (ch !== 0x60/* ` */) { return false }\n\n  const start = pos\n  pos++\n  const max = state.posMax\n\n  // scan marker length\n  while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++ }\n\n  const marker = state.src.slice(start, pos)\n  const openerLength = marker.length\n\n  if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) {\n    if (!silent) state.pending += marker\n    state.pos += openerLength\n    return true\n  }\n\n  let matchEnd = pos\n  let matchStart\n\n  // Nothing found in the cache, scan until the end of the line (or until marker is found)\n  while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n    matchEnd = matchStart + 1\n\n    // scan marker length\n    while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++ }\n\n    const closerLength = matchEnd - matchStart\n\n    if (closerLength === openerLength) {\n      // Found matching closer length.\n      if (!silent) {\n        const token = state.push('code_inline', 'code', 0)\n        token.markup = marker\n        token.content = state.src.slice(pos, matchStart)\n          .replace(/\\n/g, ' ')\n          .replace(/^ (.+) $/, '$1')\n      }\n      state.pos = matchEnd\n      return true\n    }\n\n    // Some different length found, put it in cache as upper limit of where closer can be found\n    state.backticks[closerLength] = matchStart\n  }\n\n  // Scanned through the end, didn't find anything\n  state.backticksScanned = true\n\n  if (!silent) state.pending += marker\n  state.pos += openerLength\n  return true\n}\n","// ~~strike through~~\n//\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction strikethrough_tokenize (state, silent) {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x7E/* ~ */) { return false }\n\n  const scanned = state.scanDelims(state.pos, true)\n  let len = scanned.length\n  const ch = String.fromCharCode(marker)\n\n  if (len < 2) { return false }\n\n  let token\n\n  if (len % 2) {\n    token         = state.push('text', '', 0)\n    token.content = ch\n    len--\n  }\n\n  for (let i = 0; i < len; i += 2) {\n    token         = state.push('text', '', 0)\n    token.content = ch + ch\n\n    state.delimiters.push({\n      marker,\n      length: 0,     // disable \"rule of 3\" length checks meant for emphasis\n      token: state.tokens.length - 1,\n      end: -1,\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state, delimiters) {\n  let token\n  const loneMarkers = []\n  const max = delimiters.length\n\n  for (let i = 0; i < max; i++) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x7E/* ~ */) {\n      continue\n    }\n\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    token         = state.tokens[startDelim.token]\n    token.type    = 's_open'\n    token.tag     = 's'\n    token.nesting = 1\n    token.markup  = '~~'\n    token.content = ''\n\n    token         = state.tokens[endDelim.token]\n    token.type    = 's_close'\n    token.tag     = 's'\n    token.nesting = -1\n    token.markup  = '~~'\n    token.content = ''\n\n    if (state.tokens[endDelim.token - 1].type === 'text' &&\n        state.tokens[endDelim.token - 1].content === '~') {\n      loneMarkers.push(endDelim.token - 1)\n    }\n  }\n\n  // If a marker sequence has an odd number of characters, it's splitted\n  // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n  // start of the sequence.\n  //\n  // So, we have to move all those markers after subsequent s_close tags.\n  //\n  while (loneMarkers.length) {\n    const i = loneMarkers.pop()\n    let j = i + 1\n\n    while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n      j++\n    }\n\n    j--\n\n    if (i !== j) {\n      token = state.tokens[j]\n      state.tokens[j] = state.tokens[i]\n      state.tokens[i] = token\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction strikethrough_postProcess (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: strikethrough_tokenize,\n  postProcess: strikethrough_postProcess\n}\n","// Process *this* and _that_\n//\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nfunction emphasis_tokenize (state, silent) {\n  const start = state.pos\n  const marker = state.src.charCodeAt(start)\n\n  if (silent) { return false }\n\n  if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false }\n\n  const scanned = state.scanDelims(state.pos, marker === 0x2A)\n\n  for (let i = 0; i < scanned.length; i++) {\n    const token = state.push('text', '', 0)\n    token.content = String.fromCharCode(marker)\n\n    state.delimiters.push({\n      // Char code of the starting marker (number).\n      //\n      marker,\n\n      // Total length of these series of delimiters.\n      //\n      length: scanned.length,\n\n      // A position of the token this delimiter corresponds to.\n      //\n      token: state.tokens.length - 1,\n\n      // If this delimiter is matched as a valid opener, `end` will be\n      // equal to its position, otherwise it's `-1`.\n      //\n      end: -1,\n\n      // Boolean flags that determine if this delimiter could open or close\n      // an emphasis.\n      //\n      open: scanned.can_open,\n      close: scanned.can_close\n    })\n  }\n\n  state.pos += scanned.length\n\n  return true\n}\n\nfunction postProcess (state, delimiters) {\n  const max = delimiters.length\n\n  for (let i = max - 1; i >= 0; i--) {\n    const startDelim = delimiters[i]\n\n    if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n      continue\n    }\n\n    // Process only opening markers\n    if (startDelim.end === -1) {\n      continue\n    }\n\n    const endDelim = delimiters[startDelim.end]\n\n    // If the previous delimiter has the same marker and is adjacent to this one,\n    // merge those into one strong delimiter.\n    //\n    // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`\n    //\n    const isStrong = i > 0 &&\n               delimiters[i - 1].end === startDelim.end + 1 &&\n               // check that first two markers match and adjacent\n               delimiters[i - 1].marker === startDelim.marker &&\n               delimiters[i - 1].token === startDelim.token - 1 &&\n               // check that last two markers are adjacent (we can safely assume they match)\n               delimiters[startDelim.end + 1].token === endDelim.token + 1\n\n    const ch = String.fromCharCode(startDelim.marker)\n\n    const token_o   = state.tokens[startDelim.token]\n    token_o.type    = isStrong ? 'strong_open' : 'em_open'\n    token_o.tag     = isStrong ? 'strong' : 'em'\n    token_o.nesting = 1\n    token_o.markup  = isStrong ? ch + ch : ch\n    token_o.content = ''\n\n    const token_c   = state.tokens[endDelim.token]\n    token_c.type    = isStrong ? 'strong_close' : 'em_close'\n    token_c.tag     = isStrong ? 'strong' : 'em'\n    token_c.nesting = -1\n    token_c.markup  = isStrong ? ch + ch : ch\n    token_c.content = ''\n\n    if (isStrong) {\n      state.tokens[delimiters[i - 1].token].content = ''\n      state.tokens[delimiters[startDelim.end + 1].token].content = ''\n      i--\n    }\n  }\n}\n\n// Walk through delimiter list and replace text tokens with tags\n//\nfunction emphasis_post_process (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  postProcess(state, state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      postProcess(state, tokens_meta[curr].delimiters)\n    }\n  }\n}\n\nexport default {\n  tokenize: emphasis_tokenize,\n  postProcess: emphasis_post_process\n}\n","// Process [link](<to> \"stuff\")\n\nimport { normalizeReference, isSpace } from '../common/utils.mjs'\n\nexport default function link (state, silent) {\n  let code, label, res, ref\n  let href = ''\n  let title = ''\n  let start = state.pos\n  let parseReference = true\n\n  if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false }\n\n  const oldPos = state.pos\n  const max = state.posMax\n  const labelStart = state.pos + 1\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  let pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // might have found a valid shortcut link, disable reference parsing\n    parseReference = false\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                ^^ skipping these spaces\n      start = pos\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n\n      // [link](  <href>  \"title\"  )\n      //                  ^^^^^^^ parsing link title\n      res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n      if (pos < max && start !== pos && res.ok) {\n        title = res.str\n        pos = res.pos\n\n        // [link](  <href>  \"title\"  )\n        //                         ^^ skipping these spaces\n        for (; pos < max; pos++) {\n          code = state.src.charCodeAt(pos)\n          if (!isSpace(code) && code !== 0x0A) { break }\n        }\n      }\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      // parsing a valid shortcut link failed, fallback to reference\n      parseReference = true\n    }\n    pos++\n  }\n\n  if (parseReference) {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    ref = state.env.references[normalizeReference(label)]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    state.pos = labelStart\n    state.posMax = labelEnd\n\n    const token_o = state.push('link_open', 'a', 1)\n    const attrs = [['href', href]]\n    token_o.attrs  = attrs\n    if (title) {\n      attrs.push(['title', title])\n    }\n\n    state.linkLevel++\n    state.md.inline.tokenize(state)\n    state.linkLevel--\n\n    state.push('link_close', 'a', -1)\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process ![image](<src> \"title\")\n\nimport { normalizeReference, isSpace } from '../common/utils.mjs'\n\nexport default function image (state, silent) {\n  let code, content, label, pos, ref, res, title, start\n  let href = ''\n  const oldPos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false }\n  if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false }\n\n  const labelStart = state.pos + 2\n  const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false)\n\n  // parser failed to find ']', so it's not a valid link\n  if (labelEnd < 0) { return false }\n\n  pos = labelEnd + 1\n  if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n    //\n    // Inline link\n    //\n\n    // [link](  <href>  \"title\"  )\n    //        ^^ skipping these spaces\n    pos++\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n    if (pos >= max) { return false }\n\n    // [link](  <href>  \"title\"  )\n    //          ^^^^^^ parsing link destination\n    start = pos\n    res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)\n    if (res.ok) {\n      href = state.md.normalizeLink(res.str)\n      if (state.md.validateLink(href)) {\n        pos = res.pos\n      } else {\n        href = ''\n      }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                ^^ skipping these spaces\n    start = pos\n    for (; pos < max; pos++) {\n      code = state.src.charCodeAt(pos)\n      if (!isSpace(code) && code !== 0x0A) { break }\n    }\n\n    // [link](  <href>  \"title\"  )\n    //                  ^^^^^^^ parsing link title\n    res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)\n    if (pos < max && start !== pos && res.ok) {\n      title = res.str\n      pos = res.pos\n\n      // [link](  <href>  \"title\"  )\n      //                         ^^ skipping these spaces\n      for (; pos < max; pos++) {\n        code = state.src.charCodeAt(pos)\n        if (!isSpace(code) && code !== 0x0A) { break }\n      }\n    } else {\n      title = ''\n    }\n\n    if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n      state.pos = oldPos\n      return false\n    }\n    pos++\n  } else {\n    //\n    // Link reference\n    //\n    if (typeof state.env.references === 'undefined') { return false }\n\n    if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n      start = pos + 1\n      pos = state.md.helpers.parseLinkLabel(state, pos)\n      if (pos >= 0) {\n        label = state.src.slice(start, pos++)\n      } else {\n        pos = labelEnd + 1\n      }\n    } else {\n      pos = labelEnd + 1\n    }\n\n    // covers label === '' and label === undefined\n    // (collapsed reference link and shortcut reference link respectively)\n    if (!label) { label = state.src.slice(labelStart, labelEnd) }\n\n    ref = state.env.references[normalizeReference(label)]\n    if (!ref) {\n      state.pos = oldPos\n      return false\n    }\n    href = ref.href\n    title = ref.title\n  }\n\n  //\n  // We found the end of the link, and know for a fact it's a valid link;\n  // so all that's left to do is to call tokenizer.\n  //\n  if (!silent) {\n    content = state.src.slice(labelStart, labelEnd)\n\n    const tokens = []\n    state.md.inline.parse(\n      content,\n      state.md,\n      state.env,\n      tokens\n    )\n\n    const token = state.push('image', 'img', 0)\n    const attrs = [['src', href], ['alt', '']]\n    token.attrs = attrs\n    token.children = tokens\n    token.content = content\n\n    if (title) {\n      attrs.push(['title', title])\n    }\n  }\n\n  state.pos = pos\n  state.posMax = max\n  return true\n}\n","// Process autolinks '<protocol:...>'\n\n/* eslint max-len:0 */\nconst EMAIL_RE    = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/\n/* eslint-disable-next-line no-control-regex */\nconst AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\\x00-\\x20]*)$/\n\nexport default function autolink (state, silent) {\n  let pos = state.pos\n\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false }\n\n  const start = state.pos\n  const max = state.posMax\n\n  for (;;) {\n    if (++pos >= max) return false\n\n    const ch = state.src.charCodeAt(pos)\n\n    if (ch === 0x3C /* < */) return false\n    if (ch === 0x3E /* > */) break\n  }\n\n  const url = state.src.slice(start + 1, pos)\n\n  if (AUTOLINK_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink(url)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o   = state.push('link_open', 'a', 1)\n      token_o.attrs   = [['href', fullUrl]]\n      token_o.markup  = 'autolink'\n      token_o.info    = 'auto'\n\n      const token_t   = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c   = state.push('link_close', 'a', -1)\n      token_c.markup  = 'autolink'\n      token_c.info    = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  if (EMAIL_RE.test(url)) {\n    const fullUrl = state.md.normalizeLink('mailto:' + url)\n    if (!state.md.validateLink(fullUrl)) { return false }\n\n    if (!silent) {\n      const token_o   = state.push('link_open', 'a', 1)\n      token_o.attrs   = [['href', fullUrl]]\n      token_o.markup  = 'autolink'\n      token_o.info    = 'auto'\n\n      const token_t   = state.push('text', '', 0)\n      token_t.content = state.md.normalizeLinkText(url)\n\n      const token_c   = state.push('link_close', 'a', -1)\n      token_c.markup  = 'autolink'\n      token_c.info    = 'auto'\n    }\n\n    state.pos += url.length + 2\n    return true\n  }\n\n  return false\n}\n","// Process html tags\n\nimport { HTML_TAG_RE } from '../common/html_re.mjs'\n\nfunction isLinkOpen (str) {\n  return /^<a[>\\s]/i.test(str)\n}\nfunction isLinkClose (str) {\n  return /^<\\/a\\s*>/i.test(str)\n}\n\nfunction isLetter (ch) {\n  /* eslint no-bitwise:0 */\n  const lc = ch | 0x20 // to lower case\n  return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */)\n}\n\nexport default function html_inline (state, silent) {\n  if (!state.md.options.html) { return false }\n\n  // Check start\n  const max = state.posMax\n  const pos = state.pos\n  if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n      pos + 2 >= max) {\n    return false\n  }\n\n  // Quick fail on second char\n  const ch = state.src.charCodeAt(pos + 1)\n  if (ch !== 0x21/* ! */ &&\n      ch !== 0x3F/* ? */ &&\n      ch !== 0x2F/* / */ &&\n      !isLetter(ch)) {\n    return false\n  }\n\n  const match = state.src.slice(pos).match(HTML_TAG_RE)\n  if (!match) { return false }\n\n  if (!silent) {\n    const token = state.push('html_inline', '', 0)\n    token.content = match[0]\n\n    if (isLinkOpen(token.content))  state.linkLevel++\n    if (isLinkClose(token.content)) state.linkLevel--\n  }\n  state.pos += match[0].length\n  return true\n}\n","// Process html entity - &#123;, &#xAF;, &quot;, ...\n\nimport { decodeHTML } from 'entities'\nimport { isValidEntityCode, fromCodePoint } from '../common/utils.mjs'\n\nconst DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i\nconst NAMED_RE   = /^&([a-z][a-z0-9]{1,31});/i\n\nexport default function entity (state, silent) {\n  const pos = state.pos\n  const max = state.posMax\n\n  if (state.src.charCodeAt(pos) !== 0x26/* & */) return false\n\n  if (pos + 1 >= max) return false\n\n  const ch = state.src.charCodeAt(pos + 1)\n\n  if (ch === 0x23 /* # */) {\n    const match = state.src.slice(pos).match(DIGITAL_RE)\n    if (match) {\n      if (!silent) {\n        const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10)\n\n        const token   = state.push('text_special', '', 0)\n        token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD)\n        token.markup  = match[0]\n        token.info    = 'entity'\n      }\n      state.pos += match[0].length\n      return true\n    }\n  } else {\n    const match = state.src.slice(pos).match(NAMED_RE)\n    if (match) {\n      const decoded = decodeHTML(match[0])\n      if (decoded !== match[0]) {\n        if (!silent) {\n          const token   = state.push('text_special', '', 0)\n          token.content = decoded\n          token.markup  = match[0]\n          token.info    = 'entity'\n        }\n        state.pos += match[0].length\n        return true\n      }\n    }\n  }\n\n  return false\n}\n","// For each opening emphasis-like marker find a matching closing one\n//\n\nfunction processDelimiters (delimiters) {\n  const openersBottom = {}\n  const max = delimiters.length\n\n  if (!max) return\n\n  // headerIdx is the first delimiter of the current (where closer is) delimiter run\n  let headerIdx = 0\n  let lastTokenIdx = -2 // needs any value lower than -1\n  const jumps = []\n\n  for (let closerIdx = 0; closerIdx < max; closerIdx++) {\n    const closer = delimiters[closerIdx]\n\n    jumps.push(0)\n\n    // markers belong to same delimiter run if:\n    //  - they have adjacent tokens\n    //  - AND markers are the same\n    //\n    if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n      headerIdx = closerIdx\n    }\n\n    lastTokenIdx = closer.token\n\n    // Length is only used for emphasis-specific \"rule of 3\",\n    // if it's not defined (in strikethrough or 3rd party plugins),\n    // we can default it to 0 to disable those checks.\n    //\n    closer.length = closer.length || 0\n\n    if (!closer.close) continue\n\n    // Previously calculated lower bounds (previous fails)\n    // for each marker, each delimiter length modulo 3,\n    // and for whether this closer can be an opener;\n    // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n    /* eslint-disable-next-line no-prototype-builtins */\n    if (!openersBottom.hasOwnProperty(closer.marker)) {\n      openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]\n    }\n\n    const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)]\n\n    let openerIdx = headerIdx - jumps[headerIdx] - 1\n\n    let newMinOpenerIdx = openerIdx\n\n    for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n      const opener = delimiters[openerIdx]\n\n      if (opener.marker !== closer.marker) continue\n\n      if (opener.open && opener.end < 0) {\n        let isOddMatch = false\n\n        // from spec:\n        //\n        // If one of the delimiters can both open and close emphasis, then the\n        // sum of the lengths of the delimiter runs containing the opening and\n        // closing delimiters must not be a multiple of 3 unless both lengths\n        // are multiples of 3.\n        //\n        if (opener.close || closer.open) {\n          if ((opener.length + closer.length) % 3 === 0) {\n            if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n              isOddMatch = true\n            }\n          }\n        }\n\n        if (!isOddMatch) {\n          // If previous delimiter cannot be an opener, we can safely skip\n          // the entire sequence in future checks. This is required to make\n          // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n          //\n          const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open\n            ? jumps[openerIdx - 1] + 1\n            : 0\n\n          jumps[closerIdx] = closerIdx - openerIdx + lastJump\n          jumps[openerIdx] = lastJump\n\n          closer.open  = false\n          opener.end   = closerIdx\n          opener.close = false\n          newMinOpenerIdx = -1\n          // treat next token as start of run,\n          // it optimizes skips in **<...>**a**<...>** pathological case\n          lastTokenIdx = -2\n          break\n        }\n      }\n    }\n\n    if (newMinOpenerIdx !== -1) {\n      // If match for this delimiter run failed, we want to set lower bound for\n      // future lookups. This is required to make sure algorithm has linear\n      // complexity.\n      //\n      // See details here:\n      // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n      //\n      openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx\n    }\n  }\n}\n\nexport default function link_pairs (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  processDelimiters(state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      processDelimiters(tokens_meta[curr].delimiters)\n    }\n  }\n}\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n\nexport default function fragments_join (state) {\n  let curr, last\n  let level = 0\n  const tokens = state.tokens\n  const max = state.tokens.length\n\n  for (curr = last = 0; curr < max; curr++) {\n    // re-calculate levels after emphasis/strikethrough turns some text nodes\n    // into opening/closing tags\n    if (tokens[curr].nesting < 0) level-- // closing tag\n    tokens[curr].level = level\n    if (tokens[curr].nesting > 0) level++ // opening tag\n\n    if (tokens[curr].type === 'text' &&\n        curr + 1 < max &&\n        tokens[curr + 1].type === 'text') {\n      // collapse two adjacent text nodes\n      tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content\n    } else {\n      if (curr !== last) { tokens[last] = tokens[curr] }\n\n      last++\n    }\n  }\n\n  if (curr !== last) {\n    tokens.length = last\n  }\n}\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n\nimport Ruler from './ruler.mjs'\nimport StateInline from './rules_inline/state_inline.mjs'\n\nimport r_text from './rules_inline/text.mjs'\nimport r_linkify from './rules_inline/linkify.mjs'\nimport r_newline from './rules_inline/newline.mjs'\nimport r_escape from './rules_inline/escape.mjs'\nimport r_backticks from './rules_inline/backticks.mjs'\nimport r_strikethrough from './rules_inline/strikethrough.mjs'\nimport r_emphasis from './rules_inline/emphasis.mjs'\nimport r_link from './rules_inline/link.mjs'\nimport r_image from './rules_inline/image.mjs'\nimport r_autolink from './rules_inline/autolink.mjs'\nimport r_html_inline from './rules_inline/html_inline.mjs'\nimport r_entity from './rules_inline/entity.mjs'\n\nimport r_balance_pairs from './rules_inline/balance_pairs.mjs'\nimport r_fragments_join from './rules_inline/fragments_join.mjs'\n\n// Parser rules\n\nconst _rules = [\n  ['text',            r_text],\n  ['linkify',         r_linkify],\n  ['newline',         r_newline],\n  ['escape',          r_escape],\n  ['backticks',       r_backticks],\n  ['strikethrough',   r_strikethrough.tokenize],\n  ['emphasis',        r_emphasis.tokenize],\n  ['link',            r_link],\n  ['image',           r_image],\n  ['autolink',        r_autolink],\n  ['html_inline',     r_html_inline],\n  ['entity',          r_entity]\n]\n\n// `rule2` ruleset was created specifically for emphasis/strikethrough\n// post-processing and may be changed in the future.\n//\n// Don't use this for anything except pairs (plugins working with `balance_pairs`).\n//\nconst _rules2 = [\n  ['balance_pairs',   r_balance_pairs],\n  ['strikethrough',   r_strikethrough.postProcess],\n  ['emphasis',        r_emphasis.postProcess],\n  // rules for pairs separate '**' into its own text tokens, which may be left unused,\n  // rule below merges unused segments back with the rest of the text\n  ['fragments_join',  r_fragments_join]\n]\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline () {\n  /**\n   * ParserInline#ruler -> Ruler\n   *\n   * [[Ruler]] instance. Keep configuration of inline rules.\n   **/\n  this.ruler = new Ruler()\n\n  for (let i = 0; i < _rules.length; i++) {\n    this.ruler.push(_rules[i][0], _rules[i][1])\n  }\n\n  /**\n   * ParserInline#ruler2 -> Ruler\n   *\n   * [[Ruler]] instance. Second ruler used for post-processing\n   * (e.g. in emphasis-like rules).\n   **/\n  this.ruler2 = new Ruler()\n\n  for (let i = 0; i < _rules2.length; i++) {\n    this.ruler2.push(_rules2[i][0], _rules2[i][1])\n  }\n}\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n  const pos = state.pos\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const maxNesting = state.md.options.maxNesting\n  const cache = state.cache\n\n  if (typeof cache[pos] !== 'undefined') {\n    state.pos = cache[pos]\n    return\n  }\n\n  let ok = false\n\n  if (state.level < maxNesting) {\n    for (let i = 0; i < len; i++) {\n      // Increment state.level and decrement it later to limit recursion.\n      // It's harmless to do here, because no tokens are created. But ideally,\n      // we'd need a separate private state variable for this purpose.\n      //\n      state.level++\n      ok = rules[i](state, true)\n      state.level--\n\n      if (ok) {\n        if (pos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n        break\n      }\n    }\n  } else {\n    // Too much nesting, just skip until the end of the paragraph.\n    //\n    // NOTE: this will cause links to behave incorrectly in the following case,\n    //       when an amount of `[` is exactly equal to `maxNesting + 1`:\n    //\n    //       [[[[[[[[[[[[[[[[[[[[[foo]()\n    //\n    // TODO: remove this workaround when CM standard will allow nested links\n    //       (we can replace it by preventing links from being parsed in\n    //       validation mode)\n    //\n    state.pos = state.posMax\n  }\n\n  if (!ok) { state.pos++ }\n  cache[pos] = state.pos\n}\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n  const rules = this.ruler.getRules('')\n  const len = rules.length\n  const end = state.posMax\n  const maxNesting = state.md.options.maxNesting\n\n  while (state.pos < end) {\n    // Try all possible rules.\n    // On success, rule should:\n    //\n    // - update `state.pos`\n    // - update `state.tokens`\n    // - return true\n    const prevPos = state.pos\n    let ok = false\n\n    if (state.level < maxNesting) {\n      for (let i = 0; i < len; i++) {\n        ok = rules[i](state, false)\n        if (ok) {\n          if (prevPos >= state.pos) { throw new Error(\"inline rule didn't increment state.pos\") }\n          break\n        }\n      }\n    }\n\n    if (ok) {\n      if (state.pos >= end) { break }\n      continue\n    }\n\n    state.pending += state.src[state.pos++]\n  }\n\n  if (state.pending) {\n    state.pushPending()\n  }\n}\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n  const state = new this.State(str, md, env, outTokens)\n\n  this.tokenize(state)\n\n  const rules = this.ruler2.getRules('')\n  const len = rules.length\n\n  for (let i = 0; i < len; i++) {\n    rules[i](state)\n  }\n}\n\nParserInline.prototype.State = StateInline\n\nexport default ParserInline\n","import { Any, Cc, Z, P } from 'uc.micro'\n\nexport default function (opts) {\n  const re = {}\n  opts = opts || {}\n\n  re.src_Any = Any.source\n  re.src_Cc = Cc.source\n  re.src_Z = Z.source\n  re.src_P = P.source\n\n  // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n  re.src_ZPCc = [re.src_Z, re.src_P, re.src_Cc].join('|')\n\n  // \\p{\\Z\\Cc} (white spaces + control)\n  re.src_ZCc = [re.src_Z, re.src_Cc].join('|')\n\n  // Experimental. List of chars, completely prohibited in links\n  // because can separate it from other part of text\n  const text_separators = '[><\\uff5c]'\n\n  // All possible word characters (everything without punctuation, spaces & controls)\n  // Defined via punctuation & spaces to save space\n  // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n  re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')'\n  // The same as abothe but without [0-9]\n  // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n  re.src_ip4 =\n\n    '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'\n\n  // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n  re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?'\n\n  re.src_port =\n\n    '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?'\n\n  re.src_host_terminator =\n\n    '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' +\n    '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))'\n\n  re.src_path =\n\n    '(?:' +\n      '[/?#]' +\n        '(?:' +\n          '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-;]).|' +\n          '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n          '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n          '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n          '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n          \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n\n          // allow `I'm_king` if no pair found\n          \"\\\\'(?=\" + re.src_pseudo_letter + '|[-])|' +\n\n          // google has many dots in \"google search\" links (#66, #81).\n          // github has ... in commit range links,\n          // Restrict to\n          // - english\n          // - percent-encoded\n          // - parts of file path\n          // - params separator\n          // until more examples found.\n          '\\\\.{2,}[a-zA-Z0-9%/&]|' +\n\n          '\\\\.(?!' + re.src_ZCc + '|[.]|$)|' +\n          (opts['---']\n            ? '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n            : '\\\\-+|'\n          ) +\n          // allow `,,,` in paths\n          ',(?!' + re.src_ZCc + '|$)|' +\n\n          // allow `;` if not followed by space-like char\n          ';(?!' + re.src_ZCc + '|$)|' +\n\n          // allow `!!!` in paths, but not at the end\n          '\\\\!+(?!' + re.src_ZCc + '|[!]|$)|' +\n\n          '\\\\?(?!' + re.src_ZCc + '|[?]|$)' +\n        ')+' +\n      '|\\\\/' +\n    ')?'\n\n  // Allow anything in markdown spec, forbid quote (\") at the first position\n  // because emails enclosed in quotes are far more common\n  re.src_email_name =\n\n    '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*'\n\n  re.src_xn =\n\n    'xn--[a-z0-9\\\\-]{1,59}'\n\n  // More to read about domain names\n  // http://serverfault.com/questions/638260/\n\n  re.src_domain_root =\n\n    // Allow letters & digits (http://test1)\n    '(?:' +\n      re.src_xn +\n      '|' +\n      re.src_pseudo_letter + '{1,63}' +\n    ')'\n\n  re.src_domain =\n\n    '(?:' +\n      re.src_xn +\n      '|' +\n      '(?:' + re.src_pseudo_letter + ')' +\n      '|' +\n      '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n    ')'\n\n  re.src_host =\n\n    '(?:' +\n    // Don't need IP check, because digits are already allowed in normal domain names\n    //   src_ip4 +\n    // '|' +\n      '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/* _root */ + ')' +\n    ')'\n\n  re.tpl_host_fuzzy =\n\n    '(?:' +\n      re.src_ip4 +\n    '|' +\n      '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n    ')'\n\n  re.tpl_host_no_ip_fuzzy =\n\n    '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))'\n\n  re.src_host_strict =\n\n    re.src_host + re.src_host_terminator\n\n  re.tpl_host_fuzzy_strict =\n\n    re.tpl_host_fuzzy + re.src_host_terminator\n\n  re.src_host_port_strict =\n\n    re.src_host + re.src_port + re.src_host_terminator\n\n  re.tpl_host_port_fuzzy_strict =\n\n    re.tpl_host_fuzzy + re.src_port + re.src_host_terminator\n\n  re.tpl_host_port_no_ip_fuzzy_strict =\n\n    re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator\n\n  //\n  // Main rules\n  //\n\n  // Rude test fuzzy links by host, for quick deny\n  re.tpl_host_fuzzy_test =\n\n    'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))'\n\n  re.tpl_email_fuzzy =\n\n      '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n      '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')'\n\n  re.tpl_link_fuzzy =\n      // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n      // but can start with > (markdown blockquote)\n      '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n      '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')'\n\n  re.tpl_link_no_ip_fuzzy =\n      // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n      // but can start with > (markdown blockquote)\n      '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n      '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')'\n\n  return re\n}\n","import reFactory from './lib/re.mjs'\n\n//\n// Helpers\n//\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n  const sources = Array.prototype.slice.call(arguments, 1)\n\n  sources.forEach(function (source) {\n    if (!source) { return }\n\n    Object.keys(source).forEach(function (key) {\n      obj[key] = source[key]\n    })\n  })\n\n  return obj\n}\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\nfunction isString (obj) { return _class(obj) === '[object String]' }\nfunction isObject (obj) { return _class(obj) === '[object Object]' }\nfunction isRegExp (obj) { return _class(obj) === '[object RegExp]' }\nfunction isFunction (obj) { return _class(obj) === '[object Function]' }\n\nfunction escapeRE (str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&') }\n\n//\n\nconst defaultOptions = {\n  fuzzyLink: true,\n  fuzzyEmail: true,\n  fuzzyIP: false\n}\n\nfunction isOptionsObj (obj) {\n  return Object.keys(obj || {}).reduce(function (acc, k) {\n    /* eslint-disable-next-line no-prototype-builtins */\n    return acc || defaultOptions.hasOwnProperty(k)\n  }, false)\n}\n\nconst defaultSchemas = {\n  'http:': {\n    validate: function (text, pos, self) {\n      const tail = text.slice(pos)\n\n      if (!self.re.http) {\n        // compile lazily, because \"host\"-containing variables can change on tlds update.\n        self.re.http = new RegExp(\n          '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n        )\n      }\n      if (self.re.http.test(tail)) {\n        return tail.match(self.re.http)[0].length\n      }\n      return 0\n    }\n  },\n  'https:': 'http:',\n  'ftp:': 'http:',\n  '//': {\n    validate: function (text, pos, self) {\n      const tail = text.slice(pos)\n\n      if (!self.re.no_http) {\n      // compile lazily, because \"host\"-containing variables can change on tlds update.\n        self.re.no_http = new RegExp(\n          '^' +\n          self.re.src_auth +\n          // Don't allow single-level domains, because of false positives like '//test'\n          // with code comments\n          '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n          self.re.src_port +\n          self.re.src_host_terminator +\n          self.re.src_path,\n\n          'i'\n        )\n      }\n\n      if (self.re.no_http.test(tail)) {\n        // should not be `://` & `///`, that protects from errors in protocol name\n        if (pos >= 3 && text[pos - 3] === ':') { return 0 }\n        if (pos >= 3 && text[pos - 3] === '/') { return 0 }\n        return tail.match(self.re.no_http)[0].length\n      }\n      return 0\n    }\n  },\n  'mailto:': {\n    validate: function (text, pos, self) {\n      const tail = text.slice(pos)\n\n      if (!self.re.mailto) {\n        self.re.mailto = new RegExp(\n          '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n        )\n      }\n      if (self.re.mailto.test(tail)) {\n        return tail.match(self.re.mailto)[0].length\n      }\n      return 0\n    }\n  }\n}\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\n/* eslint-disable-next-line max-len */\nconst tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nconst tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|')\n\nfunction resetScanCache (self) {\n  self.__index__ = -1\n  self.__text_cache__ = ''\n}\n\nfunction createValidator (re) {\n  return function (text, pos) {\n    const tail = text.slice(pos)\n\n    if (re.test(tail)) {\n      return tail.match(re)[0].length\n    }\n    return 0\n  }\n}\n\nfunction createNormalizer () {\n  return function (match, self) {\n    self.normalize(match)\n  }\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile (self) {\n  // Load & clone RE patterns.\n  const re = self.re = reFactory(self.__opts__)\n\n  // Define dynamic patterns\n  const tlds = self.__tlds__.slice()\n\n  self.onCompile()\n\n  if (!self.__tlds_replaced__) {\n    tlds.push(tlds_2ch_src_re)\n  }\n  tlds.push(re.src_xn)\n\n  re.src_tlds = tlds.join('|')\n\n  function untpl (tpl) { return tpl.replace('%TLDS%', re.src_tlds) }\n\n  re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i')\n  re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i')\n  re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i')\n  re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i')\n\n  //\n  // Compile each schema\n  //\n\n  const aliases = []\n\n  self.__compiled__ = {} // Reset compiled data\n\n  function schemaError (name, val) {\n    throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val)\n  }\n\n  Object.keys(self.__schemas__).forEach(function (name) {\n    const val = self.__schemas__[name]\n\n    // skip disabled methods\n    if (val === null) { return }\n\n    const compiled = { validate: null, link: null }\n\n    self.__compiled__[name] = compiled\n\n    if (isObject(val)) {\n      if (isRegExp(val.validate)) {\n        compiled.validate = createValidator(val.validate)\n      } else if (isFunction(val.validate)) {\n        compiled.validate = val.validate\n      } else {\n        schemaError(name, val)\n      }\n\n      if (isFunction(val.normalize)) {\n        compiled.normalize = val.normalize\n      } else if (!val.normalize) {\n        compiled.normalize = createNormalizer()\n      } else {\n        schemaError(name, val)\n      }\n\n      return\n    }\n\n    if (isString(val)) {\n      aliases.push(name)\n      return\n    }\n\n    schemaError(name, val)\n  })\n\n  //\n  // Compile postponed aliases\n  //\n\n  aliases.forEach(function (alias) {\n    if (!self.__compiled__[self.__schemas__[alias]]) {\n      // Silently fail on missed schemas to avoid errons on disable.\n      // schemaError(alias, self.__schemas__[alias]);\n      return\n    }\n\n    self.__compiled__[alias].validate =\n      self.__compiled__[self.__schemas__[alias]].validate\n    self.__compiled__[alias].normalize =\n      self.__compiled__[self.__schemas__[alias]].normalize\n  })\n\n  //\n  // Fake record for guessed links\n  //\n  self.__compiled__[''] = { validate: null, normalize: createNormalizer() }\n\n  //\n  // Build schema condition\n  //\n  const slist = Object.keys(self.__compiled__)\n    .filter(function (name) {\n      // Filter disabled & fake schemas\n      return name.length > 0 && self.__compiled__[name]\n    })\n    .map(escapeRE)\n    .join('|')\n  // (?!_) cause 1.5x slowdown\n  self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i')\n  self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig')\n  self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i')\n\n  self.re.pretest = RegExp(\n    '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n    'i'\n  )\n\n  //\n  // Cleanup\n  //\n\n  resetScanCache(self)\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match (self, shift) {\n  const start = self.__index__\n  const end = self.__last_index__\n  const text = self.__text_cache__.slice(start, end)\n\n  /**\n   * Match#schema -> String\n   *\n   * Prefix (protocol) for matched string.\n   **/\n  this.schema = self.__schema__.toLowerCase()\n  /**\n   * Match#index -> Number\n   *\n   * First position of matched string.\n   **/\n  this.index = start + shift\n  /**\n   * Match#lastIndex -> Number\n   *\n   * Next position after matched string.\n   **/\n  this.lastIndex = end + shift\n  /**\n   * Match#raw -> String\n   *\n   * Matched string.\n   **/\n  this.raw = text\n  /**\n   * Match#text -> String\n   *\n   * Notmalized text of matched string.\n   **/\n  this.text = text\n  /**\n   * Match#url -> String\n   *\n   * Normalized url of matched string.\n   **/\n  this.url = text\n}\n\nfunction createMatch (self, shift) {\n  const match = new Match(self, shift)\n\n  self.__compiled__[match.schema].normalize(match, self)\n\n  return match\n}\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n *   for example). `linkify-it` makes shure that prefix is not preceeded with\n *   alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n *   - _String_ - just alias to existing rule\n *   - _Object_\n *     - _validate_ - validator function (should return matched length on success),\n *       or `RegExp`.\n *     - _normalize_ - optional function to normalize text & url of matched result\n *       (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n *   like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt (schemas, options) {\n  if (!(this instanceof LinkifyIt)) {\n    return new LinkifyIt(schemas, options)\n  }\n\n  if (!options) {\n    if (isOptionsObj(schemas)) {\n      options = schemas\n      schemas = {}\n    }\n  }\n\n  this.__opts__ = assign({}, defaultOptions, options)\n\n  // Cache last tested result. Used to skip repeating steps on next `match` call.\n  this.__index__ = -1\n  this.__last_index__ = -1 // Next scan position\n  this.__schema__ = ''\n  this.__text_cache__ = ''\n\n  this.__schemas__ = assign({}, defaultSchemas, schemas)\n  this.__compiled__ = {}\n\n  this.__tlds__ = tlds_default\n  this.__tlds_replaced__ = false\n\n  this.re = {}\n\n  compile(this)\n}\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add (schema, definition) {\n  this.__schemas__[schema] = definition\n  compile(this)\n  return this\n}\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set (options) {\n  this.__opts__ = assign(this.__opts__, options)\n  return this\n}\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test (text) {\n  // Reset scan cache\n  this.__text_cache__ = text\n  this.__index__ = -1\n\n  if (!text.length) { return false }\n\n  let m, ml, me, len, shift, next, re, tld_pos, at_pos\n\n  // try to scan for link with schema - that's the most simple rule\n  if (this.re.schema_test.test(text)) {\n    re = this.re.schema_search\n    re.lastIndex = 0\n    while ((m = re.exec(text)) !== null) {\n      len = this.testSchemaAt(text, m[2], re.lastIndex)\n      if (len) {\n        this.__schema__ = m[2]\n        this.__index__ = m.index + m[1].length\n        this.__last_index__ = m.index + m[0].length + len\n        break\n      }\n    }\n  }\n\n  if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n    // guess schemaless links\n    tld_pos = text.search(this.re.host_fuzzy_test)\n    if (tld_pos >= 0) {\n      // if tld is located after found link - no need to check fuzzy pattern\n      if (this.__index__ < 0 || tld_pos < this.__index__) {\n        if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n          shift = ml.index + ml[1].length\n\n          if (this.__index__ < 0 || shift < this.__index__) {\n            this.__schema__ = ''\n            this.__index__ = shift\n            this.__last_index__ = ml.index + ml[0].length\n          }\n        }\n      }\n    }\n  }\n\n  if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n    // guess schemaless emails\n    at_pos = text.indexOf('@')\n    if (at_pos >= 0) {\n      // We can't skip this check, because this cases are possible:\n      // 192.168.1.1@gmail.com, my.in@example.com\n      if ((me = text.match(this.re.email_fuzzy)) !== null) {\n        shift = me.index + me[1].length\n        next = me.index + me[0].length\n\n        if (this.__index__ < 0 || shift < this.__index__ ||\n            (shift === this.__index__ && next > this.__last_index__)) {\n          this.__schema__ = 'mailto:'\n          this.__index__ = shift\n          this.__last_index__ = next\n        }\n      }\n    }\n  }\n\n  return this.__index__ >= 0\n}\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest (text) {\n  return this.re.pretest.test(text)\n}\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt (text, schema, pos) {\n  // If not supported schema check requested - terminate\n  if (!this.__compiled__[schema.toLowerCase()]) {\n    return 0\n  }\n  return this.__compiled__[schema.toLowerCase()].validate(text, pos, this)\n}\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n *   protocol-neutral  links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match (text) {\n  const result = []\n  let shift = 0\n\n  // Try to take previous element from cache, if .test() called before\n  if (this.__index__ >= 0 && this.__text_cache__ === text) {\n    result.push(createMatch(this, shift))\n    shift = this.__last_index__\n  }\n\n  // Cut head if cache was used\n  let tail = shift ? text.slice(shift) : text\n\n  // Scan string until end reached\n  while (this.test(tail)) {\n    result.push(createMatch(this, shift))\n\n    tail = tail.slice(this.__last_index__)\n    shift += this.__last_index__\n  }\n\n  if (result.length) {\n    return result\n  }\n\n  return null\n}\n\n/**\n * LinkifyIt#matchAtStart(text) -> Match|null\n *\n * Returns fully-formed (not fuzzy) link if it starts at the beginning\n * of the string, and null otherwise.\n **/\nLinkifyIt.prototype.matchAtStart = function matchAtStart (text) {\n  // Reset scan cache\n  this.__text_cache__ = text\n  this.__index__ = -1\n\n  if (!text.length) return null\n\n  const m = this.re.schema_at_start.exec(text)\n  if (!m) return null\n\n  const len = this.testSchemaAt(text, m[2], m[0].length)\n  if (!len) return null\n\n  this.__schema__ = m[2]\n  this.__index__ = m.index + m[1].length\n  this.__last_index__ = m.index + m[0].length + len\n\n  return createMatch(this, 0)\n}\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n *   are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds (list, keepOld) {\n  list = Array.isArray(list) ? list : [list]\n\n  if (!keepOld) {\n    this.__tlds__ = list.slice()\n    this.__tlds_replaced__ = true\n    compile(this)\n    return this\n  }\n\n  this.__tlds__ = this.__tlds__.concat(list)\n    .sort()\n    .filter(function (el, idx, arr) {\n      return el !== arr[idx - 1]\n    })\n    .reverse()\n\n  compile(this)\n  return this\n}\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize (match) {\n  // Do minimal possible changes by default. Need to collect feedback prior\n  // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n  if (!match.schema) { match.url = 'http://' + match.url }\n\n  if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n    match.url = 'mailto:' + match.url\n  }\n}\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile () {\n}\n\nexport default LinkifyIt\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = callback(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n\tconst parts = domain.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tdomain = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tdomain = domain.replace(regexSeparators, '\\x2E');\n\tconst labels = domain.split('.');\n\tconst encoded = map(labels, callback).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint >= 0x30 && codePoint < 0x3A) {\n\t\treturn 26 + (codePoint - 0x30);\n\t}\n\tif (codePoint >= 0x41 && codePoint < 0x5B) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint >= 0x61 && codePoint < 0x7B) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tconst oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\t\t\tif (digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tconst inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tconst basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue === n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.3.1',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };\nexport default punycode;\n","// Main parser class\n\nimport * as utils from './common/utils.mjs'\nimport * as helpers from './helpers/index.mjs'\nimport Renderer from './renderer.mjs'\nimport ParserCore from './parser_core.mjs'\nimport ParserBlock from './parser_block.mjs'\nimport ParserInline from './parser_inline.mjs'\nimport LinkifyIt from 'linkify-it'\nimport * as mdurl from 'mdurl'\nimport punycode from 'punycode.js'\n\nimport cfg_default from './presets/default.mjs'\nimport cfg_zero from './presets/zero.mjs'\nimport cfg_commonmark from './presets/commonmark.mjs'\n\nconst config = {\n  default: cfg_default,\n  zero: cfg_zero,\n  commonmark: cfg_commonmark\n}\n\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nconst BAD_PROTO_RE = /^(vbscript|javascript|file|data):/\nconst GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/\n\nfunction validateLink (url) {\n  // url should be normalized at this point, and existing entities are decoded\n  const str = url.trim().toLowerCase()\n\n  return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true\n}\n\nconst RECODE_HOSTNAME_FOR = ['http:', 'https:', 'mailto:']\n\nfunction normalizeLink (url) {\n  const parsed = mdurl.parse(url, true)\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toASCII(parsed.hostname)\n      } catch (er) { /**/ }\n    }\n  }\n\n  return mdurl.encode(mdurl.format(parsed))\n}\n\nfunction normalizeLinkText (url) {\n  const parsed = mdurl.parse(url, true)\n\n  if (parsed.hostname) {\n    // Encode hostnames in urls like:\n    // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n    //\n    // We don't encode unknown schemas, because it's likely that we encode\n    // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n    //\n    if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n      try {\n        parsed.hostname = punycode.toUnicode(parsed.hostname)\n      } catch (er) { /**/ }\n    }\n  }\n\n  // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720\n  return mdurl.decode(mdurl.format(parsed), mdurl.decode.defaultChars + '%')\n}\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n *     md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.mjs) -\n *   configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.mjs) -\n *   similar to GFM, used when no preset name given. Enables all available rules,\n *   but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.mjs) -\n *   all rules disabled. Useful to quickly setup your config via `.enable()`.\n *   For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n *   That's not safe! You may need external sanitizer to protect output from XSS.\n *   It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n *   (`<br />`). This is needed only for full CommonMark compatibility. In real\n *   world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `<br>`.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n *   Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__  - `false`. Set `true` to enable [some language-neutral\n *   replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs) +\n *   quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n *   pairs, when typographer enabled and smartquotes on. For example, you can\n *   use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n *   `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n *   Highlighter `function (str, lang)` should return escaped HTML. It can also\n *   return empty string if the source was not changed and should be escaped\n *   externaly. If result starts with <pre... internal wrapper is skipped.\n *\n * ##### Example\n *\n * ```javascript\n * // commonmark mode\n * var md = require('markdown-it')('commonmark');\n *\n * // default mode\n * var md = require('markdown-it')();\n *\n * // enable everything\n * var md = require('markdown-it')({\n *   html: true,\n *   linkify: true,\n *   typographer: true\n * });\n * ```\n *\n * ##### Syntax highlighting\n *\n * ```js\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return hljs.highlight(str, { language: lang, ignoreIllegals: true }).value;\n *       } catch (__) {}\n *     }\n *\n *     return ''; // use external default escaping\n *   }\n * });\n * ```\n *\n * Or with full wrapper override (if you need assign class to `<pre>` or `<code>`):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n *   highlight: function (str, lang) {\n *     if (lang && hljs.getLanguage(lang)) {\n *       try {\n *         return '<pre><code class=\"hljs\">' +\n *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +\n *                '</code></pre>';\n *       } catch (__) {}\n *     }\n *\n *     return '<pre><code class=\"hljs\">' + md.utils.escapeHtml(str) + '</code></pre>';\n *   }\n * });\n * ```\n *\n **/\nfunction MarkdownIt (presetName, options) {\n  if (!(this instanceof MarkdownIt)) {\n    return new MarkdownIt(presetName, options)\n  }\n\n  if (!options) {\n    if (!utils.isString(presetName)) {\n      options = presetName || {}\n      presetName = 'default'\n    }\n  }\n\n  /**\n   * MarkdownIt#inline -> ParserInline\n   *\n   * Instance of [[ParserInline]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.inline = new ParserInline()\n\n  /**\n   * MarkdownIt#block -> ParserBlock\n   *\n   * Instance of [[ParserBlock]]. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.block = new ParserBlock()\n\n  /**\n   * MarkdownIt#core -> Core\n   *\n   * Instance of [[Core]] chain executor. You may need it to add new rules when\n   * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n   * [[MarkdownIt.enable]].\n   **/\n  this.core = new ParserCore()\n\n  /**\n   * MarkdownIt#renderer -> Renderer\n   *\n   * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n   * rules for new token types, generated by plugins.\n   *\n   * ##### Example\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   *\n   * function myToken(tokens, idx, options, env, self) {\n   *   //...\n   *   return result;\n   * };\n   *\n   * md.renderer.rules['my_token'] = myToken\n   * ```\n   *\n   * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs).\n   **/\n  this.renderer = new Renderer()\n\n  /**\n   * MarkdownIt#linkify -> LinkifyIt\n   *\n   * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n   * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.mjs)\n   * rule.\n   **/\n  this.linkify = new LinkifyIt()\n\n  /**\n   * MarkdownIt#validateLink(url) -> Boolean\n   *\n   * Link validation function. CommonMark allows too much in links. By default\n   * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n   * except some embedded image types.\n   *\n   * You can change this behaviour:\n   *\n   * ```javascript\n   * var md = require('markdown-it')();\n   * // enable everything\n   * md.validateLink = function () { return true; }\n   * ```\n   **/\n  this.validateLink = validateLink\n\n  /**\n   * MarkdownIt#normalizeLink(url) -> String\n   *\n   * Function used to encode link url to a machine-readable format,\n   * which includes url-encoding, punycode, etc.\n   **/\n  this.normalizeLink = normalizeLink\n\n  /**\n   * MarkdownIt#normalizeLinkText(url) -> String\n   *\n   * Function used to decode link url to a human-readable format`\n   **/\n  this.normalizeLinkText = normalizeLinkText\n\n  // Expose utils & helpers for easy acces from plugins\n\n  /**\n   * MarkdownIt#utils -> utils\n   *\n   * Assorted utility functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.mjs).\n   **/\n  this.utils = utils\n\n  /**\n   * MarkdownIt#helpers -> helpers\n   *\n   * Link components parser functions, useful to write plugins. See details\n   * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n   **/\n  this.helpers = utils.assign({}, helpers)\n\n  this.options = {}\n  this.configure(presetName)\n\n  if (options) { this.set(options) }\n}\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .set({ html: true, breaks: true })\n *             .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n  utils.assign(this.options, options)\n  return this\n}\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you will - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n  const self = this\n\n  if (utils.isString(presets)) {\n    const presetName = presets\n    presets = config[presetName]\n    if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name') }\n  }\n\n  if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty') }\n\n  if (presets.options) { self.set(presets.options) }\n\n  if (presets.components) {\n    Object.keys(presets.components).forEach(function (name) {\n      if (presets.components[name].rules) {\n        self[name].ruler.enableOnly(presets.components[name].rules)\n      }\n      if (presets.components[name].rules2) {\n        self[name].ruler2.enableOnly(presets.components[name].rules2)\n      }\n    })\n  }\n  return this\n}\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n *             .enable(['sub', 'sup'])\n *             .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n  let result = []\n\n  if (!Array.isArray(list)) { list = [list] }\n\n  ['core', 'block', 'inline'].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.enable(list, true))\n  }, this)\n\n  result = result.concat(this.inline.ruler2.enable(list, true))\n\n  const missed = list.filter(function (name) { return result.indexOf(name) < 0 })\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed)\n  }\n\n  return this\n}\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n  let result = []\n\n  if (!Array.isArray(list)) { list = [list] }\n\n  ['core', 'block', 'inline'].forEach(function (chain) {\n    result = result.concat(this[chain].ruler.disable(list, true))\n  }, this)\n\n  result = result.concat(this.inline.ruler2.disable(list, true))\n\n  const missed = list.filter(function (name) { return result.indexOf(name) < 0 })\n\n  if (missed.length && !ignoreInvalid) {\n    throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed)\n  }\n  return this\n}\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n *             .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n *               tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n *             });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n  const args = [this].concat(Array.prototype.slice.call(arguments, 1))\n  plugin.apply(plugin, args)\n  return this\n}\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and return list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n  if (typeof src !== 'string') {\n    throw new Error('Input data should be a String')\n  }\n\n  const state = new this.core.State(src, this, env)\n\n  this.core.process(state)\n\n  return state.tokens\n}\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n  env = env || {}\n\n  return this.renderer.render(this.parse(src, env), this.options, env)\n}\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n  const state = new this.core.State(src, this, env)\n\n  state.inlineMode = true\n  this.core.process(state)\n\n  return state.tokens\n}\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `<p>` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n  env = env || {}\n\n  return this.renderer.render(this.parseInline(src, env), this.options, env)\n}\n\nexport default MarkdownIt\n","// markdown-it default options\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: false,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: false,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 100\n  },\n\n  components: {\n    core: {},\n    block: {},\n    inline: {}\n  }\n}\n","// \"Zero\" preset, with nothing enabled. Useful for manual configuring of simple\n// modes. For example, to parse bold/italic only.\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: false,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: false,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 20\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'fragments_join'\n      ]\n    }\n  }\n}\n","// Commonmark default options\n\nexport default {\n  options: {\n    // Enable HTML tags in source\n    html: true,\n\n    // Use '/' to close single tags (<br />)\n    xhtmlOut: true,\n\n    // Convert '\\n' in paragraphs into <br>\n    breaks: false,\n\n    // CSS language prefix for fenced blocks\n    langPrefix: 'language-',\n\n    // autoconvert URL-like texts to links\n    linkify: false,\n\n    // Enable some language-neutral replacements + quotes beautification\n    typographer: false,\n\n    // Double + single quotes replacement pairs, when typographer enabled,\n    // and smartquotes on. Could be either a String or an Array.\n    //\n    // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n    // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n    quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n    // Highlighter function. Should return escaped HTML,\n    // or '' if the source string is not changed and should be escaped externaly.\n    // If result starts with <pre... internal wrapper is skipped.\n    //\n    // function (/*str, lang*/) { return ''; }\n    //\n    highlight: null,\n\n    // Internal protection, recursion limit\n    maxNesting: 20\n  },\n\n  components: {\n\n    core: {\n      rules: [\n        'normalize',\n        'block',\n        'inline',\n        'text_join'\n      ]\n    },\n\n    block: {\n      rules: [\n        'blockquote',\n        'code',\n        'fence',\n        'heading',\n        'hr',\n        'html_block',\n        'lheading',\n        'list',\n        'reference',\n        'paragraph'\n      ]\n    },\n\n    inline: {\n      rules: [\n        'autolink',\n        'backticks',\n        'emphasis',\n        'entity',\n        'escape',\n        'html_inline',\n        'image',\n        'link',\n        'newline',\n        'text'\n      ],\n      rules2: [\n        'balance_pairs',\n        'emphasis',\n        'fragments_join'\n      ]\n    }\n  }\n}\n","/**\n * This is the ParseError class, which is the main error thrown by KaTeX\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError extends Error {\n  // Error start position based on passed-in Token or ParseNode.\n\n  // Length of affected text based on passed-in Token or ParseNode.\n\n  // The underlying error message without any context added.\n  constructor(message,\n  // The error message\n  token) {\n    var error = \"KaTeX parse error: \" + message;\n    var start;\n    var end;\n    var loc = token && token.loc;\n    if (loc && loc.start <= loc.end) {\n      // If we have the input and a position, make the error a bit fancier\n      // Get the input\n      var input = loc.lexer.input;\n      // Prepend some information\n      start = loc.start;\n      end = loc.end;\n      if (start === input.length) {\n        error += \" at end of input: \";\n      } else {\n        error += \" at position \" + (start + 1) + \": \";\n      }\n      // Underline token in question using combining underscores\n      var underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n      // Extract some context from the input and add it to the error\n      var left;\n      if (start > 15) {\n        left = \"…\" + input.slice(start - 15, start);\n      } else {\n        left = input.slice(0, start);\n      }\n      var right;\n      if (end + 15 < input.length) {\n        right = input.slice(end, end + 15) + \"…\";\n      } else {\n        right = input.slice(end);\n      }\n      error += left + underlined + right;\n    }\n    super(error);\n    this.name = \"ParseError\";\n    Object.setPrototypeOf(this, ParseError.prototype);\n    this.position = start;\n    if (start != null && end != null) {\n      this.length = end - start;\n    }\n    this.rawMessage = message;\n  }\n}\n\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\nvar uppercase = /([A-Z])/g;\nvar hyphenate = str => str.replace(uppercase, \"-$1\").toLowerCase();\nvar ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  \"\\\"\": \"&quot;\",\n  \"'\": \"&#x27;\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\nvar escape = text => String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nvar getBaseElem = group => {\n  if (group.type === \"ordgroup\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"color\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"font\") {\n    return getBaseElem(group.body);\n  } else {\n    return group;\n  }\n};\nvar characterNodesTypes = new Set([\"mathord\", \"textord\", \"atom\"]);\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nvar isCharacterBox = group => characterNodesTypes.has(getBaseElem(group).type);\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nvar protocolFromUrl = url => {\n  // Check for possible leading protocol.\n  // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n  // (U+20) or C0 control (U+00-U+1F) characters.\n  // eslint-disable-next-line no-control-regex\n  var protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);\n  if (!protocol) {\n    return \"_relative\";\n  }\n  // Reject weird colons\n  if (protocol[2] !== \":\") {\n    return null;\n  }\n  // Reject invalid characters in scheme according to\n  // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n  if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n    return null;\n  }\n  // Lowercase the protocol\n  return protocol[1].toLowerCase();\n};\n\n/* eslint no-console:0 */\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n  displayMode: {\n    type: \"boolean\",\n    description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n    cli: \"-d, --display-mode\"\n  },\n  output: {\n    type: {\n      enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n    },\n    description: \"Determines the markup language of the output.\",\n    cli: \"-F, --format <type>\"\n  },\n  leqno: {\n    type: \"boolean\",\n    description: \"Render display math in leqno style (left-justified tags).\"\n  },\n  fleqn: {\n    type: \"boolean\",\n    description: \"Render display math flush left.\"\n  },\n  throwOnError: {\n    type: \"boolean\",\n    default: true,\n    cli: \"-t, --no-throw-on-error\",\n    cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n  },\n  errorColor: {\n    type: \"string\",\n    default: \"#cc0000\",\n    cli: \"-c, --error-color <color>\",\n    cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n    cliProcessor: color => \"#\" + color\n  },\n  macros: {\n    type: \"object\",\n    cli: \"-m, --macro <def>\",\n    cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n    cliDefault: [],\n    cliProcessor: (def, defs) => {\n      defs.push(def);\n      return defs;\n    }\n  },\n  minRuleThickness: {\n    type: \"number\",\n    description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n    processor: t => Math.max(0, t),\n    cli: \"--min-rule-thickness <size>\",\n    cliProcessor: parseFloat\n  },\n  colorIsTextColor: {\n    type: \"boolean\",\n    description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n    cli: \"-b, --color-is-text-color\"\n  },\n  strict: {\n    type: [{\n      enum: [\"warn\", \"ignore\", \"error\"]\n    }, \"boolean\", \"function\"],\n    description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n    cli: \"-S, --strict\",\n    cliDefault: false\n  },\n  trust: {\n    type: [\"boolean\", \"function\"],\n    description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n    cli: \"-T, --trust\"\n  },\n  maxSize: {\n    type: \"number\",\n    default: Infinity,\n    description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n    processor: s => Math.max(0, s),\n    cli: \"-s, --max-size <n>\",\n    cliProcessor: parseInt\n  },\n  maxExpand: {\n    type: \"number\",\n    default: 1000,\n    description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n    processor: n => Math.max(0, n),\n    cli: \"-e, --max-expand <n>\",\n    cliProcessor: n => n === \"Infinity\" ? Infinity : parseInt(n)\n  },\n  globalGroup: {\n    type: \"boolean\",\n    cli: false\n  }\n};\nfunction getDefaultValue(schema) {\n  if (\"default\" in schema) {\n    return schema.default;\n  }\n  var type = schema.type;\n  var defaultType = Array.isArray(type) ? type[0] : type;\n  if (typeof defaultType !== 'string') {\n    return defaultType.enum[0];\n  }\n  switch (defaultType) {\n    case 'boolean':\n      return false;\n    case 'string':\n      return '';\n    case 'number':\n      return 0;\n    case 'object':\n      return {};\n  }\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n *  - displayMode: Whether the expression should be typeset as inline math\n *                 (false, the default), meaning that the math starts in\n *                 \\textstyle and is placed in an inline-block); or as display\n *                 math (true), meaning that the math starts in \\displaystyle\n *                 and is placed in a block with vertical margin.\n */\nclass Settings {\n  constructor(options) {\n    if (options === void 0) {\n      options = {};\n    }\n    // allow null options\n    options = options || {};\n    for (var prop of Object.keys(SETTINGS_SCHEMA)) {\n      var schema = SETTINGS_SCHEMA[prop];\n      var optionValue = options[prop];\n      // TODO: validate options\n      this[prop] = optionValue !== undefined ? schema.processor ? schema.processor(optionValue) : optionValue : getDefaultValue(schema);\n    }\n  }\n  /**\n   * Report nonstrict (non-LaTeX-compatible) input.\n   * Can safely not be called if `this.strict` is false in JavaScript.\n   */\n  reportNonstrict(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      strict = strict(errorCode, errorMsg, token);\n    }\n    if (!strict || strict === \"ignore\") {\n      return;\n    } else if (strict === true || strict === \"error\") {\n      throw new ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n    }\n  }\n  /**\n   * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n   * input (like `\\\\`).  Unlike `nonstrict`, will not throw an error;\n   * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n   * translates to a return value of `false`.  May still print a warning:\n   * \"warn\" prints a warning and returns `false`.\n   * This is for the second category of `errorCode`s listed in the README.\n   */\n  useStrictBehavior(errorCode, errorMsg, token) {\n    var strict = this.strict;\n    if (typeof strict === \"function\") {\n      // Allow return value of strict function to be boolean or string\n      // (or null/undefined, meaning no further processing).\n      // But catch any exceptions thrown by function, treating them\n      // like \"error\".\n      try {\n        strict = strict(errorCode, errorMsg, token);\n      } catch (error) {\n        strict = \"error\";\n      }\n    }\n    if (!strict || strict === \"ignore\") {\n      return false;\n    } else if (strict === true || strict === \"error\") {\n      return true;\n    } else if (strict === \"warn\") {\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    } else {\n      // won't happen in type-safe code\n      typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n      return false;\n    }\n  }\n  /**\n   * Check whether to test potentially dangerous input, and return\n   * `true` (trusted) or `false` (untrusted).  The sole argument `context`\n   * should be an object with `command` field specifying the relevant LaTeX\n   * command (as a string starting with `\\`), and any other arguments, etc.\n   * If `context` has a `url` field, a `protocol` field will automatically\n   * get added by this function (changing the specified object).\n   */\n  isTrusted(context) {\n    if (\"url\" in context && context.url && !context.protocol) {\n      var protocol = protocolFromUrl(context.url);\n      if (protocol == null) {\n        return false;\n      }\n      context.protocol = protocol;\n    }\n    var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n    return Boolean(trust);\n  }\n}\n\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nclass Style {\n  constructor(id, size, cramped) {\n    this.id = id;\n    this.size = size;\n    this.cramped = cramped;\n  }\n  /**\n   * Get the style of a superscript given a base in the current style.\n   */\n  sup() {\n    return styles[sup[this.id]];\n  }\n  /**\n   * Get the style of a subscript given a base in the current style.\n   */\n  sub() {\n    return styles[sub[this.id]];\n  }\n  /**\n   * Get the style of a fraction numerator given the fraction in the current\n   * style.\n   */\n  fracNum() {\n    return styles[fracNum[this.id]];\n  }\n  /**\n   * Get the style of a fraction denominator given the fraction in the current\n   * style.\n   */\n  fracDen() {\n    return styles[fracDen[this.id]];\n  }\n  /**\n   * Get the cramped version of a style (in particular, cramping a cramped style\n   * doesn't change the style).\n   */\n  cramp() {\n    return styles[cramp[this.id]];\n  }\n  /**\n   * Get a text or display version of this style.\n   */\n  text() {\n    return styles[text$1[this.id]];\n  }\n  /**\n   * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n   */\n  isTight() {\n    return this.size >= 2;\n  }\n}\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7;\n// Instances of the different styles\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)];\n// Lookup tables for switching from one style to another\nvar sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar text$1 = [D, Dc, T, Tc, T, Tc, T, Tc];\n// We only export some of the styles.\nvar Style$1 = {\n  DISPLAY: styles[D],\n  TEXT: styles[T],\n  SCRIPT: styles[S],\n  SCRIPTSCRIPT: styles[SS]\n};\n\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n  // Latin characters beyond the Latin-1 characters we have metrics for.\n  // Needed for Czech, Hungarian and Turkish text, for example.\n  name: 'latin',\n  blocks: [[0x0100, 0x024f],\n  // Latin Extended-A and Latin Extended-B\n  [0x0300, 0x036f] // Combining Diacritical marks\n  ]\n}, {\n  // The Cyrillic script used by Russian and related languages.\n  // A Cyrillic subset used to be supported as explicitly defined\n  // symbols in symbols.js\n  name: 'cyrillic',\n  blocks: [[0x0400, 0x04ff]]\n}, {\n  // Armenian\n  name: 'armenian',\n  blocks: [[0x0530, 0x058F]]\n}, {\n  // The Brahmic scripts of South and Southeast Asia\n  // Devanagari (0900–097F)\n  // Bengali (0980–09FF)\n  // Gurmukhi (0A00–0A7F)\n  // Gujarati (0A80–0AFF)\n  // Oriya (0B00–0B7F)\n  // Tamil (0B80–0BFF)\n  // Telugu (0C00–0C7F)\n  // Kannada (0C80–0CFF)\n  // Malayalam (0D00–0D7F)\n  // Sinhala (0D80–0DFF)\n  // Thai (0E00–0E7F)\n  // Lao (0E80–0EFF)\n  // Tibetan (0F00–0FFF)\n  // Myanmar (1000–109F)\n  name: 'brahmic',\n  blocks: [[0x0900, 0x109F]]\n}, {\n  name: 'georgian',\n  blocks: [[0x10A0, 0x10ff]]\n}, {\n  // Chinese and Japanese.\n  // The \"k\" in cjk is for Korean, but we've separated Korean out\n  name: \"cjk\",\n  blocks: [[0x3000, 0x30FF],\n  // CJK symbols and punctuation, Hiragana, Katakana\n  [0x4E00, 0x9FAF],\n  // CJK ideograms\n  [0xFF00, 0xFF60] // Fullwidth punctuation\n  // TODO: add halfwidth Katakana and Romanji glyphs\n  ]\n}, {\n  // Korean\n  name: 'hangul',\n  blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\nfunction scriptFromCodepoint(codepoint) {\n  for (var i = 0; i < scriptData.length; i++) {\n    var script = scriptData[i];\n    for (var _i = 0; _i < script.blocks.length; _i++) {\n      var block = script.blocks[_i];\n      if (codepoint >= block[0] && codepoint <= block[1]) {\n        return script.name;\n      }\n    }\n  }\n  return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\nvar allBlocks = [];\nscriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\nfunction supportedCodepoint(codepoint) {\n  for (var i = 0; i < allBlocks.length; i += 2) {\n    if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\n// Second Brush Stroke\n//    Low resolution monitors struggle to display images in fine detail.\n//    So browsers apply anti-aliasing. A long straight arrow shaft therefore\n//    will sometimes appear as if it has a blurred edge.\n//    To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n//    arrow shafts. That is, a second long thin rectangular SVG path has been\n//    written directly on top of each arrow shaft. This reinforcement causes\n//    some of the screen pixels to display as black instead of the anti-aliased\n//    gray pixel that a  single path would generate. So we get arrow shafts\n//    whose edges appear to be sharper.\nvar doubleBrushStroke = svgPath => svgPath + \" \" + svgPath;\nvar hLinePad = 80; // padding above a sqrt vinculum. Prevents image cropping.\n// The vinculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraVinculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraVinculum below.\n// The detour proceeds one extraVinculum distance up and slightly to the right,\n// displacing the radiused corner between surd and vinculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long vinculum, then down one extraVinculum distance,\n// after which it resumes regular path geometry for the radical.\n/*                                                  vinculum\n                                                   /\n         /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraVinculum\n        / █████████████████████←0.04em (40 unit) std vinculum thickness\n       / /\n      / /\n     / /\\\n    / / surd\n*/\nvar sqrtMain = function sqrtMain(extraVinculum, hLinePad) {\n  // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n  return \"M95,\" + (622 + extraVinculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraVinculum / 2.075 + \" -\" + extraVinculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraVinculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize1 = function sqrtSize1(extraVinculum, hLinePad) {\n  // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n  return \"M263,\" + (601 + extraVinculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraVinculum / 2.084 + \" -\" + extraVinculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraVinculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize2 = function sqrtSize2(extraVinculum, hLinePad) {\n  // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n  return \"M983 \" + (10 + extraVinculum + hLinePad) + \"\\nl\" + extraVinculum / 3.13 + \" -\" + extraVinculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraVinculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize3 = function sqrtSize3(extraVinculum, hLinePad) {\n  // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n  return \"M424,\" + (2398 + extraVinculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraVinculum / 4.223 + \" -\" + extraVinculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraVinculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraVinculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\nvar sqrtSize4 = function sqrtSize4(extraVinculum, hLinePad) {\n  // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n  return \"M473,\" + (2713 + extraVinculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraVinculum / 5.298 + \" -\" + extraVinculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraVinculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"H1017.7z\";\n};\nvar phasePath = function phasePath(y) {\n  var x = y / 2; // x coordinate at top of angle\n  return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\nvar sqrtTall = function sqrtTall(extraVinculum, hLinePad, viewBoxHeight) {\n  // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n  // One path edge has a variable length. It runs vertically from the vinculum\n  // to a point near (14 units) the bottom of the surd. The vinculum\n  // is normally 40 units thick. So the length of the line in question is:\n  var vertSegment = viewBoxHeight - 54 - hLinePad - extraVinculum;\n  return \"M702 \" + (extraVinculum + hLinePad) + \"H400000\" + (40 + extraVinculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" + hLinePad + \"H400000v\" + (40 + extraVinculum) + \"H742z\";\n};\nvar sqrtPath = function sqrtPath(size, extraVinculum, viewBoxHeight) {\n  extraVinculum = 1000 * extraVinculum; // Convert from document ems to viewBox.\n  var path = \"\";\n  switch (size) {\n    case \"sqrtMain\":\n      path = sqrtMain(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize1\":\n      path = sqrtSize1(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize2\":\n      path = sqrtSize2(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize3\":\n      path = sqrtSize3(extraVinculum, hLinePad);\n      break;\n    case \"sqrtSize4\":\n      path = sqrtSize4(extraVinculum, hLinePad);\n      break;\n    case \"sqrtTall\":\n      path = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);\n  }\n  return path;\n};\nvar innerPath = function innerPath(name, height) {\n  // The inner part of stretchy tall delimiters\n  switch (name) {\n    case \"\\u239c\":\n      return doubleBrushStroke(\"M291 0 H417 V\" + height + \" H291z\");\n    case \"\\u2223\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\");\n    case \"\\u2225\":\n      return doubleBrushStroke(\"M145 0 H188 V\" + height + \" H145z\") + doubleBrushStroke(\"M367 0 H410 V\" + height + \" H367z\");\n    case \"\\u239f\":\n      return doubleBrushStroke(\"M457 0 H583 V\" + height + \" H457z\");\n    case \"\\u23a2\":\n      return doubleBrushStroke(\"M319 0 H403 V\" + height + \" H319z\");\n    case \"\\u23a5\":\n      return doubleBrushStroke(\"M263 0 H347 V\" + height + \" H263z\");\n    case \"\\u23aa\":\n      return doubleBrushStroke(\"M384 0 H504 V\" + height + \" H384z\");\n    case \"\\u23d0\":\n      return doubleBrushStroke(\"M312 0 H355 V\" + height + \" H312z\");\n    case \"\\u2016\":\n      return doubleBrushStroke(\"M257 0 H300 V\" + height + \" H257z\") + doubleBrushStroke(\"M478 0 H521 V\" + height + \" H478z\");\n    default:\n      return \"\";\n  }\n};\nvar path = {\n  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main\n  doubleleftarrow: \"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",\n  // doublerightarrow is from glyph U+21D2 in font KaTeX Main\n  doublerightarrow: \"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",\n  // leftarrow is from glyph U+2190 in font KaTeX Main\n  leftarrow: \"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",\n  // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular\n  leftbrace: \"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",\n  leftbraceunder: \"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",\n  // overgroup is from the MnSymbol package (public domain)\n  leftgroup: \"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",\n  leftgroupunder: \"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",\n  // Harpoons are from glyph U+21BD in font KaTeX Main\n  leftharpoon: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",\n  leftharpoonplus: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",\n  leftharpoondown: \"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",\n  leftharpoondownplus: \"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",\n  // hook is from glyph U+21A9 in font KaTeX Main\n  lefthook: \"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",\n  leftlinesegment: doubleBrushStroke(\"M40 281 V428 H0 V94 H40 V241 H400000 v40z\"),\n  leftbracketunder: doubleBrushStroke(\"M0 0 h120 V290 H399995 v120 H0z\"),\n  leftbracketover: doubleBrushStroke(\"M0 440 h120 V150 H399995 v-120 H0z\"),\n  leftmapsto: doubleBrushStroke(\"M40 281 V448H0V74H40V241H400000v40z\"),\n  // tofrom is from glyph U+21C4 in font KaTeX AMS Regular\n  leftToFrom: \"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",\n  longequal: doubleBrushStroke(\"M0 50 h400000 v40H0z m0 194h40000v40H0z\"),\n  midbrace: \"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",\n  midbraceunder: \"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",\n  oiintSize1: \"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",\n  oiintSize2: \"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",\n  oiiintSize1: \"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",\n  oiiintSize2: \"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",\n  rightarrow: \"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",\n  rightbrace: \"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",\n  rightbraceunder: \"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",\n  rightgroup: \"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",\n  rightgroupunder: \"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",\n  rightharpoon: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",\n  rightharpoonplus: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",\n  rightharpoondown: \"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",\n  rightharpoondownplus: \"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",\n  righthook: \"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",\n  rightlinesegment: doubleBrushStroke(\"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\"),\n  rightbracketunder: doubleBrushStroke(\"M399995 0 h-120 V290 H0 v120 H400000z\"),\n  rightbracketover: doubleBrushStroke(\"M399995 440 h-120 V150 H0 v-120 H399995z\"),\n  rightToFrom: \"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",\n  // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular\n  twoheadleftarrow: \"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",\n  twoheadrightarrow: \"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",\n  // tilde1 is a modified version of a glyph from the MnSymbol package\n  tilde1: \"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",\n  // ditto tilde2, tilde3, & tilde4\n  tilde2: \"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",\n  tilde3: \"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",\n  tilde4: \"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",\n  // vec is from glyph U+20D7 in font KaTeX Main\n  vec: \"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",\n  // widehat1 is a modified version of a glyph from the MnSymbol package\n  widehat1: \"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",\n  // ditto widehat2, widehat3, & widehat4\n  widehat2: \"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat3: \"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  widehat4: \"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n  // widecheck paths are all inverted versions of widehat\n  widecheck1: \"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",\n  widecheck2: \"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck3: \"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  widecheck4: \"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n  // The next ten paths support reaction arrows from the mhchem package.\n  // Arrows for \\ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX\n  // baraboveleftarrow is mostly from glyph U+2190 in font KaTeX Main\n  baraboveleftarrow: \"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",\n  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main\n  rightarrowabovebar: \"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",\n  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.\n  // Ref from mhchem.sty: \\rlap{\\raisebox{-.22ex}{$\\kern0.5em\n  baraboveshortleftharpoon: \"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",\n  rightharpoonaboveshortbar: \"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",\n  shortbaraboveleftharpoon: \"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",\n  shortrightharpoonabovebar: \"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"\n};\nvar tallDelim = function tallDelim(label, midHeight) {\n  switch (label) {\n    case \"lbrack\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v1759 h347 v-84\\nH403z M403 1759 V0 H319 V1759 v\" + midHeight + \" v1759 h84z\";\n    case \"rbrack\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v1759 H0 v84 H347z\\nM347 1759 V0 H263 V1759 v\" + midHeight + \" v1759 h84z\";\n    case \"vert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\";\n    case \"doublevert\":\n      return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\\nM367 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v\" + midHeight + \" v585 h43z\";\n    case \"lfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1715 h263 v84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"rfloor\":\n      return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1799 H0 v-84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n    case \"lceil\":\n      return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v602 h84z\\nM403 1759 V0 H319 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"rceil\":\n      return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v602 h84z\\nM347 1759 V0 h-84 V1759 v\" + midHeight + \" v602 h84z\";\n    case \"lparen\":\n      return \"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\\n-36,557 l0,\" + (midHeight + 84) + \"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\\nl0,-\" + (midHeight + 92) + \"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z\";\n    case \"rparen\":\n      return \"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,\" + (midHeight + 9) + \"\\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\\nl0,-\" + (midHeight + 144) + \"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z\";\n    default:\n      // We should not ever get here.\n      throw new Error(\"Unknown stretchy delimiter.\");\n  }\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n  // Never used; needed for satisfying interface.\n  constructor(children) {\n    this.children = children;\n    this.classes = [];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = {};\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /** Convert the fragment into a node. */\n  toNode() {\n    var frag = document.createDocumentFragment();\n    for (var i = 0; i < this.children.length; i++) {\n      frag.appendChild(this.children[i].toNode());\n    }\n    return frag;\n  }\n  /** Convert the fragment into HTML markup. */\n  toMarkup() {\n    var markup = \"\";\n    // Simply concatenate the markup for the children together.\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText. Applies to\n   * MathDomNode's only.\n   */\n  toText() {\n    // To avoid this, we would subclass documentFragment separately for\n    // MathML, but polyfills for subclassing is expensive per PR 1469.\n    // TODO(ts): Only works for ChildType = MathDomNode.\n    var toText = child => child.toText();\n    return this.children.map(toText).join(\"\");\n  }\n}\n\n/**\n * This file does conversion between units.  In particular, it provides\n * calculateSize to convert other units into ems.\n */\n// This table gives the number of TeX pts in one of each *absolute* TeX unit.\n// Thus, multiplying a length by this number converts the length from units\n// into pts.  Dividing the result by ptPerEm gives the number of ems\n// *assuming* a font size of ptPerEm (normal size, normal style).\nvar ptPerUnit = {\n  // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n  // https://tex.stackexchange.com/a/8263\n  \"pt\": 1,\n  // TeX point\n  \"mm\": 7227 / 2540,\n  // millimeter\n  \"cm\": 7227 / 254,\n  // centimeter\n  \"in\": 72.27,\n  // inch\n  \"bp\": 803 / 800,\n  // big (PostScript) points\n  \"pc\": 12,\n  // pica\n  \"dd\": 1238 / 1157,\n  // didot\n  \"cc\": 14856 / 1157,\n  // cicero (12 didot)\n  \"nd\": 685 / 642,\n  // new didot\n  \"nc\": 1370 / 107,\n  // new cicero (12 new didot)\n  \"sp\": 1 / 65536,\n  // scaled point (TeX's internal smallest unit)\n  // https://tex.stackexchange.com/a/41371\n  \"px\": 803 / 800 // \\pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX\n};\n// Dictionary of relative units, for fast validity testing.\nvar relativeUnit = {\n  \"ex\": true,\n  \"em\": true,\n  \"mu\": true\n};\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nvar validUnit = function validUnit(unit) {\n  if (typeof unit !== \"string\") {\n    unit = unit.unit;\n  }\n  return unit in ptPerUnit || unit in relativeUnit || unit === \"ex\";\n};\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS em value for the\n * current style/scale.  `options` gives the current options.\n */\nvar calculateSize = function calculateSize(sizeValue, options) {\n  var scale;\n  if (sizeValue.unit in ptPerUnit) {\n    // Absolute units\n    scale = ptPerUnit[sizeValue.unit] // Convert unit to pt\n    / options.fontMetrics().ptPerEm // Convert pt to CSS em\n    / options.sizeMultiplier; // Unscale to make absolute units\n  } else if (sizeValue.unit === \"mu\") {\n    // `mu` units scale with scriptstyle/scriptscriptstyle.\n    scale = options.fontMetrics().cssEmPerMu;\n  } else {\n    // Other relative units always refer to the *textstyle* font\n    // in the current size.\n    var unitOptions;\n    if (options.style.isTight()) {\n      // isTight() means current style is script/scriptscript.\n      unitOptions = options.havingStyle(options.style.text());\n    } else {\n      unitOptions = options;\n    }\n    // TODO: In TeX these units are relative to the quad of the current\n    // *text* font, e.g. cmr10. KaTeX instead uses values from the\n    // comparably-sized *Computer Modern symbol* font. At 10pt, these\n    // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;\n    // cmr5=1.361133, cmsy5=1.472241. Consider $\\scriptsize a\\kern1emb$.\n    // TeX \\showlists shows a kern of 1.13889 * fontsize;\n    // KaTeX shows a kern of 1.171 * fontsize.\n    if (sizeValue.unit === \"ex\") {\n      scale = unitOptions.fontMetrics().xHeight;\n    } else if (sizeValue.unit === \"em\") {\n      scale = unitOptions.fontMetrics().quad;\n    } else {\n      throw new ParseError(\"Invalid unit: '\" + sizeValue.unit + \"'\");\n    }\n    if (unitOptions !== options) {\n      scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;\n    }\n  }\n  return Math.min(sizeValue.number * scale, options.maxSize);\n};\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. See\n * https://github.com/KaTeX/KaTeX/pull/2460.\n */\nvar makeEm = function makeEm(n) {\n  return +n.toFixed(4) + \"em\";\n};\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n * TODO: refactor `span` and `anchor` into common superclass when\n * target environments support class inheritance\n */\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nvar createClass = function createClass(classes) {\n  return classes.filter(cls => cls).join(\" \");\n};\nvar initNode = function initNode(classes, options, style) {\n  this.classes = classes || [];\n  this.attributes = {};\n  this.height = 0;\n  this.depth = 0;\n  this.maxFontSize = 0;\n  this.style = style || {};\n  if (options) {\n    if (options.style.isTight()) {\n      this.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      this.style.color = color;\n    }\n  }\n};\n/**\n * Convert into an HTML node\n */\nvar toNode = function toNode(tagName) {\n  var node = document.createElement(tagName);\n  // Apply the class\n  node.className = createClass(this.classes);\n  // Apply inline styles\n  for (var key of Object.keys(this.style)) {\n    node.style[key] = this.style[key];\n  }\n  // Apply attributes\n  for (var attr of Object.keys(this.attributes)) {\n    node.setAttribute(attr, this.attributes[attr]);\n  }\n  // Append the children, also as HTML nodes\n  for (var i = 0; i < this.children.length; i++) {\n    node.appendChild(this.children[i].toNode());\n  }\n  return node;\n};\n/**\n * https://w3c.github.io/html-reference/syntax.html#syntax-attributes\n *\n * > Attribute Names must consist of one or more characters\n * other than the space characters, U+0000 NULL,\n * '\"', \"'\", \">\", \"/\", \"=\", the control characters,\n * and any characters that are not defined by Unicode.\n */\nvar invalidAttributeNameRegex = /[\\s\"'>/=\\x00-\\x1f]/;\n/**\n * Convert into an HTML markup string\n */\nvar toMarkup = function toMarkup(tagName) {\n  var markup = \"<\" + tagName;\n  // Add the class\n  if (this.classes.length) {\n    markup += \" class=\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n  }\n  var styles = \"\";\n  // Add the styles, after hyphenation\n  for (var key of Object.keys(this.style)) {\n    styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n  }\n  if (styles) {\n    markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n  }\n  // Add the attributes\n  for (var attr of Object.keys(this.attributes)) {\n    if (invalidAttributeNameRegex.test(attr)) {\n      throw new ParseError(\"Invalid attribute name '\" + attr + \"'\");\n    }\n    markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n  }\n  markup += \">\";\n  // Add the markup of the children, also as markup\n  for (var i = 0; i < this.children.length; i++) {\n    markup += this.children[i].toMarkup();\n  }\n  markup += \"</\" + tagName + \">\";\n  return markup;\n};\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style. It also contains information about its height, depth, and\n * maxFontSize.\n *\n * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan\n * otherwise. This typesafety is important when HTML builders access a span's\n * children.\n */\nclass Span {\n  constructor(classes, children, options, style) {\n    initNode.call(this, classes, options, style);\n    this.children = children || [];\n  }\n  /**\n   * Sets an arbitrary attribute on the span. Warning: use this wisely. Not\n   * all browsers support attributes the same, and having too many custom\n   * attributes is probably bad.\n   */\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"span\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"span\");\n  }\n}\n/**\n * This node represents an anchor (<a>) element with a hyperlink.  See `span`\n * for further details.\n */\nclass Anchor {\n  constructor(href, classes, children, options) {\n    initNode.call(this, classes, options);\n    this.children = children || [];\n    this.setAttribute('href', href);\n  }\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    return toNode.call(this, \"a\");\n  }\n  toMarkup() {\n    return toMarkup.call(this, \"a\");\n  }\n}\n/**\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n  constructor(src, alt, style) {\n    this.alt = alt;\n    this.src = src;\n    this.classes = [\"mord\"];\n    this.height = 0;\n    this.depth = 0;\n    this.maxFontSize = 0;\n    this.style = style;\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  toNode() {\n    var node = document.createElement(\"img\");\n    node.src = this.src;\n    node.alt = this.alt;\n    node.className = \"mord\";\n    // Apply inline styles\n    for (var key of Object.keys(this.style)) {\n      node.style[key] = this.style[key];\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<img src=\\\"\" + escape(this.src) + \"\\\"\" + (\" alt=\\\"\" + escape(this.alt) + \"\\\"\");\n    // Add the styles, after hyphenation\n    var styles = \"\";\n    for (var key of Object.keys(this.style)) {\n      styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n    }\n    if (styles) {\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    markup += \"'/>\";\n    return markup;\n  }\n}\nvar iCombinations = {\n  'î': '\\u0131\\u0302',\n  'ï': '\\u0131\\u0308',\n  'í': '\\u0131\\u0301',\n  // 'ī': '\\u0131\\u0304', // enable when we add Extended Latin\n  'ì': '\\u0131\\u0300'\n};\n/**\n * A symbol node contains information about a single symbol. It either renders\n * to a single text node, or a span with a single text node in it, depending on\n * whether it has CSS classes, styles, or needs italic correction.\n */\nclass SymbolNode {\n  constructor(text, height, depth, italic, skew, width, classes, style) {\n    this.text = text;\n    this.height = height || 0;\n    this.depth = depth || 0;\n    this.italic = italic || 0;\n    this.skew = skew || 0;\n    this.width = width || 0;\n    this.classes = classes || [];\n    this.style = style || {};\n    this.maxFontSize = 0;\n    // Mark text from non-Latin scripts with specific classes so that we\n    // can specify which fonts to use.  This allows us to render these\n    // characters with a serif font in situations where the browser would\n    // either default to a sans serif or render a placeholder character.\n    // We use CSS class names like cjk_fallback, hangul_fallback and\n    // brahmic_fallback. See ./unicodeScripts.js for the set of possible\n    // script names\n    var script = scriptFromCodepoint(this.text.charCodeAt(0));\n    if (script) {\n      this.classes.push(script + \"_fallback\");\n    }\n    if (/[îïíì]/.test(this.text)) {\n      // add ī when we add Extended Latin\n      this.text = iCombinations[this.text];\n    }\n  }\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n  /**\n   * Creates a text node or span from a symbol node. Note that a span is only\n   * created if it is needed.\n   */\n  toNode() {\n    var node = document.createTextNode(this.text);\n    var span = null;\n    if (this.italic > 0) {\n      span = document.createElement(\"span\");\n      span.style.marginRight = makeEm(this.italic);\n    }\n    if (this.classes.length > 0) {\n      span = span || document.createElement(\"span\");\n      span.className = createClass(this.classes);\n    }\n    for (var key of Object.keys(this.style)) {\n      span = span || document.createElement(\"span\");\n      span.style[key] = this.style[key];\n    }\n    if (span) {\n      span.appendChild(node);\n      return span;\n    } else {\n      return node;\n    }\n  }\n  /**\n   * Creates markup for a symbol node.\n   */\n  toMarkup() {\n    // TODO(alpert): More duplication than I'd like from\n    // span.prototype.toMarkup and symbolNode.prototype.toNode...\n    var needsSpan = false;\n    var markup = \"<span\";\n    if (this.classes.length) {\n      needsSpan = true;\n      markup += \" class=\\\"\";\n      markup += escape(createClass(this.classes));\n      markup += \"\\\"\";\n    }\n    var styles = \"\";\n    if (this.italic > 0) {\n      styles += \"margin-right:\" + makeEm(this.italic) + \";\";\n    }\n    for (var key of Object.keys(this.style)) {\n      styles += hyphenate(key) + \":\" + this.style[key] + \";\";\n    }\n    if (styles) {\n      needsSpan = true;\n      markup += \" style=\\\"\" + escape(styles) + \"\\\"\";\n    }\n    var escaped = escape(this.text);\n    if (needsSpan) {\n      markup += \">\";\n      markup += escaped;\n      markup += \"</span>\";\n      return markup;\n    } else {\n      return escaped;\n    }\n  }\n}\n/**\n * SVG nodes are used to render stretchy wide elements.\n */\nclass SvgNode {\n  constructor(children, attributes) {\n    this.children = children || [];\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"svg\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\";\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</svg>\";\n    return markup;\n  }\n}\nclass PathNode {\n  constructor(pathName, alternate) {\n    this.pathName = pathName;\n    this.alternate = alternate; // Used only for \\sqrt, \\phase, & tall delims\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"path\");\n    if (this.alternate) {\n      node.setAttribute(\"d\", this.alternate);\n    } else {\n      node.setAttribute(\"d\", path[this.pathName]);\n    }\n    return node;\n  }\n  toMarkup() {\n    if (this.alternate) {\n      return \"<path d=\\\"\" + escape(this.alternate) + \"\\\"/>\";\n    } else {\n      return \"<path d=\\\"\" + escape(path[this.pathName]) + \"\\\"/>\";\n    }\n  }\n}\nclass LineNode {\n  constructor(attributes) {\n    this.attributes = attributes || {};\n  }\n  toNode() {\n    var svgNS = \"http://www.w3.org/2000/svg\";\n    var node = document.createElementNS(svgNS, \"line\");\n    // Apply attributes\n    for (var attr of Object.keys(this.attributes)) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n    return node;\n  }\n  toMarkup() {\n    var markup = \"<line\";\n    for (var attr of Object.keys(this.attributes)) {\n      markup += \" \" + attr + \"=\\\"\" + escape(this.attributes[attr]) + \"\\\"\";\n    }\n    markup += \"/>\";\n    return markup;\n  }\n}\nfunction assertSymbolDomNode(group) {\n  if (group instanceof SymbolNode) {\n    return group;\n  } else {\n    throw new Error(\"Expected symbolNode but got \" + String(group) + \".\");\n  }\n}\nfunction assertSpan(group) {\n  if (group instanceof Span) {\n    return group;\n  } else {\n    throw new Error(\"Expected span<HtmlDomNode> but got \" + String(group) + \".\");\n  }\n}\n/**\n * Whether an HtmlDomNode has HtmlDomNode children.\n * HtmlDomNode is a base type representing a union of\n * SymbolNode, SvgSpan, DomSpan, Anchor, and documentFragment.\n * In the last three cases, the children are HtmlDomNode[].\n */\nvar hasHtmlDomChildren = node => node instanceof Span || node instanceof Anchor || node instanceof DocumentFragment;\n\n// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\nvar fontMetricsData = {\n  \"AMS-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68889, 0, 0, 0.72222],\n    \"66\": [0, 0.68889, 0, 0, 0.66667],\n    \"67\": [0, 0.68889, 0, 0, 0.72222],\n    \"68\": [0, 0.68889, 0, 0, 0.72222],\n    \"69\": [0, 0.68889, 0, 0, 0.66667],\n    \"70\": [0, 0.68889, 0, 0, 0.61111],\n    \"71\": [0, 0.68889, 0, 0, 0.77778],\n    \"72\": [0, 0.68889, 0, 0, 0.77778],\n    \"73\": [0, 0.68889, 0, 0, 0.38889],\n    \"74\": [0.16667, 0.68889, 0, 0, 0.5],\n    \"75\": [0, 0.68889, 0, 0, 0.77778],\n    \"76\": [0, 0.68889, 0, 0, 0.66667],\n    \"77\": [0, 0.68889, 0, 0, 0.94445],\n    \"78\": [0, 0.68889, 0, 0, 0.72222],\n    \"79\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"80\": [0, 0.68889, 0, 0, 0.61111],\n    \"81\": [0.16667, 0.68889, 0, 0, 0.77778],\n    \"82\": [0, 0.68889, 0, 0, 0.72222],\n    \"83\": [0, 0.68889, 0, 0, 0.55556],\n    \"84\": [0, 0.68889, 0, 0, 0.66667],\n    \"85\": [0, 0.68889, 0, 0, 0.72222],\n    \"86\": [0, 0.68889, 0, 0, 0.72222],\n    \"87\": [0, 0.68889, 0, 0, 1.0],\n    \"88\": [0, 0.68889, 0, 0, 0.72222],\n    \"89\": [0, 0.68889, 0, 0, 0.72222],\n    \"90\": [0, 0.68889, 0, 0, 0.66667],\n    \"107\": [0, 0.68889, 0, 0, 0.55556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"165\": [0, 0.675, 0.025, 0, 0.75],\n    \"174\": [0.15559, 0.69224, 0, 0, 0.94666],\n    \"240\": [0, 0.68889, 0, 0, 0.55556],\n    \"295\": [0, 0.68889, 0, 0, 0.54028],\n    \"710\": [0, 0.825, 0, 0, 2.33334],\n    \"732\": [0, 0.9, 0, 0, 2.33334],\n    \"770\": [0, 0.825, 0, 0, 2.33334],\n    \"771\": [0, 0.9, 0, 0, 2.33334],\n    \"989\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"1008\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"8245\": [0, 0.54986, 0, 0, 0.275],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8487\": [0, 0.68889, 0, 0, 0.72222],\n    \"8498\": [0, 0.68889, 0, 0, 0.55556],\n    \"8502\": [0, 0.68889, 0, 0, 0.66667],\n    \"8503\": [0, 0.68889, 0, 0, 0.44445],\n    \"8504\": [0, 0.68889, 0, 0, 0.66667],\n    \"8513\": [0, 0.68889, 0, 0, 0.63889],\n    \"8592\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8594\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8602\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8603\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8606\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8608\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8610\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8611\": [0.01354, 0.52239, 0, 0, 1.11111],\n    \"8619\": [0, 0.54986, 0, 0, 1.0],\n    \"8620\": [0, 0.54986, 0, 0, 1.0],\n    \"8621\": [-0.13313, 0.37788, 0, 0, 1.38889],\n    \"8622\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8624\": [0, 0.69224, 0, 0, 0.5],\n    \"8625\": [0, 0.69224, 0, 0, 0.5],\n    \"8630\": [0, 0.43056, 0, 0, 1.0],\n    \"8631\": [0, 0.43056, 0, 0, 1.0],\n    \"8634\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8635\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8638\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8639\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8642\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8643\": [0.19444, 0.69224, 0, 0, 0.41667],\n    \"8644\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8646\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8647\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8648\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8649\": [0.1808, 0.675, 0, 0, 1.0],\n    \"8650\": [0.19444, 0.69224, 0, 0, 0.83334],\n    \"8651\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8652\": [0.01354, 0.52239, 0, 0, 1.0],\n    \"8653\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8654\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8655\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8666\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8667\": [0.13667, 0.63667, 0, 0, 1.0],\n    \"8669\": [-0.13313, 0.37788, 0, 0, 1.0],\n    \"8672\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8674\": [-0.064, 0.437, 0, 0, 1.334],\n    \"8705\": [0, 0.825, 0, 0, 0.5],\n    \"8708\": [0, 0.68889, 0, 0, 0.55556],\n    \"8709\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8717\": [0, 0.43056, 0, 0, 0.42917],\n    \"8722\": [-0.03598, 0.46402, 0, 0, 0.5],\n    \"8724\": [0.08198, 0.69224, 0, 0, 0.77778],\n    \"8726\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8733\": [0, 0.69224, 0, 0, 0.77778],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8737\": [0, 0.69224, 0, 0, 0.72222],\n    \"8738\": [0.03517, 0.52239, 0, 0, 0.72222],\n    \"8739\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"8740\": [0.25142, 0.74111, 0, 0, 0.27778],\n    \"8741\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"8742\": [0.25142, 0.74111, 0, 0, 0.5],\n    \"8756\": [0, 0.69224, 0, 0, 0.66667],\n    \"8757\": [0, 0.69224, 0, 0, 0.66667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8765\": [-0.13313, 0.37788, 0, 0, 0.77778],\n    \"8769\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8770\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8774\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8778\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8782\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8783\": [0.06062, 0.54986, 0, 0, 0.77778],\n    \"8785\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8786\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8787\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8790\": [0, 0.69224, 0, 0, 0.77778],\n    \"8791\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8796\": [0.08198, 0.91667, 0, 0, 0.77778],\n    \"8806\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8807\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"8808\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8809\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"8812\": [0.25583, 0.75583, 0, 0, 0.5],\n    \"8814\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8815\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8816\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8817\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8818\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8819\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8822\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8823\": [0.1808, 0.675, 0, 0, 0.77778],\n    \"8828\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8829\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8830\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8831\": [0.22958, 0.72958, 0, 0, 0.77778],\n    \"8832\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8833\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8840\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8841\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8842\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8843\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8847\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8848\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8858\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8859\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8861\": [0.08198, 0.58198, 0, 0, 0.77778],\n    \"8862\": [0, 0.675, 0, 0, 0.77778],\n    \"8863\": [0, 0.675, 0, 0, 0.77778],\n    \"8864\": [0, 0.675, 0, 0, 0.77778],\n    \"8865\": [0, 0.675, 0, 0, 0.77778],\n    \"8872\": [0, 0.69224, 0, 0, 0.61111],\n    \"8873\": [0, 0.69224, 0, 0, 0.72222],\n    \"8874\": [0, 0.69224, 0, 0, 0.88889],\n    \"8876\": [0, 0.68889, 0, 0, 0.61111],\n    \"8877\": [0, 0.68889, 0, 0, 0.61111],\n    \"8878\": [0, 0.68889, 0, 0, 0.72222],\n    \"8879\": [0, 0.68889, 0, 0, 0.72222],\n    \"8882\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8883\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8884\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8885\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8888\": [0, 0.54986, 0, 0, 1.11111],\n    \"8890\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"8891\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8892\": [0.19444, 0.69224, 0, 0, 0.61111],\n    \"8901\": [0, 0.54986, 0, 0, 0.27778],\n    \"8903\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8905\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8906\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"8907\": [0, 0.69224, 0, 0, 0.77778],\n    \"8908\": [0, 0.69224, 0, 0, 0.77778],\n    \"8909\": [-0.03598, 0.46402, 0, 0, 0.77778],\n    \"8910\": [0, 0.54986, 0, 0, 0.76042],\n    \"8911\": [0, 0.54986, 0, 0, 0.76042],\n    \"8912\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8913\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"8914\": [0, 0.54986, 0, 0, 0.66667],\n    \"8915\": [0, 0.54986, 0, 0, 0.66667],\n    \"8916\": [0, 0.69224, 0, 0, 0.66667],\n    \"8918\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8919\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8920\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8921\": [0.03517, 0.54986, 0, 0, 1.33334],\n    \"8922\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8923\": [0.38569, 0.88569, 0, 0, 0.77778],\n    \"8926\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8927\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"8928\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8929\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8934\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8935\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8936\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8937\": [0.23222, 0.74111, 0, 0, 0.77778],\n    \"8938\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8939\": [0.20576, 0.70576, 0, 0, 0.77778],\n    \"8940\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8941\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"8994\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"8995\": [0.19444, 0.69224, 0, 0, 0.77778],\n    \"9416\": [0.15559, 0.69224, 0, 0, 0.90222],\n    \"9484\": [0, 0.69224, 0, 0, 0.5],\n    \"9488\": [0, 0.69224, 0, 0, 0.5],\n    \"9492\": [0, 0.37788, 0, 0, 0.5],\n    \"9496\": [0, 0.37788, 0, 0, 0.5],\n    \"9585\": [0.19444, 0.68889, 0, 0, 0.88889],\n    \"9586\": [0.19444, 0.74111, 0, 0, 0.88889],\n    \"9632\": [0, 0.675, 0, 0, 0.77778],\n    \"9633\": [0, 0.675, 0, 0, 0.77778],\n    \"9650\": [0, 0.54986, 0, 0, 0.72222],\n    \"9651\": [0, 0.54986, 0, 0, 0.72222],\n    \"9654\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9660\": [0, 0.54986, 0, 0, 0.72222],\n    \"9661\": [0, 0.54986, 0, 0, 0.72222],\n    \"9664\": [0.03517, 0.54986, 0, 0, 0.77778],\n    \"9674\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"9733\": [0.19444, 0.69224, 0, 0, 0.94445],\n    \"10003\": [0, 0.69224, 0, 0, 0.83334],\n    \"10016\": [0, 0.69224, 0, 0, 0.83334],\n    \"10731\": [0.11111, 0.69224, 0, 0, 0.66667],\n    \"10846\": [0.19444, 0.75583, 0, 0, 0.61111],\n    \"10877\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10878\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10885\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10886\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10887\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10888\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10889\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10890\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10891\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10892\": [0.48256, 0.98256, 0, 0, 0.77778],\n    \"10901\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10902\": [0.13667, 0.63667, 0, 0, 0.77778],\n    \"10933\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10934\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"10935\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10936\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10937\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10938\": [0.26167, 0.75726, 0, 0, 0.77778],\n    \"10949\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10950\": [0.25583, 0.75583, 0, 0, 0.77778],\n    \"10955\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"10956\": [0.28481, 0.79383, 0, 0, 0.77778],\n    \"57350\": [0.08167, 0.58167, 0, 0, 0.22222],\n    \"57351\": [0.08167, 0.58167, 0, 0, 0.38889],\n    \"57352\": [0.08167, 0.58167, 0, 0, 0.77778],\n    \"57353\": [0, 0.43056, 0.04028, 0, 0.66667],\n    \"57356\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57357\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57358\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57359\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57360\": [0.30274, 0.79383, 0, 0, 0.77778],\n    \"57361\": [0.41951, 0.91951, 0, 0, 0.77778],\n    \"57366\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57367\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57368\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57369\": [0.25142, 0.75726, 0, 0, 0.77778],\n    \"57370\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57371\": [0.13597, 0.63597, 0, 0, 0.77778]\n  },\n  \"Caligraphic-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.68333, 0, 0.19445, 0.79847],\n    \"66\": [0, 0.68333, 0.03041, 0.13889, 0.65681],\n    \"67\": [0, 0.68333, 0.05834, 0.13889, 0.52653],\n    \"68\": [0, 0.68333, 0.02778, 0.08334, 0.77139],\n    \"69\": [0, 0.68333, 0.08944, 0.11111, 0.52778],\n    \"70\": [0, 0.68333, 0.09931, 0.11111, 0.71875],\n    \"71\": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],\n    \"72\": [0, 0.68333, 0.00965, 0.11111, 0.84452],\n    \"73\": [0, 0.68333, 0.07382, 0, 0.54452],\n    \"74\": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],\n    \"75\": [0, 0.68333, 0.01445, 0.05556, 0.76195],\n    \"76\": [0, 0.68333, 0, 0.13889, 0.68972],\n    \"77\": [0, 0.68333, 0, 0.13889, 1.2009],\n    \"78\": [0, 0.68333, 0.14736, 0.08334, 0.82049],\n    \"79\": [0, 0.68333, 0.02778, 0.11111, 0.79611],\n    \"80\": [0, 0.68333, 0.08222, 0.08334, 0.69556],\n    \"81\": [0.09722, 0.68333, 0, 0.11111, 0.81667],\n    \"82\": [0, 0.68333, 0, 0.08334, 0.8475],\n    \"83\": [0, 0.68333, 0.075, 0.13889, 0.60556],\n    \"84\": [0, 0.68333, 0.25417, 0, 0.54464],\n    \"85\": [0, 0.68333, 0.09931, 0.08334, 0.62583],\n    \"86\": [0, 0.68333, 0.08222, 0, 0.61278],\n    \"87\": [0, 0.68333, 0.08222, 0.08334, 0.98778],\n    \"88\": [0, 0.68333, 0.14643, 0.13889, 0.7133],\n    \"89\": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],\n    \"90\": [0, 0.68333, 0.07944, 0.13889, 0.72473],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Fraktur-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69141, 0, 0, 0.29574],\n    \"34\": [0, 0.69141, 0, 0, 0.21471],\n    \"38\": [0, 0.69141, 0, 0, 0.73786],\n    \"39\": [0, 0.69141, 0, 0, 0.21201],\n    \"40\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"41\": [0.24982, 0.74947, 0, 0, 0.38865],\n    \"42\": [0, 0.62119, 0, 0, 0.27764],\n    \"43\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"44\": [0, 0.10803, 0, 0, 0.27764],\n    \"45\": [0.08319, 0.58283, 0, 0, 0.75623],\n    \"46\": [0, 0.10803, 0, 0, 0.27764],\n    \"47\": [0.24982, 0.74947, 0, 0, 0.50181],\n    \"48\": [0, 0.47534, 0, 0, 0.50181],\n    \"49\": [0, 0.47534, 0, 0, 0.50181],\n    \"50\": [0, 0.47534, 0, 0, 0.50181],\n    \"51\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"52\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"53\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"54\": [0, 0.69141, 0, 0, 0.50181],\n    \"55\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"56\": [0, 0.69141, 0, 0, 0.50181],\n    \"57\": [0.18906, 0.47534, 0, 0, 0.50181],\n    \"58\": [0, 0.47534, 0, 0, 0.21606],\n    \"59\": [0.12604, 0.47534, 0, 0, 0.21606],\n    \"61\": [-0.13099, 0.36866, 0, 0, 0.75623],\n    \"63\": [0, 0.69141, 0, 0, 0.36245],\n    \"65\": [0, 0.69141, 0, 0, 0.7176],\n    \"66\": [0, 0.69141, 0, 0, 0.88397],\n    \"67\": [0, 0.69141, 0, 0, 0.61254],\n    \"68\": [0, 0.69141, 0, 0, 0.83158],\n    \"69\": [0, 0.69141, 0, 0, 0.66278],\n    \"70\": [0.12604, 0.69141, 0, 0, 0.61119],\n    \"71\": [0, 0.69141, 0, 0, 0.78539],\n    \"72\": [0.06302, 0.69141, 0, 0, 0.7203],\n    \"73\": [0, 0.69141, 0, 0, 0.55448],\n    \"74\": [0.12604, 0.69141, 0, 0, 0.55231],\n    \"75\": [0, 0.69141, 0, 0, 0.66845],\n    \"76\": [0, 0.69141, 0, 0, 0.66602],\n    \"77\": [0, 0.69141, 0, 0, 1.04953],\n    \"78\": [0, 0.69141, 0, 0, 0.83212],\n    \"79\": [0, 0.69141, 0, 0, 0.82699],\n    \"80\": [0.18906, 0.69141, 0, 0, 0.82753],\n    \"81\": [0.03781, 0.69141, 0, 0, 0.82699],\n    \"82\": [0, 0.69141, 0, 0, 0.82807],\n    \"83\": [0, 0.69141, 0, 0, 0.82861],\n    \"84\": [0, 0.69141, 0, 0, 0.66899],\n    \"85\": [0, 0.69141, 0, 0, 0.64576],\n    \"86\": [0, 0.69141, 0, 0, 0.83131],\n    \"87\": [0, 0.69141, 0, 0, 1.04602],\n    \"88\": [0, 0.69141, 0, 0, 0.71922],\n    \"89\": [0.18906, 0.69141, 0, 0, 0.83293],\n    \"90\": [0.12604, 0.69141, 0, 0, 0.60201],\n    \"91\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"93\": [0.24982, 0.74947, 0, 0, 0.27764],\n    \"94\": [0, 0.69141, 0, 0, 0.49965],\n    \"97\": [0, 0.47534, 0, 0, 0.50046],\n    \"98\": [0, 0.69141, 0, 0, 0.51315],\n    \"99\": [0, 0.47534, 0, 0, 0.38946],\n    \"100\": [0, 0.62119, 0, 0, 0.49857],\n    \"101\": [0, 0.47534, 0, 0, 0.40053],\n    \"102\": [0.18906, 0.69141, 0, 0, 0.32626],\n    \"103\": [0.18906, 0.47534, 0, 0, 0.5037],\n    \"104\": [0.18906, 0.69141, 0, 0, 0.52126],\n    \"105\": [0, 0.69141, 0, 0, 0.27899],\n    \"106\": [0, 0.69141, 0, 0, 0.28088],\n    \"107\": [0, 0.69141, 0, 0, 0.38946],\n    \"108\": [0, 0.69141, 0, 0, 0.27953],\n    \"109\": [0, 0.47534, 0, 0, 0.76676],\n    \"110\": [0, 0.47534, 0, 0, 0.52666],\n    \"111\": [0, 0.47534, 0, 0, 0.48885],\n    \"112\": [0.18906, 0.52396, 0, 0, 0.50046],\n    \"113\": [0.18906, 0.47534, 0, 0, 0.48912],\n    \"114\": [0, 0.47534, 0, 0, 0.38919],\n    \"115\": [0, 0.47534, 0, 0, 0.44266],\n    \"116\": [0, 0.62119, 0, 0, 0.33301],\n    \"117\": [0, 0.47534, 0, 0, 0.5172],\n    \"118\": [0, 0.52396, 0, 0, 0.5118],\n    \"119\": [0, 0.52396, 0, 0, 0.77351],\n    \"120\": [0.18906, 0.47534, 0, 0, 0.38865],\n    \"121\": [0.18906, 0.47534, 0, 0, 0.49884],\n    \"122\": [0.18906, 0.47534, 0, 0, 0.39054],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"8216\": [0, 0.69141, 0, 0, 0.21471],\n    \"8217\": [0, 0.69141, 0, 0, 0.21471],\n    \"58112\": [0, 0.62119, 0, 0, 0.49749],\n    \"58113\": [0, 0.62119, 0, 0, 0.4983],\n    \"58114\": [0.18906, 0.69141, 0, 0, 0.33328],\n    \"58115\": [0.18906, 0.69141, 0, 0, 0.32923],\n    \"58116\": [0.18906, 0.47534, 0, 0, 0.50343],\n    \"58117\": [0, 0.69141, 0, 0, 0.33301],\n    \"58118\": [0, 0.62119, 0, 0, 0.33409],\n    \"58119\": [0, 0.47534, 0, 0, 0.50073]\n  },\n  \"Main-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.35],\n    \"34\": [0, 0.69444, 0, 0, 0.60278],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.95833],\n    \"36\": [0.05556, 0.75, 0, 0, 0.575],\n    \"37\": [0.05556, 0.75, 0, 0, 0.95833],\n    \"38\": [0, 0.69444, 0, 0, 0.89444],\n    \"39\": [0, 0.69444, 0, 0, 0.31944],\n    \"40\": [0.25, 0.75, 0, 0, 0.44722],\n    \"41\": [0.25, 0.75, 0, 0, 0.44722],\n    \"42\": [0, 0.75, 0, 0, 0.575],\n    \"43\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"44\": [0.19444, 0.15556, 0, 0, 0.31944],\n    \"45\": [0, 0.44444, 0, 0, 0.38333],\n    \"46\": [0, 0.15556, 0, 0, 0.31944],\n    \"47\": [0.25, 0.75, 0, 0, 0.575],\n    \"48\": [0, 0.64444, 0, 0, 0.575],\n    \"49\": [0, 0.64444, 0, 0, 0.575],\n    \"50\": [0, 0.64444, 0, 0, 0.575],\n    \"51\": [0, 0.64444, 0, 0, 0.575],\n    \"52\": [0, 0.64444, 0, 0, 0.575],\n    \"53\": [0, 0.64444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0, 0.64444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0, 0.64444, 0, 0, 0.575],\n    \"58\": [0, 0.44444, 0, 0, 0.31944],\n    \"59\": [0.19444, 0.44444, 0, 0, 0.31944],\n    \"60\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"61\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"62\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"63\": [0, 0.69444, 0, 0, 0.54305],\n    \"64\": [0, 0.69444, 0, 0, 0.89444],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0, 0, 0.81805],\n    \"67\": [0, 0.68611, 0, 0, 0.83055],\n    \"68\": [0, 0.68611, 0, 0, 0.88194],\n    \"69\": [0, 0.68611, 0, 0, 0.75555],\n    \"70\": [0, 0.68611, 0, 0, 0.72361],\n    \"71\": [0, 0.68611, 0, 0, 0.90416],\n    \"72\": [0, 0.68611, 0, 0, 0.9],\n    \"73\": [0, 0.68611, 0, 0, 0.43611],\n    \"74\": [0, 0.68611, 0, 0, 0.59444],\n    \"75\": [0, 0.68611, 0, 0, 0.90138],\n    \"76\": [0, 0.68611, 0, 0, 0.69166],\n    \"77\": [0, 0.68611, 0, 0, 1.09166],\n    \"78\": [0, 0.68611, 0, 0, 0.9],\n    \"79\": [0, 0.68611, 0, 0, 0.86388],\n    \"80\": [0, 0.68611, 0, 0, 0.78611],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86388],\n    \"82\": [0, 0.68611, 0, 0, 0.8625],\n    \"83\": [0, 0.68611, 0, 0, 0.63889],\n    \"84\": [0, 0.68611, 0, 0, 0.8],\n    \"85\": [0, 0.68611, 0, 0, 0.88472],\n    \"86\": [0, 0.68611, 0.01597, 0, 0.86944],\n    \"87\": [0, 0.68611, 0.01597, 0, 1.18888],\n    \"88\": [0, 0.68611, 0, 0, 0.86944],\n    \"89\": [0, 0.68611, 0.02875, 0, 0.86944],\n    \"90\": [0, 0.68611, 0, 0, 0.70277],\n    \"91\": [0.25, 0.75, 0, 0, 0.31944],\n    \"92\": [0.25, 0.75, 0, 0, 0.575],\n    \"93\": [0.25, 0.75, 0, 0, 0.31944],\n    \"94\": [0, 0.69444, 0, 0, 0.575],\n    \"95\": [0.31, 0.13444, 0.03194, 0, 0.575],\n    \"97\": [0, 0.44444, 0, 0, 0.55902],\n    \"98\": [0, 0.69444, 0, 0, 0.63889],\n    \"99\": [0, 0.44444, 0, 0, 0.51111],\n    \"100\": [0, 0.69444, 0, 0, 0.63889],\n    \"101\": [0, 0.44444, 0, 0, 0.52708],\n    \"102\": [0, 0.69444, 0.10903, 0, 0.35139],\n    \"103\": [0.19444, 0.44444, 0.01597, 0, 0.575],\n    \"104\": [0, 0.69444, 0, 0, 0.63889],\n    \"105\": [0, 0.69444, 0, 0, 0.31944],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.35139],\n    \"107\": [0, 0.69444, 0, 0, 0.60694],\n    \"108\": [0, 0.69444, 0, 0, 0.31944],\n    \"109\": [0, 0.44444, 0, 0, 0.95833],\n    \"110\": [0, 0.44444, 0, 0, 0.63889],\n    \"111\": [0, 0.44444, 0, 0, 0.575],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.63889],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.60694],\n    \"114\": [0, 0.44444, 0, 0, 0.47361],\n    \"115\": [0, 0.44444, 0, 0, 0.45361],\n    \"116\": [0, 0.63492, 0, 0, 0.44722],\n    \"117\": [0, 0.44444, 0, 0, 0.63889],\n    \"118\": [0, 0.44444, 0.01597, 0, 0.60694],\n    \"119\": [0, 0.44444, 0.01597, 0, 0.83055],\n    \"120\": [0, 0.44444, 0, 0, 0.60694],\n    \"121\": [0.19444, 0.44444, 0.01597, 0, 0.60694],\n    \"122\": [0, 0.44444, 0, 0, 0.51111],\n    \"123\": [0.25, 0.75, 0, 0, 0.575],\n    \"124\": [0.25, 0.75, 0, 0, 0.31944],\n    \"125\": [0.25, 0.75, 0, 0, 0.575],\n    \"126\": [0.35, 0.34444, 0, 0, 0.575],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.86853],\n    \"168\": [0, 0.69444, 0, 0, 0.575],\n    \"172\": [0, 0.44444, 0, 0, 0.76666],\n    \"176\": [0, 0.69444, 0, 0, 0.86944],\n    \"177\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"184\": [0.17014, 0, 0, 0, 0.51111],\n    \"198\": [0, 0.68611, 0, 0, 1.04166],\n    \"215\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"216\": [0.04861, 0.73472, 0, 0, 0.89444],\n    \"223\": [0, 0.69444, 0, 0, 0.59722],\n    \"230\": [0, 0.44444, 0, 0, 0.83055],\n    \"247\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"248\": [0.09722, 0.54167, 0, 0, 0.575],\n    \"305\": [0, 0.44444, 0, 0, 0.31944],\n    \"338\": [0, 0.68611, 0, 0, 1.16944],\n    \"339\": [0, 0.44444, 0, 0, 0.89444],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.35139],\n    \"710\": [0, 0.69444, 0, 0, 0.575],\n    \"711\": [0, 0.63194, 0, 0, 0.575],\n    \"713\": [0, 0.59611, 0, 0, 0.575],\n    \"714\": [0, 0.69444, 0, 0, 0.575],\n    \"715\": [0, 0.69444, 0, 0, 0.575],\n    \"728\": [0, 0.69444, 0, 0, 0.575],\n    \"729\": [0, 0.69444, 0, 0, 0.31944],\n    \"730\": [0, 0.69444, 0, 0, 0.86944],\n    \"732\": [0, 0.69444, 0, 0, 0.575],\n    \"733\": [0, 0.69444, 0, 0, 0.575],\n    \"915\": [0, 0.68611, 0, 0, 0.69166],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0, 0, 0.89444],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0, 0, 0.76666],\n    \"928\": [0, 0.68611, 0, 0, 0.9],\n    \"931\": [0, 0.68611, 0, 0, 0.83055],\n    \"933\": [0, 0.68611, 0, 0, 0.89444],\n    \"934\": [0, 0.68611, 0, 0, 0.83055],\n    \"936\": [0, 0.68611, 0, 0, 0.89444],\n    \"937\": [0, 0.68611, 0, 0, 0.83055],\n    \"8211\": [0, 0.44444, 0.03194, 0, 0.575],\n    \"8212\": [0, 0.44444, 0.03194, 0, 1.14999],\n    \"8216\": [0, 0.69444, 0, 0, 0.31944],\n    \"8217\": [0, 0.69444, 0, 0, 0.31944],\n    \"8220\": [0, 0.69444, 0, 0, 0.60278],\n    \"8221\": [0, 0.69444, 0, 0, 0.60278],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.51111],\n    \"8242\": [0, 0.55556, 0, 0, 0.34444],\n    \"8407\": [0, 0.72444, 0.15486, 0, 0.575],\n    \"8463\": [0, 0.69444, 0, 0, 0.66759],\n    \"8465\": [0, 0.69444, 0, 0, 0.83055],\n    \"8467\": [0, 0.69444, 0, 0, 0.47361],\n    \"8472\": [0.19444, 0.44444, 0, 0, 0.74027],\n    \"8476\": [0, 0.69444, 0, 0, 0.83055],\n    \"8501\": [0, 0.69444, 0, 0, 0.70277],\n    \"8592\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8594\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.575],\n    \"8596\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8597\": [0.25, 0.75, 0, 0, 0.575],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"8636\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8637\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8640\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8641\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8656\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8658\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.70277],\n    \"8660\": [-0.10889, 0.39111, 0, 0, 1.14999],\n    \"8661\": [0.25, 0.75, 0, 0, 0.70277],\n    \"8704\": [0, 0.69444, 0, 0, 0.63889],\n    \"8706\": [0, 0.69444, 0.06389, 0, 0.62847],\n    \"8707\": [0, 0.69444, 0, 0, 0.63889],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.575],\n    \"8711\": [0, 0.68611, 0, 0, 0.95833],\n    \"8712\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8715\": [0.08556, 0.58556, 0, 0, 0.76666],\n    \"8722\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8723\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8725\": [0.25, 0.75, 0, 0, 0.575],\n    \"8726\": [0.25, 0.75, 0, 0, 0.575],\n    \"8727\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8728\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8729\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8730\": [0.18, 0.82, 0, 0, 0.95833],\n    \"8733\": [0, 0.44444, 0, 0, 0.89444],\n    \"8734\": [0, 0.44444, 0, 0, 1.14999],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.31944],\n    \"8741\": [0.25, 0.75, 0, 0, 0.575],\n    \"8743\": [0, 0.55556, 0, 0, 0.76666],\n    \"8744\": [0, 0.55556, 0, 0, 0.76666],\n    \"8745\": [0, 0.55556, 0, 0, 0.76666],\n    \"8746\": [0, 0.55556, 0, 0, 0.76666],\n    \"8747\": [0.19444, 0.69444, 0.12778, 0, 0.56875],\n    \"8764\": [-0.10889, 0.39111, 0, 0, 0.89444],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.31944],\n    \"8771\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8773\": [0.027, 0.638, 0, 0, 0.894],\n    \"8776\": [0.02444, 0.52444, 0, 0, 0.89444],\n    \"8781\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8801\": [0.00222, 0.50222, 0, 0, 0.89444],\n    \"8804\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8805\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8810\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8811\": [0.08556, 0.58556, 0, 0, 1.14999],\n    \"8826\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8827\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8834\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8835\": [0.08556, 0.58556, 0, 0, 0.89444],\n    \"8838\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8839\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8846\": [0, 0.55556, 0, 0, 0.76666],\n    \"8849\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8850\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"8851\": [0, 0.55556, 0, 0, 0.76666],\n    \"8852\": [0, 0.55556, 0, 0, 0.76666],\n    \"8853\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8854\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8855\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8856\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8857\": [0.13333, 0.63333, 0, 0, 0.89444],\n    \"8866\": [0, 0.69444, 0, 0, 0.70277],\n    \"8867\": [0, 0.69444, 0, 0, 0.70277],\n    \"8868\": [0, 0.69444, 0, 0, 0.89444],\n    \"8869\": [0, 0.69444, 0, 0, 0.89444],\n    \"8900\": [-0.02639, 0.47361, 0, 0, 0.575],\n    \"8901\": [-0.02639, 0.47361, 0, 0, 0.31944],\n    \"8902\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"8968\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8969\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8970\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8971\": [0.25, 0.75, 0, 0, 0.51111],\n    \"8994\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"8995\": [-0.13889, 0.36111, 0, 0, 1.14999],\n    \"9651\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9657\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9661\": [0.19444, 0.69444, 0, 0, 1.02222],\n    \"9667\": [-0.02778, 0.47222, 0, 0, 0.575],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.14999],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.89444],\n    \"9837\": [0, 0.75, 0, 0, 0.44722],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.44722],\n    \"10216\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10217\": [0.25, 0.75, 0, 0, 0.44722],\n    \"10815\": [0, 0.68611, 0, 0, 0.9],\n    \"10927\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"10928\": [0.19667, 0.69667, 0, 0, 0.89444],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Main-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.11417, 0, 0.38611],\n    \"34\": [0, 0.69444, 0.07939, 0, 0.62055],\n    \"35\": [0.19444, 0.69444, 0.06833, 0, 0.94444],\n    \"37\": [0.05556, 0.75, 0.12861, 0, 0.94444],\n    \"38\": [0, 0.69444, 0.08528, 0, 0.88555],\n    \"39\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"40\": [0.25, 0.75, 0.15806, 0, 0.47333],\n    \"41\": [0.25, 0.75, 0.03306, 0, 0.47333],\n    \"42\": [0, 0.75, 0.14333, 0, 0.59111],\n    \"43\": [0.10333, 0.60333, 0.03306, 0, 0.88555],\n    \"44\": [0.19444, 0.14722, 0, 0, 0.35555],\n    \"45\": [0, 0.44444, 0.02611, 0, 0.41444],\n    \"46\": [0, 0.14722, 0, 0, 0.35555],\n    \"47\": [0.25, 0.75, 0.15806, 0, 0.59111],\n    \"48\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"49\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"50\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"51\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"52\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"53\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"54\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"55\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n    \"56\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"57\": [0, 0.64444, 0.13167, 0, 0.59111],\n    \"58\": [0, 0.44444, 0.06695, 0, 0.35555],\n    \"59\": [0.19444, 0.44444, 0.06695, 0, 0.35555],\n    \"61\": [-0.10889, 0.39111, 0.06833, 0, 0.88555],\n    \"63\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"64\": [0, 0.69444, 0.09208, 0, 0.88555],\n    \"65\": [0, 0.68611, 0, 0, 0.86555],\n    \"66\": [0, 0.68611, 0.0992, 0, 0.81666],\n    \"67\": [0, 0.68611, 0.14208, 0, 0.82666],\n    \"68\": [0, 0.68611, 0.09062, 0, 0.87555],\n    \"69\": [0, 0.68611, 0.11431, 0, 0.75666],\n    \"70\": [0, 0.68611, 0.12903, 0, 0.72722],\n    \"71\": [0, 0.68611, 0.07347, 0, 0.89527],\n    \"72\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"73\": [0, 0.68611, 0.15681, 0, 0.47166],\n    \"74\": [0, 0.68611, 0.145, 0, 0.61055],\n    \"75\": [0, 0.68611, 0.14208, 0, 0.89499],\n    \"76\": [0, 0.68611, 0, 0, 0.69777],\n    \"77\": [0, 0.68611, 0.17208, 0, 1.07277],\n    \"78\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"79\": [0, 0.68611, 0.09062, 0, 0.85499],\n    \"80\": [0, 0.68611, 0.0992, 0, 0.78721],\n    \"81\": [0.19444, 0.68611, 0.09062, 0, 0.85499],\n    \"82\": [0, 0.68611, 0.02559, 0, 0.85944],\n    \"83\": [0, 0.68611, 0.11264, 0, 0.64999],\n    \"84\": [0, 0.68611, 0.12903, 0, 0.7961],\n    \"85\": [0, 0.68611, 0.17208, 0, 0.88083],\n    \"86\": [0, 0.68611, 0.18625, 0, 0.86555],\n    \"87\": [0, 0.68611, 0.18625, 0, 1.15999],\n    \"88\": [0, 0.68611, 0.15681, 0, 0.86555],\n    \"89\": [0, 0.68611, 0.19803, 0, 0.86555],\n    \"90\": [0, 0.68611, 0.14208, 0, 0.70888],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.35611],\n    \"93\": [0.25, 0.75, 0.09972, 0, 0.35611],\n    \"94\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"95\": [0.31, 0.13444, 0.09811, 0, 0.59111],\n    \"97\": [0, 0.44444, 0.09426, 0, 0.59111],\n    \"98\": [0, 0.69444, 0.07861, 0, 0.53222],\n    \"99\": [0, 0.44444, 0.05222, 0, 0.53222],\n    \"100\": [0, 0.69444, 0.10861, 0, 0.59111],\n    \"101\": [0, 0.44444, 0.085, 0, 0.53222],\n    \"102\": [0.19444, 0.69444, 0.21778, 0, 0.4],\n    \"103\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"104\": [0, 0.69444, 0.09426, 0, 0.59111],\n    \"105\": [0, 0.69326, 0.11387, 0, 0.35555],\n    \"106\": [0.19444, 0.69326, 0.1672, 0, 0.35555],\n    \"107\": [0, 0.69444, 0.11111, 0, 0.53222],\n    \"108\": [0, 0.69444, 0.10861, 0, 0.29666],\n    \"109\": [0, 0.44444, 0.09426, 0, 0.94444],\n    \"110\": [0, 0.44444, 0.09426, 0, 0.64999],\n    \"111\": [0, 0.44444, 0.07861, 0, 0.59111],\n    \"112\": [0.19444, 0.44444, 0.07861, 0, 0.59111],\n    \"113\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n    \"114\": [0, 0.44444, 0.11111, 0, 0.50167],\n    \"115\": [0, 0.44444, 0.08167, 0, 0.48694],\n    \"116\": [0, 0.63492, 0.09639, 0, 0.385],\n    \"117\": [0, 0.44444, 0.09426, 0, 0.62055],\n    \"118\": [0, 0.44444, 0.11111, 0, 0.53222],\n    \"119\": [0, 0.44444, 0.11111, 0, 0.76777],\n    \"120\": [0, 0.44444, 0.12583, 0, 0.56055],\n    \"121\": [0.19444, 0.44444, 0.105, 0, 0.56166],\n    \"122\": [0, 0.44444, 0.13889, 0, 0.49055],\n    \"126\": [0.35, 0.34444, 0.11472, 0, 0.59111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0.11473, 0, 0.59111],\n    \"176\": [0, 0.69444, 0, 0, 0.94888],\n    \"184\": [0.17014, 0, 0, 0, 0.53222],\n    \"198\": [0, 0.68611, 0.11431, 0, 1.02277],\n    \"216\": [0.04861, 0.73472, 0.09062, 0, 0.88555],\n    \"223\": [0.19444, 0.69444, 0.09736, 0, 0.665],\n    \"230\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"248\": [0.09722, 0.54167, 0.09458, 0, 0.59111],\n    \"305\": [0, 0.44444, 0.09426, 0, 0.35555],\n    \"338\": [0, 0.68611, 0.11431, 0, 1.14054],\n    \"339\": [0, 0.44444, 0.085, 0, 0.82666],\n    \"567\": [0.19444, 0.44444, 0.04611, 0, 0.385],\n    \"710\": [0, 0.69444, 0.06709, 0, 0.59111],\n    \"711\": [0, 0.63194, 0.08271, 0, 0.59111],\n    \"713\": [0, 0.59444, 0.10444, 0, 0.59111],\n    \"714\": [0, 0.69444, 0.08528, 0, 0.59111],\n    \"715\": [0, 0.69444, 0, 0, 0.59111],\n    \"728\": [0, 0.69444, 0.10333, 0, 0.59111],\n    \"729\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"730\": [0, 0.69444, 0, 0, 0.94888],\n    \"732\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"733\": [0, 0.69444, 0.11472, 0, 0.59111],\n    \"915\": [0, 0.68611, 0.12903, 0, 0.69777],\n    \"916\": [0, 0.68611, 0, 0, 0.94444],\n    \"920\": [0, 0.68611, 0.09062, 0, 0.88555],\n    \"923\": [0, 0.68611, 0, 0, 0.80666],\n    \"926\": [0, 0.68611, 0.15092, 0, 0.76777],\n    \"928\": [0, 0.68611, 0.17208, 0, 0.8961],\n    \"931\": [0, 0.68611, 0.11431, 0, 0.82666],\n    \"933\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"934\": [0, 0.68611, 0.05632, 0, 0.82666],\n    \"936\": [0, 0.68611, 0.10778, 0, 0.88555],\n    \"937\": [0, 0.68611, 0.0992, 0, 0.82666],\n    \"8211\": [0, 0.44444, 0.09811, 0, 0.59111],\n    \"8212\": [0, 0.44444, 0.09811, 0, 1.18221],\n    \"8216\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8217\": [0, 0.69444, 0.12945, 0, 0.35555],\n    \"8220\": [0, 0.69444, 0.16772, 0, 0.62055],\n    \"8221\": [0, 0.69444, 0.07939, 0, 0.62055]\n  },\n  \"Main-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"34\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"35\": [0.19444, 0.69444, 0.06616, 0, 0.81777],\n    \"37\": [0.05556, 0.75, 0.13639, 0, 0.81777],\n    \"38\": [0, 0.69444, 0.09694, 0, 0.76666],\n    \"39\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"40\": [0.25, 0.75, 0.16194, 0, 0.40889],\n    \"41\": [0.25, 0.75, 0.03694, 0, 0.40889],\n    \"42\": [0, 0.75, 0.14917, 0, 0.51111],\n    \"43\": [0.05667, 0.56167, 0.03694, 0, 0.76666],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.30667],\n    \"45\": [0, 0.43056, 0.02826, 0, 0.35778],\n    \"46\": [0, 0.10556, 0, 0, 0.30667],\n    \"47\": [0.25, 0.75, 0.16194, 0, 0.51111],\n    \"48\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"49\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"50\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"51\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"52\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"53\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"54\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"55\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n    \"56\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"57\": [0, 0.64444, 0.13556, 0, 0.51111],\n    \"58\": [0, 0.43056, 0.0582, 0, 0.30667],\n    \"59\": [0.19444, 0.43056, 0.0582, 0, 0.30667],\n    \"61\": [-0.13313, 0.36687, 0.06616, 0, 0.76666],\n    \"63\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"64\": [0, 0.69444, 0.09597, 0, 0.76666],\n    \"65\": [0, 0.68333, 0, 0, 0.74333],\n    \"66\": [0, 0.68333, 0.10257, 0, 0.70389],\n    \"67\": [0, 0.68333, 0.14528, 0, 0.71555],\n    \"68\": [0, 0.68333, 0.09403, 0, 0.755],\n    \"69\": [0, 0.68333, 0.12028, 0, 0.67833],\n    \"70\": [0, 0.68333, 0.13305, 0, 0.65277],\n    \"71\": [0, 0.68333, 0.08722, 0, 0.77361],\n    \"72\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"73\": [0, 0.68333, 0.15806, 0, 0.38555],\n    \"74\": [0, 0.68333, 0.14028, 0, 0.525],\n    \"75\": [0, 0.68333, 0.14528, 0, 0.76888],\n    \"76\": [0, 0.68333, 0, 0, 0.62722],\n    \"77\": [0, 0.68333, 0.16389, 0, 0.89666],\n    \"78\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"79\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"80\": [0, 0.68333, 0.10257, 0, 0.67833],\n    \"81\": [0.19444, 0.68333, 0.09403, 0, 0.76666],\n    \"82\": [0, 0.68333, 0.03868, 0, 0.72944],\n    \"83\": [0, 0.68333, 0.11972, 0, 0.56222],\n    \"84\": [0, 0.68333, 0.13305, 0, 0.71555],\n    \"85\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"86\": [0, 0.68333, 0.18361, 0, 0.74333],\n    \"87\": [0, 0.68333, 0.18361, 0, 0.99888],\n    \"88\": [0, 0.68333, 0.15806, 0, 0.74333],\n    \"89\": [0, 0.68333, 0.19383, 0, 0.74333],\n    \"90\": [0, 0.68333, 0.14528, 0, 0.61333],\n    \"91\": [0.25, 0.75, 0.1875, 0, 0.30667],\n    \"93\": [0.25, 0.75, 0.10528, 0, 0.30667],\n    \"94\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"95\": [0.31, 0.12056, 0.09208, 0, 0.51111],\n    \"97\": [0, 0.43056, 0.07671, 0, 0.51111],\n    \"98\": [0, 0.69444, 0.06312, 0, 0.46],\n    \"99\": [0, 0.43056, 0.05653, 0, 0.46],\n    \"100\": [0, 0.69444, 0.10333, 0, 0.51111],\n    \"101\": [0, 0.43056, 0.07514, 0, 0.46],\n    \"102\": [0.19444, 0.69444, 0.21194, 0, 0.30667],\n    \"103\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"104\": [0, 0.69444, 0.07671, 0, 0.51111],\n    \"105\": [0, 0.65536, 0.1019, 0, 0.30667],\n    \"106\": [0.19444, 0.65536, 0.14467, 0, 0.30667],\n    \"107\": [0, 0.69444, 0.10764, 0, 0.46],\n    \"108\": [0, 0.69444, 0.10333, 0, 0.25555],\n    \"109\": [0, 0.43056, 0.07671, 0, 0.81777],\n    \"110\": [0, 0.43056, 0.07671, 0, 0.56222],\n    \"111\": [0, 0.43056, 0.06312, 0, 0.51111],\n    \"112\": [0.19444, 0.43056, 0.06312, 0, 0.51111],\n    \"113\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n    \"114\": [0, 0.43056, 0.10764, 0, 0.42166],\n    \"115\": [0, 0.43056, 0.08208, 0, 0.40889],\n    \"116\": [0, 0.61508, 0.09486, 0, 0.33222],\n    \"117\": [0, 0.43056, 0.07671, 0, 0.53666],\n    \"118\": [0, 0.43056, 0.10764, 0, 0.46],\n    \"119\": [0, 0.43056, 0.10764, 0, 0.66444],\n    \"120\": [0, 0.43056, 0.12042, 0, 0.46389],\n    \"121\": [0.19444, 0.43056, 0.08847, 0, 0.48555],\n    \"122\": [0, 0.43056, 0.12292, 0, 0.40889],\n    \"126\": [0.35, 0.31786, 0.11585, 0, 0.51111],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.66786, 0.10474, 0, 0.51111],\n    \"176\": [0, 0.69444, 0, 0, 0.83129],\n    \"184\": [0.17014, 0, 0, 0, 0.46],\n    \"198\": [0, 0.68333, 0.12028, 0, 0.88277],\n    \"216\": [0.04861, 0.73194, 0.09403, 0, 0.76666],\n    \"223\": [0.19444, 0.69444, 0.10514, 0, 0.53666],\n    \"230\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"248\": [0.09722, 0.52778, 0.09194, 0, 0.51111],\n    \"338\": [0, 0.68333, 0.12028, 0, 0.98499],\n    \"339\": [0, 0.43056, 0.07514, 0, 0.71555],\n    \"710\": [0, 0.69444, 0.06646, 0, 0.51111],\n    \"711\": [0, 0.62847, 0.08295, 0, 0.51111],\n    \"713\": [0, 0.56167, 0.10333, 0, 0.51111],\n    \"714\": [0, 0.69444, 0.09694, 0, 0.51111],\n    \"715\": [0, 0.69444, 0, 0, 0.51111],\n    \"728\": [0, 0.69444, 0.10806, 0, 0.51111],\n    \"729\": [0, 0.66786, 0.11752, 0, 0.30667],\n    \"730\": [0, 0.69444, 0, 0, 0.83129],\n    \"732\": [0, 0.66786, 0.11585, 0, 0.51111],\n    \"733\": [0, 0.69444, 0.1225, 0, 0.51111],\n    \"915\": [0, 0.68333, 0.13305, 0, 0.62722],\n    \"916\": [0, 0.68333, 0, 0, 0.81777],\n    \"920\": [0, 0.68333, 0.09403, 0, 0.76666],\n    \"923\": [0, 0.68333, 0, 0, 0.69222],\n    \"926\": [0, 0.68333, 0.15294, 0, 0.66444],\n    \"928\": [0, 0.68333, 0.16389, 0, 0.74333],\n    \"931\": [0, 0.68333, 0.12028, 0, 0.71555],\n    \"933\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"934\": [0, 0.68333, 0.05986, 0, 0.71555],\n    \"936\": [0, 0.68333, 0.11111, 0, 0.76666],\n    \"937\": [0, 0.68333, 0.10257, 0, 0.71555],\n    \"8211\": [0, 0.43056, 0.09208, 0, 0.51111],\n    \"8212\": [0, 0.43056, 0.09208, 0, 1.02222],\n    \"8216\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8217\": [0, 0.69444, 0.12417, 0, 0.30667],\n    \"8220\": [0, 0.69444, 0.1685, 0, 0.51444],\n    \"8221\": [0, 0.69444, 0.06961, 0, 0.51444],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028]\n  },\n  \"Main-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.27778],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.77778],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.19444, 0.10556, 0, 0, 0.27778],\n    \"45\": [0, 0.43056, 0, 0, 0.33333],\n    \"46\": [0, 0.10556, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.64444, 0, 0, 0.5],\n    \"49\": [0, 0.64444, 0, 0, 0.5],\n    \"50\": [0, 0.64444, 0, 0, 0.5],\n    \"51\": [0, 0.64444, 0, 0, 0.5],\n    \"52\": [0, 0.64444, 0, 0, 0.5],\n    \"53\": [0, 0.64444, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0, 0.64444, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0, 0.64444, 0, 0, 0.5],\n    \"58\": [0, 0.43056, 0, 0, 0.27778],\n    \"59\": [0.19444, 0.43056, 0, 0, 0.27778],\n    \"60\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"61\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"62\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.77778],\n    \"65\": [0, 0.68333, 0, 0, 0.75],\n    \"66\": [0, 0.68333, 0, 0, 0.70834],\n    \"67\": [0, 0.68333, 0, 0, 0.72222],\n    \"68\": [0, 0.68333, 0, 0, 0.76389],\n    \"69\": [0, 0.68333, 0, 0, 0.68056],\n    \"70\": [0, 0.68333, 0, 0, 0.65278],\n    \"71\": [0, 0.68333, 0, 0, 0.78472],\n    \"72\": [0, 0.68333, 0, 0, 0.75],\n    \"73\": [0, 0.68333, 0, 0, 0.36111],\n    \"74\": [0, 0.68333, 0, 0, 0.51389],\n    \"75\": [0, 0.68333, 0, 0, 0.77778],\n    \"76\": [0, 0.68333, 0, 0, 0.625],\n    \"77\": [0, 0.68333, 0, 0, 0.91667],\n    \"78\": [0, 0.68333, 0, 0, 0.75],\n    \"79\": [0, 0.68333, 0, 0, 0.77778],\n    \"80\": [0, 0.68333, 0, 0, 0.68056],\n    \"81\": [0.19444, 0.68333, 0, 0, 0.77778],\n    \"82\": [0, 0.68333, 0, 0, 0.73611],\n    \"83\": [0, 0.68333, 0, 0, 0.55556],\n    \"84\": [0, 0.68333, 0, 0, 0.72222],\n    \"85\": [0, 0.68333, 0, 0, 0.75],\n    \"86\": [0, 0.68333, 0.01389, 0, 0.75],\n    \"87\": [0, 0.68333, 0.01389, 0, 1.02778],\n    \"88\": [0, 0.68333, 0, 0, 0.75],\n    \"89\": [0, 0.68333, 0.025, 0, 0.75],\n    \"90\": [0, 0.68333, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.27778],\n    \"92\": [0.25, 0.75, 0, 0, 0.5],\n    \"93\": [0.25, 0.75, 0, 0, 0.27778],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.31, 0.12056, 0.02778, 0, 0.5],\n    \"97\": [0, 0.43056, 0, 0, 0.5],\n    \"98\": [0, 0.69444, 0, 0, 0.55556],\n    \"99\": [0, 0.43056, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.55556],\n    \"101\": [0, 0.43056, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.07778, 0, 0.30556],\n    \"103\": [0.19444, 0.43056, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.55556],\n    \"105\": [0, 0.66786, 0, 0, 0.27778],\n    \"106\": [0.19444, 0.66786, 0, 0, 0.30556],\n    \"107\": [0, 0.69444, 0, 0, 0.52778],\n    \"108\": [0, 0.69444, 0, 0, 0.27778],\n    \"109\": [0, 0.43056, 0, 0, 0.83334],\n    \"110\": [0, 0.43056, 0, 0, 0.55556],\n    \"111\": [0, 0.43056, 0, 0, 0.5],\n    \"112\": [0.19444, 0.43056, 0, 0, 0.55556],\n    \"113\": [0.19444, 0.43056, 0, 0, 0.52778],\n    \"114\": [0, 0.43056, 0, 0, 0.39167],\n    \"115\": [0, 0.43056, 0, 0, 0.39445],\n    \"116\": [0, 0.61508, 0, 0, 0.38889],\n    \"117\": [0, 0.43056, 0, 0, 0.55556],\n    \"118\": [0, 0.43056, 0.01389, 0, 0.52778],\n    \"119\": [0, 0.43056, 0.01389, 0, 0.72222],\n    \"120\": [0, 0.43056, 0, 0, 0.52778],\n    \"121\": [0.19444, 0.43056, 0.01389, 0, 0.52778],\n    \"122\": [0, 0.43056, 0, 0, 0.44445],\n    \"123\": [0.25, 0.75, 0, 0, 0.5],\n    \"124\": [0.25, 0.75, 0, 0, 0.27778],\n    \"125\": [0.25, 0.75, 0, 0, 0.5],\n    \"126\": [0.35, 0.31786, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"163\": [0, 0.69444, 0, 0, 0.76909],\n    \"167\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"168\": [0, 0.66786, 0, 0, 0.5],\n    \"172\": [0, 0.43056, 0, 0, 0.66667],\n    \"176\": [0, 0.69444, 0, 0, 0.75],\n    \"177\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"182\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"198\": [0, 0.68333, 0, 0, 0.90278],\n    \"215\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"216\": [0.04861, 0.73194, 0, 0, 0.77778],\n    \"223\": [0, 0.69444, 0, 0, 0.5],\n    \"230\": [0, 0.43056, 0, 0, 0.72222],\n    \"247\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"248\": [0.09722, 0.52778, 0, 0, 0.5],\n    \"305\": [0, 0.43056, 0, 0, 0.27778],\n    \"338\": [0, 0.68333, 0, 0, 1.01389],\n    \"339\": [0, 0.43056, 0, 0, 0.77778],\n    \"567\": [0.19444, 0.43056, 0, 0, 0.30556],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.62847, 0, 0, 0.5],\n    \"713\": [0, 0.56778, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.66786, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.75],\n    \"732\": [0, 0.66786, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.68333, 0, 0, 0.625],\n    \"916\": [0, 0.68333, 0, 0, 0.83334],\n    \"920\": [0, 0.68333, 0, 0, 0.77778],\n    \"923\": [0, 0.68333, 0, 0, 0.69445],\n    \"926\": [0, 0.68333, 0, 0, 0.66667],\n    \"928\": [0, 0.68333, 0, 0, 0.75],\n    \"931\": [0, 0.68333, 0, 0, 0.72222],\n    \"933\": [0, 0.68333, 0, 0, 0.77778],\n    \"934\": [0, 0.68333, 0, 0, 0.72222],\n    \"936\": [0, 0.68333, 0, 0, 0.77778],\n    \"937\": [0, 0.68333, 0, 0, 0.72222],\n    \"8211\": [0, 0.43056, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.43056, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5],\n    \"8224\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8225\": [0.19444, 0.69444, 0, 0, 0.44445],\n    \"8230\": [0, 0.123, 0, 0, 1.172],\n    \"8242\": [0, 0.55556, 0, 0, 0.275],\n    \"8407\": [0, 0.71444, 0.15382, 0, 0.5],\n    \"8463\": [0, 0.68889, 0, 0, 0.54028],\n    \"8465\": [0, 0.69444, 0, 0, 0.72222],\n    \"8467\": [0, 0.69444, 0, 0.11111, 0.41667],\n    \"8472\": [0.19444, 0.43056, 0, 0.11111, 0.63646],\n    \"8476\": [0, 0.69444, 0, 0, 0.72222],\n    \"8501\": [0, 0.69444, 0, 0, 0.61111],\n    \"8592\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8593\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8594\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8595\": [0.19444, 0.69444, 0, 0, 0.5],\n    \"8596\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8597\": [0.25, 0.75, 0, 0, 0.5],\n    \"8598\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8599\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8600\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8601\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"8614\": [0.011, 0.511, 0, 0, 1.0],\n    \"8617\": [0.011, 0.511, 0, 0, 1.126],\n    \"8618\": [0.011, 0.511, 0, 0, 1.126],\n    \"8636\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8637\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8640\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8641\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8652\": [0.011, 0.671, 0, 0, 1.0],\n    \"8656\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8657\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8658\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8659\": [0.19444, 0.69444, 0, 0, 0.61111],\n    \"8660\": [-0.13313, 0.36687, 0, 0, 1.0],\n    \"8661\": [0.25, 0.75, 0, 0, 0.61111],\n    \"8704\": [0, 0.69444, 0, 0, 0.55556],\n    \"8706\": [0, 0.69444, 0.05556, 0.08334, 0.5309],\n    \"8707\": [0, 0.69444, 0, 0, 0.55556],\n    \"8709\": [0.05556, 0.75, 0, 0, 0.5],\n    \"8711\": [0, 0.68333, 0, 0, 0.83334],\n    \"8712\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8715\": [0.0391, 0.5391, 0, 0, 0.66667],\n    \"8722\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8723\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8725\": [0.25, 0.75, 0, 0, 0.5],\n    \"8726\": [0.25, 0.75, 0, 0, 0.5],\n    \"8727\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8728\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8729\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8730\": [0.2, 0.8, 0, 0, 0.83334],\n    \"8733\": [0, 0.43056, 0, 0, 0.77778],\n    \"8734\": [0, 0.43056, 0, 0, 1.0],\n    \"8736\": [0, 0.69224, 0, 0, 0.72222],\n    \"8739\": [0.25, 0.75, 0, 0, 0.27778],\n    \"8741\": [0.25, 0.75, 0, 0, 0.5],\n    \"8743\": [0, 0.55556, 0, 0, 0.66667],\n    \"8744\": [0, 0.55556, 0, 0, 0.66667],\n    \"8745\": [0, 0.55556, 0, 0, 0.66667],\n    \"8746\": [0, 0.55556, 0, 0, 0.66667],\n    \"8747\": [0.19444, 0.69444, 0.11111, 0, 0.41667],\n    \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n    \"8768\": [0.19444, 0.69444, 0, 0, 0.27778],\n    \"8771\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8773\": [-0.022, 0.589, 0, 0, 0.778],\n    \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n    \"8781\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8784\": [-0.133, 0.673, 0, 0, 0.778],\n    \"8801\": [-0.03625, 0.46375, 0, 0, 0.77778],\n    \"8804\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8805\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8810\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8811\": [0.0391, 0.5391, 0, 0, 1.0],\n    \"8826\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8827\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8834\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8835\": [0.0391, 0.5391, 0, 0, 0.77778],\n    \"8838\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8839\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8846\": [0, 0.55556, 0, 0, 0.66667],\n    \"8849\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8850\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"8851\": [0, 0.55556, 0, 0, 0.66667],\n    \"8852\": [0, 0.55556, 0, 0, 0.66667],\n    \"8853\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8854\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8855\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8856\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8857\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"8866\": [0, 0.69444, 0, 0, 0.61111],\n    \"8867\": [0, 0.69444, 0, 0, 0.61111],\n    \"8868\": [0, 0.69444, 0, 0, 0.77778],\n    \"8869\": [0, 0.69444, 0, 0, 0.77778],\n    \"8872\": [0.249, 0.75, 0, 0, 0.867],\n    \"8900\": [-0.05555, 0.44445, 0, 0, 0.5],\n    \"8901\": [-0.05555, 0.44445, 0, 0, 0.27778],\n    \"8902\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"8904\": [0.005, 0.505, 0, 0, 0.9],\n    \"8942\": [0.03, 0.903, 0, 0, 0.278],\n    \"8943\": [-0.19, 0.313, 0, 0, 1.172],\n    \"8945\": [-0.1, 0.823, 0, 0, 1.282],\n    \"8968\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8969\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8970\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8971\": [0.25, 0.75, 0, 0, 0.44445],\n    \"8994\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"8995\": [-0.14236, 0.35764, 0, 0, 1.0],\n    \"9136\": [0.244, 0.744, 0, 0, 0.412],\n    \"9137\": [0.244, 0.745, 0, 0, 0.412],\n    \"9651\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9657\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9661\": [0.19444, 0.69444, 0, 0, 0.88889],\n    \"9667\": [-0.03472, 0.46528, 0, 0, 0.5],\n    \"9711\": [0.19444, 0.69444, 0, 0, 1.0],\n    \"9824\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9825\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9826\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9827\": [0.12963, 0.69444, 0, 0, 0.77778],\n    \"9837\": [0, 0.75, 0, 0, 0.38889],\n    \"9838\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"9839\": [0.19444, 0.69444, 0, 0, 0.38889],\n    \"10216\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10217\": [0.25, 0.75, 0, 0, 0.38889],\n    \"10222\": [0.244, 0.744, 0, 0, 0.412],\n    \"10223\": [0.244, 0.745, 0, 0, 0.412],\n    \"10229\": [0.011, 0.511, 0, 0, 1.609],\n    \"10230\": [0.011, 0.511, 0, 0, 1.638],\n    \"10231\": [0.011, 0.511, 0, 0, 1.859],\n    \"10232\": [0.024, 0.525, 0, 0, 1.609],\n    \"10233\": [0.024, 0.525, 0, 0, 1.638],\n    \"10234\": [0.024, 0.525, 0, 0, 1.858],\n    \"10236\": [0.011, 0.511, 0, 0, 1.638],\n    \"10815\": [0, 0.68333, 0, 0, 0.75],\n    \"10927\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"10928\": [0.13597, 0.63597, 0, 0, 0.77778],\n    \"57376\": [0.19444, 0.69444, 0, 0, 0]\n  },\n  \"Math-BoldItalic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.44444, 0, 0, 0.575],\n    \"49\": [0, 0.44444, 0, 0, 0.575],\n    \"50\": [0, 0.44444, 0, 0, 0.575],\n    \"51\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"52\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"53\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"54\": [0, 0.64444, 0, 0, 0.575],\n    \"55\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"56\": [0, 0.64444, 0, 0, 0.575],\n    \"57\": [0.19444, 0.44444, 0, 0, 0.575],\n    \"65\": [0, 0.68611, 0, 0, 0.86944],\n    \"66\": [0, 0.68611, 0.04835, 0, 0.8664],\n    \"67\": [0, 0.68611, 0.06979, 0, 0.81694],\n    \"68\": [0, 0.68611, 0.03194, 0, 0.93812],\n    \"69\": [0, 0.68611, 0.05451, 0, 0.81007],\n    \"70\": [0, 0.68611, 0.15972, 0, 0.68889],\n    \"71\": [0, 0.68611, 0, 0, 0.88673],\n    \"72\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"73\": [0, 0.68611, 0.07778, 0, 0.51111],\n    \"74\": [0, 0.68611, 0.10069, 0, 0.63125],\n    \"75\": [0, 0.68611, 0.06979, 0, 0.97118],\n    \"76\": [0, 0.68611, 0, 0, 0.75555],\n    \"77\": [0, 0.68611, 0.11424, 0, 1.14201],\n    \"78\": [0, 0.68611, 0.11424, 0, 0.95034],\n    \"79\": [0, 0.68611, 0.03194, 0, 0.83666],\n    \"80\": [0, 0.68611, 0.15972, 0, 0.72309],\n    \"81\": [0.19444, 0.68611, 0, 0, 0.86861],\n    \"82\": [0, 0.68611, 0.00421, 0, 0.87235],\n    \"83\": [0, 0.68611, 0.05382, 0, 0.69271],\n    \"84\": [0, 0.68611, 0.15972, 0, 0.63663],\n    \"85\": [0, 0.68611, 0.11424, 0, 0.80027],\n    \"86\": [0, 0.68611, 0.25555, 0, 0.67778],\n    \"87\": [0, 0.68611, 0.15972, 0, 1.09305],\n    \"88\": [0, 0.68611, 0.07778, 0, 0.94722],\n    \"89\": [0, 0.68611, 0.25555, 0, 0.67458],\n    \"90\": [0, 0.68611, 0.06979, 0, 0.77257],\n    \"97\": [0, 0.44444, 0, 0, 0.63287],\n    \"98\": [0, 0.69444, 0, 0, 0.52083],\n    \"99\": [0, 0.44444, 0, 0, 0.51342],\n    \"100\": [0, 0.69444, 0, 0, 0.60972],\n    \"101\": [0, 0.44444, 0, 0, 0.55361],\n    \"102\": [0.19444, 0.69444, 0.11042, 0, 0.56806],\n    \"103\": [0.19444, 0.44444, 0.03704, 0, 0.5449],\n    \"104\": [0, 0.69444, 0, 0, 0.66759],\n    \"105\": [0, 0.69326, 0, 0, 0.4048],\n    \"106\": [0.19444, 0.69326, 0.0622, 0, 0.47083],\n    \"107\": [0, 0.69444, 0.01852, 0, 0.6037],\n    \"108\": [0, 0.69444, 0.0088, 0, 0.34815],\n    \"109\": [0, 0.44444, 0, 0, 1.0324],\n    \"110\": [0, 0.44444, 0, 0, 0.71296],\n    \"111\": [0, 0.44444, 0, 0, 0.58472],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.60092],\n    \"113\": [0.19444, 0.44444, 0.03704, 0, 0.54213],\n    \"114\": [0, 0.44444, 0.03194, 0, 0.5287],\n    \"115\": [0, 0.44444, 0, 0, 0.53125],\n    \"116\": [0, 0.63492, 0, 0, 0.41528],\n    \"117\": [0, 0.44444, 0, 0, 0.68102],\n    \"118\": [0, 0.44444, 0.03704, 0, 0.56666],\n    \"119\": [0, 0.44444, 0.02778, 0, 0.83148],\n    \"120\": [0, 0.44444, 0, 0, 0.65903],\n    \"121\": [0.19444, 0.44444, 0.03704, 0, 0.59028],\n    \"122\": [0, 0.44444, 0.04213, 0, 0.55509],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68611, 0.15972, 0, 0.65694],\n    \"916\": [0, 0.68611, 0, 0, 0.95833],\n    \"920\": [0, 0.68611, 0.03194, 0, 0.86722],\n    \"923\": [0, 0.68611, 0, 0, 0.80555],\n    \"926\": [0, 0.68611, 0.07458, 0, 0.84125],\n    \"928\": [0, 0.68611, 0.08229, 0, 0.98229],\n    \"931\": [0, 0.68611, 0.05451, 0, 0.88507],\n    \"933\": [0, 0.68611, 0.15972, 0, 0.67083],\n    \"934\": [0, 0.68611, 0, 0, 0.76666],\n    \"936\": [0, 0.68611, 0.11653, 0, 0.71402],\n    \"937\": [0, 0.68611, 0.04835, 0, 0.8789],\n    \"945\": [0, 0.44444, 0, 0, 0.76064],\n    \"946\": [0.19444, 0.69444, 0.03403, 0, 0.65972],\n    \"947\": [0.19444, 0.44444, 0.06389, 0, 0.59003],\n    \"948\": [0, 0.69444, 0.03819, 0, 0.52222],\n    \"949\": [0, 0.44444, 0, 0, 0.52882],\n    \"950\": [0.19444, 0.69444, 0.06215, 0, 0.50833],\n    \"951\": [0.19444, 0.44444, 0.03704, 0, 0.6],\n    \"952\": [0, 0.69444, 0.03194, 0, 0.5618],\n    \"953\": [0, 0.44444, 0, 0, 0.41204],\n    \"954\": [0, 0.44444, 0, 0, 0.66759],\n    \"955\": [0, 0.69444, 0, 0, 0.67083],\n    \"956\": [0.19444, 0.44444, 0, 0, 0.70787],\n    \"957\": [0, 0.44444, 0.06898, 0, 0.57685],\n    \"958\": [0.19444, 0.69444, 0.03021, 0, 0.50833],\n    \"959\": [0, 0.44444, 0, 0, 0.58472],\n    \"960\": [0, 0.44444, 0.03704, 0, 0.68241],\n    \"961\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"962\": [0.09722, 0.44444, 0.07917, 0, 0.42361],\n    \"963\": [0, 0.44444, 0.03704, 0, 0.68588],\n    \"964\": [0, 0.44444, 0.13472, 0, 0.52083],\n    \"965\": [0, 0.44444, 0.03704, 0, 0.63055],\n    \"966\": [0.19444, 0.44444, 0, 0, 0.74722],\n    \"967\": [0.19444, 0.44444, 0, 0, 0.71805],\n    \"968\": [0.19444, 0.69444, 0.03704, 0, 0.75833],\n    \"969\": [0, 0.44444, 0.03704, 0, 0.71782],\n    \"977\": [0, 0.69444, 0, 0, 0.69155],\n    \"981\": [0.19444, 0.69444, 0, 0, 0.7125],\n    \"982\": [0, 0.44444, 0.03194, 0, 0.975],\n    \"1009\": [0.19444, 0.44444, 0, 0, 0.6118],\n    \"1013\": [0, 0.44444, 0, 0, 0.48333],\n    \"57649\": [0, 0.44444, 0, 0, 0.39352],\n    \"57911\": [0.19444, 0.44444, 0, 0, 0.43889]\n  },\n  \"Math-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"48\": [0, 0.43056, 0, 0, 0.5],\n    \"49\": [0, 0.43056, 0, 0, 0.5],\n    \"50\": [0, 0.43056, 0, 0, 0.5],\n    \"51\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"52\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"53\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"54\": [0, 0.64444, 0, 0, 0.5],\n    \"55\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"56\": [0, 0.64444, 0, 0, 0.5],\n    \"57\": [0.19444, 0.43056, 0, 0, 0.5],\n    \"65\": [0, 0.68333, 0, 0.13889, 0.75],\n    \"66\": [0, 0.68333, 0.05017, 0.08334, 0.75851],\n    \"67\": [0, 0.68333, 0.07153, 0.08334, 0.71472],\n    \"68\": [0, 0.68333, 0.02778, 0.05556, 0.82792],\n    \"69\": [0, 0.68333, 0.05764, 0.08334, 0.7382],\n    \"70\": [0, 0.68333, 0.13889, 0.08334, 0.64306],\n    \"71\": [0, 0.68333, 0, 0.08334, 0.78625],\n    \"72\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"73\": [0, 0.68333, 0.07847, 0.11111, 0.43958],\n    \"74\": [0, 0.68333, 0.09618, 0.16667, 0.55451],\n    \"75\": [0, 0.68333, 0.07153, 0.05556, 0.84931],\n    \"76\": [0, 0.68333, 0, 0.02778, 0.68056],\n    \"77\": [0, 0.68333, 0.10903, 0.08334, 0.97014],\n    \"78\": [0, 0.68333, 0.10903, 0.08334, 0.80347],\n    \"79\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"80\": [0, 0.68333, 0.13889, 0.08334, 0.64201],\n    \"81\": [0.19444, 0.68333, 0, 0.08334, 0.79056],\n    \"82\": [0, 0.68333, 0.00773, 0.08334, 0.75929],\n    \"83\": [0, 0.68333, 0.05764, 0.08334, 0.6132],\n    \"84\": [0, 0.68333, 0.13889, 0.08334, 0.58438],\n    \"85\": [0, 0.68333, 0.10903, 0.02778, 0.68278],\n    \"86\": [0, 0.68333, 0.22222, 0, 0.58333],\n    \"87\": [0, 0.68333, 0.13889, 0, 0.94445],\n    \"88\": [0, 0.68333, 0.07847, 0.08334, 0.82847],\n    \"89\": [0, 0.68333, 0.22222, 0, 0.58056],\n    \"90\": [0, 0.68333, 0.07153, 0.08334, 0.68264],\n    \"97\": [0, 0.43056, 0, 0, 0.52859],\n    \"98\": [0, 0.69444, 0, 0, 0.42917],\n    \"99\": [0, 0.43056, 0, 0.05556, 0.43276],\n    \"100\": [0, 0.69444, 0, 0.16667, 0.52049],\n    \"101\": [0, 0.43056, 0, 0.05556, 0.46563],\n    \"102\": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],\n    \"103\": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],\n    \"104\": [0, 0.69444, 0, 0, 0.57616],\n    \"105\": [0, 0.65952, 0, 0, 0.34451],\n    \"106\": [0.19444, 0.65952, 0.05724, 0, 0.41181],\n    \"107\": [0, 0.69444, 0.03148, 0, 0.5206],\n    \"108\": [0, 0.69444, 0.01968, 0.08334, 0.29838],\n    \"109\": [0, 0.43056, 0, 0, 0.87801],\n    \"110\": [0, 0.43056, 0, 0, 0.60023],\n    \"111\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"112\": [0.19444, 0.43056, 0, 0.08334, 0.50313],\n    \"113\": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],\n    \"114\": [0, 0.43056, 0.02778, 0.05556, 0.45116],\n    \"115\": [0, 0.43056, 0, 0.05556, 0.46875],\n    \"116\": [0, 0.61508, 0, 0.08334, 0.36111],\n    \"117\": [0, 0.43056, 0, 0.02778, 0.57246],\n    \"118\": [0, 0.43056, 0.03588, 0.02778, 0.48472],\n    \"119\": [0, 0.43056, 0.02691, 0.08334, 0.71592],\n    \"120\": [0, 0.43056, 0, 0.02778, 0.57153],\n    \"121\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],\n    \"122\": [0, 0.43056, 0.04398, 0.05556, 0.46505],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"915\": [0, 0.68333, 0.13889, 0.08334, 0.61528],\n    \"916\": [0, 0.68333, 0, 0.16667, 0.83334],\n    \"920\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n    \"923\": [0, 0.68333, 0, 0.16667, 0.69445],\n    \"926\": [0, 0.68333, 0.07569, 0.08334, 0.74236],\n    \"928\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n    \"931\": [0, 0.68333, 0.05764, 0.08334, 0.77986],\n    \"933\": [0, 0.68333, 0.13889, 0.05556, 0.58333],\n    \"934\": [0, 0.68333, 0, 0.08334, 0.66667],\n    \"936\": [0, 0.68333, 0.11, 0.05556, 0.61222],\n    \"937\": [0, 0.68333, 0.05017, 0.08334, 0.7724],\n    \"945\": [0, 0.43056, 0.0037, 0.02778, 0.6397],\n    \"946\": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],\n    \"947\": [0.19444, 0.43056, 0.05556, 0, 0.51773],\n    \"948\": [0, 0.69444, 0.03785, 0.05556, 0.44444],\n    \"949\": [0, 0.43056, 0, 0.08334, 0.46632],\n    \"950\": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],\n    \"951\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],\n    \"952\": [0, 0.69444, 0.02778, 0.08334, 0.46944],\n    \"953\": [0, 0.43056, 0, 0.05556, 0.35394],\n    \"954\": [0, 0.43056, 0, 0, 0.57616],\n    \"955\": [0, 0.69444, 0, 0, 0.58334],\n    \"956\": [0.19444, 0.43056, 0, 0.02778, 0.60255],\n    \"957\": [0, 0.43056, 0.06366, 0.02778, 0.49398],\n    \"958\": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],\n    \"959\": [0, 0.43056, 0, 0.05556, 0.48472],\n    \"960\": [0, 0.43056, 0.03588, 0, 0.57003],\n    \"961\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"962\": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],\n    \"963\": [0, 0.43056, 0.03588, 0, 0.57141],\n    \"964\": [0, 0.43056, 0.1132, 0.02778, 0.43715],\n    \"965\": [0, 0.43056, 0.03588, 0.02778, 0.54028],\n    \"966\": [0.19444, 0.43056, 0, 0.08334, 0.65417],\n    \"967\": [0.19444, 0.43056, 0, 0.05556, 0.62569],\n    \"968\": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],\n    \"969\": [0, 0.43056, 0.03588, 0, 0.62245],\n    \"977\": [0, 0.69444, 0, 0.08334, 0.59144],\n    \"981\": [0.19444, 0.69444, 0, 0.08334, 0.59583],\n    \"982\": [0, 0.43056, 0.02778, 0, 0.82813],\n    \"1009\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n    \"1013\": [0, 0.43056, 0, 0.05556, 0.4059],\n    \"57649\": [0, 0.43056, 0, 0.02778, 0.32246],\n    \"57911\": [0.19444, 0.43056, 0, 0.08334, 0.38403]\n  },\n  \"SansSerif-Bold\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.36667],\n    \"34\": [0, 0.69444, 0, 0, 0.55834],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.91667],\n    \"36\": [0.05556, 0.75, 0, 0, 0.55],\n    \"37\": [0.05556, 0.75, 0, 0, 1.02912],\n    \"38\": [0, 0.69444, 0, 0, 0.83056],\n    \"39\": [0, 0.69444, 0, 0, 0.30556],\n    \"40\": [0.25, 0.75, 0, 0, 0.42778],\n    \"41\": [0.25, 0.75, 0, 0, 0.42778],\n    \"42\": [0, 0.75, 0, 0, 0.55],\n    \"43\": [0.11667, 0.61667, 0, 0, 0.85556],\n    \"44\": [0.10556, 0.13056, 0, 0, 0.30556],\n    \"45\": [0, 0.45833, 0, 0, 0.36667],\n    \"46\": [0, 0.13056, 0, 0, 0.30556],\n    \"47\": [0.25, 0.75, 0, 0, 0.55],\n    \"48\": [0, 0.69444, 0, 0, 0.55],\n    \"49\": [0, 0.69444, 0, 0, 0.55],\n    \"50\": [0, 0.69444, 0, 0, 0.55],\n    \"51\": [0, 0.69444, 0, 0, 0.55],\n    \"52\": [0, 0.69444, 0, 0, 0.55],\n    \"53\": [0, 0.69444, 0, 0, 0.55],\n    \"54\": [0, 0.69444, 0, 0, 0.55],\n    \"55\": [0, 0.69444, 0, 0, 0.55],\n    \"56\": [0, 0.69444, 0, 0, 0.55],\n    \"57\": [0, 0.69444, 0, 0, 0.55],\n    \"58\": [0, 0.45833, 0, 0, 0.30556],\n    \"59\": [0.10556, 0.45833, 0, 0, 0.30556],\n    \"61\": [-0.09375, 0.40625, 0, 0, 0.85556],\n    \"63\": [0, 0.69444, 0, 0, 0.51945],\n    \"64\": [0, 0.69444, 0, 0, 0.73334],\n    \"65\": [0, 0.69444, 0, 0, 0.73334],\n    \"66\": [0, 0.69444, 0, 0, 0.73334],\n    \"67\": [0, 0.69444, 0, 0, 0.70278],\n    \"68\": [0, 0.69444, 0, 0, 0.79445],\n    \"69\": [0, 0.69444, 0, 0, 0.64167],\n    \"70\": [0, 0.69444, 0, 0, 0.61111],\n    \"71\": [0, 0.69444, 0, 0, 0.73334],\n    \"72\": [0, 0.69444, 0, 0, 0.79445],\n    \"73\": [0, 0.69444, 0, 0, 0.33056],\n    \"74\": [0, 0.69444, 0, 0, 0.51945],\n    \"75\": [0, 0.69444, 0, 0, 0.76389],\n    \"76\": [0, 0.69444, 0, 0, 0.58056],\n    \"77\": [0, 0.69444, 0, 0, 0.97778],\n    \"78\": [0, 0.69444, 0, 0, 0.79445],\n    \"79\": [0, 0.69444, 0, 0, 0.79445],\n    \"80\": [0, 0.69444, 0, 0, 0.70278],\n    \"81\": [0.10556, 0.69444, 0, 0, 0.79445],\n    \"82\": [0, 0.69444, 0, 0, 0.70278],\n    \"83\": [0, 0.69444, 0, 0, 0.61111],\n    \"84\": [0, 0.69444, 0, 0, 0.73334],\n    \"85\": [0, 0.69444, 0, 0, 0.76389],\n    \"86\": [0, 0.69444, 0.01528, 0, 0.73334],\n    \"87\": [0, 0.69444, 0.01528, 0, 1.03889],\n    \"88\": [0, 0.69444, 0, 0, 0.73334],\n    \"89\": [0, 0.69444, 0.0275, 0, 0.73334],\n    \"90\": [0, 0.69444, 0, 0, 0.67223],\n    \"91\": [0.25, 0.75, 0, 0, 0.34306],\n    \"93\": [0.25, 0.75, 0, 0, 0.34306],\n    \"94\": [0, 0.69444, 0, 0, 0.55],\n    \"95\": [0.35, 0.10833, 0.03056, 0, 0.55],\n    \"97\": [0, 0.45833, 0, 0, 0.525],\n    \"98\": [0, 0.69444, 0, 0, 0.56111],\n    \"99\": [0, 0.45833, 0, 0, 0.48889],\n    \"100\": [0, 0.69444, 0, 0, 0.56111],\n    \"101\": [0, 0.45833, 0, 0, 0.51111],\n    \"102\": [0, 0.69444, 0.07639, 0, 0.33611],\n    \"103\": [0.19444, 0.45833, 0.01528, 0, 0.55],\n    \"104\": [0, 0.69444, 0, 0, 0.56111],\n    \"105\": [0, 0.69444, 0, 0, 0.25556],\n    \"106\": [0.19444, 0.69444, 0, 0, 0.28611],\n    \"107\": [0, 0.69444, 0, 0, 0.53056],\n    \"108\": [0, 0.69444, 0, 0, 0.25556],\n    \"109\": [0, 0.45833, 0, 0, 0.86667],\n    \"110\": [0, 0.45833, 0, 0, 0.56111],\n    \"111\": [0, 0.45833, 0, 0, 0.55],\n    \"112\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"113\": [0.19444, 0.45833, 0, 0, 0.56111],\n    \"114\": [0, 0.45833, 0.01528, 0, 0.37222],\n    \"115\": [0, 0.45833, 0, 0, 0.42167],\n    \"116\": [0, 0.58929, 0, 0, 0.40417],\n    \"117\": [0, 0.45833, 0, 0, 0.56111],\n    \"118\": [0, 0.45833, 0.01528, 0, 0.5],\n    \"119\": [0, 0.45833, 0.01528, 0, 0.74445],\n    \"120\": [0, 0.45833, 0, 0, 0.5],\n    \"121\": [0.19444, 0.45833, 0.01528, 0, 0.5],\n    \"122\": [0, 0.45833, 0, 0, 0.47639],\n    \"126\": [0.35, 0.34444, 0, 0, 0.55],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.69444, 0, 0, 0.55],\n    \"176\": [0, 0.69444, 0, 0, 0.73334],\n    \"180\": [0, 0.69444, 0, 0, 0.55],\n    \"184\": [0.17014, 0, 0, 0, 0.48889],\n    \"305\": [0, 0.45833, 0, 0, 0.25556],\n    \"567\": [0.19444, 0.45833, 0, 0, 0.28611],\n    \"710\": [0, 0.69444, 0, 0, 0.55],\n    \"711\": [0, 0.63542, 0, 0, 0.55],\n    \"713\": [0, 0.63778, 0, 0, 0.55],\n    \"728\": [0, 0.69444, 0, 0, 0.55],\n    \"729\": [0, 0.69444, 0, 0, 0.30556],\n    \"730\": [0, 0.69444, 0, 0, 0.73334],\n    \"732\": [0, 0.69444, 0, 0, 0.55],\n    \"733\": [0, 0.69444, 0, 0, 0.55],\n    \"915\": [0, 0.69444, 0, 0, 0.58056],\n    \"916\": [0, 0.69444, 0, 0, 0.91667],\n    \"920\": [0, 0.69444, 0, 0, 0.85556],\n    \"923\": [0, 0.69444, 0, 0, 0.67223],\n    \"926\": [0, 0.69444, 0, 0, 0.73334],\n    \"928\": [0, 0.69444, 0, 0, 0.79445],\n    \"931\": [0, 0.69444, 0, 0, 0.79445],\n    \"933\": [0, 0.69444, 0, 0, 0.85556],\n    \"934\": [0, 0.69444, 0, 0, 0.79445],\n    \"936\": [0, 0.69444, 0, 0, 0.85556],\n    \"937\": [0, 0.69444, 0, 0, 0.79445],\n    \"8211\": [0, 0.45833, 0.03056, 0, 0.55],\n    \"8212\": [0, 0.45833, 0.03056, 0, 1.10001],\n    \"8216\": [0, 0.69444, 0, 0, 0.30556],\n    \"8217\": [0, 0.69444, 0, 0, 0.30556],\n    \"8220\": [0, 0.69444, 0, 0, 0.55834],\n    \"8221\": [0, 0.69444, 0, 0, 0.55834]\n  },\n  \"SansSerif-Italic\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0.05733, 0, 0.31945],\n    \"34\": [0, 0.69444, 0.00316, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0.05087, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0.11156, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0.03126, 0, 0.83334],\n    \"38\": [0, 0.69444, 0.03058, 0, 0.75834],\n    \"39\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0.13164, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0.02536, 0, 0.38889],\n    \"42\": [0, 0.75, 0.11775, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0.02536, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0.01946, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0.13164, 0, 0.5],\n    \"48\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"49\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"50\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"51\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"52\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"53\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"54\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"55\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"56\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"57\": [0, 0.65556, 0.11156, 0, 0.5],\n    \"58\": [0, 0.44444, 0.02502, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0.02502, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0.05087, 0, 0.77778],\n    \"63\": [0, 0.69444, 0.11809, 0, 0.47222],\n    \"64\": [0, 0.69444, 0.07555, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0.08293, 0, 0.66667],\n    \"67\": [0, 0.69444, 0.11983, 0, 0.63889],\n    \"68\": [0, 0.69444, 0.07555, 0, 0.72223],\n    \"69\": [0, 0.69444, 0.11983, 0, 0.59722],\n    \"70\": [0, 0.69444, 0.13372, 0, 0.56945],\n    \"71\": [0, 0.69444, 0.11983, 0, 0.66667],\n    \"72\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"73\": [0, 0.69444, 0.13372, 0, 0.27778],\n    \"74\": [0, 0.69444, 0.08094, 0, 0.47222],\n    \"75\": [0, 0.69444, 0.11983, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0.08094, 0, 0.875],\n    \"78\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"79\": [0, 0.69444, 0.07555, 0, 0.73611],\n    \"80\": [0, 0.69444, 0.08293, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0.07555, 0, 0.73611],\n    \"82\": [0, 0.69444, 0.08293, 0, 0.64584],\n    \"83\": [0, 0.69444, 0.09205, 0, 0.55556],\n    \"84\": [0, 0.69444, 0.13372, 0, 0.68056],\n    \"85\": [0, 0.69444, 0.08094, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.1615, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.1615, 0, 0.94445],\n    \"88\": [0, 0.69444, 0.13372, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.17261, 0, 0.66667],\n    \"90\": [0, 0.69444, 0.11983, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0.15942, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0.08719, 0, 0.28889],\n    \"94\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.08616, 0, 0.5],\n    \"97\": [0, 0.44444, 0.00981, 0, 0.48056],\n    \"98\": [0, 0.69444, 0.03057, 0, 0.51667],\n    \"99\": [0, 0.44444, 0.08336, 0, 0.44445],\n    \"100\": [0, 0.69444, 0.09483, 0, 0.51667],\n    \"101\": [0, 0.44444, 0.06778, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.21705, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.10836, 0, 0.5],\n    \"104\": [0, 0.69444, 0.01778, 0, 0.51667],\n    \"105\": [0, 0.67937, 0.09718, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0.09162, 0, 0.26667],\n    \"107\": [0, 0.69444, 0.08336, 0, 0.48889],\n    \"108\": [0, 0.69444, 0.09483, 0, 0.23889],\n    \"109\": [0, 0.44444, 0.01778, 0, 0.79445],\n    \"110\": [0, 0.44444, 0.01778, 0, 0.51667],\n    \"111\": [0, 0.44444, 0.06613, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0.0389, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0.04169, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.10836, 0, 0.34167],\n    \"115\": [0, 0.44444, 0.0778, 0, 0.38333],\n    \"116\": [0, 0.57143, 0.07225, 0, 0.36111],\n    \"117\": [0, 0.44444, 0.04169, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.10836, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.10836, 0, 0.68334],\n    \"120\": [0, 0.44444, 0.09169, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.10836, 0, 0.46111],\n    \"122\": [0, 0.44444, 0.08752, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0.08826, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0.06385, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.73752],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0.04169, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0.04169, 0, 0.26667],\n    \"710\": [0, 0.69444, 0.0799, 0, 0.5],\n    \"711\": [0, 0.63194, 0.08432, 0, 0.5],\n    \"713\": [0, 0.60889, 0.08776, 0, 0.5],\n    \"714\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0.09483, 0, 0.5],\n    \"729\": [0, 0.67937, 0.07774, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.73752],\n    \"732\": [0, 0.67659, 0.08826, 0, 0.5],\n    \"733\": [0, 0.69444, 0.09205, 0, 0.5],\n    \"915\": [0, 0.69444, 0.13372, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0.07555, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0.12816, 0, 0.66667],\n    \"928\": [0, 0.69444, 0.08094, 0, 0.70834],\n    \"931\": [0, 0.69444, 0.11983, 0, 0.72222],\n    \"933\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"934\": [0, 0.69444, 0.04603, 0, 0.72222],\n    \"936\": [0, 0.69444, 0.09031, 0, 0.77778],\n    \"937\": [0, 0.69444, 0.08293, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.08616, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.08616, 0, 1.0],\n    \"8216\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0.07816, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0.14205, 0, 0.5],\n    \"8221\": [0, 0.69444, 0.00316, 0, 0.5]\n  },\n  \"SansSerif-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"33\": [0, 0.69444, 0, 0, 0.31945],\n    \"34\": [0, 0.69444, 0, 0, 0.5],\n    \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n    \"36\": [0.05556, 0.75, 0, 0, 0.5],\n    \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n    \"38\": [0, 0.69444, 0, 0, 0.75834],\n    \"39\": [0, 0.69444, 0, 0, 0.27778],\n    \"40\": [0.25, 0.75, 0, 0, 0.38889],\n    \"41\": [0.25, 0.75, 0, 0, 0.38889],\n    \"42\": [0, 0.75, 0, 0, 0.5],\n    \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n    \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n    \"45\": [0, 0.44444, 0, 0, 0.33333],\n    \"46\": [0, 0.08333, 0, 0, 0.27778],\n    \"47\": [0.25, 0.75, 0, 0, 0.5],\n    \"48\": [0, 0.65556, 0, 0, 0.5],\n    \"49\": [0, 0.65556, 0, 0, 0.5],\n    \"50\": [0, 0.65556, 0, 0, 0.5],\n    \"51\": [0, 0.65556, 0, 0, 0.5],\n    \"52\": [0, 0.65556, 0, 0, 0.5],\n    \"53\": [0, 0.65556, 0, 0, 0.5],\n    \"54\": [0, 0.65556, 0, 0, 0.5],\n    \"55\": [0, 0.65556, 0, 0, 0.5],\n    \"56\": [0, 0.65556, 0, 0, 0.5],\n    \"57\": [0, 0.65556, 0, 0, 0.5],\n    \"58\": [0, 0.44444, 0, 0, 0.27778],\n    \"59\": [0.125, 0.44444, 0, 0, 0.27778],\n    \"61\": [-0.13, 0.37, 0, 0, 0.77778],\n    \"63\": [0, 0.69444, 0, 0, 0.47222],\n    \"64\": [0, 0.69444, 0, 0, 0.66667],\n    \"65\": [0, 0.69444, 0, 0, 0.66667],\n    \"66\": [0, 0.69444, 0, 0, 0.66667],\n    \"67\": [0, 0.69444, 0, 0, 0.63889],\n    \"68\": [0, 0.69444, 0, 0, 0.72223],\n    \"69\": [0, 0.69444, 0, 0, 0.59722],\n    \"70\": [0, 0.69444, 0, 0, 0.56945],\n    \"71\": [0, 0.69444, 0, 0, 0.66667],\n    \"72\": [0, 0.69444, 0, 0, 0.70834],\n    \"73\": [0, 0.69444, 0, 0, 0.27778],\n    \"74\": [0, 0.69444, 0, 0, 0.47222],\n    \"75\": [0, 0.69444, 0, 0, 0.69445],\n    \"76\": [0, 0.69444, 0, 0, 0.54167],\n    \"77\": [0, 0.69444, 0, 0, 0.875],\n    \"78\": [0, 0.69444, 0, 0, 0.70834],\n    \"79\": [0, 0.69444, 0, 0, 0.73611],\n    \"80\": [0, 0.69444, 0, 0, 0.63889],\n    \"81\": [0.125, 0.69444, 0, 0, 0.73611],\n    \"82\": [0, 0.69444, 0, 0, 0.64584],\n    \"83\": [0, 0.69444, 0, 0, 0.55556],\n    \"84\": [0, 0.69444, 0, 0, 0.68056],\n    \"85\": [0, 0.69444, 0, 0, 0.6875],\n    \"86\": [0, 0.69444, 0.01389, 0, 0.66667],\n    \"87\": [0, 0.69444, 0.01389, 0, 0.94445],\n    \"88\": [0, 0.69444, 0, 0, 0.66667],\n    \"89\": [0, 0.69444, 0.025, 0, 0.66667],\n    \"90\": [0, 0.69444, 0, 0, 0.61111],\n    \"91\": [0.25, 0.75, 0, 0, 0.28889],\n    \"93\": [0.25, 0.75, 0, 0, 0.28889],\n    \"94\": [0, 0.69444, 0, 0, 0.5],\n    \"95\": [0.35, 0.09444, 0.02778, 0, 0.5],\n    \"97\": [0, 0.44444, 0, 0, 0.48056],\n    \"98\": [0, 0.69444, 0, 0, 0.51667],\n    \"99\": [0, 0.44444, 0, 0, 0.44445],\n    \"100\": [0, 0.69444, 0, 0, 0.51667],\n    \"101\": [0, 0.44444, 0, 0, 0.44445],\n    \"102\": [0, 0.69444, 0.06944, 0, 0.30556],\n    \"103\": [0.19444, 0.44444, 0.01389, 0, 0.5],\n    \"104\": [0, 0.69444, 0, 0, 0.51667],\n    \"105\": [0, 0.67937, 0, 0, 0.23889],\n    \"106\": [0.19444, 0.67937, 0, 0, 0.26667],\n    \"107\": [0, 0.69444, 0, 0, 0.48889],\n    \"108\": [0, 0.69444, 0, 0, 0.23889],\n    \"109\": [0, 0.44444, 0, 0, 0.79445],\n    \"110\": [0, 0.44444, 0, 0, 0.51667],\n    \"111\": [0, 0.44444, 0, 0, 0.5],\n    \"112\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"113\": [0.19444, 0.44444, 0, 0, 0.51667],\n    \"114\": [0, 0.44444, 0.01389, 0, 0.34167],\n    \"115\": [0, 0.44444, 0, 0, 0.38333],\n    \"116\": [0, 0.57143, 0, 0, 0.36111],\n    \"117\": [0, 0.44444, 0, 0, 0.51667],\n    \"118\": [0, 0.44444, 0.01389, 0, 0.46111],\n    \"119\": [0, 0.44444, 0.01389, 0, 0.68334],\n    \"120\": [0, 0.44444, 0, 0, 0.46111],\n    \"121\": [0.19444, 0.44444, 0.01389, 0, 0.46111],\n    \"122\": [0, 0.44444, 0, 0, 0.43472],\n    \"126\": [0.35, 0.32659, 0, 0, 0.5],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"168\": [0, 0.67937, 0, 0, 0.5],\n    \"176\": [0, 0.69444, 0, 0, 0.66667],\n    \"184\": [0.17014, 0, 0, 0, 0.44445],\n    \"305\": [0, 0.44444, 0, 0, 0.23889],\n    \"567\": [0.19444, 0.44444, 0, 0, 0.26667],\n    \"710\": [0, 0.69444, 0, 0, 0.5],\n    \"711\": [0, 0.63194, 0, 0, 0.5],\n    \"713\": [0, 0.60889, 0, 0, 0.5],\n    \"714\": [0, 0.69444, 0, 0, 0.5],\n    \"715\": [0, 0.69444, 0, 0, 0.5],\n    \"728\": [0, 0.69444, 0, 0, 0.5],\n    \"729\": [0, 0.67937, 0, 0, 0.27778],\n    \"730\": [0, 0.69444, 0, 0, 0.66667],\n    \"732\": [0, 0.67659, 0, 0, 0.5],\n    \"733\": [0, 0.69444, 0, 0, 0.5],\n    \"915\": [0, 0.69444, 0, 0, 0.54167],\n    \"916\": [0, 0.69444, 0, 0, 0.83334],\n    \"920\": [0, 0.69444, 0, 0, 0.77778],\n    \"923\": [0, 0.69444, 0, 0, 0.61111],\n    \"926\": [0, 0.69444, 0, 0, 0.66667],\n    \"928\": [0, 0.69444, 0, 0, 0.70834],\n    \"931\": [0, 0.69444, 0, 0, 0.72222],\n    \"933\": [0, 0.69444, 0, 0, 0.77778],\n    \"934\": [0, 0.69444, 0, 0, 0.72222],\n    \"936\": [0, 0.69444, 0, 0, 0.77778],\n    \"937\": [0, 0.69444, 0, 0, 0.72222],\n    \"8211\": [0, 0.44444, 0.02778, 0, 0.5],\n    \"8212\": [0, 0.44444, 0.02778, 0, 1.0],\n    \"8216\": [0, 0.69444, 0, 0, 0.27778],\n    \"8217\": [0, 0.69444, 0, 0, 0.27778],\n    \"8220\": [0, 0.69444, 0, 0, 0.5],\n    \"8221\": [0, 0.69444, 0, 0, 0.5]\n  },\n  \"Script-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"65\": [0, 0.7, 0.22925, 0, 0.80253],\n    \"66\": [0, 0.7, 0.04087, 0, 0.90757],\n    \"67\": [0, 0.7, 0.1689, 0, 0.66619],\n    \"68\": [0, 0.7, 0.09371, 0, 0.77443],\n    \"69\": [0, 0.7, 0.18583, 0, 0.56162],\n    \"70\": [0, 0.7, 0.13634, 0, 0.89544],\n    \"71\": [0, 0.7, 0.17322, 0, 0.60961],\n    \"72\": [0, 0.7, 0.29694, 0, 0.96919],\n    \"73\": [0, 0.7, 0.19189, 0, 0.80907],\n    \"74\": [0.27778, 0.7, 0.19189, 0, 1.05159],\n    \"75\": [0, 0.7, 0.31259, 0, 0.91364],\n    \"76\": [0, 0.7, 0.19189, 0, 0.87373],\n    \"77\": [0, 0.7, 0.15981, 0, 1.08031],\n    \"78\": [0, 0.7, 0.3525, 0, 0.9015],\n    \"79\": [0, 0.7, 0.08078, 0, 0.73787],\n    \"80\": [0, 0.7, 0.08078, 0, 1.01262],\n    \"81\": [0, 0.7, 0.03305, 0, 0.88282],\n    \"82\": [0, 0.7, 0.06259, 0, 0.85],\n    \"83\": [0, 0.7, 0.19189, 0, 0.86767],\n    \"84\": [0, 0.7, 0.29087, 0, 0.74697],\n    \"85\": [0, 0.7, 0.25815, 0, 0.79996],\n    \"86\": [0, 0.7, 0.27523, 0, 0.62204],\n    \"87\": [0, 0.7, 0.27523, 0, 0.80532],\n    \"88\": [0, 0.7, 0.26006, 0, 0.94445],\n    \"89\": [0, 0.7, 0.2939, 0, 0.70961],\n    \"90\": [0, 0.7, 0.24037, 0, 0.8212],\n    \"160\": [0, 0, 0, 0, 0.25]\n  },\n  \"Size1-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"41\": [0.35001, 0.85, 0, 0, 0.45834],\n    \"47\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"91\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"92\": [0.35001, 0.85, 0, 0, 0.57778],\n    \"93\": [0.35001, 0.85, 0, 0, 0.41667],\n    \"123\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"125\": [0.35001, 0.85, 0, 0, 0.58334],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.72222, 0, 0, 0.55556],\n    \"732\": [0, 0.72222, 0, 0, 0.55556],\n    \"770\": [0, 0.72222, 0, 0, 0.55556],\n    \"771\": [0, 0.72222, 0, 0, 0.55556],\n    \"8214\": [-0.00099, 0.601, 0, 0, 0.77778],\n    \"8593\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8595\": [1e-05, 0.6, 0, 0, 0.66667],\n    \"8657\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8659\": [1e-05, 0.6, 0, 0, 0.77778],\n    \"8719\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8720\": [0.25001, 0.75, 0, 0, 0.94445],\n    \"8721\": [0.25001, 0.75, 0, 0, 1.05556],\n    \"8730\": [0.35001, 0.85, 0, 0, 1.0],\n    \"8739\": [-0.00599, 0.606, 0, 0, 0.33333],\n    \"8741\": [-0.00599, 0.606, 0, 0, 0.55556],\n    \"8747\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8748\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8749\": [0.306, 0.805, 0.19445, 0, 0.47222],\n    \"8750\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n    \"8896\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8897\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8898\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8899\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"8968\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8969\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8970\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"8971\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"9168\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"10216\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10217\": [0.35001, 0.85, 0, 0, 0.47222],\n    \"10752\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10753\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10754\": [0.25001, 0.75, 0, 0, 1.11111],\n    \"10756\": [0.25001, 0.75, 0, 0, 0.83334],\n    \"10758\": [0.25001, 0.75, 0, 0, 0.83334]\n  },\n  \"Size2-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"41\": [0.65002, 1.15, 0, 0, 0.59722],\n    \"47\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"91\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"92\": [0.65002, 1.15, 0, 0, 0.81111],\n    \"93\": [0.65002, 1.15, 0, 0, 0.47222],\n    \"123\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"125\": [0.65002, 1.15, 0, 0, 0.66667],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.0],\n    \"732\": [0, 0.75, 0, 0, 1.0],\n    \"770\": [0, 0.75, 0, 0, 1.0],\n    \"771\": [0, 0.75, 0, 0, 1.0],\n    \"8719\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8720\": [0.55001, 1.05, 0, 0, 1.27778],\n    \"8721\": [0.55001, 1.05, 0, 0, 1.44445],\n    \"8730\": [0.65002, 1.15, 0, 0, 1.0],\n    \"8747\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8748\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8749\": [0.862, 1.36, 0.44445, 0, 0.55556],\n    \"8750\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n    \"8896\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8897\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8898\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8899\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"8968\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8969\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8970\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"8971\": [0.65002, 1.15, 0, 0, 0.52778],\n    \"10216\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10217\": [0.65002, 1.15, 0, 0, 0.61111],\n    \"10752\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10753\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10754\": [0.55001, 1.05, 0, 0, 1.51112],\n    \"10756\": [0.55001, 1.05, 0, 0, 1.11111],\n    \"10758\": [0.55001, 1.05, 0, 0, 1.11111]\n  },\n  \"Size3-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"41\": [0.95003, 1.45, 0, 0, 0.73611],\n    \"47\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"91\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"92\": [0.95003, 1.45, 0, 0, 1.04445],\n    \"93\": [0.95003, 1.45, 0, 0, 0.52778],\n    \"123\": [0.95003, 1.45, 0, 0, 0.75],\n    \"125\": [0.95003, 1.45, 0, 0, 0.75],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.75, 0, 0, 1.44445],\n    \"732\": [0, 0.75, 0, 0, 1.44445],\n    \"770\": [0, 0.75, 0, 0, 1.44445],\n    \"771\": [0, 0.75, 0, 0, 1.44445],\n    \"8730\": [0.95003, 1.45, 0, 0, 1.0],\n    \"8968\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8969\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8970\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"8971\": [0.95003, 1.45, 0, 0, 0.58334],\n    \"10216\": [0.95003, 1.45, 0, 0, 0.75],\n    \"10217\": [0.95003, 1.45, 0, 0, 0.75]\n  },\n  \"Size4-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.25],\n    \"40\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"41\": [1.25003, 1.75, 0, 0, 0.79167],\n    \"47\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"91\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"92\": [1.25003, 1.75, 0, 0, 1.27778],\n    \"93\": [1.25003, 1.75, 0, 0, 0.58334],\n    \"123\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"125\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"160\": [0, 0, 0, 0, 0.25],\n    \"710\": [0, 0.825, 0, 0, 1.8889],\n    \"732\": [0, 0.825, 0, 0, 1.8889],\n    \"770\": [0, 0.825, 0, 0, 1.8889],\n    \"771\": [0, 0.825, 0, 0, 1.8889],\n    \"8730\": [1.25003, 1.75, 0, 0, 1.0],\n    \"8968\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8969\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8970\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"8971\": [1.25003, 1.75, 0, 0, 0.63889],\n    \"9115\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9116\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9117\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9118\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9119\": [1e-05, 0.6, 0, 0, 0.875],\n    \"9120\": [0.64502, 1.155, 0, 0, 0.875],\n    \"9121\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9122\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9123\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9124\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9125\": [-0.00099, 0.601, 0, 0, 0.66667],\n    \"9126\": [0.64502, 1.155, 0, 0, 0.66667],\n    \"9127\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9128\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9129\": [0.90001, 0, 0, 0, 0.88889],\n    \"9130\": [0, 0.3, 0, 0, 0.88889],\n    \"9131\": [1e-05, 0.9, 0, 0, 0.88889],\n    \"9132\": [0.65002, 1.15, 0, 0, 0.88889],\n    \"9133\": [0.90001, 0, 0, 0, 0.88889],\n    \"9143\": [0.88502, 0.915, 0, 0, 1.05556],\n    \"10216\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"10217\": [1.25003, 1.75, 0, 0, 0.80556],\n    \"57344\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57345\": [-0.00499, 0.605, 0, 0, 1.05556],\n    \"57680\": [0, 0.12, 0, 0, 0.45],\n    \"57681\": [0, 0.12, 0, 0, 0.45],\n    \"57682\": [0, 0.12, 0, 0, 0.45],\n    \"57683\": [0, 0.12, 0, 0, 0.45]\n  },\n  \"Typewriter-Regular\": {\n    \"32\": [0, 0, 0, 0, 0.525],\n    \"33\": [0, 0.61111, 0, 0, 0.525],\n    \"34\": [0, 0.61111, 0, 0, 0.525],\n    \"35\": [0, 0.61111, 0, 0, 0.525],\n    \"36\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"37\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"38\": [0, 0.61111, 0, 0, 0.525],\n    \"39\": [0, 0.61111, 0, 0, 0.525],\n    \"40\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"41\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"42\": [0, 0.52083, 0, 0, 0.525],\n    \"43\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"44\": [0.13889, 0.125, 0, 0, 0.525],\n    \"45\": [-0.08056, 0.53055, 0, 0, 0.525],\n    \"46\": [0, 0.125, 0, 0, 0.525],\n    \"47\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"48\": [0, 0.61111, 0, 0, 0.525],\n    \"49\": [0, 0.61111, 0, 0, 0.525],\n    \"50\": [0, 0.61111, 0, 0, 0.525],\n    \"51\": [0, 0.61111, 0, 0, 0.525],\n    \"52\": [0, 0.61111, 0, 0, 0.525],\n    \"53\": [0, 0.61111, 0, 0, 0.525],\n    \"54\": [0, 0.61111, 0, 0, 0.525],\n    \"55\": [0, 0.61111, 0, 0, 0.525],\n    \"56\": [0, 0.61111, 0, 0, 0.525],\n    \"57\": [0, 0.61111, 0, 0, 0.525],\n    \"58\": [0, 0.43056, 0, 0, 0.525],\n    \"59\": [0.13889, 0.43056, 0, 0, 0.525],\n    \"60\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"61\": [-0.19549, 0.41562, 0, 0, 0.525],\n    \"62\": [-0.05556, 0.55556, 0, 0, 0.525],\n    \"63\": [0, 0.61111, 0, 0, 0.525],\n    \"64\": [0, 0.61111, 0, 0, 0.525],\n    \"65\": [0, 0.61111, 0, 0, 0.525],\n    \"66\": [0, 0.61111, 0, 0, 0.525],\n    \"67\": [0, 0.61111, 0, 0, 0.525],\n    \"68\": [0, 0.61111, 0, 0, 0.525],\n    \"69\": [0, 0.61111, 0, 0, 0.525],\n    \"70\": [0, 0.61111, 0, 0, 0.525],\n    \"71\": [0, 0.61111, 0, 0, 0.525],\n    \"72\": [0, 0.61111, 0, 0, 0.525],\n    \"73\": [0, 0.61111, 0, 0, 0.525],\n    \"74\": [0, 0.61111, 0, 0, 0.525],\n    \"75\": [0, 0.61111, 0, 0, 0.525],\n    \"76\": [0, 0.61111, 0, 0, 0.525],\n    \"77\": [0, 0.61111, 0, 0, 0.525],\n    \"78\": [0, 0.61111, 0, 0, 0.525],\n    \"79\": [0, 0.61111, 0, 0, 0.525],\n    \"80\": [0, 0.61111, 0, 0, 0.525],\n    \"81\": [0.13889, 0.61111, 0, 0, 0.525],\n    \"82\": [0, 0.61111, 0, 0, 0.525],\n    \"83\": [0, 0.61111, 0, 0, 0.525],\n    \"84\": [0, 0.61111, 0, 0, 0.525],\n    \"85\": [0, 0.61111, 0, 0, 0.525],\n    \"86\": [0, 0.61111, 0, 0, 0.525],\n    \"87\": [0, 0.61111, 0, 0, 0.525],\n    \"88\": [0, 0.61111, 0, 0, 0.525],\n    \"89\": [0, 0.61111, 0, 0, 0.525],\n    \"90\": [0, 0.61111, 0, 0, 0.525],\n    \"91\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"92\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"93\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"94\": [0, 0.61111, 0, 0, 0.525],\n    \"95\": [0.09514, 0, 0, 0, 0.525],\n    \"96\": [0, 0.61111, 0, 0, 0.525],\n    \"97\": [0, 0.43056, 0, 0, 0.525],\n    \"98\": [0, 0.61111, 0, 0, 0.525],\n    \"99\": [0, 0.43056, 0, 0, 0.525],\n    \"100\": [0, 0.61111, 0, 0, 0.525],\n    \"101\": [0, 0.43056, 0, 0, 0.525],\n    \"102\": [0, 0.61111, 0, 0, 0.525],\n    \"103\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"104\": [0, 0.61111, 0, 0, 0.525],\n    \"105\": [0, 0.61111, 0, 0, 0.525],\n    \"106\": [0.22222, 0.61111, 0, 0, 0.525],\n    \"107\": [0, 0.61111, 0, 0, 0.525],\n    \"108\": [0, 0.61111, 0, 0, 0.525],\n    \"109\": [0, 0.43056, 0, 0, 0.525],\n    \"110\": [0, 0.43056, 0, 0, 0.525],\n    \"111\": [0, 0.43056, 0, 0, 0.525],\n    \"112\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"113\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"114\": [0, 0.43056, 0, 0, 0.525],\n    \"115\": [0, 0.43056, 0, 0, 0.525],\n    \"116\": [0, 0.55358, 0, 0, 0.525],\n    \"117\": [0, 0.43056, 0, 0, 0.525],\n    \"118\": [0, 0.43056, 0, 0, 0.525],\n    \"119\": [0, 0.43056, 0, 0, 0.525],\n    \"120\": [0, 0.43056, 0, 0, 0.525],\n    \"121\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"122\": [0, 0.43056, 0, 0, 0.525],\n    \"123\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"124\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"125\": [0.08333, 0.69444, 0, 0, 0.525],\n    \"126\": [0, 0.61111, 0, 0, 0.525],\n    \"127\": [0, 0.61111, 0, 0, 0.525],\n    \"160\": [0, 0, 0, 0, 0.525],\n    \"176\": [0, 0.61111, 0, 0, 0.525],\n    \"184\": [0.19445, 0, 0, 0, 0.525],\n    \"305\": [0, 0.43056, 0, 0, 0.525],\n    \"567\": [0.22222, 0.43056, 0, 0, 0.525],\n    \"711\": [0, 0.56597, 0, 0, 0.525],\n    \"713\": [0, 0.56555, 0, 0, 0.525],\n    \"714\": [0, 0.61111, 0, 0, 0.525],\n    \"715\": [0, 0.61111, 0, 0, 0.525],\n    \"728\": [0, 0.61111, 0, 0, 0.525],\n    \"730\": [0, 0.61111, 0, 0, 0.525],\n    \"770\": [0, 0.61111, 0, 0, 0.525],\n    \"771\": [0, 0.61111, 0, 0, 0.525],\n    \"776\": [0, 0.61111, 0, 0, 0.525],\n    \"915\": [0, 0.61111, 0, 0, 0.525],\n    \"916\": [0, 0.61111, 0, 0, 0.525],\n    \"920\": [0, 0.61111, 0, 0, 0.525],\n    \"923\": [0, 0.61111, 0, 0, 0.525],\n    \"926\": [0, 0.61111, 0, 0, 0.525],\n    \"928\": [0, 0.61111, 0, 0, 0.525],\n    \"931\": [0, 0.61111, 0, 0, 0.525],\n    \"933\": [0, 0.61111, 0, 0, 0.525],\n    \"934\": [0, 0.61111, 0, 0, 0.525],\n    \"936\": [0, 0.61111, 0, 0, 0.525],\n    \"937\": [0, 0.61111, 0, 0, 0.525],\n    \"8216\": [0, 0.61111, 0, 0, 0.525],\n    \"8217\": [0, 0.61111, 0, 0, 0.525],\n    \"8242\": [0, 0.61111, 0, 0, 0.525],\n    \"9251\": [0.11111, 0.21944, 0, 0, 0.525]\n  }\n};\n\n/**\n * This file contains metrics regarding fonts and individual symbols. The sigma\n * and xi variables, as well as the metricMap map contain data extracted from\n * TeX, TeX font metrics, and the TTF files. These data are then exposed via the\n * `metrics` variable and the getCharacterMetrics function.\n */\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:\n// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt).  These are\n// provided in the arrays below, in that order.\n//\n// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respectively.\n// This was determined by running the following script:\n//\n//     latex -interaction=nonstopmode \\\n//     '\\documentclass{article}\\usepackage{amsmath}\\begin{document}' \\\n//     '$a$ \\expandafter\\show\\the\\textfont2' \\\n//     '\\expandafter\\show\\the\\scriptfont2' \\\n//     '\\expandafter\\show\\the\\scriptscriptfont2' \\\n//     '\\stop'\n//\n// The metrics themselves were retrieved using the following commands:\n//\n//     tftopl cmsy10\n//     tftopl cmsy7\n//     tftopl cmsy5\n//\n// The output of each of these commands is quite lengthy.  The only part we\n// care about is the FONTDIMEN section. Each value is measured in EMs.\nvar sigmasAndXis = {\n  slant: [0.250, 0.250, 0.250],\n  // sigma1\n  space: [0.000, 0.000, 0.000],\n  // sigma2\n  stretch: [0.000, 0.000, 0.000],\n  // sigma3\n  shrink: [0.000, 0.000, 0.000],\n  // sigma4\n  xHeight: [0.431, 0.431, 0.431],\n  // sigma5\n  quad: [1.000, 1.171, 1.472],\n  // sigma6\n  extraSpace: [0.000, 0.000, 0.000],\n  // sigma7\n  num1: [0.677, 0.732, 0.925],\n  // sigma8\n  num2: [0.394, 0.384, 0.387],\n  // sigma9\n  num3: [0.444, 0.471, 0.504],\n  // sigma10\n  denom1: [0.686, 0.752, 1.025],\n  // sigma11\n  denom2: [0.345, 0.344, 0.532],\n  // sigma12\n  sup1: [0.413, 0.503, 0.504],\n  // sigma13\n  sup2: [0.363, 0.431, 0.404],\n  // sigma14\n  sup3: [0.289, 0.286, 0.294],\n  // sigma15\n  sub1: [0.150, 0.143, 0.200],\n  // sigma16\n  sub2: [0.247, 0.286, 0.400],\n  // sigma17\n  supDrop: [0.386, 0.353, 0.494],\n  // sigma18\n  subDrop: [0.050, 0.071, 0.100],\n  // sigma19\n  delim1: [2.390, 1.700, 1.980],\n  // sigma20\n  delim2: [1.010, 1.157, 1.420],\n  // sigma21\n  axisHeight: [0.250, 0.250, 0.250],\n  // sigma22\n  // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;\n  // they correspond to the font parameters of the extension fonts (family 3).\n  // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to\n  // match cmex7, we'd use cmex7.tfm values for script and scriptscript\n  // values.\n  defaultRuleThickness: [0.04, 0.049, 0.049],\n  // xi8; cmex7: 0.049\n  bigOpSpacing1: [0.111, 0.111, 0.111],\n  // xi9\n  bigOpSpacing2: [0.166, 0.166, 0.166],\n  // xi10\n  bigOpSpacing3: [0.2, 0.2, 0.2],\n  // xi11\n  bigOpSpacing4: [0.6, 0.611, 0.611],\n  // xi12; cmex7: 0.611\n  bigOpSpacing5: [0.1, 0.143, 0.143],\n  // xi13; cmex7: 0.143\n  // The \\sqrt rule width is taken from the height of the surd character.\n  // Since we use the same font at all sizes, this thickness doesn't scale.\n  sqrtRuleThickness: [0.04, 0.04, 0.04],\n  // This value determines how large a pt is, for metrics which are defined\n  // in terms of pts.\n  // This value is also used in katex.scss; if you change it make sure the\n  // values match.\n  ptPerEm: [10.0, 10.0, 10.0],\n  // The space between adjacent `|` columns in an array definition. From\n  // `\\showthe\\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.\n  doubleRuleSep: [0.2, 0.2, 0.2],\n  // The width of separator lines in {array} environments. From\n  // `\\showthe\\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.\n  arrayRuleWidth: [0.04, 0.04, 0.04],\n  // Two values from LaTeX source2e:\n  fboxsep: [0.3, 0.3, 0.3],\n  //        3 pt / ptPerEm\n  fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm\n};\n// These are very rough approximations.  We default to Times New Roman which\n// should have Latin-1 and Cyrillic characters, but may not depending on the\n// operating system.  The metrics do not account for extra height from the\n// accents.  In the case of Cyrillic characters which have both ascenders and\n// descenders we prefer approximations with ascenders, primarily to prevent\n// the fraction bar or root line from intersecting the glyph.\n// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.\nvar extraCharacterMap = {\n  // Latin-1\n  'Å': 'A',\n  'Ð': 'D',\n  'Þ': 'o',\n  'å': 'a',\n  'ð': 'd',\n  'þ': 'o',\n  // Cyrillic\n  'А': 'A',\n  'Б': 'B',\n  'В': 'B',\n  'Г': 'F',\n  'Д': 'A',\n  'Е': 'E',\n  'Ж': 'K',\n  'З': '3',\n  'И': 'N',\n  'Й': 'N',\n  'К': 'K',\n  'Л': 'N',\n  'М': 'M',\n  'Н': 'H',\n  'О': 'O',\n  'П': 'N',\n  'Р': 'P',\n  'С': 'C',\n  'Т': 'T',\n  'У': 'y',\n  'Ф': 'O',\n  'Х': 'X',\n  'Ц': 'U',\n  'Ч': 'h',\n  'Ш': 'W',\n  'Щ': 'W',\n  'Ъ': 'B',\n  'Ы': 'X',\n  'Ь': 'B',\n  'Э': '3',\n  'Ю': 'X',\n  'Я': 'R',\n  'а': 'a',\n  'б': 'b',\n  'в': 'a',\n  'г': 'r',\n  'д': 'y',\n  'е': 'e',\n  'ж': 'm',\n  'з': 'e',\n  'и': 'n',\n  'й': 'n',\n  'к': 'n',\n  'л': 'n',\n  'м': 'm',\n  'н': 'n',\n  'о': 'o',\n  'п': 'n',\n  'р': 'p',\n  'с': 'c',\n  'т': 'o',\n  'у': 'y',\n  'ф': 'b',\n  'х': 'x',\n  'ц': 'n',\n  'ч': 'n',\n  'ш': 'w',\n  'щ': 'w',\n  'ъ': 'a',\n  'ы': 'm',\n  'ь': 'a',\n  'э': 'e',\n  'ю': 'm',\n  'я': 'r'\n};\n/**\n * This function adds new font metrics to default metricMap\n * It can also override existing metrics\n */\nfunction setFontMetrics(fontName, metrics) {\n  fontMetricsData[fontName] = metrics;\n}\n/**\n * This function is a convenience function for looking up information in the\n * metricMap table. It takes a character as a string, and a font.\n *\n * Note: the `width` property may be undefined if fontMetricsData.js wasn't\n * built using `Make extended_metrics`.\n */\nfunction getCharacterMetrics(character, font, mode) {\n  if (!fontMetricsData[font]) {\n    throw new Error(\"Font metrics not found for font: \" + font + \".\");\n  }\n  var ch = character.charCodeAt(0);\n  var metrics = fontMetricsData[font][ch];\n  if (!metrics && character[0] in extraCharacterMap) {\n    ch = extraCharacterMap[character[0]].charCodeAt(0);\n    metrics = fontMetricsData[font][ch];\n  }\n  if (!metrics && mode === 'text') {\n    // We don't typically have font metrics for Asian scripts.\n    // But since we support them in text mode, we need to return\n    // some sort of metrics.\n    // So if the character is in a script we support but we\n    // don't have metrics for it, just use the metrics for\n    // the Latin capital letter M. This is close enough because\n    // we (currently) only care about the height of the glyph\n    // not its width.\n    if (supportedCodepoint(ch)) {\n      metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'\n    }\n  }\n  if (metrics) {\n    return {\n      depth: metrics[0],\n      height: metrics[1],\n      italic: metrics[2],\n      skew: metrics[3],\n      width: metrics[4]\n    };\n  }\n}\nvar fontMetricsBySizeIndex = {};\n/**\n * Get the font metrics for a given size.\n */\nfunction getGlobalMetrics(size) {\n  var sizeIndex;\n  if (size >= 5) {\n    sizeIndex = 0;\n  } else if (size >= 3) {\n    sizeIndex = 1;\n  } else {\n    sizeIndex = 2;\n  }\n  if (!fontMetricsBySizeIndex[sizeIndex]) {\n    var metrics = fontMetricsBySizeIndex[sizeIndex] = {\n      cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18\n    };\n    for (var key in sigmasAndXis) {\n      if (sigmasAndXis.hasOwnProperty(key)) {\n        metrics[key] = sigmasAndXis[key][sizeIndex];\n      }\n    }\n  }\n  return fontMetricsBySizeIndex[sizeIndex];\n}\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are three properties they can have:\n * - font (required): the font to be used for this symbol. Either \"main\" (the\n     normal font), or \"ams\" (the ams fonts).\n * - group (required): the ParseNode group type the symbol should have (i.e.\n     \"textord\", \"mathord\", etc).\n     See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types\n * - replace: the character that this symbol or function should be\n *   replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n *   character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nvar ATOMS = {\n  \"bin\": 1,\n  \"close\": 1,\n  \"inner\": 1,\n  \"open\": 1,\n  \"punct\": 1,\n  \"rel\": 1\n};\nvar NON_ATOMS = {\n  \"accent-token\": 1,\n  \"mathord\": 1,\n  \"op-token\": 1,\n  \"spacing\": 1,\n  \"textord\": 1\n};\nvar symbols = {\n  \"math\": {},\n  \"text\": {}\n};\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {\n  symbols[mode][name] = {\n    font,\n    group,\n    replace\n  };\n  if (acceptUnicodeChar && replace) {\n    symbols[mode][replace] = symbols[mode][name];\n  }\n}\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n// modes:\nvar math = \"math\";\nvar text = \"text\";\n// fonts:\nvar main = \"main\";\nvar ams = \"ams\";\n// groups:\nvar accent = \"accent-token\";\nvar bin = \"bin\";\nvar close = \"close\";\nvar inner = \"inner\";\nvar mathord = \"mathord\";\nvar op = \"op-token\";\nvar open = \"open\";\nvar punct = \"punct\";\nvar rel = \"rel\";\nvar spacing = \"spacing\";\nvar textord = \"textord\";\n// Now comes the symbol table\n// Relation Symbols\ndefineSymbol(math, main, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, main, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, main, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, main, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, main, rel, \"\\u22a5\", \"\\\\perp\");\ndefineSymbol(math, main, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, main, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, main, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, main, rel, \"\\u2223\", \"\\\\mid\", true);\ndefineSymbol(math, main, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, main, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, main, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, main, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, main, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, main, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, main, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, main, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, main, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, main, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\owns\");\n// Punctuation\ndefineSymbol(math, main, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\\\cdotp\");\n// The KaTeX fonts do not contain U+00B7. Use the centered dot glyph at U+22C5\n// in both modes, but keep math-mode punctuation spacing only in math mode.\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\u00b7\");\ndefineSymbol(text, main, textord, \"\\u22c5\", \"\\u00b7\");\n// Misc Symbols\ndefineSymbol(math, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, main, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, main, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, main, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, main, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, main, textord, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, main, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, main, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, main, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, main, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, main, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, main, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, main, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, main, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, main, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, main, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, main, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, main, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, main, textord, \"\\u00b6\", \"\\\\P\");\n// Math and Text\ndefineSymbol(math, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n// Large Delimiters\ndefineSymbol(math, main, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, main, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, main, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, main, open, \"\\u27ee\", \"\\\\lgroup\", true);\n// Binary Operators\ndefineSymbol(math, main, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, main, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, main, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, main, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, main, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, main, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, main, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, main, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, main, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, main, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, main, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\n// Arrow Symbols\ndefineSymbol(math, main, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, main, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, main, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\n// AMS Negated Binary Relations\ndefineSymbol(math, ams, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceded by \"@\" each have a corresponding macro.\ndefineSymbol(math, ams, rel, \"\\ue010\", \"\\\\@nleqslant\");\ndefineSymbol(math, ams, rel, \"\\ue011\", \"\\\\@nleqq\");\ndefineSymbol(math, ams, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00c\", \"\\\\@lvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, ams, rel, \"\\ue006\", \"\\\\@nshortmid\");\ndefineSymbol(math, ams, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, ams, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, ams, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01a\", \"\\\\@varsubsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue017\", \"\\\\@varsubsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, ams, rel, \"\\ue00f\", \"\\\\@ngeqslant\");\ndefineSymbol(math, ams, rel, \"\\ue00e\", \"\\\\@ngeqq\");\ndefineSymbol(math, ams, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00d\", \"\\\\@gvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, ams, rel, \"\\ue007\", \"\\\\@nshortparallel\");\ndefineSymbol(math, ams, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, ams, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, ams, rel, \"\\ue018\", \"\\\\@nsupseteqq\");\ndefineSymbol(math, ams, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01b\", \"\\\\@varsupsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue019\", \"\\\\@varsupsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue016\", \"\\\\@nsubseteqq\");\ndefineSymbol(math, ams, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, ams, bin, \"\\u22b5\", \"\\\\unrhd\");\n// AMS Negated Arrows\ndefineSymbol(math, ams, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n// AMS Misc\ndefineSymbol(math, ams, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, ams, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, ams, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, ams, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(math, ams, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, ams, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, ams, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, ams, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, ams, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, ams, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, ams, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, ams, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, ams, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, ams, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, ams, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, ams, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, main, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, ams, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, ams, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, ams, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, ams, textord, \"\\u2713\", \"\\\\checkmark\");\n// AMS Hebrew\ndefineSymbol(math, ams, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, ams, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, ams, textord, \"\\u2137\", \"\\\\gimel\", true);\n// AMS Greek\ndefineSymbol(math, ams, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, ams, textord, \"\\u03f0\", \"\\\\varkappa\");\n// AMS Delimiters\ndefineSymbol(math, ams, open, \"\\u250c\", \"\\\\@ulcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2510\", \"\\\\@urcorner\", true);\ndefineSymbol(math, ams, open, \"\\u2514\", \"\\\\@llcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2518\", \"\\\\@lrcorner\", true);\n// AMS Binary Relations\ndefineSymbol(math, ams, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, ams, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, ams, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, ams, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, ams, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, ams, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, ams, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, ams, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, ams, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, ams, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, ams, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, ams, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, ams, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, ams, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, ams, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, ams, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, ams, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, ams, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, ams, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, ams, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, ams, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, ams, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, ams, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, ams, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, ams, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, ams, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, ams, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, ams, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, ams, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, ams, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, ams, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, ams, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, ams, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, ams, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, ams, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\Doteq\", true);\n// AMS Binary Operators\ndefineSymbol(math, ams, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, ams, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, ams, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, ams, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, ams, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, ams, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, ams, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, ams, bin, \"\\u22c5\", \"\\\\centerdot\");\ndefineSymbol(math, ams, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, ams, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, ams, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, ams, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, main, rel, \"\\u22b6\", \"\\\\origof\", true); // not in font\ndefineSymbol(math, main, rel, \"\\u22b7\", \"\\\\imageof\", true); // not in font\ndefineSymbol(math, ams, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, ams, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, ams, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, ams, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\restriction\");\ndefineSymbol(math, main, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(math, main, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, main, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, main, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, main, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(math, main, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, main, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, main, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, main, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, main, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, main, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, main, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, main, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, main, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, main, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, main, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, main, textord, \"A\", \"\\u0391\");\ndefineSymbol(math, main, textord, \"B\", \"\\u0392\");\ndefineSymbol(math, main, textord, \"E\", \"\\u0395\");\ndefineSymbol(math, main, textord, \"Z\", \"\\u0396\");\ndefineSymbol(math, main, textord, \"H\", \"\\u0397\");\ndefineSymbol(math, main, textord, \"I\", \"\\u0399\");\ndefineSymbol(math, main, textord, \"K\", \"\\u039A\");\ndefineSymbol(math, main, textord, \"M\", \"\\u039C\");\ndefineSymbol(math, main, textord, \"N\", \"\\u039D\");\ndefineSymbol(math, main, textord, \"O\", \"\\u039F\");\ndefineSymbol(math, main, textord, \"P\", \"\\u03A1\");\ndefineSymbol(math, main, textord, \"T\", \"\\u03A4\");\ndefineSymbol(math, main, textord, \"X\", \"\\u03A7\");\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, main, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, main, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, main, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, ams, textord, \"\\u2205\", \"\\\\varnothing\");\ndefineSymbol(math, main, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, main, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, main, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, main, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, main, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, main, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, main, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, main, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, main, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, main, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, main, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, main, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, main, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, main, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, main, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"*\", true);\ndefineSymbol(math, main, bin, \"+\", \"+\");\ndefineSymbol(math, main, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, main, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, main, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, main, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, main, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, main, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, main, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, main, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, main, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, main, textord, \"\\u221a\", \"\\\\surd\");\ndefineSymbol(math, main, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, main, open, \"\\u2223\", \"\\\\lvert\");\ndefineSymbol(math, main, open, \"\\u2225\", \"\\\\lVert\");\ndefineSymbol(math, main, close, \"?\", \"?\");\ndefineSymbol(math, main, close, \"!\", \"!\");\ndefineSymbol(math, main, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, main, close, \"\\u2223\", \"\\\\rvert\");\ndefineSymbol(math, main, close, \"\\u2225\", \"\\\\rVert\");\ndefineSymbol(math, main, rel, \"=\", \"=\");\ndefineSymbol(math, main, rel, \":\", \":\");\ndefineSymbol(math, main, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, main, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, main, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, main, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, main, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, main, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, main, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, main, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, main, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, ams, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, main, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, main, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, main, punct, \",\", \",\");\ndefineSymbol(math, main, punct, \";\", \";\");\ndefineSymbol(math, ams, bin, \"\\u22bc\", \"\\\\barwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22bb\", \"\\\\veebar\", true);\ndefineSymbol(math, main, bin, \"\\u2299\", \"\\\\odot\", true);\ndefineSymbol(math, main, bin, \"\\u2295\", \"\\\\oplus\", true);\ndefineSymbol(math, main, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, main, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, main, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, ams, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, ams, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, main, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, main, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, main, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, main, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, main, bin, \"\\u22c6\", \"\\\\star\");\ndefineSymbol(math, main, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, main, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, main, close, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, main, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, main, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, main, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, main, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, main, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, main, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, main, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(text, main, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, main, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, main, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, main, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, main, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, main, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, main, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"|\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"\\\\vert\");\ndefineSymbol(text, main, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\|\");\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\Vert\");\ndefineSymbol(text, main, textord, \"\\u2225\", \"\\\\textbardbl\");\ndefineSymbol(text, main, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, main, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, main, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, main, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, main, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, main, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, main, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, main, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, main, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, main, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, main, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, main, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, main, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, main, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, main, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, main, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, main, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, main, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, main, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, main, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, main, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, main, inner, \"\\u22f1\", \"\\\\ddots\", true);\n// \\vdots is a macro that uses one of these two symbols (with made-up names):\ndefineSymbol(math, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(text, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, main, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, main, accent, \"\\u02cb\", \"\\\\grave\");\ndefineSymbol(math, main, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, main, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, main, accent, \"\\u02c9\", \"\\\\bar\");\ndefineSymbol(math, main, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, main, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, main, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, main, accent, \"\\u20d7\", \"\\\\vec\");\ndefineSymbol(math, main, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, main, accent, \"\\u02da\", \"\\\\mathring\");\n// \\imath and \\jmath should be invariant to \\mathrm, \\mathbf, etc., so use PUA\ndefineSymbol(math, main, mathord, \"\\ue131\", \"\\\\@imath\");\ndefineSymbol(math, main, mathord, \"\\ue237\", \"\\\\@jmath\");\ndefineSymbol(math, main, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, main, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, main, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, main, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, main, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, main, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, main, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, main, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, main, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, main, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, main, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, main, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, main, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, main, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, main, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, main, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, main, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, main, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, main, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, main, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, main, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, main, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(text, main, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(text, main, accent, \"\\u25ef\", \"\\\\textcircled\"); // \\bigcirc glyph\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nvar ligatures = {\n  \"--\": true,\n  \"---\": true,\n  \"``\": true,\n  \"''\": true\n};\ndefineSymbol(text, main, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, main, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, main, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, main, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, main, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, main, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, main, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, main, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, main, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, main, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, main, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, main, textord, \"\\u201d\", \"\\\\textquotedblright\");\n//  \\degree from gensymb package\ndefineSymbol(math, main, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, ams, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, ams, textord, \"\\u2720\", \"\\\\maltese\");\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nvar mathTextSymbols = \"0123456789/@.\\\"\";\nfor (var i = 0; i < mathTextSymbols.length; i++) {\n  var ch = mathTextSymbols.charAt(i);\n  defineSymbol(math, main, textord, ch, ch);\n}\n// All of these are textords in text mode\nvar textSymbols = \"0123456789!@*()-=+\\\";:?/.,\";\nfor (var _i = 0; _i < textSymbols.length; _i++) {\n  var _ch = textSymbols.charAt(_i);\n  defineSymbol(text, main, textord, _ch, _ch);\n}\n// All of these are textords in text mode, and mathords in math mode\nvar letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (var _i2 = 0; _i2 < letters.length; _i2++) {\n  var _ch2 = letters.charAt(_i2);\n  defineSymbol(math, main, mathord, _ch2, _ch2);\n  defineSymbol(text, main, textord, _ch2, _ch2);\n}\n// Blackboard bold and script letters in Unicode range\ndefineSymbol(math, ams, textord, \"C\", \"\\u2102\"); // blackboard bold\ndefineSymbol(text, ams, textord, \"C\", \"\\u2102\");\ndefineSymbol(math, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(text, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(math, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(text, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(math, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(text, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(math, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(text, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(math, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(text, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(math, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(text, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(math, main, mathord, \"h\", \"\\u210E\"); // italic h, Planck constant\ndefineSymbol(text, main, mathord, \"h\", \"\\u210E\");\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\n// Some editors do not deal well with wide characters. So don't write the\n// string into this file. Instead, create the string from the surrogate pair.\nvar wideChar = \"\";\nfor (var _i3 = 0; _i3 < letters.length; _i3++) {\n  var _ch3 = letters.charAt(_i3);\n  // The hex numbers in the next line are a surrogate pair.\n  // 0xD835 is the high surrogate for all letters in the range we support.\n  // 0xDC00 is the low surrogate for bold A.\n  wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDD6C + _i3); // A-Z a-z bold Fraktur\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace\n  defineSymbol(math, main, mathord, _ch3, wideChar);\n  defineSymbol(text, main, textord, _ch3, wideChar);\n  if (_i3 < 26) {\n    // KaTeX fonts have only capital letters for blackboard bold and script.\n    // See exception for k below.\n    wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n    wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script\n    defineSymbol(math, main, mathord, _ch3, wideChar);\n    defineSymbol(text, main, textord, _ch3, wideChar);\n  }\n  // TODO: Add bold script when it is supported by a KaTeX font.\n}\n// \"k\" is the only double struck lower case letter in the KaTeX fonts.\nwideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck\ndefineSymbol(math, main, mathord, \"k\", wideChar);\ndefineSymbol(text, main, textord, \"k\", wideChar);\n// Next, some wide character numerals\nfor (var _i4 = 0; _i4 < 10; _i4++) {\n  var _ch4 = _i4.toString();\n  wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n  wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace\n  defineSymbol(math, main, mathord, _ch4, wideChar);\n  defineSymbol(text, main, textord, _ch4, wideChar);\n}\n// We add these Latin-1 letters as symbols for backwards-compatibility,\n// but they are not actually in the font, nor are they supported by the\n// Unicode accent mechanism, so they fall back to Times font and look ugly.\n// TODO(edemaine): Fix this.\nvar extraLatin = \"\\u00d0\\u00de\\u00fe\";\nfor (var _i5 = 0; _i5 < extraLatin.length; _i5++) {\n  var _ch5 = extraLatin.charAt(_i5);\n  defineSymbol(math, main, mathord, _ch5, _ch5);\n  defineSymbol(text, main, textord, _ch5, _ch5);\n}\n\n/**\n * This file provides support for Unicode range U+1D400 to U+1D7FF,\n * Mathematical Alphanumeric Symbols.\n *\n * Function wideCharacterFont takes a wide character as input and returns\n * the font information necessary to render it properly.\n */\n/**\n * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf\n * That document sorts characters into groups by font type, say bold or italic.\n *\n * In the arrays below, each subarray consists three elements:\n *      * The CSS class of that group when in math mode.\n *      * The CSS class of that group when in text mode.\n *      * The font name, so that KaTeX can get font metrics.\n */\nvar wideLatinLetterData = [[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// A-Z bold upright\n[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// a-z bold upright\n[\"mathnormal\", \"textit\", \"Math-Italic\"],\n// A-Z italic\n[\"mathnormal\", \"textit\", \"Math-Italic\"],\n// a-z italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"],\n// A-Z bold italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"],\n// a-z bold italic\n// Map fancy A-Z letters to script, not calligraphic.\n// This aligns with unicode-math and math fonts (except Cambria Math).\n[\"mathscr\", \"textscr\", \"Script-Regular\"],\n// A-Z script\n[\"\", \"\", \"\"],\n// a-z script.  No font\n[\"\", \"\", \"\"],\n// A-Z bold script. No font\n[\"\", \"\", \"\"],\n// a-z bold script. No font\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"],\n// A-Z Fraktur\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"],\n// a-z Fraktur\n[\"mathbb\", \"textbb\", \"AMS-Regular\"],\n// A-Z double-struck\n[\"mathbb\", \"textbb\", \"AMS-Regular\"],\n// k double-struck\n// Note that we are using a bold font, but font metrics for regular Fraktur.\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"],\n// A-Z bold Fraktur\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"],\n// a-z bold Fraktur\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// A-Z sans-serif\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// a-z sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// A-Z bold sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// a-z bold sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"],\n// A-Z italic sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"],\n// a-z italic sans-serif\n[\"\", \"\", \"\"],\n// A-Z bold italic sans. No font\n[\"\", \"\", \"\"],\n// a-z bold italic sans. No font\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"],\n// A-Z monospace\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // a-z monospace\n];\nvar wideNumeralData = [[\"mathbf\", \"textbf\", \"Main-Bold\"],\n// 0-9 bold\n[\"\", \"\", \"\"],\n// 0-9 double-struck. No KaTeX font.\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"],\n// 0-9 sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"],\n// 0-9 bold sans-serif\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // 0-9 monospace\n];\nvar wideCharacterFont = (wideChar, mode) => {\n  // IE doesn't support codePointAt(). So work with the surrogate pair.\n  var H = wideChar.charCodeAt(0); // high surrogate\n  var L = wideChar.charCodeAt(1); // low surrogate\n  var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;\n  var j = mode === \"math\" ? 0 : 1; // column index for CSS class.\n  if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {\n    // wideLatinLetterData contains exactly 26 chars on each row.\n    // So we can calculate the relevant row. No traverse necessary.\n    var i = Math.floor((codePoint - 0x1D400) / 26);\n    return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];\n  } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {\n    // Numerals, ten per row.\n    var _i = Math.floor((codePoint - 0x1D7CE) / 10);\n    return [wideNumeralData[_i][2], wideNumeralData[_i][j]];\n  } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {\n    // dotless i or j\n    return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];\n  } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {\n    // Greek letters. Not supported, yet.\n    return [\"\", \"\"];\n  } else {\n    // We don't support any wide characters outside 1D400–1D7FF.\n    throw new ParseError(\"Unsupported character: \" + wideChar);\n  }\n};\n\n/* eslint no-console:0 */\n/**\n * Looks up the given symbol in fontMetrics, after applying any symbol\n * replacements defined in symbol.js\n */\nvar lookupSymbol = function lookupSymbol(value,\n// TODO(#963): Use a union type for this.\nfontName, mode) {\n  // Replace the value with its replaced value from symbol.js\n  if (symbols[mode][value]) {\n    var replacement = symbols[mode][value].replace;\n    if (replacement) {\n      value = replacement;\n    }\n  }\n  return {\n    value,\n    metrics: getCharacterMetrics(value, fontName, mode)\n  };\n};\n/**\n * Makes a symbolNode after translation via the list of symbols in symbols.js.\n * Correctly pulls out metrics for the character, and optionally takes a list of\n * classes to be attached to the node.\n *\n * TODO: make argument order closer to makeSpan\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n * TODO(#953): Make `options` mandatory and always pass it in.\n */\nvar makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {\n  var lookup = lookupSymbol(value, fontName, mode);\n  var metrics = lookup.metrics;\n  value = lookup.value;\n  var symbolNode;\n  if (metrics) {\n    var italic = metrics.italic;\n    if (mode === \"text\" || options && options.font === \"mathit\") {\n      italic = 0;\n    }\n    symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);\n  } else {\n    // TODO(emily): Figure out a good way to only print this in development\n    typeof console !== \"undefined\" && console.warn(\"No character metrics \" + (\"for '\" + value + \"' in style '\" + fontName + \"' and mode '\" + mode + \"'\"));\n    symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);\n  }\n  if (options) {\n    symbolNode.maxFontSize = options.sizeMultiplier;\n    if (options.style.isTight()) {\n      symbolNode.classes.push(\"mtight\");\n    }\n    var color = options.getColor();\n    if (color) {\n      symbolNode.style.color = color;\n    }\n  }\n  return symbolNode;\n};\n/**\n * Makes a symbol in Main-Regular or AMS-Regular.\n * Used for rel, bin, open, close, inner, and punct.\n */\nvar mathsym = function mathsym(value, mode, options, classes) {\n  if (classes === void 0) {\n    classes = [];\n  }\n  // Decide what font to render the symbol in by its entry in the symbols\n  // table.\n  // Have a special case for when the value = \\ because the \\ is used as a\n  // textord in unsupported command errors but cannot be parsed as a regular\n  // text ordinal and is therefore not present as a symbol in the symbols\n  // table for text, as well as a special case for boldsymbol because it\n  // can be used for bold + and -\n  if (options.font === \"boldsymbol\" && lookupSymbol(value, \"Main-Bold\", mode).metrics) {\n    return makeSymbol(value, \"Main-Bold\", mode, options, classes.concat([\"mathbf\"]));\n  } else if (value === \"\\\\\" || symbols[mode][value].font === \"main\") {\n    return makeSymbol(value, \"Main-Regular\", mode, options, classes);\n  } else {\n    return makeSymbol(value, \"AMS-Regular\", mode, options, classes.concat([\"amsrm\"]));\n  }\n};\n/**\n * Determines which of the two font names (Main-Bold and Math-BoldItalic) and\n * corresponding style tags (mathbf or boldsymbol) to use for font \"boldsymbol\",\n * depending on the symbol.  Use this function instead of fontMap for font\n * \"boldsymbol\".\n */\nvar boldsymbol = function boldsymbol(value, mode, options, classes, type) {\n  if (type !== \"textord\" && lookupSymbol(value, \"Math-BoldItalic\", mode).metrics) {\n    return {\n      fontName: \"Math-BoldItalic\",\n      fontClass: \"boldsymbol\"\n    };\n  } else {\n    // Some glyphs do not exist in Math-BoldItalic so we need to use\n    // Main-Bold instead.\n    return {\n      fontName: \"Main-Bold\",\n      fontClass: \"mathbf\"\n    };\n  }\n};\n/**\n * Makes either a mathord or textord in the correct font and color.\n */\nvar makeOrd = function makeOrd(group, options, type) {\n  var mode = group.mode;\n  var text = group.text;\n  var classes = [\"mord\"];\n  // Math mode or Old font (i.e. \\rm)\n  var isFont = mode === \"math\" || mode === \"text\" && options.font;\n  var fontOrFamily = isFont ? options.font : options.fontFamily;\n  var wideFontName = \"\";\n  var wideFontClass = \"\";\n  if (text.charCodeAt(0) === 0xD835) {\n    [wideFontName, wideFontClass] = wideCharacterFont(text, mode);\n  }\n  if (wideFontName.length > 0) {\n    // surrogate pairs get special treatment\n    return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));\n  } else if (fontOrFamily) {\n    var fontName;\n    var fontClasses;\n    if (fontOrFamily === \"boldsymbol\") {\n      var fontData = boldsymbol(text, mode, options, classes, type);\n      fontName = fontData.fontName;\n      fontClasses = [fontData.fontClass];\n    } else if (isFont) {\n      fontName = fontMap[fontOrFamily].fontName;\n      fontClasses = [fontOrFamily];\n    } else {\n      fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);\n      fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];\n    }\n    if (lookupSymbol(text, fontName, mode).metrics) {\n      return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));\n    } else if (ligatures.hasOwnProperty(text) && fontName.slice(0, 10) === \"Typewriter\") {\n      // Deconstruct ligatures in monospace fonts (\\texttt, \\tt).\n      var parts = [];\n      for (var i = 0; i < text.length; i++) {\n        parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));\n      }\n      return makeFragment(parts);\n    }\n  }\n  // Makes a symbol in the default font for mathords and textords.\n  if (type === \"mathord\") {\n    return makeSymbol(text, \"Math-Italic\", mode, options, classes.concat([\"mathnormal\"]));\n  } else if (type === \"textord\") {\n    var font = symbols[mode][text] && symbols[mode][text].font;\n    if (font === \"ams\") {\n      var _fontName = retrieveTextFontName(\"amsrm\", options.fontWeight, options.fontShape);\n      return makeSymbol(text, _fontName, mode, options, classes.concat(\"amsrm\", options.fontWeight, options.fontShape));\n    } else if (font === \"main\" || !font) {\n      var _fontName2 = retrieveTextFontName(\"textrm\", options.fontWeight, options.fontShape);\n      return makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));\n    } else {\n      // fonts added by plugins\n      var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape);\n      // We add font name as a css class\n      return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));\n    }\n  } else {\n    throw new Error(\"unexpected type: \" + type + \" in makeOrd\");\n  }\n};\n/**\n * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,\n * and styles. For mathnormal text, the left node must also have zero italic\n * correction so we don't lose spacing between combined glyphs.\n */\nvar canCombine = (prev, next) => {\n  if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize || prev.italic !== 0 && prev.hasClass(\"mathnormal\")) {\n    return false;\n  }\n  // If prev and next both are just \"mbin\"s or \"mord\"s we don't combine them\n  // so that the proper spacing can be preserved.\n  if (prev.classes.length === 1) {\n    var cls = prev.classes[0];\n    if (cls === \"mbin\" || cls === \"mord\") {\n      return false;\n    }\n  }\n  for (var key of Object.keys(prev.style)) {\n    if (prev.style[key] !== next.style[key]) {\n      return false;\n    }\n  }\n  for (var _key of Object.keys(next.style)) {\n    if (prev.style[_key] !== next.style[_key]) {\n      return false;\n    }\n  }\n  return true;\n};\n/**\n * Combine consecutive domTree.symbolNodes into a single symbolNode.\n * Note: this function mutates the argument.\n */\nvar tryCombineChars = chars => {\n  for (var i = 0; i < chars.length - 1; i++) {\n    var prev = chars[i];\n    var next = chars[i + 1];\n    if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {\n      prev.text += next.text;\n      prev.height = Math.max(prev.height, next.height);\n      prev.depth = Math.max(prev.depth, next.depth);\n      // Use the last character's italic correction since we use\n      // it to add padding to the right of the span created from\n      // the combined characters.\n      prev.italic = next.italic;\n      chars.splice(i + 1, 1);\n      i--;\n    }\n  }\n  return chars;\n};\n/**\n * Calculate the height, depth, and maxFontSize of an element based on its\n * children.\n */\nvar sizeElementFromChildren = function sizeElementFromChildren(elem) {\n  var height = 0;\n  var depth = 0;\n  var maxFontSize = 0;\n  for (var i = 0; i < elem.children.length; i++) {\n    var child = elem.children[i];\n    if (child.height > height) {\n      height = child.height;\n    }\n    if (child.depth > depth) {\n      depth = child.depth;\n    }\n    if (child.maxFontSize > maxFontSize) {\n      maxFontSize = child.maxFontSize;\n    }\n  }\n  elem.height = height;\n  elem.depth = depth;\n  elem.maxFontSize = maxFontSize;\n};\n/**\n * Makes a span with the given list of classes, list of children, and options.\n *\n * TODO(#953): Ensure that `options` is always provided (currently some call\n * sites don't pass it) and make the type below mandatory.\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n */\nvar makeSpan = function makeSpan(classes, children, options, style) {\n  var span = new Span(classes, children, options, style);\n  sizeElementFromChildren(span);\n  return span;\n};\n// SVG one is simpler -- doesn't require height, depth, max-font setting.\n// This is also a separate method for typesafety.\nvar makeSvgSpan = (classes, children, options, style) => new Span(classes, children, options, style);\nvar makeLineSpan = function makeLineSpan(className, options, thickness) {\n  var line = makeSpan([className], [], options);\n  line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n  line.style.borderBottomWidth = makeEm(line.height);\n  line.maxFontSize = 1.0;\n  return line;\n};\n/**\n * Makes an anchor with the given href, list of classes, list of children,\n * and options.\n */\nvar makeAnchor = function makeAnchor(href, classes, children, options) {\n  var anchor = new Anchor(href, classes, children, options);\n  sizeElementFromChildren(anchor);\n  return anchor;\n};\n/**\n * Makes a document fragment with the given list of children.\n */\nvar makeFragment = function makeFragment(children) {\n  var fragment = new DocumentFragment(children);\n  sizeElementFromChildren(fragment);\n  return fragment;\n};\n/**\n * Wraps group in a span if it's a document fragment, allowing to apply classes\n * and styles\n */\nvar wrapFragment = function wrapFragment(group, options) {\n  if (group instanceof DocumentFragment) {\n    return makeSpan([], [group], options);\n  }\n  return group;\n};\n// Computes the updated `children` list and the overall depth.\n//\n// This helper function for makeVList makes it easier to enforce type safety by\n// allowing early exits (returns) in the logic.\nvar getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {\n  if (params.positionType === \"individualShift\") {\n    var oldChildren = params.children;\n    var children = [oldChildren[0]];\n    // Add in kerns to the list of params.children to get each element to be\n    // shifted to the correct specified shift\n    var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;\n    var currPos = _depth;\n    for (var i = 1; i < oldChildren.length; i++) {\n      var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;\n      var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);\n      currPos = currPos + diff;\n      children.push({\n        type: \"kern\",\n        size\n      });\n      children.push(oldChildren[i]);\n    }\n    return {\n      children,\n      depth: _depth\n    };\n  }\n  var depth;\n  if (params.positionType === \"top\") {\n    // We always start at the bottom, so calculate the bottom by adding up\n    // all the sizes\n    var bottom = params.positionData;\n    for (var _i = 0; _i < params.children.length; _i++) {\n      var child = params.children[_i];\n      bottom -= child.type === \"kern\" ? child.size : child.elem.height + child.elem.depth;\n    }\n    depth = bottom;\n  } else if (params.positionType === \"bottom\") {\n    depth = -params.positionData;\n  } else {\n    var firstChild = params.children[0];\n    if (firstChild.type !== \"elem\") {\n      throw new Error('First child must have type \"elem\".');\n    }\n    if (params.positionType === \"shift\") {\n      depth = -firstChild.elem.depth - params.positionData;\n    } else if (params.positionType === \"firstBaseline\") {\n      depth = -firstChild.elem.depth;\n    } else {\n      throw new Error(\"Invalid positionType \" + params.positionType + \".\");\n    }\n  }\n  return {\n    children: params.children,\n    depth\n  };\n};\n/**\n * Makes a vertical list by stacking elements and kerns on top of each other.\n * Allows for many different ways of specifying the positioning method.\n *\n * See VListParam documentation above.\n */\nvar makeVList = function makeVList(params, options) {\n  var {\n    children,\n    depth\n  } = getVListChildrenAndDepth(params);\n  // Create a strut that is taller than any list item. The strut is added to\n  // each item, where it will determine the item's baseline. Since it has\n  // `overflow:hidden`, the strut's top edge will sit on the item's line box's\n  // top edge and the strut's bottom edge will sit on the item's baseline,\n  // with no additional line-height spacing. This allows the item baseline to\n  // be positioned precisely without worrying about font ascent and\n  // line-height.\n  var pstrutSize = 0;\n  for (var i = 0; i < children.length; i++) {\n    var child = children[i];\n    if (child.type === \"elem\") {\n      var elem = child.elem;\n      pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);\n    }\n  }\n  pstrutSize += 2;\n  var pstrut = makeSpan([\"pstrut\"], []);\n  pstrut.style.height = makeEm(pstrutSize);\n  // Create a new list of actual children at the correct offsets\n  var realChildren = [];\n  var minPos = depth;\n  var maxPos = depth;\n  var currPos = depth;\n  for (var _i2 = 0; _i2 < children.length; _i2++) {\n    var _child = children[_i2];\n    if (_child.type === \"kern\") {\n      currPos += _child.size;\n    } else {\n      var _elem = _child.elem;\n      var classes = _child.wrapperClasses || [];\n      var style = _child.wrapperStyle || {};\n      var childWrap = makeSpan(classes, [pstrut, _elem], undefined, style);\n      childWrap.style.top = makeEm(-pstrutSize - currPos - _elem.depth);\n      if (_child.marginLeft) {\n        childWrap.style.marginLeft = _child.marginLeft;\n      }\n      if (_child.marginRight) {\n        childWrap.style.marginRight = _child.marginRight;\n      }\n      realChildren.push(childWrap);\n      currPos += _elem.height + _elem.depth;\n    }\n    minPos = Math.min(minPos, currPos);\n    maxPos = Math.max(maxPos, currPos);\n  }\n  // The vlist contents go in a table-cell with `vertical-align:bottom`.\n  // This cell's bottom edge will determine the containing table's baseline\n  // without overly expanding the containing line-box.\n  var vlist = makeSpan([\"vlist\"], realChildren);\n  vlist.style.height = makeEm(maxPos);\n  // A second row is used if necessary to represent the vlist's depth.\n  var rows;\n  if (minPos < 0) {\n    // We will define depth in an empty span with display: table-cell.\n    // It should render with the height that we define. But Chrome, in\n    // contenteditable mode only, treats that span as if it contains some\n    // text content. And that min-height over-rides our desired height.\n    // So we put another empty span inside the depth strut span.\n    var emptySpan = makeSpan([], []);\n    var depthStrut = makeSpan([\"vlist\"], [emptySpan]);\n    depthStrut.style.height = makeEm(-minPos);\n    // Safari wants the first row to have inline content; otherwise it\n    // puts the bottom of the *second* row on the baseline.\n    var topStrut = makeSpan([\"vlist-s\"], [new SymbolNode(\"\\u200b\")]);\n    rows = [makeSpan([\"vlist-r\"], [vlist, topStrut]), makeSpan([\"vlist-r\"], [depthStrut])];\n  } else {\n    rows = [makeSpan([\"vlist-r\"], [vlist])];\n  }\n  var vtable = makeSpan([\"vlist-t\"], rows);\n  if (rows.length === 2) {\n    vtable.classes.push(\"vlist-t2\");\n  }\n  vtable.height = maxPos;\n  vtable.depth = -minPos;\n  return vtable;\n};\n// Glue is a concept from TeX which is a flexible space between elements in\n// either a vertical or horizontal list. In KaTeX, at least for now, it's\n// static space between elements in a horizontal layout.\nvar makeGlue = (measurement, options) => {\n  // Make an empty span for the space\n  var rule = makeSpan([\"mspace\"], [], options);\n  var size = calculateSize(measurement, options);\n  rule.style.marginRight = makeEm(size);\n  return rule;\n};\n// Takes font options, and returns the appropriate fontLookup name\nvar retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {\n  var baseFontName = \"\";\n  switch (fontFamily) {\n    case \"amsrm\":\n      baseFontName = \"AMS\";\n      break;\n    case \"textrm\":\n      baseFontName = \"Main\";\n      break;\n    case \"textsf\":\n      baseFontName = \"SansSerif\";\n      break;\n    case \"texttt\":\n      baseFontName = \"Typewriter\";\n      break;\n    default:\n      baseFontName = fontFamily;\n    // use fonts added by a plugin\n  }\n  var fontStylesName;\n  if (fontWeight === \"textbf\" && fontShape === \"textit\") {\n    fontStylesName = \"BoldItalic\";\n  } else if (fontWeight === \"textbf\") {\n    fontStylesName = \"Bold\";\n  } else if (fontWeight === \"textit\") {\n    fontStylesName = \"Italic\";\n  } else {\n    fontStylesName = \"Regular\";\n  }\n  return baseFontName + \"-\" + fontStylesName;\n};\n/**\n * Maps TeX font commands to objects containing:\n * - variant: string used for \"mathvariant\" attribute in buildMathML.js\n * - fontName: the \"style\" parameter to fontMetrics.getCharacterMetrics\n */\n// A map between tex font commands an MathML mathvariant attribute values\nvar fontMap = {\n  // styles\n  \"mathbf\": {\n    variant: \"bold\",\n    fontName: \"Main-Bold\"\n  },\n  \"mathrm\": {\n    variant: \"normal\",\n    fontName: \"Main-Regular\"\n  },\n  \"textit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathit\": {\n    variant: \"italic\",\n    fontName: \"Main-Italic\"\n  },\n  \"mathnormal\": {\n    variant: \"italic\",\n    fontName: \"Math-Italic\"\n  },\n  \"mathsfit\": {\n    variant: \"sans-serif-italic\",\n    fontName: \"SansSerif-Italic\"\n  },\n  // \"boldsymbol\" is missing because they require the use of multiple fonts:\n  // Math-BoldItalic and Main-Bold.  This is handled by a special case in\n  // makeOrd which ends up calling boldsymbol.\n  // families\n  \"mathbb\": {\n    variant: \"double-struck\",\n    fontName: \"AMS-Regular\"\n  },\n  \"mathcal\": {\n    variant: \"script\",\n    fontName: \"Caligraphic-Regular\"\n  },\n  \"mathfrak\": {\n    variant: \"fraktur\",\n    fontName: \"Fraktur-Regular\"\n  },\n  \"mathscr\": {\n    variant: \"script\",\n    fontName: \"Script-Regular\"\n  },\n  \"mathsf\": {\n    variant: \"sans-serif\",\n    fontName: \"SansSerif-Regular\"\n  },\n  \"mathtt\": {\n    variant: \"monospace\",\n    fontName: \"Typewriter-Regular\"\n  }\n};\nvar svgData = {\n  //   path, width, height\n  vec: [\"vec\", 0.471, 0.714],\n  // values from the font glyph\n  oiintSize1: [\"oiintSize1\", 0.957, 0.499],\n  // oval to overlay the integrand\n  oiintSize2: [\"oiintSize2\", 1.472, 0.659],\n  oiiintSize1: [\"oiiintSize1\", 1.304, 0.499],\n  oiiintSize2: [\"oiiintSize2\", 1.98, 0.659]\n};\nvar staticSvg = function staticSvg(value, options) {\n  // Create a span with inline SVG for the element.\n  var [pathName, width, height] = svgData[value];\n  var path = new PathNode(pathName);\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + 1000 * height,\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([\"overlay\"], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return span;\n};\n\nvar thinspace = {\n  number: 3,\n  unit: \"mu\"\n};\nvar mediumspace = {\n  number: 4,\n  unit: \"mu\"\n};\nvar thickspace = {\n  number: 5,\n  unit: \"mu\"\n};\n// Spacing relationships for display and text styles\nvar spacings = {\n  mord: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mbin: {\n    mord: mediumspace,\n    mop: mediumspace,\n    mopen: mediumspace,\n    minner: mediumspace\n  },\n  mrel: {\n    mord: thickspace,\n    mop: thickspace,\n    mopen: thickspace,\n    minner: thickspace\n  },\n  mopen: {},\n  mclose: {\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    minner: thinspace\n  },\n  mpunct: {\n    mord: thinspace,\n    mop: thinspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mclose: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  },\n  minner: {\n    mord: thinspace,\n    mop: thinspace,\n    mbin: mediumspace,\n    mrel: thickspace,\n    mopen: thinspace,\n    mpunct: thinspace,\n    minner: thinspace\n  }\n};\n// Spacing relationships for script and scriptscript styles\nvar tightSpacings = {\n  mord: {\n    mop: thinspace\n  },\n  mop: {\n    mord: thinspace,\n    mop: thinspace\n  },\n  mbin: {},\n  mrel: {},\n  mopen: {},\n  mclose: {\n    mop: thinspace\n  },\n  mpunct: {},\n  minner: {\n    mop: thinspace\n  }\n};\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nvar _functions = {};\n/**\n * All HTML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nvar _htmlGroupBuilders = {};\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nvar _mathmlGroupBuilders = {};\nfunction defineFunction(_ref) {\n  var {\n    type,\n    names,\n    props,\n    handler,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  // Set default values of functions\n  var data = {\n    type,\n    numArgs: props.numArgs,\n    argTypes: props.argTypes,\n    allowedInArgument: !!props.allowedInArgument,\n    allowedInText: !!props.allowedInText,\n    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n    numOptionalArgs: props.numOptionalArgs || 0,\n    infix: !!props.infix,\n    primitive: !!props.primitive,\n    handler\n  };\n  for (var i = 0; i < names.length; ++i) {\n    _functions[names[i]] = data;\n  }\n  if (type) {\n    if (htmlBuilder) {\n      _htmlGroupBuilders[type] = htmlBuilder;\n    }\n    if (mathmlBuilder) {\n      _mathmlGroupBuilders[type] = mathmlBuilder;\n    }\n  }\n}\n/**\n * Use this to register only the HTML and MathML builders for a function (e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders(_ref2) {\n  var {\n    type,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref2;\n  defineFunction({\n    type,\n    names: [],\n    props: {\n      numArgs: 0\n    },\n    handler() {\n      throw new Error('Should never be called.');\n    },\n    htmlBuilder,\n    mathmlBuilder\n  });\n}\nvar normalizeArgument = function normalizeArgument(arg) {\n  return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg;\n};\n// Since the corresponding buildHTML/buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nvar ordargument = function ordargument(arg) {\n  return arg.type === \"ordgroup\" ? arg.body : [arg];\n};\n\n/**\n * This file does the main work of building a domTree structure from a parse\n * tree. The entry point is the `buildHTML` function, which takes a parse tree.\n * Then, the buildExpression, buildGroup, and various groupBuilders functions\n * are called, to produce a final HTML tree.\n */\n// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)\n// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,\n// and the text before Rule 19.\nvar binLeftCanceller = new Set([\"leftmost\", \"mbin\", \"mopen\", \"mrel\", \"mop\", \"mpunct\"]);\nvar binRightCanceller = new Set([\"rightmost\", \"mrel\", \"mclose\", \"mpunct\"]);\nvar styleMap$1 = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\nvar DomEnum = {\n  mord: \"mord\",\n  mop: \"mop\",\n  mbin: \"mbin\",\n  mrel: \"mrel\",\n  mopen: \"mopen\",\n  mclose: \"mclose\",\n  mpunct: \"mpunct\",\n  minner: \"minner\"\n};\n/**\n * Take a list of nodes, build them in order, and return a list of the built\n * nodes. documentFragments are flattened into their contents, so the\n * returned list contains no fragments. `isRealGroup` is true if `expression`\n * is a real group (no atoms will be added on either side), as opposed to\n * a partial group (e.g. one created by \\color). `surrounding` is an array\n * consisting type of nodes that will be added to the left and right.\n */\nvar buildExpression$1 = function buildExpression(expression, options, isRealGroup, surrounding) {\n  if (surrounding === void 0) {\n    surrounding = [null, null];\n  }\n  // Parse expressions into `groups`.\n  var groups = [];\n  for (var i = 0; i < expression.length; i++) {\n    var output = buildGroup$1(expression[i], options);\n    if (output instanceof DocumentFragment) {\n      var children = output.children;\n      groups.push(...children);\n    } else {\n      groups.push(output);\n    }\n  }\n  // Combine consecutive domTree.symbolNodes into a single symbolNode.\n  tryCombineChars(groups);\n  // If `expression` is a partial group, let the parent handle spacings\n  // to avoid processing groups multiple times.\n  if (!isRealGroup) {\n    return groups;\n  }\n  var glueOptions = options;\n  if (expression.length === 1) {\n    var node = expression[0];\n    if (node.type === \"sizing\") {\n      glueOptions = options.havingSize(node.size);\n    } else if (node.type === \"styling\") {\n      glueOptions = options.havingStyle(styleMap$1[node.style]);\n    }\n  }\n  // Dummy spans for determining spacings between surrounding atoms.\n  // If `expression` has no atoms on the left or right, class \"leftmost\"\n  // or \"rightmost\", respectively, is used to indicate it.\n  var dummyPrev = makeSpan([surrounding[0] || \"leftmost\"], [], options);\n  var dummyNext = makeSpan([surrounding[1] || \"rightmost\"], [], options);\n  // TODO: These code assumes that a node's math class is the first element\n  // of its `classes` array. A later cleanup should ensure this, for\n  // instance by changing the signature of `makeSpan`.\n  // Before determining what spaces to insert, perform bin cancellation.\n  // Binary operators change to ordinary symbols in some contexts.\n  var isRoot = isRealGroup === \"root\";\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var prevType = prev.classes[0];\n    var type = node.classes[0];\n    if (prevType === \"mbin\" && binRightCanceller.has(type)) {\n      prev.classes[0] = \"mord\";\n    } else if (type === \"mbin\" && binLeftCanceller.has(prevType)) {\n      node.classes[0] = \"mord\";\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  _traverseNonSpaceNodes(groups, (node, prev) => {\n    var _tightSpacings$prevTy, _spacings$prevType;\n    var prevType = getTypeOfDomTree(prev);\n    var type = getTypeOfDomTree(node);\n    // 'mtight' indicates that the node is script or scriptscript style.\n    var space = prevType && type ? node.hasClass(\"mtight\") ? (_tightSpacings$prevTy = tightSpacings[prevType]) == null ? void 0 : _tightSpacings$prevTy[type] : (_spacings$prevType = spacings[prevType]) == null ? void 0 : _spacings$prevType[type] : null;\n    if (space) {\n      // Insert glue (spacing) after the `prev`.\n      return makeGlue(space, glueOptions);\n    }\n  }, {\n    node: dummyPrev\n  }, dummyNext, isRoot);\n  return groups;\n};\n// Depth-first traverse non-space `nodes`, calling `callback` with the current and\n// previous node as arguments, optionally returning a node to insert after the\n// previous node. `prev` is an object with the previous node and `insertAfter`\n// function to insert after it. `next` is a node that will be added to the right.\n// Used for bin cancellation and inserting spacings.\nvar _traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) {\n  if (next) {\n    // temporarily append the right node, if exists\n    nodes.push(next);\n  }\n  var i = 0;\n  for (; i < nodes.length; i++) {\n    var node = nodes[i];\n    var partialGroup = checkPartialGroup(node);\n    if (partialGroup) {\n      // Recursive DFS\n      // TODO(ts): make nodes a $ReadOnlyArray by returning a new array\n      _traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot);\n      continue;\n    }\n    // Ignore explicit spaces (e.g., \\;, \\,) when determining what implicit\n    // spacing should go between atoms of different classes\n    var nonspace = !node.hasClass(\"mspace\");\n    if (nonspace) {\n      var result = callback(node, prev.node);\n      if (result) {\n        if (prev.insertAfter) {\n          prev.insertAfter(result);\n        } else {\n          // insert at front\n          nodes.unshift(result);\n          i++;\n        }\n      }\n    }\n    if (nonspace) {\n      prev.node = node;\n    } else if (isRoot && node.hasClass(\"newline\")) {\n      prev.node = makeSpan([\"leftmost\"]); // treat like beginning of line\n    }\n    prev.insertAfter = (index => n => {\n      nodes.splice(index + 1, 0, n);\n      i++;\n    })(i);\n  }\n  if (next) {\n    nodes.pop();\n  }\n};\n// Check if given node is a partial group, i.e., does not affect spacing around.\nvar checkPartialGroup = function checkPartialGroup(node) {\n  if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass(\"enclosing\")) {\n    return node;\n  }\n  return null;\n};\n// Return the outermost node of a domTree.\nvar _getOutermostNode = function getOutermostNode(node, side) {\n  var partialGroup = checkPartialGroup(node);\n  if (partialGroup) {\n    var children = partialGroup.children;\n    if (children.length) {\n      if (side === \"right\") {\n        return _getOutermostNode(children[children.length - 1], \"right\");\n      } else if (side === \"left\") {\n        return _getOutermostNode(children[0], \"left\");\n      }\n    }\n  }\n  return node;\n};\n// Return math atom class (mclass) of a domTree.\n// If `side` is given, it will get the type of the outermost node at given side.\nvar getTypeOfDomTree = function getTypeOfDomTree(node, side) {\n  if (!node) {\n    return null;\n  }\n  if (side) {\n    node = _getOutermostNode(node, side);\n  }\n  // This makes a lot of assumptions as to where the type of atom\n  // appears.  We should do a better job of enforcing this.\n  var className = node.classes[0];\n  return DomEnum[className] || null;\n};\nvar makeNullDelimiter = function makeNullDelimiter(options, classes) {\n  var moreClasses = [\"nulldelimiter\"].concat(options.baseSizingClasses());\n  return makeSpan(classes.concat(moreClasses));\n};\n/**\n * buildGroup is the function that takes a group and calls the correct groupType\n * function for it. It also handles the interaction of size and style changes\n * between parents and children.\n */\nvar buildGroup$1 = function buildGroup(group, options, baseOptions) {\n  if (!group) {\n    return makeSpan();\n  }\n  if (_htmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    // TODO(ts)\n    var groupNode = _htmlGroupBuilders[group.type](group, options);\n    // If the size changed between the parent and the current group, account\n    // for that size difference.\n    if (baseOptions && options.size !== baseOptions.size) {\n      groupNode = makeSpan(options.sizingClasses(baseOptions), [groupNode], options);\n      var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n      groupNode.height *= multiplier;\n      groupNode.depth *= multiplier;\n    }\n    return groupNode;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)\n * into an unbreakable HTML node of class .base, with proper struts to\n * guarantee correct vertical extent.  `buildHTML` calls this repeatedly to\n * make up the entire expression as a sequence of unbreakable units.\n */\nfunction buildHTMLUnbreakable(children, options) {\n  // Compute height and depth of this chunk.\n  var body = makeSpan([\"base\"], children, options);\n  // Add strut, which ensures that the top of the HTML element falls at\n  // the height of the expression, and the bottom of the HTML element\n  // falls at the depth of the expression.\n  var strut = makeSpan([\"strut\"]);\n  strut.style.height = makeEm(body.height + body.depth);\n  if (body.depth) {\n    strut.style.verticalAlign = makeEm(-body.depth);\n  }\n  body.children.unshift(strut);\n  return body;\n}\n/**\n * Take an entire parse tree, and build it into an appropriate set of HTML\n * nodes.\n */\nfunction buildHTML(tree, options) {\n  // Strip off outer tag wrapper for processing below.\n  var tag = null;\n  if (tree.length === 1 && tree[0].type === \"tag\") {\n    tag = tree[0].tag;\n    tree = tree[0].body;\n  }\n  // Build the expression contained in the tree\n  var expression = buildExpression$1(tree, options, \"root\");\n  var eqnNum;\n  if (expression.length === 2 && expression[1].hasClass(\"tag\")) {\n    // An environment with automatic equation numbers, e.g. {gather}.\n    eqnNum = expression.pop();\n  }\n  var children = [];\n  // Create one base node for each chunk between potential line breaks.\n  // The TeXBook [p.173] says \"A formula will be broken only after a\n  // relation symbol like $=$ or $<$ or $\\rightarrow$, or after a binary\n  // operation symbol like $+$ or $-$ or $\\times$, where the relation or\n  // binary operation is on the ``outer level'' of the formula (i.e., not\n  // enclosed in {...} and not part of an \\over construction).\"\n  var parts = [];\n  for (var i = 0; i < expression.length; i++) {\n    parts.push(expression[i]);\n    if (expression[i].hasClass(\"mbin\") || expression[i].hasClass(\"mrel\") || expression[i].hasClass(\"allowbreak\")) {\n      // Put any post-operator glue on same line as operator.\n      // Watch for \\nobreak along the way, and stop at \\newline.\n      var nobreak = false;\n      while (i < expression.length - 1 && expression[i + 1].hasClass(\"mspace\") && !expression[i + 1].hasClass(\"newline\")) {\n        i++;\n        parts.push(expression[i]);\n        if (expression[i].hasClass(\"nobreak\")) {\n          nobreak = true;\n        }\n      }\n      // Don't allow break if \\nobreak among the post-operator glue.\n      if (!nobreak) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n    } else if (expression[i].hasClass(\"newline\")) {\n      // Write the line except the newline\n      parts.pop();\n      if (parts.length > 0) {\n        children.push(buildHTMLUnbreakable(parts, options));\n        parts = [];\n      }\n      // Put the newline at the top level\n      children.push(expression[i]);\n    }\n  }\n  if (parts.length > 0) {\n    children.push(buildHTMLUnbreakable(parts, options));\n  }\n  // Now, if there was a tag, build it too and append it as a final child.\n  var tagChild;\n  if (tag) {\n    tagChild = buildHTMLUnbreakable(buildExpression$1(tag, options, true), options);\n    tagChild.classes = [\"tag\"];\n    children.push(tagChild);\n  } else if (eqnNum) {\n    children.push(eqnNum);\n  }\n  var htmlNode = makeSpan([\"katex-html\"], children);\n  htmlNode.setAttribute(\"aria-hidden\", \"true\");\n  // Adjust the strut of the tag to be the maximum height of all children\n  // (the height of the enclosing htmlNode) for proper vertical alignment.\n  if (tagChild) {\n    var strut = tagChild.children[0];\n    strut.style.height = makeEm(htmlNode.height + htmlNode.depth);\n    if (htmlNode.depth) {\n      strut.style.verticalAlign = makeEm(-htmlNode.depth);\n    }\n  }\n  return htmlNode;\n}\n\n/**\n * These objects store data about MathML nodes. This is the MathML equivalent\n * of the types in domTree.js. Since MathML handles its own rendering, and\n * since we're mainly using MathML to improve accessibility, we don't manage\n * any of the styling state that the plain DOM nodes do.\n *\n * The `toNode` and `toMarkup` functions work similarly to how they do in\n * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.\n */\nfunction newDocumentFragment(children) {\n  return new DocumentFragment(children);\n}\n/**\n * This node represents a general purpose MathML node of any type. The\n * constructor requires the type of node to create (for example, `\"mo\"` or\n * `\"mspace\"`, corresponding to `<mo>` and `<mspace>` tags).\n */\nclass MathNode {\n  constructor(type, children, classes) {\n    this.type = type;\n    this.attributes = {};\n    this.children = children || [];\n    this.classes = classes || [];\n  }\n  /**\n   * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n   * semantic content, so this is used heavily.\n   */\n  setAttribute(name, value) {\n    this.attributes[name] = value;\n  }\n  /**\n   * Gets an attribute on a MathML node.\n   */\n  getAttribute(name) {\n    return this.attributes[name];\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        node.setAttribute(attr, this.attributes[attr]);\n      }\n    }\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n    for (var i = 0; i < this.children.length; i++) {\n      // Combine multiple TextNodes into one TextNode, to prevent\n      // screen readers from reading each as a separate word [#3995]\n      if (this.children[i] instanceof TextNode && this.children[i + 1] instanceof TextNode) {\n        var text = this.children[i].toText() + this.children[++i].toText();\n        while (this.children[i + 1] instanceof TextNode) {\n          text += this.children[++i].toText();\n        }\n        node.appendChild(new TextNode(text).toNode());\n      } else {\n        node.appendChild(this.children[i].toNode());\n      }\n    }\n    return node;\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    var markup = \"<\" + this.type;\n    // Add the attributes\n    for (var attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        markup += \" \" + attr + \"=\\\"\";\n        markup += escape(this.attributes[attr]);\n        markup += \"\\\"\";\n      }\n    }\n    if (this.classes.length > 0) {\n      markup += \" class =\\\"\" + escape(createClass(this.classes)) + \"\\\"\";\n    }\n    markup += \">\";\n    for (var i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</\" + this.type + \">\";\n    return markup;\n  }\n  /**\n   * Converts the math node into a string, similar to innerText, but escaped.\n   */\n  toText() {\n    return this.children.map(child => child.toText()).join(\"\");\n  }\n}\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n  /**\n   * Converts the text node into a DOM text node.\n   */\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n  /**\n   * Converts the text node into escaped HTML markup\n   * (representing the text itself).\n   */\n  toMarkup() {\n    return escape(this.toText());\n  }\n  /**\n   * Converts the text node into a string\n   * (representing the text itself).\n   */\n  toText() {\n    return this.text;\n  }\n}\n/**\n * This node represents a space, but may render as <mspace.../> or as text,\n * depending on the width.\n */\nclass SpaceNode {\n  /**\n   * Create a Space node with width given in CSS ems.\n   */\n  constructor(width) {\n    this.width = width;\n    // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html\n    // for a table of space-like characters.  We use Unicode\n    // representations instead of &LongNames; as it's not clear how to\n    // make the latter via document.createTextNode.\n    if (width >= 0.05555 && width <= 0.05556) {\n      this.character = \"\\u200a\"; // &VeryThinSpace;\n    } else if (width >= 0.1666 && width <= 0.1667) {\n      this.character = \"\\u2009\"; // &ThinSpace;\n    } else if (width >= 0.2222 && width <= 0.2223) {\n      this.character = \"\\u2005\"; // &MediumSpace;\n    } else if (width >= 0.2777 && width <= 0.2778) {\n      this.character = \"\\u2005\\u200a\"; // &ThickSpace;\n    } else if (width >= -0.05556 && width <= -0.05555) {\n      this.character = \"\\u200a\\u2063\"; // &NegativeVeryThinSpace;\n    } else if (width >= -0.1667 && width <= -0.1666) {\n      this.character = \"\\u2009\\u2063\"; // &NegativeThinSpace;\n    } else if (width >= -0.2223 && width <= -0.2222) {\n      this.character = \"\\u205f\\u2063\"; // &NegativeMediumSpace;\n    } else if (width >= -0.2778 && width <= -0.2777) {\n      this.character = \"\\u2005\\u2063\"; // &NegativeThickSpace;\n    } else {\n      this.character = null;\n    }\n  }\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    if (this.character) {\n      return document.createTextNode(this.character);\n    } else {\n      var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mspace\");\n      node.setAttribute(\"width\", makeEm(this.width));\n      return node;\n    }\n  }\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    if (this.character) {\n      return \"<mtext>\" + this.character + \"</mtext>\";\n    } else {\n      return \"<mspace width=\\\"\" + makeEm(this.width) + \"\\\"/>\";\n    }\n  }\n  /**\n   * Converts the math node into a string, similar to innerText.\n   */\n  toText() {\n    if (this.character) {\n      return this.character;\n    } else {\n      return \" \";\n    }\n  }\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\nvar noVariantSymbols = new Set([\"\\\\imath\", \"\\\\jmath\"]);\nvar rowLikeTypes = new Set([\"mrow\", \"mtable\"]);\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nvar makeText = function makeText(text, mode, options) {\n  if (symbols[mode][text] && symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.slice(4, 6) === \"tt\" || options.font && options.font.slice(4, 6) === \"tt\"))) {\n    text = symbols[mode][text].replace;\n  }\n  return new TextNode(text);\n};\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1.  Always returns a single node.\n */\nvar makeRow = function makeRow(body) {\n  if (body.length === 1) {\n    return body[0];\n  } else {\n    return new MathNode(\"mrow\", body);\n  }\n};\n/**\n * Returns the math variant as a string or null if none is required.\n */\nvar getVariant = function getVariant(group, options) {\n  // Handle \\text... font specifiers as best we can.\n  // MathML has a limited list of allowable mathvariant specifiers; see\n  // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt\n  if (options.fontFamily === \"texttt\") {\n    return \"monospace\";\n  } else if (options.fontFamily === \"textsf\") {\n    if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n      return \"sans-serif-bold-italic\";\n    } else if (options.fontShape === \"textit\") {\n      return \"sans-serif-italic\";\n    } else if (options.fontWeight === \"textbf\") {\n      return \"bold-sans-serif\";\n    } else {\n      return \"sans-serif\";\n    }\n  } else if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n    return \"bold-italic\";\n  } else if (options.fontShape === \"textit\") {\n    return \"italic\";\n  } else if (options.fontWeight === \"textbf\") {\n    return \"bold\";\n  }\n  var font = options.font;\n  if (!font || font === \"mathnormal\") {\n    return null;\n  }\n  var mode = group.mode;\n  if (font === \"mathit\") {\n    return \"italic\";\n  } else if (font === \"boldsymbol\") {\n    return group.type === \"textord\" ? \"bold\" : \"bold-italic\";\n  } else if (font === \"mathbf\") {\n    return \"bold\";\n  } else if (font === \"mathbb\") {\n    return \"double-struck\";\n  } else if (font === \"mathsfit\") {\n    return \"sans-serif-italic\";\n  } else if (font === \"mathfrak\") {\n    return \"fraktur\";\n  } else if (font === \"mathscr\" || font === \"mathcal\") {\n    // MathML makes no distinction between script and calligraphic\n    return \"script\";\n  } else if (font === \"mathsf\") {\n    return \"sans-serif\";\n  } else if (font === \"mathtt\") {\n    return \"monospace\";\n  }\n  var text = group.text;\n  if (noVariantSymbols.has(text)) {\n    return null;\n  }\n  if (symbols[mode][text]) {\n    var replacement = symbols[mode][text].replace;\n    if (replacement) {\n      text = replacement;\n    }\n  }\n  var fontName = fontMap[font].fontName;\n  if (getCharacterMetrics(text, fontName, mode)) {\n    return fontMap[font].variant;\n  }\n  return null;\n};\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n  if (!group) {\n    return false;\n  }\n  if (group.type === 'mi' && group.children.length === 1) {\n    var child = group.children[0];\n    return child instanceof TextNode && child.text === '.';\n  } else if (group.type === 'mo' && group.children.length === 1 && group.getAttribute('separator') === 'true' && group.getAttribute('lspace') === '0em' && group.getAttribute('rspace') === '0em') {\n    var _child = group.children[0];\n    return _child instanceof TextNode && _child.text === ',';\n  } else {\n    return false;\n  }\n}\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes.  Also combine consecutive <mtext> outputs into a single\n * <mtext> tag.\n */\nvar buildExpression = function buildExpression(expression, options, isOrdgroup) {\n  if (expression.length === 1) {\n    var group = buildGroup(expression[0], options);\n    if (isOrdgroup && group instanceof MathNode && group.type === \"mo\") {\n      // When TeX writers want to suppress spacing on an operator,\n      // they often put the operator by itself inside braces.\n      group.setAttribute(\"lspace\", \"0em\");\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    return [group];\n  }\n  var groups = [];\n  var lastGroup;\n  for (var i = 0; i < expression.length; i++) {\n    var _group = buildGroup(expression[i], options);\n    if (_group instanceof MathNode && lastGroup instanceof MathNode) {\n      // Concatenate adjacent <mtext>s\n      if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate adjacent <mn>s\n      } else if (_group.type === 'mn' && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      } else if (isNumberPunctuation(_group) && lastGroup.type === 'mn') {\n        lastGroup.children.push(..._group.children);\n        continue;\n        // Concatenate <mi>.</mi> followed by <mn>...</mn>\n      } else if (_group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n        _group.children = [...lastGroup.children, ..._group.children];\n        groups.pop();\n        // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n        // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n      } else if ((_group.type === 'msup' || _group.type === 'msub') && _group.children.length >= 1 && (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n        var base = _group.children[0];\n        if (base instanceof MathNode && base.type === 'mn') {\n          base.children = [...lastGroup.children, ...base.children];\n          groups.pop();\n        }\n        // \\not\n      } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {\n        var lastChild = lastGroup.children[0];\n        if (lastChild instanceof TextNode && lastChild.text === '\\u0338' && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {\n          var child = _group.children[0];\n          if (child instanceof TextNode && child.text.length > 0) {\n            // Overlay with combining character long solidus\n            child.text = child.text.slice(0, 1) + \"\\u0338\" + child.text.slice(1);\n            groups.pop();\n          }\n        }\n      }\n    }\n    groups.push(_group);\n    lastGroup = _group;\n  }\n  return groups;\n};\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one.  Returns a single node instead of an array.\n */\nvar buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {\n  return makeRow(buildExpression(expression, options, isOrdgroup));\n};\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nvar buildGroup = function buildGroup(group, options) {\n  if (!group) {\n    return new MathNode(\"mrow\");\n  }\n  if (_mathmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    // TODO(ts)\n    var result = _mathmlGroupBuilders[group.type](group, options);\n    // TODO(ts)\n    return result;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it. In particular, we put the elements from building the parse tree into a\n * <semantics> tag so we can also include that TeX source as an annotation.\n *\n * Note that we actually return a domTree element with a `<math>` inside it so\n * we can do appropriate styling.\n */\nfunction buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) {\n  var expression = buildExpression(tree, options);\n  // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes\n  // and add spacing nodes. This is necessary only adjacent to math operators\n  // like \\sin or \\lim or to subsup elements that contain math operators.\n  // MathML takes care of the other spacing issues.\n  // Wrap up the expression in an mrow so it is presented in the semantics\n  // tag correctly, unless it's a single <mrow> or <mtable>.\n  var wrapper;\n  if (expression.length === 1 && expression[0] instanceof MathNode && rowLikeTypes.has(expression[0].type)) {\n    wrapper = expression[0];\n  } else {\n    wrapper = new MathNode(\"mrow\", expression);\n  }\n  // Build a TeX annotation of the source\n  var annotation = new MathNode(\"annotation\", [new TextNode(texExpression)]);\n  annotation.setAttribute(\"encoding\", \"application/x-tex\");\n  var semantics = new MathNode(\"semantics\", [wrapper, annotation]);\n  var math = new MathNode(\"math\", [semantics]);\n  math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n  if (isDisplayMode) {\n    math.setAttribute(\"display\", \"block\");\n  }\n  // You can't style <math> nodes, so we wrap the node in a span.\n  // NOTE: The span class is not typed to have <math> nodes as children, and\n  // we don't want to make the children type more generic since the children\n  // of span are expected to have more fields in `buildHtml` contexts.\n  var wrapperClass = forMathmlOnly ? \"katex\" : \"katex-mathml\";\n  // TODO(ts)\n  return makeSpan([wrapperClass], [math]);\n}\n\n/**\n * This file contains information about the options that the Parser carries\n * around with it while parsing. Data is held in an `Options` object, and when\n * recursing, a new `Options` object can be created with the `.with*` and\n * `.reset` functions.\n */\nvar sizeStyleMap = [\n// Each element contains [textsize, scriptsize, scriptscriptsize].\n// The size mappings are taken from TeX with \\normalsize=10pt.\n[1, 1, 1],\n// size1: [5, 5, 5]              \\tiny\n[2, 1, 1],\n// size2: [6, 5, 5]\n[3, 1, 1],\n// size3: [7, 5, 5]              \\scriptsize\n[4, 2, 1],\n// size4: [8, 6, 5]              \\footnotesize\n[5, 2, 1],\n// size5: [9, 6, 5]              \\small\n[6, 3, 1],\n// size6: [10, 7, 5]             \\normalsize\n[7, 4, 2],\n// size7: [12, 8, 6]             \\large\n[8, 6, 3],\n// size8: [14.4, 10, 7]          \\Large\n[9, 7, 6],\n// size9: [17.28, 12, 10]        \\LARGE\n[10, 8, 7],\n// size10: [20.74, 14.4, 12]     \\huge\n[11, 10, 9] // size11: [24.88, 20.74, 17.28] \\HUGE\n];\nvar sizeMultipliers = [\n// fontMetrics.js:getGlobalMetrics also uses size indexes, so if\n// you change size indexes, change that function.\n0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];\nvar sizeAtStyle = function sizeAtStyle(size, style) {\n  return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];\n};\n/**\n * This is the main options class. It contains the current style, size, color,\n * and font.\n *\n * Options objects should not be modified. To create a new Options with\n * different properties, call a `.having*` method.\n */\nclass Options {\n  constructor(data) {\n    this.style = data.style;\n    this.color = data.color;\n    this.size = data.size || Options.BASESIZE;\n    this.textSize = data.textSize || this.size;\n    this.phantom = !!data.phantom;\n    this.font = data.font || \"\";\n    this.fontFamily = data.fontFamily || \"\";\n    this.fontWeight = data.fontWeight || '';\n    this.fontShape = data.fontShape || '';\n    this.sizeMultiplier = sizeMultipliers[this.size - 1];\n    this.maxSize = data.maxSize;\n    this.minRuleThickness = data.minRuleThickness;\n    this._fontMetrics = undefined;\n  }\n  /**\n   * Returns a new options object with the same properties as \"this\".  Properties\n   * from \"extension\" will be copied to the new options object.\n   */\n  extend(extension) {\n    var data = {\n      style: this.style,\n      size: this.size,\n      textSize: this.textSize,\n      color: this.color,\n      phantom: this.phantom,\n      font: this.font,\n      fontFamily: this.fontFamily,\n      fontWeight: this.fontWeight,\n      fontShape: this.fontShape,\n      maxSize: this.maxSize,\n      minRuleThickness: this.minRuleThickness\n    };\n    Object.assign(data, extension);\n    return new Options(data);\n  }\n  /**\n   * Return an options object with the given style. If `this.style === style`,\n   * returns `this`.\n   */\n  havingStyle(style) {\n    if (this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: sizeAtStyle(this.textSize, style)\n      });\n    }\n  }\n  /**\n   * Return an options object with a cramped version of the current style. If\n   * the current style is cramped, returns `this`.\n   */\n  havingCrampedStyle() {\n    return this.havingStyle(this.style.cramp());\n  }\n  /**\n   * Return an options object with the given size and in at least `\\textstyle`.\n   * Returns `this` if appropriate.\n   */\n  havingSize(size) {\n    if (this.size === size && this.textSize === size) {\n      return this;\n    } else {\n      return this.extend({\n        style: this.style.text(),\n        size: size,\n        textSize: size,\n        sizeMultiplier: sizeMultipliers[size - 1]\n      });\n    }\n  }\n  /**\n   * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,\n   * changes to at least `\\textstyle`.\n   */\n  havingBaseStyle(style) {\n    style = style || this.style.text();\n    var wantSize = sizeAtStyle(Options.BASESIZE, style);\n    if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {\n      return this;\n    } else {\n      return this.extend({\n        style: style,\n        size: wantSize\n      });\n    }\n  }\n  /**\n   * Remove the effect of sizing changes such as \\Huge.\n   * Keep the effect of the current style, such as \\scriptstyle.\n   */\n  havingBaseSizing() {\n    var size;\n    switch (this.style.id) {\n      case 4:\n      case 5:\n        size = 3; // normalsize in scriptstyle\n        break;\n      case 6:\n      case 7:\n        size = 1; // normalsize in scriptscriptstyle\n        break;\n      default:\n        size = 6;\n      // normalsize in textstyle or displaystyle\n    }\n    return this.extend({\n      style: this.style.text(),\n      size: size\n    });\n  }\n  /**\n   * Create a new options object with the given color.\n   */\n  withColor(color) {\n    return this.extend({\n      color: color\n    });\n  }\n  /**\n   * Create a new options object with \"phantom\" set to true.\n   */\n  withPhantom() {\n    return this.extend({\n      phantom: true\n    });\n  }\n  /**\n   * Creates a new options object with the given math font or old text font.\n   * @type {[type]}\n   */\n  withFont(font) {\n    return this.extend({\n      font\n    });\n  }\n  /**\n   * Create a new options objects with the given fontFamily.\n   */\n  withTextFontFamily(fontFamily) {\n    return this.extend({\n      fontFamily,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontWeight(fontWeight) {\n    return this.extend({\n      fontWeight,\n      font: \"\"\n    });\n  }\n  /**\n   * Creates a new options object with the given font weight\n   */\n  withTextFontShape(fontShape) {\n    return this.extend({\n      fontShape,\n      font: \"\"\n    });\n  }\n  /**\n   * Return the CSS sizing classes required to switch from enclosing options\n   * `oldOptions` to `this`. Returns an array of classes.\n   */\n  sizingClasses(oldOptions) {\n    if (oldOptions.size !== this.size) {\n      return [\"sizing\", \"reset-size\" + oldOptions.size, \"size\" + this.size];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the CSS sizing classes required to switch to the base size. Like\n   * `this.havingSize(BASESIZE).sizingClasses(this)`.\n   */\n  baseSizingClasses() {\n    if (this.size !== Options.BASESIZE) {\n      return [\"sizing\", \"reset-size\" + this.size, \"size\" + Options.BASESIZE];\n    } else {\n      return [];\n    }\n  }\n  /**\n   * Return the font metrics for this size.\n   */\n  fontMetrics() {\n    if (!this._fontMetrics) {\n      this._fontMetrics = getGlobalMetrics(this.size);\n    }\n    return this._fontMetrics;\n  }\n  /**\n   * Gets the CSS color of the current options object\n   */\n  getColor() {\n    if (this.phantom) {\n      return \"transparent\";\n    } else {\n      return this.color;\n    }\n  }\n}\n// A font family applies to a group of fonts (i.e. SansSerif), while a font\n// represents a specific font (i.e. SansSerif Bold).\n// See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n/**\n * The base size index.\n */\nOptions.BASESIZE = 6;\n\nvar optionsFromSettings = function optionsFromSettings(settings) {\n  return new Options({\n    style: settings.displayMode ? Style$1.DISPLAY : Style$1.TEXT,\n    maxSize: settings.maxSize,\n    minRuleThickness: settings.minRuleThickness\n  });\n};\nvar displayWrap = function displayWrap(node, settings) {\n  if (settings.displayMode) {\n    var classes = [\"katex-display\"];\n    if (settings.leqno) {\n      classes.push(\"leqno\");\n    }\n    if (settings.fleqn) {\n      classes.push(\"fleqn\");\n    }\n    node = makeSpan(classes, [node]);\n  }\n  return node;\n};\nvar buildTree = function buildTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var katexNode;\n  if (settings.output === \"mathml\") {\n    return buildMathML(tree, expression, options, settings.displayMode, true);\n  } else if (settings.output === \"html\") {\n    var htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [htmlNode]);\n  } else {\n    var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false);\n    var _htmlNode = buildHTML(tree, options);\n    katexNode = makeSpan([\"katex\"], [mathMLNode, _htmlNode]);\n  }\n  return displayWrap(katexNode, settings);\n};\nvar buildHTMLTree = function buildHTMLTree(tree, expression, settings) {\n  var options = optionsFromSettings(settings);\n  var htmlNode = buildHTML(tree, options);\n  var katexNode = makeSpan([\"katex\"], [htmlNode]);\n  return displayWrap(katexNode, settings);\n};\n\n/**\n * This file provides support to buildMathML.js and buildHTML.js\n * for stretchy wide elements rendered from SVG files\n * and other CSS trickery.\n */\nvar stretchyCodePoint = {\n  widehat: \"^\",\n  widecheck: \"ˇ\",\n  widetilde: \"~\",\n  utilde: \"~\",\n  overleftarrow: \"\\u2190\",\n  underleftarrow: \"\\u2190\",\n  xleftarrow: \"\\u2190\",\n  overrightarrow: \"\\u2192\",\n  underrightarrow: \"\\u2192\",\n  xrightarrow: \"\\u2192\",\n  underbrace: \"\\u23df\",\n  overbrace: \"\\u23de\",\n  underbracket: \"\\u23b5\",\n  overbracket: \"\\u23b4\",\n  overgroup: \"\\u23e0\",\n  undergroup: \"\\u23e1\",\n  overleftrightarrow: \"\\u2194\",\n  underleftrightarrow: \"\\u2194\",\n  xleftrightarrow: \"\\u2194\",\n  Overrightarrow: \"\\u21d2\",\n  xRightarrow: \"\\u21d2\",\n  overleftharpoon: \"\\u21bc\",\n  xleftharpoonup: \"\\u21bc\",\n  overrightharpoon: \"\\u21c0\",\n  xrightharpoonup: \"\\u21c0\",\n  xLeftarrow: \"\\u21d0\",\n  xLeftrightarrow: \"\\u21d4\",\n  xhookleftarrow: \"\\u21a9\",\n  xhookrightarrow: \"\\u21aa\",\n  xmapsto: \"\\u21a6\",\n  xrightharpoondown: \"\\u21c1\",\n  xleftharpoondown: \"\\u21bd\",\n  xrightleftharpoons: \"\\u21cc\",\n  xleftrightharpoons: \"\\u21cb\",\n  xtwoheadleftarrow: \"\\u219e\",\n  xtwoheadrightarrow: \"\\u21a0\",\n  xlongequal: \"=\",\n  xtofrom: \"\\u21c4\",\n  xrightleftarrows: \"\\u21c4\",\n  xrightequilibrium: \"\\u21cc\",\n  // Not a perfect match.\n  xleftequilibrium: \"\\u21cb\",\n  // None better available.\n  \"\\\\cdrightarrow\": \"\\u2192\",\n  \"\\\\cdleftarrow\": \"\\u2190\",\n  \"\\\\cdlongequal\": \"=\"\n};\nvar stretchyMathML = function stretchyMathML(label) {\n  var node = new MathNode(\"mo\", [new TextNode(stretchyCodePoint[label.replace(/^\\\\/, '')])]);\n  node.setAttribute(\"stretchy\", \"true\");\n  return node;\n};\n// Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.\n// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)\n// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)\n// Licensed under the SIL Open Font License, Version 1.1.\n// See \\nhttp://scripts.sil.org/OFL\n// Very Long SVGs\n//    Many of the KaTeX stretchy wide elements use a long SVG image and an\n//    overflow: hidden tactic to achieve a stretchy image while avoiding\n//    distortion of arrowheads or brace corners.\n//    The SVG typically contains a very long (400 em) arrow.\n//    The SVG is in a container span that has overflow: hidden, so the span\n//    acts like a window that exposes only part of the  SVG.\n//    The SVG always has a longer, thinner aspect ratio than the container span.\n//    After the SVG fills 100% of the height of the container span,\n//    there is a long arrow shaft left over. That left-over shaft is not shown.\n//    Instead, it is sliced off because the span's CSS has overflow: hidden.\n//    Thus, the reader sees an arrow that matches the subject matter width\n//    without distortion.\n//    Some functions, such as \\cancel, need to vary their aspect ratio. These\n//    functions do not get the overflow SVG treatment.\n// In the katexImagesData object just below, the dimensions all\n// correspond to path geometry inside the relevant SVG.\n// For example, \\overrightarrow uses the same arrowhead as glyph U+2192\n// from the KaTeX Main font. The scaling factor is 1000.\n// That is, inside the font, that arrowhead is 522 units tall, which\n// corresponds to 0.522 em inside the document.\nvar katexImagesData = {\n  //   path(s), minWidth, height, align\n  overrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  overleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  underrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n  underleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n  xrightarrow: [[\"rightarrow\"], 1.469, 522, \"xMaxYMin\"],\n  \"\\\\cdrightarrow\": [[\"rightarrow\"], 3.0, 522, \"xMaxYMin\"],\n  // CD minwwidth2.5pc\n  xleftarrow: [[\"leftarrow\"], 1.469, 522, \"xMinYMin\"],\n  \"\\\\cdleftarrow\": [[\"leftarrow\"], 3.0, 522, \"xMinYMin\"],\n  Overrightarrow: [[\"doublerightarrow\"], 0.888, 560, \"xMaxYMin\"],\n  xRightarrow: [[\"doublerightarrow\"], 1.526, 560, \"xMaxYMin\"],\n  xLeftarrow: [[\"doubleleftarrow\"], 1.526, 560, \"xMinYMin\"],\n  overleftharpoon: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoonup: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n  xleftharpoondown: [[\"leftharpoondown\"], 0.888, 522, \"xMinYMin\"],\n  overrightharpoon: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoonup: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n  xrightharpoondown: [[\"rightharpoondown\"], 0.888, 522, \"xMaxYMin\"],\n  xlongequal: [[\"longequal\"], 0.888, 334, \"xMinYMin\"],\n  \"\\\\cdlongequal\": [[\"longequal\"], 3.0, 334, \"xMinYMin\"],\n  xtwoheadleftarrow: [[\"twoheadleftarrow\"], 0.888, 334, \"xMinYMin\"],\n  xtwoheadrightarrow: [[\"twoheadrightarrow\"], 0.888, 334, \"xMaxYMin\"],\n  overleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  overbrace: [[\"leftbrace\", \"midbrace\", \"rightbrace\"], 1.6, 548],\n  underbrace: [[\"leftbraceunder\", \"midbraceunder\", \"rightbraceunder\"], 1.6, 548],\n  underleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n  xleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 1.75, 522],\n  xLeftrightarrow: [[\"doubleleftarrow\", \"doublerightarrow\"], 1.75, 560],\n  xrightleftharpoons: [[\"leftharpoondownplus\", \"rightharpoonplus\"], 1.75, 716],\n  xleftrightharpoons: [[\"leftharpoonplus\", \"rightharpoondownplus\"], 1.75, 716],\n  xhookleftarrow: [[\"leftarrow\", \"righthook\"], 1.08, 522],\n  xhookrightarrow: [[\"lefthook\", \"rightarrow\"], 1.08, 522],\n  overlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  underlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n  overbracket: [[\"leftbracketover\", \"rightbracketover\"], 1.6, 440],\n  underbracket: [[\"leftbracketunder\", \"rightbracketunder\"], 1.6, 410],\n  overgroup: [[\"leftgroup\", \"rightgroup\"], 0.888, 342],\n  undergroup: [[\"leftgroupunder\", \"rightgroupunder\"], 0.888, 342],\n  xmapsto: [[\"leftmapsto\", \"rightarrow\"], 1.5, 522],\n  xtofrom: [[\"leftToFrom\", \"rightToFrom\"], 1.75, 528],\n  // The next three arrows are from the mhchem package.\n  // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the\n  // document as \\xrightarrow or \\xrightleftharpoons. Those have\n  // min-length = 1.75em, so we set min-length on these next three to match.\n  xrightleftarrows: [[\"baraboveleftarrow\", \"rightarrowabovebar\"], 1.75, 901],\n  xrightequilibrium: [[\"baraboveshortleftharpoon\", \"rightharpoonaboveshortbar\"], 1.75, 716],\n  xleftequilibrium: [[\"shortbaraboveleftharpoon\", \"shortrightharpoonabovebar\"], 1.75, 716]\n};\nvar wideAccentLabels = new Set([\"widehat\", \"widecheck\", \"widetilde\", \"utilde\"]);\nvar stretchySvg = function stretchySvg(group, options) {\n  // Create a span with inline SVG for the element.\n  function buildSvgSpan_() {\n    var viewBoxWidth = 400000; // default\n    var label = group.label.slice(1);\n    if (wideAccentLabels.has(label)) {\n      // Each type in the `if` statement corresponds to one of the ParseNode\n      // types below. This narrowing is required to access `grp.base`.\n      // TODO(ts)\n      var grp = group;\n      // There are four SVG images available for each function.\n      // Choose a taller image when there are more characters.\n      var numChars = grp.base.type === \"ordgroup\" ? grp.base.body.length : 1;\n      var viewBoxHeight;\n      var pathName;\n      var _height;\n      if (numChars > 5) {\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxHeight = 420;\n          viewBoxWidth = 2364;\n          _height = 0.42;\n          pathName = label + \"4\";\n        } else {\n          viewBoxHeight = 312;\n          viewBoxWidth = 2340;\n          _height = 0.34;\n          pathName = \"tilde4\";\n        }\n      } else {\n        var imgIndex = [1, 1, 2, 2, 3, 3][numChars];\n        if (label === \"widehat\" || label === \"widecheck\") {\n          viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];\n          viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];\n          _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];\n          pathName = label + imgIndex;\n        } else {\n          viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];\n          viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];\n          _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];\n          pathName = \"tilde\" + imgIndex;\n        }\n      }\n      var path = new PathNode(pathName);\n      var svgNode = new SvgNode([path], {\n        \"width\": \"100%\",\n        \"height\": makeEm(_height),\n        \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight,\n        \"preserveAspectRatio\": \"none\"\n      });\n      return {\n        span: makeSvgSpan([], [svgNode], options),\n        minWidth: 0,\n        height: _height\n      };\n    } else {\n      var spans = [];\n      var data = katexImagesData[label];\n      var [paths, _minWidth, _viewBoxHeight] = data;\n      var _height2 = _viewBoxHeight / 1000;\n      var numSvgChildren = paths.length;\n      var widthClasses;\n      var aligns;\n      if (numSvgChildren === 1) {\n        // TODO(ts): All these cases must be of the 4-tuple type.\n        var align1 = data[3];\n        widthClasses = [\"hide-tail\"];\n        aligns = [align1];\n      } else if (numSvgChildren === 2) {\n        widthClasses = [\"halfarrow-left\", \"halfarrow-right\"];\n        aligns = [\"xMinYMin\", \"xMaxYMin\"];\n      } else if (numSvgChildren === 3) {\n        widthClasses = [\"brace-left\", \"brace-center\", \"brace-right\"];\n        aligns = [\"xMinYMin\", \"xMidYMin\", \"xMaxYMin\"];\n      } else {\n        throw new Error(\"Correct katexImagesData or update code here to support\\n                    \" + numSvgChildren + \" children.\");\n      }\n      for (var i = 0; i < numSvgChildren; i++) {\n        var _path = new PathNode(paths[i]);\n        var _svgNode = new SvgNode([_path], {\n          \"width\": \"400em\",\n          \"height\": makeEm(_height2),\n          \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + _viewBoxHeight,\n          \"preserveAspectRatio\": aligns[i] + \" slice\"\n        });\n        var _span = makeSvgSpan([widthClasses[i]], [_svgNode], options);\n        if (numSvgChildren === 1) {\n          return {\n            span: _span,\n            minWidth: _minWidth,\n            height: _height2\n          };\n        } else {\n          _span.style.height = makeEm(_height2);\n          spans.push(_span);\n        }\n      }\n      return {\n        span: makeSpan([\"stretchy\"], spans, options),\n        minWidth: _minWidth,\n        height: _height2\n      };\n    }\n  } // buildSvgSpan_()\n  var {\n    span,\n    minWidth,\n    height\n  } = buildSvgSpan_();\n  // Note that we are returning span.depth = 0.\n  // Any adjustments relative to the baseline must be done in buildHTML.\n  span.height = height;\n  span.style.height = makeEm(height);\n  if (minWidth > 0) {\n    span.style.minWidth = makeEm(minWidth);\n  }\n  return span;\n};\nvar stretchyEnclose = function stretchyEnclose(inner, label, topPad, bottomPad, options) {\n  // Return an image span for \\cancel, \\bcancel, \\xcancel, \\fbox, or \\angl\n  var img;\n  var totalHeight = inner.height + inner.depth + topPad + bottomPad;\n  if (/fbox|color|angl/.test(label)) {\n    img = makeSpan([\"stretchy\", label], [], options);\n    if (label === \"fbox\") {\n      var color = options.color && options.getColor();\n      if (color) {\n        img.style.borderColor = color;\n      }\n    }\n  } else {\n    // \\cancel, \\bcancel, or \\xcancel\n    // Since \\cancel's SVG is inline and it omits the viewBox attribute,\n    // its stroke-width will not vary with span area.\n    var lines = [];\n    if (/^[bx]cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"0\",\n        \"x2\": \"100%\",\n        \"y2\": \"100%\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    if (/^x?cancel$/.test(label)) {\n      lines.push(new LineNode({\n        \"x1\": \"0\",\n        \"y1\": \"100%\",\n        \"x2\": \"100%\",\n        \"y2\": \"0\",\n        \"stroke-width\": \"0.046em\"\n      }));\n    }\n    var svgNode = new SvgNode(lines, {\n      \"width\": \"100%\",\n      \"height\": makeEm(totalHeight)\n    });\n    img = makeSvgSpan([], [svgNode], options);\n  }\n  img.height = totalHeight;\n  img.style.height = makeEm(totalHeight);\n  return img;\n};\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n  if (!node || node.type !== type) {\n    throw new Error(\"Expected node of type \" + type + \", but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return node;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n  var typedNode = checkSymbolNodeType(node);\n  if (!typedNode) {\n    throw new Error(\"Expected node of symbol group type, but got \" + (node ? \"node of type \" + node.type : String(node)));\n  }\n  return typedNode;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n  if (node && (node.type === \"atom\" || NON_ATOMS.hasOwnProperty(node.type))) {\n    return node;\n  }\n  return null;\n}\n\nvar getBaseSymbol = group => {\n  if (group instanceof SymbolNode) {\n    return group;\n  }\n  if (hasHtmlDomChildren(group) && group.children.length === 1) {\n    return getBaseSymbol(group.children[0]);\n  }\n};\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"accent\", but\n// also \"supsub\" since an accent can affect super/subscripting.\nvar htmlBuilder$a = (grp, options) => {\n  // Accents are handled in the TeXbook pg. 443, rule 12.\n  var base;\n  var group;\n  var supSubGroup;\n  if (grp && grp.type === \"supsub\") {\n    // If our base is a character box, and we have superscripts and\n    // subscripts, the supsub will defer to us. In particular, we want\n    // to attach the superscripts and subscripts to the inner body (so\n    // that the position of the superscripts and subscripts won't be\n    // affected by the height of the accent). We accomplish this by\n    // sticking the base of the accent into the base of the supsub, and\n    // rendering that, while keeping track of where the accent is.\n    // The real accent group is the base of the supsub group\n    group = assertNodeType(grp.base, \"accent\");\n    // The character box is the base of the accent group\n    base = group.base;\n    // Stick the character box into the base of the supsub group\n    grp.base = base;\n    // Rerender the supsub group with its new base, and store that\n    // result.\n    supSubGroup = assertSpan(buildGroup$1(grp, options));\n    // reset original base\n    grp.base = group;\n  } else {\n    group = assertNodeType(grp, \"accent\");\n    base = group.base;\n  }\n  // Build the base group\n  var body = buildGroup$1(base, options.havingCrampedStyle());\n  // Does the accent need to shift for the skew of a character?\n  var mustShift = group.isShifty && isCharacterBox(base);\n  // Calculate the skew of the accent. This is based on the line \"If the\n  // nucleus is not a single character, let s = 0; otherwise set s to the\n  // kern amount for the nucleus followed by the \\skewchar of its font.\"\n  // Note that our skew metrics are just the kern between each character\n  // and the skewchar.\n  var skew = 0;\n  if (mustShift) {\n    var _getBaseSymbol$skew, _getBaseSymbol;\n    // Read the skew from the rendered base symbol.\n    // This preserves font metrics from font wrappers like \\mathbb.\n    skew = (_getBaseSymbol$skew = (_getBaseSymbol = getBaseSymbol(body)) == null ? void 0 : _getBaseSymbol.skew) != null ? _getBaseSymbol$skew : 0;\n  }\n  var accentBelow = group.label === \"\\\\c\";\n  // calculate the amount of space between the body and the accent\n  var clearance = accentBelow ? body.height + body.depth : Math.min(body.height, options.fontMetrics().xHeight);\n  // Build the accent\n  var accentBody;\n  if (!group.isStretchy) {\n    var accent;\n    var width;\n    if (group.label === \"\\\\vec\") {\n      // Before version 0.9, \\vec used the combining font glyph U+20D7.\n      // But browsers, especially Safari, are not consistent in how they\n      // render combining characters when not preceded by a character.\n      // So now we use an SVG.\n      // If Safari reforms, we should consider reverting to the glyph.\n      accent = staticSvg(\"vec\", options);\n      width = svgData.vec[1];\n    } else {\n      accent = makeOrd({\n        type: \"textord\",\n        mode: group.mode,\n        text: group.label\n      }, options, \"textord\");\n      accent = assertSymbolDomNode(accent);\n      // Remove the italic correction of the accent, because it only serves to\n      // shift the accent over to a place we don't want.\n      accent.italic = 0;\n      width = accent.width;\n      if (accentBelow) {\n        clearance += accent.depth;\n      }\n    }\n    accentBody = makeSpan([\"accent-body\"], [accent]);\n    // \"Full\" accents expand the width of the resulting symbol to be\n    // at least the width of the accent, and overlap directly onto the\n    // character without any vertical offset.\n    var accentFull = group.label === \"\\\\textcircled\";\n    if (accentFull) {\n      accentBody.classes.push('accent-full');\n      clearance = body.height;\n    }\n    // Shift the accent over by the skew.\n    var left = skew;\n    // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`\n    // so that the accent doesn't contribute to the bounding box.\n    // We need to shift the character by its width (effectively half\n    // its width) to compensate.\n    if (!accentFull) {\n      left -= width / 2;\n    }\n    accentBody.style.left = makeEm(left);\n    // \\textcircled uses the \\bigcirc glyph, so it needs some\n    // vertical adjustment to match LaTeX.\n    if (group.label === \"\\\\textcircled\") {\n      accentBody.style.top = \".2em\";\n    }\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: -clearance\n      }, {\n        type: \"elem\",\n        elem: accentBody\n      }]\n    });\n  } else {\n    accentBody = stretchySvg(group, options);\n    accentBody = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"],\n        wrapperStyle: skew > 0 ? {\n          width: \"calc(100% - \" + makeEm(2 * skew) + \")\",\n          marginLeft: makeEm(2 * skew)\n        } : undefined\n      }]\n    });\n  }\n  var accentWrap = makeSpan([\"mord\", \"accent\"], [accentBody], options);\n  if (supSubGroup) {\n    // Here, we replace the \"base\" child of the supsub with our newly\n    // generated accent.\n    supSubGroup.children[0] = accentWrap;\n    // Since we don't rerun the height calculation after replacing the\n    // accent, we manually recalculate height.\n    supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height);\n    // Accents should always be ords, even when their innards are not.\n    supSubGroup.classes[0] = \"mord\";\n    return supSubGroup;\n  } else {\n    return accentWrap;\n  }\n};\nvar mathmlBuilder$9 = (group, options) => {\n  var accentNode = group.isStretchy ? stretchyMathML(group.label) : new MathNode(\"mo\", [makeText(group.label, group.mode)]);\n  var node = new MathNode(\"mover\", [buildGroup(group.base, options), accentNode]);\n  node.setAttribute(\"accent\", \"true\");\n  return node;\n};\nvar NON_STRETCHY_ACCENT_REGEX = new RegExp([\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\"].map(accent => \"\\\\\" + accent).join(\"|\"));\n// Accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\", \"\\\\widecheck\", \"\\\\widehat\", \"\\\\widetilde\", \"\\\\overrightarrow\", \"\\\\overleftarrow\", \"\\\\Overrightarrow\", \"\\\\overleftrightarrow\", \"\\\\overgroup\", \"\\\\overlinesegment\", \"\\\\overleftharpoon\", \"\\\\overrightharpoon\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (context, args) => {\n    var base = normalizeArgument(args[0]);\n    var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);\n    var isShifty = !isStretchy || context.funcName === \"\\\\widehat\" || context.funcName === \"\\\\widetilde\" || context.funcName === \"\\\\widecheck\";\n    return {\n      type: \"accent\",\n      mode: context.parser.mode,\n      label: context.funcName,\n      isStretchy: isStretchy,\n      isShifty: isShifty,\n      base: base\n    };\n  },\n  htmlBuilder: htmlBuilder$a,\n  mathmlBuilder: mathmlBuilder$9\n});\n// Text-mode accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\c\", \"\\\\r\", \"\\\\H\", \"\\\\v\", \"\\\\textcircled\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    // unless in strict mode\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    var base = args[0];\n    var mode = context.parser.mode;\n    if (mode === \"math\") {\n      context.parser.settings.reportNonstrict(\"mathVsTextAccents\", \"LaTeX's accent \" + context.funcName + \" works only in text mode\");\n      mode = \"text\";\n    }\n    return {\n      type: \"accent\",\n      mode: mode,\n      label: context.funcName,\n      isStretchy: false,\n      isShifty: true,\n      base: base\n    };\n  },\n  htmlBuilder: htmlBuilder$a,\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"accentUnder\",\n  names: [\"\\\\underleftarrow\", \"\\\\underrightarrow\", \"\\\\underleftrightarrow\", \"\\\\undergroup\", \"\\\\underlinesegment\", \"\\\\utilde\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var base = args[0];\n    return {\n      type: \"accentUnder\",\n      mode: parser.mode,\n      label: funcName,\n      base: base\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // Treat under accents much like underlines.\n    var innerGroup = buildGroup$1(group.base, options);\n    var accentBody = stretchySvg(group, options);\n    var kern = group.label === \"\\\\utilde\" ? 0.12 : 0;\n    // Generate the vlist, with the appropriate kerns\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"elem\",\n        elem: accentBody,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: kern\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"accentunder\"], [vlist], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var accentNode = stretchyMathML(group.label);\n    var node = new MathNode(\"munder\", [buildGroup(group.base, options), accentNode]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// Helper function\nvar paddedNode = group => {\n  var node = new MathNode(\"mpadded\", group ? [group] : []);\n  node.setAttribute(\"width\", \"+0.6em\");\n  node.setAttribute(\"lspace\", \"0.3em\");\n  return node;\n};\n// Stretchy arrows with an optional argument\ndefineFunction({\n  type: \"xArrow\",\n  names: [\"\\\\xleftarrow\", \"\\\\xrightarrow\", \"\\\\xLeftarrow\", \"\\\\xRightarrow\", \"\\\\xleftrightarrow\", \"\\\\xLeftrightarrow\", \"\\\\xhookleftarrow\", \"\\\\xhookrightarrow\", \"\\\\xmapsto\", \"\\\\xrightharpoondown\", \"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\", \"\\\\xleftharpoonup\", \"\\\\xrightleftharpoons\", \"\\\\xleftrightharpoons\", \"\\\\xlongequal\", \"\\\\xtwoheadrightarrow\", \"\\\\xtwoheadleftarrow\", \"\\\\xtofrom\",\n  // The next 3 functions are here to support the mhchem extension.\n  // Direct use of these functions is discouraged and may break someday.\n  \"\\\\xrightleftarrows\", \"\\\\xrightequilibrium\", \"\\\\xleftequilibrium\",\n  // The next 3 functions are here only to support the {CD} environment.\n  \"\\\\\\\\cdrightarrow\", \"\\\\\\\\cdleftarrow\", \"\\\\\\\\cdlongequal\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"xArrow\",\n      mode: parser.mode,\n      label: funcName,\n      body: args[0],\n      below: optArgs[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var style = options.style;\n    // Build the argument groups in the appropriate style.\n    // Ref: amsmath.dtx:   \\hbox{$\\scriptstyle\\mkern#3mu{#6}\\mkern#4mu$}%\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    var newOptions = options.havingStyle(style.sup());\n    var upperGroup = wrapFragment(buildGroup$1(group.body, newOptions, options), options);\n    var arrowPrefix = group.label.slice(0, 2) === \"\\\\x\" ? \"x\" : \"cd\";\n    upperGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    var lowerGroup;\n    if (group.below) {\n      // Build the lower group\n      newOptions = options.havingStyle(style.sub());\n      lowerGroup = wrapFragment(buildGroup$1(group.below, newOptions, options), options);\n      lowerGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n    }\n    var arrowBody = stretchySvg(group, options);\n    // Re shift: Note that stretchySvg returned arrowBody.depth = 0.\n    // The point we want on the math axis is at 0.5 * arrowBody.height.\n    var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height;\n    // 2 mu kern. Ref: amsmath.dtx: #7\\if0#2\\else\\mkern#2mu\\fi\n    var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu\n    if (upperGroup.depth > 0.25 || group.label === \"\\\\xleftequilibrium\") {\n      upperShift -= upperGroup.depth; // shift up if depth encroaches\n    }\n    // Generate the vlist\n    var vlist;\n    if (lowerGroup) {\n      var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift\n        }, {\n          type: \"elem\",\n          elem: lowerGroup,\n          shift: lowerShift\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: upperGroup,\n          shift: upperShift\n        }, {\n          type: \"elem\",\n          elem: arrowBody,\n          shift: arrowShift\n        }]\n      });\n    }\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n    return makeSpan([\"mrel\", \"x-arrow\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var arrowNode = stretchyMathML(group.label);\n    arrowNode.setAttribute(\"minsize\", group.label.charAt(0) === \"x\" ? \"1.75em\" : \"3.0em\");\n    var node;\n    if (group.body) {\n      var upperNode = paddedNode(buildGroup(group.body, options));\n      if (group.below) {\n        var lowerNode = paddedNode(buildGroup(group.below, options));\n        node = new MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n      } else {\n        node = new MathNode(\"mover\", [arrowNode, upperNode]);\n      }\n    } else if (group.below) {\n      var _lowerNode = paddedNode(buildGroup(group.below, options));\n      node = new MathNode(\"munder\", [arrowNode, _lowerNode]);\n    } else {\n      // This should never happen.\n      // Parser.js throws an error if there is no argument.\n      node = paddedNode();\n      node = new MathNode(\"mover\", [arrowNode, node]);\n    }\n    return node;\n  }\n});\n\nfunction htmlBuilder$9(group, options) {\n  var elements = buildExpression$1(group.body, options, true);\n  return makeSpan([group.mclass], elements, options);\n}\nfunction mathmlBuilder$8(group, options) {\n  var node;\n  var inner = buildExpression(group.body, options);\n  if (group.mclass === \"minner\") {\n    node = new MathNode(\"mpadded\", inner);\n  } else if (group.mclass === \"mord\") {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mi\";\n    } else {\n      node = new MathNode(\"mi\", inner);\n    }\n  } else {\n    if (group.isCharacterBox) {\n      node = inner[0];\n      node.type = \"mo\";\n    } else {\n      node = new MathNode(\"mo\", inner);\n    }\n    // Set spacing based on what is the most likely adjacent atom type.\n    // See TeXbook p170.\n    if (group.mclass === \"mbin\") {\n      node.attributes.lspace = \"0.22em\"; // medium space\n      node.attributes.rspace = \"0.22em\";\n    } else if (group.mclass === \"mpunct\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0.17em\"; // thinspace\n    } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      node.attributes.lspace = \"0em\";\n      node.attributes.rspace = \"0em\";\n    } else if (group.mclass === \"minner\") {\n      node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n      node.attributes.width = \"+0.1111em\";\n    }\n    // MathML <mo> default space is 5/18 em, so <mrel> needs no action.\n    // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo\n  }\n  return node;\n}\n// Math class commands except \\mathop\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\mathord\", \"\\\\mathbin\", \"\\\\mathrel\", \"\\\\mathopen\", \"\\\\mathclose\", \"\\\\mathpunct\", \"\\\\mathinner\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: \"m\" + funcName.slice(5),\n      // TODO(kevinb): don't prefix with 'm'\n      body: ordargument(body),\n      isCharacterBox: isCharacterBox(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$9,\n  mathmlBuilder: mathmlBuilder$8\n});\nvar binrelClass = arg => {\n  // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n  // (by rendering separately and with {}s before and after, and measuring\n  // the change in spacing).  We'll do roughly the same by detecting the\n  // atom type directly.\n  var atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n  if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n    return \"m\" + atom.family;\n  } else {\n    return \"mord\";\n  }\n};\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\@binrel\"],\n  props: {\n    numArgs: 2\n  },\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[1]),\n      isCharacterBox: isCharacterBox(args[1])\n    };\n  }\n});\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n  props: {\n    numArgs: 2\n  },\n  handler(_ref3, args) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var baseArg = args[1];\n    var shiftedArg = args[0];\n    var mclass;\n    if (funcName !== \"\\\\stackrel\") {\n      // LaTeX applies \\binrel spacing to \\overset and \\underset.\n      mclass = binrelClass(baseArg);\n    } else {\n      mclass = \"mrel\"; // for \\stackrel\n    }\n    var baseOp = {\n      type: \"op\",\n      mode: baseArg.mode,\n      limits: true,\n      alwaysHandleSupSub: true,\n      parentIsSupSub: false,\n      symbol: false,\n      suppressBaseShift: funcName !== \"\\\\stackrel\",\n      body: ordargument(baseArg)\n    };\n    var supsub = {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      base: baseOp,\n      sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n      sub: funcName === \"\\\\underset\" ? shiftedArg : null\n    };\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass,\n      body: [supsub],\n      isCharacterBox: isCharacterBox(supsub)\n    };\n  },\n  htmlBuilder: htmlBuilder$9,\n  mathmlBuilder: mathmlBuilder$8\n});\n\n// \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies\n// with small offsets. We use CSS text-shadow.\n// It's a hack. Not as good as a real bold font. Better than nothing.\ndefineFunction({\n  type: \"pmb\",\n  names: [\"\\\\pmb\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"pmb\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options, true);\n    var node = makeSpan([group.mclass], elements, options);\n    node.style.textShadow = \"0.02em 0.01em 0.04px\";\n    return node;\n  },\n  mathmlBuilder(group, style) {\n    var inner = buildExpression(group.body, style);\n    // Wrap with an <mstyle> element.\n    var node = new MathNode(\"mstyle\", inner);\n    node.setAttribute(\"style\", \"text-shadow: 0.02em 0.01em 0.04px\");\n    return node;\n  }\n});\n\nvar cdArrowFunctionName = {\n  \">\": \"\\\\\\\\cdrightarrow\",\n  \"<\": \"\\\\\\\\cdleftarrow\",\n  \"=\": \"\\\\\\\\cdlongequal\",\n  \"A\": \"\\\\uparrow\",\n  \"V\": \"\\\\downarrow\",\n  \"|\": \"\\\\Vert\",\n  \".\": \"no arrow\"\n};\nvar newCell = () => {\n  // Create an empty cell, to be filled below with parse nodes.\n  // The parseTree from this module must be constructed like the\n  // one created by parseArray(), so an empty CD cell must\n  // be a ParseNode<\"styling\">. And CD is always displaystyle.\n  return {\n    type: \"styling\",\n    body: [],\n    mode: \"math\",\n    style: \"display\"\n  };\n};\nvar isStartOfArrow = node => {\n  return node.type === \"textord\" && node.text === \"@\";\n};\nvar isLabelEnd = (node, endChar) => {\n  return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\nfunction cdArrow(arrowChar, labels, parser) {\n  // Return a parse tree of an arrow and its labels.\n  // This acts in a way similar to a macro expansion.\n  var funcName = cdArrowFunctionName[arrowChar];\n  switch (funcName) {\n    case \"\\\\\\\\cdrightarrow\":\n    case \"\\\\\\\\cdleftarrow\":\n      return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n    case \"\\\\uparrow\":\n    case \"\\\\downarrow\":\n      {\n        var leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n        var bareArrow = {\n          type: \"atom\",\n          text: funcName,\n          mode: \"math\",\n          family: \"rel\"\n        };\n        var sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n        var rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n        var arrowGroup = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: [leftLabel, sizedArrow, rightLabel]\n        };\n        return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n      }\n    case \"\\\\\\\\cdlongequal\":\n      return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n    case \"\\\\Vert\":\n      {\n        var arrow = {\n          type: \"textord\",\n          text: \"\\\\Vert\",\n          mode: \"math\"\n        };\n        return parser.callFunction(\"\\\\Big\", [arrow], []);\n      }\n    default:\n      return {\n        type: \"textord\",\n        text: \" \",\n        mode: \"math\"\n      };\n  }\n}\nfunction parseCD(parser) {\n  // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n  var parsedRows = [];\n  parser.gullet.beginGroup();\n  parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  parser.gullet.beginGroup();\n  while (true) {\n    // eslint-disable-line no-constant-condition\n    // Get the parse nodes for the next row.\n    parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var next = parser.fetch().text;\n    if (next === \"&\" || next === \"\\\\\\\\\") {\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      if (parsedRows[parsedRows.length - 1].length === 0) {\n        parsedRows.pop(); // final row ended in \\\\\n      }\n      break;\n    } else {\n      throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  var row = [];\n  var body = [row];\n  // Loop thru the parse nodes. Collect them into cells and arrows.\n  for (var i = 0; i < parsedRows.length; i++) {\n    // Start a new row.\n    var rowNodes = parsedRows[i];\n    // Create the first cell.\n    var cell = newCell();\n    for (var j = 0; j < rowNodes.length; j++) {\n      if (!isStartOfArrow(rowNodes[j])) {\n        // If a parseNode is not an arrow, it goes into a cell.\n        cell.body.push(rowNodes[j]);\n      } else {\n        // Parse node j is an \"@\", the start of an arrow.\n        // Before starting on the arrow, push the cell into `row`.\n        row.push(cell);\n        // Now collect parseNodes into an arrow.\n        // The character after \"@\" defines the arrow type.\n        j += 1;\n        var arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n        // Create two empty label nodes. We may or may not use them.\n        var labels = new Array(2);\n        labels[0] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        labels[1] = {\n          type: \"ordgroup\",\n          mode: \"math\",\n          body: []\n        };\n        // Process the arrow.\n        if (\"=|.\".includes(arrowChar)) ; else if (\"<>AV\".includes(arrowChar)) {\n          // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n          // two optional labels. E.g. the right-point arrow syntax is\n          // really:  @>{optional label}>{optional label}>\n          // Collect parseNodes into labels.\n          for (var labelNum = 0; labelNum < 2; labelNum++) {\n            var inLabel = true;\n            for (var k = j + 1; k < rowNodes.length; k++) {\n              if (isLabelEnd(rowNodes[k], arrowChar)) {\n                inLabel = false;\n                j = k;\n                break;\n              }\n              if (isStartOfArrow(rowNodes[k])) {\n                throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[k]);\n              }\n              labels[labelNum].body.push(rowNodes[k]);\n            }\n            if (inLabel) {\n              // isLabelEnd never returned a true.\n              throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[j]);\n            }\n          }\n        } else {\n          throw new ParseError(\"Expected one of \\\"<>AV=|.\\\" after @\", rowNodes[j]);\n        }\n        // Now join the arrow to its labels.\n        var arrow = cdArrow(arrowChar, labels, parser);\n        // Wrap the arrow in  ParseNode<\"styling\">.\n        // This is done to match parseArray() behavior.\n        var wrappedArrow = {\n          type: \"styling\",\n          body: [arrow],\n          mode: \"math\",\n          style: \"display\" // CD is always displaystyle.\n        };\n        row.push(wrappedArrow);\n        // In CD's syntax, cells are implicit. That is, everything that\n        // is not an arrow gets collected into a cell. So create an empty\n        // cell now. It will collect upcoming parseNodes.\n        cell = newCell();\n      }\n    }\n    if (i % 2 === 0) {\n      // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n      // The last cell is not yet pushed into `row`, so:\n      row.push(cell);\n    } else {\n      // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n      // Remove the empty cell that was placed at the beginning of `row`.\n      row.shift();\n    }\n    row = [];\n    body.push(row);\n  }\n  // End row group\n  parser.gullet.endGroup();\n  // End array group defining \\\\\n  parser.gullet.endGroup();\n  // define column separation.\n  var cols = new Array(body[0].length).fill({\n    type: \"align\",\n    align: \"c\",\n    pregap: 0.25,\n    // CD package sets \\enskip between columns.\n    postgap: 0.25 // So pre and post each get half an \\enskip, i.e. 0.25em.\n  });\n  return {\n    type: \"array\",\n    mode: \"math\",\n    body,\n    arraystretch: 1,\n    addJot: true,\n    rowGaps: [null],\n    cols,\n    colSeparationType: \"CD\",\n    hLinesBeforeRow: new Array(body.length + 1).fill([])\n  };\n}\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\ndefineFunction({\n  type: \"cdlabel\",\n  names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"cdlabel\",\n      mode: parser.mode,\n      side: funcName.slice(4),\n      label: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = options.havingStyle(options.style.sup());\n    var label = wrapFragment(buildGroup$1(group.label, newOptions, options), options);\n    label.classes.push(\"cd-label-\" + group.side);\n    label.style.bottom = makeEm(0.8 - label.depth);\n    // Zero out label height & depth, so vertical align of arrow is set\n    // by the arrow height, not by the label.\n    label.height = 0;\n    label.depth = 0;\n    return label;\n  },\n  mathmlBuilder(group, options) {\n    var label = new MathNode(\"mrow\", [buildGroup(group.label, options)]);\n    label = new MathNode(\"mpadded\", [label]);\n    label.setAttribute(\"width\", \"0\");\n    if (group.side === \"left\") {\n      label.setAttribute(\"lspace\", \"-1width\");\n    }\n    // We have to guess at vertical alignment. We know the arrow is 1.8em tall,\n    // But we don't know the height or depth of the label.\n    label.setAttribute(\"voffset\", \"0.7em\");\n    label = new MathNode(\"mstyle\", [label]);\n    label.setAttribute(\"displaystyle\", \"false\");\n    label.setAttribute(\"scriptlevel\", \"1\");\n    return label;\n  }\n});\ndefineFunction({\n  type: \"cdlabelparent\",\n  names: [\"\\\\\\\\cdparent\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref2, args) {\n    var {\n      parser\n    } = _ref2;\n    return {\n      type: \"cdlabelparent\",\n      mode: parser.mode,\n      fragment: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Wrap the vertical arrow and its labels.\n    // The parent gets position: relative. The child gets position: absolute.\n    // So CSS can locate the label correctly.\n    var parent = wrapFragment(buildGroup$1(group.fragment, options), options);\n    parent.classes.push(\"cd-vert-arrow\");\n    return parent;\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", [buildGroup(group.fragment, options)]);\n  }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123.  It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n  type: \"textord\",\n  names: [\"\\\\@char\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var arg = assertNodeType(args[0], \"ordgroup\");\n    var group = arg.body;\n    var number = \"\";\n    for (var i = 0; i < group.length; i++) {\n      var node = assertNodeType(group[i], \"textord\");\n      number += node.text;\n    }\n    var code = parseInt(number);\n    var text;\n    if (isNaN(code)) {\n      throw new ParseError(\"\\\\@char has non-numeric argument \" + number);\n      // If we drop IE support, the following code could be replaced with\n      // text = String.fromCodePoint(code)\n    } else if (code < 0 || code >= 0x10ffff) {\n      throw new ParseError(\"\\\\@char with invalid code point \" + number);\n    } else if (code <= 0xffff) {\n      text = String.fromCharCode(code);\n    } else {\n      // Astral code point; split into surrogate halves\n      code -= 0x10000;\n      text = String.fromCharCode((code >> 10) + 0xd800, (code & 0x3ff) + 0xdc00);\n    }\n    return {\n      type: \"textord\",\n      mode: parser.mode,\n      text: text\n    };\n  }\n});\n\nvar htmlBuilder$8 = (group, options) => {\n  var elements = buildExpression$1(group.body, options.withColor(group.color), false);\n  // \\color isn't supposed to affect the type of the elements it contains.\n  // To accomplish this, we wrap the results in a fragment, so the inner\n  // elements will be able to directly interact with their neighbors. For\n  // example, `\\color{red}{2 +} 3` has the same spacing as `2 + 3`\n  return makeFragment(elements);\n};\nvar mathmlBuilder$7 = (group, options) => {\n  var inner = buildExpression(group.body, options.withColor(group.color));\n  var node = new MathNode(\"mstyle\", inner);\n  node.setAttribute(\"mathcolor\", group.color);\n  return node;\n};\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\textcolor\"],\n  props: {\n    numArgs: 2,\n    allowedInText: true,\n    argTypes: [\"color\", \"original\"]\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$8,\n  mathmlBuilder: mathmlBuilder$7\n});\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\color\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    argTypes: [\"color\"]\n  },\n  handler(_ref2, args) {\n    var {\n      parser,\n      breakOnTokenText\n    } = _ref2;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    // Set macro \\current@color in current namespace to store the current\n    // color, mimicking the behavior of color.sty.\n    // This is currently used just to correctly color a \\right\n    // that follows a \\color command.\n    parser.gullet.macros.set(\"\\\\current@color\", color);\n    // Parse out the implicit body that should be colored.\n    var body = parser.parseExpression(true, breakOnTokenText);\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$8,\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n  type: \"cr\",\n  names: [\"\\\\\\\\\"],\n  props: {\n    numArgs: 0,\n    numOptionalArgs: 0,\n    allowedInText: true\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n    var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior(\"newLineInDisplayMode\", \"In LaTeX, \\\\\\\\ or \\\\newline \" + \"does nothing in display mode\");\n    return {\n      type: \"cr\",\n      mode: parser.mode,\n      newLine,\n      size: size && assertNodeType(size, \"size\").value\n    };\n  },\n  // The following builders are called only at the top level,\n  // not within tabular/array environments.\n  htmlBuilder(group, options) {\n    var span = makeSpan([\"mspace\"], [], options);\n    if (group.newLine) {\n      span.classes.push(\"newline\");\n      if (group.size) {\n        span.style.marginTop = makeEm(calculateSize(group.size, options));\n      }\n    }\n    return span;\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mspace\");\n    if (group.newLine) {\n      node.setAttribute(\"linebreak\", \"newline\");\n      if (group.size) {\n        node.setAttribute(\"height\", makeEm(calculateSize(group.size, options)));\n      }\n    }\n    return node;\n  }\n});\n\nvar globalMap = {\n  \"\\\\global\": \"\\\\global\",\n  \"\\\\long\": \"\\\\\\\\globallong\",\n  \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n  \"\\\\def\": \"\\\\gdef\",\n  \"\\\\gdef\": \"\\\\gdef\",\n  \"\\\\edef\": \"\\\\xdef\",\n  \"\\\\xdef\": \"\\\\xdef\",\n  \"\\\\let\": \"\\\\\\\\globallet\",\n  \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\nvar checkControlSequence = tok => {\n  var name = tok.text;\n  if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n    throw new ParseError(\"Expected a control sequence\", tok);\n  }\n  return name;\n};\nvar getRHS = parser => {\n  var tok = parser.gullet.popToken();\n  if (tok.text === \"=\") {\n    // consume optional equals\n    tok = parser.gullet.popToken();\n    if (tok.text === \" \") {\n      // consume one optional space\n      tok = parser.gullet.popToken();\n    }\n  }\n  return tok;\n};\nvar letCommand = (parser, name, tok, global) => {\n  var macro = parser.gullet.macros.get(tok.text);\n  if (macro == null) {\n    // don't expand it later even if a macro with the same name is defined\n    // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n    tok.noexpand = true;\n    macro = {\n      tokens: [tok],\n      numArgs: 0,\n      // reproduce the same behavior in expansion\n      unexpandable: !parser.gullet.isExpandable(tok.text)\n    };\n  }\n  parser.gullet.macros.set(name, macro, global);\n};\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\global\", \"\\\\long\", \"\\\\\\\\globallong\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(_ref) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    parser.consumeSpaces();\n    var token = parser.fetch();\n    if (globalMap[token.text]) {\n      // KaTeX doesn't have \\par, so ignore \\long\n      if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n        token.text = globalMap[token.text];\n      }\n      return assertNodeType(parser.parseFunction(), \"internal\");\n    }\n    throw new ParseError(\"Invalid token after macro prefix\", token);\n  }\n});\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref2) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var tok = parser.gullet.popToken();\n    var name = tok.text;\n    if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n      throw new ParseError(\"Expected a control sequence\", tok);\n    }\n    var numArgs = 0;\n    var insert;\n    var delimiters = [[]];\n    // <parameter text> contains no braces\n    while (parser.gullet.future().text !== \"{\") {\n      tok = parser.gullet.popToken();\n      if (tok.text === \"#\") {\n        // If the very last character of the <parameter text> is #, so that\n        // this # is immediately followed by {, TeX will behave as if the {\n        // had been inserted at the right end of both the parameter text\n        // and the replacement text.\n        if (parser.gullet.future().text === \"{\") {\n          insert = parser.gullet.future();\n          delimiters[numArgs].push(\"{\");\n          break;\n        }\n        // A parameter, the first appearance of # must be followed by 1,\n        // the next by 2, and so on; up to nine #’s are allowed\n        tok = parser.gullet.popToken();\n        if (!/^[1-9]$/.test(tok.text)) {\n          throw new ParseError(\"Invalid argument number \\\"\" + tok.text + \"\\\"\");\n        }\n        if (parseInt(tok.text) !== numArgs + 1) {\n          throw new ParseError(\"Argument number \\\"\" + tok.text + \"\\\" out of order\");\n        }\n        numArgs++;\n        delimiters.push([]);\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Expected a macro definition\");\n      } else {\n        delimiters[numArgs].push(tok.text);\n      }\n    }\n    // replacement text, enclosed in '{' and '}' and properly nested\n    var {\n      tokens\n    } = parser.gullet.consumeArg();\n    if (insert) {\n      tokens.unshift(insert);\n    }\n    if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n      tokens = parser.gullet.expandTokens(tokens);\n      tokens.reverse(); // to fit in with stack order\n    }\n    // Final arg is the expansion of the macro\n    parser.gullet.macros.set(name, {\n      tokens,\n      numArgs,\n      delimiters\n    }, funcName === globalMap[funcName]);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n//     | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\let\", \"\\\\\\\\globallet\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    var name = checkControlSequence(parser.gullet.popToken());\n    parser.gullet.consumeSpaces();\n    var tok = getRHS(parser);\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\futurelet\", \"\\\\\\\\globalfuture\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var name = checkControlSequence(parser.gullet.popToken());\n    var middle = parser.gullet.popToken();\n    var tok = parser.gullet.popToken();\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n    parser.gullet.pushToken(tok);\n    parser.gullet.pushToken(middle);\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\n/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function getMetrics(symbol, font, mode) {\n  var replace = symbols.math[symbol] && symbols.math[symbol].replace;\n  var metrics = getCharacterMetrics(replace || symbol, font, mode);\n  if (!metrics) {\n    throw new Error(\"Unsupported symbol \" + symbol + \" and font size \" + font + \".\");\n  }\n  return metrics;\n};\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\nvar styleWrap = function styleWrap(delim, toStyle, options, classes) {\n  var newOptions = options.havingBaseStyle(toStyle);\n  var span = makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);\n  var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;\n  span.height *= delimSizeMultiplier;\n  span.depth *= delimSizeMultiplier;\n  span.maxFontSize = newOptions.sizeMultiplier;\n  return span;\n};\nvar centerSpan = function centerSpan(span, options, style) {\n  var newOptions = options.havingBaseStyle(style);\n  var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;\n  span.classes.push(\"delimcenter\");\n  span.style.top = makeEm(shift);\n  span.height -= shift;\n  span.depth += shift;\n};\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\nvar makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {\n  var text = makeSymbol(delim, \"Main-Regular\", mode, options);\n  var span = styleWrap(text, style, options, classes);\n  if (center) {\n    centerSpan(span, options, style);\n  }\n  return span;\n};\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\nvar mathrmSize = function mathrmSize(value, size, mode, options) {\n  return makeSymbol(value, \"Size\" + size + \"-Regular\", mode, options);\n};\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\nvar makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {\n  var inner = mathrmSize(delim, size, mode, options);\n  var span = styleWrap(makeSpan([\"delimsizing\", \"size\" + size], [inner], options), Style$1.TEXT, options, classes);\n  if (center) {\n    centerSpan(span, options, Style$1.TEXT);\n  }\n  return span;\n};\n/**\n * Make a span from a font glyph with the given offset and in the given font.\n * This is used in makeStackedDelim to make the stacking pieces for the delimiter.\n */\nvar makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) {\n  var sizeClass;\n  // Apply the correct CSS class to choose the right font.\n  if (font === \"Size1-Regular\") {\n    sizeClass = \"delim-size1\";\n  } else /* if (font === \"Size4-Regular\") */{\n      sizeClass = \"delim-size4\";\n    }\n  var corner = makeSpan([\"delimsizinginner\", sizeClass], [makeSpan([], [makeSymbol(symbol, font, mode)])]);\n  // Since this will be passed into `makeVList` in the end, wrap the element\n  // in the appropriate tag that VList uses.\n  return {\n    type: \"elem\",\n    elem: corner\n  };\n};\nvar makeInner = function makeInner(ch, height, options) {\n  // Create a span with inline SVG for the inner part of a tall stacked delimiter.\n  var width = fontMetricsData['Size4-Regular'][ch.charCodeAt(0)] ? fontMetricsData['Size4-Regular'][ch.charCodeAt(0)][4] : fontMetricsData['Size1-Regular'][ch.charCodeAt(0)][4];\n  var path = new PathNode(\"inner\", innerPath(ch, Math.round(1000 * height)));\n  var svgNode = new SvgNode([path], {\n    \"width\": makeEm(width),\n    \"height\": makeEm(height),\n    // Override CSS rule `.katex svg { width: 100% }`\n    \"style\": \"width:\" + makeEm(width),\n    \"viewBox\": \"0 0 \" + 1000 * width + \" \" + Math.round(1000 * height),\n    \"preserveAspectRatio\": \"xMinYMin\"\n  });\n  var span = makeSvgSpan([], [svgNode], options);\n  span.height = height;\n  span.style.height = makeEm(height);\n  span.style.width = makeEm(width);\n  return {\n    type: \"elem\",\n    elem: span\n  };\n};\n// Helpers for makeStackedDelim\nvar lapInEms = 0.008;\nvar lap = {\n  type: \"kern\",\n  size: -1 * lapInEms\n};\nvar verts = new Set([\"|\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\vert\"]);\nvar doubleVerts = new Set([\"\\\\|\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\Vert\"]);\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\nvar makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {\n  // There are four parts, the top, an optional middle, a repeated part, and a\n  // bottom.\n  var top;\n  var middle;\n  var repeat;\n  var bottom;\n  var svgLabel = \"\";\n  var viewBoxWidth = 0;\n  top = repeat = bottom = delim;\n  middle = null;\n  // Also keep track of what font the delimiters are in\n  var font = \"Size1-Regular\";\n  // We set the parts and font based on the symbol. Note that we use\n  // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n  // repeats of the arrows\n  if (delim === \"\\\\uparrow\") {\n    repeat = bottom = \"\\u23d0\";\n  } else if (delim === \"\\\\Uparrow\") {\n    repeat = bottom = \"\\u2016\";\n  } else if (delim === \"\\\\downarrow\") {\n    top = repeat = \"\\u23d0\";\n  } else if (delim === \"\\\\Downarrow\") {\n    top = repeat = \"\\u2016\";\n  } else if (delim === \"\\\\updownarrow\") {\n    top = \"\\\\uparrow\";\n    repeat = \"\\u23d0\";\n    bottom = \"\\\\downarrow\";\n  } else if (delim === \"\\\\Updownarrow\") {\n    top = \"\\\\Uparrow\";\n    repeat = \"\\u2016\";\n    bottom = \"\\\\Downarrow\";\n  } else if (verts.has(delim)) {\n    repeat = \"\\u2223\";\n    svgLabel = \"vert\";\n    viewBoxWidth = 333;\n  } else if (doubleVerts.has(delim)) {\n    repeat = \"\\u2225\";\n    svgLabel = \"doublevert\";\n    viewBoxWidth = 556;\n  } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n    top = \"\\u23a1\";\n    repeat = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n    top = \"\\u23a4\";\n    repeat = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rbrack\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lfloor\" || delim === \"\\u230a\") {\n    repeat = top = \"\\u23a2\";\n    bottom = \"\\u23a3\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\lceil\" || delim === \"\\u2308\") {\n    top = \"\\u23a1\";\n    repeat = bottom = \"\\u23a2\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rfloor\" || delim === \"\\u230b\") {\n    repeat = top = \"\\u23a5\";\n    bottom = \"\\u23a6\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rfloor\";\n    viewBoxWidth = 667;\n  } else if (delim === \"\\\\rceil\" || delim === \"\\u2309\") {\n    top = \"\\u23a4\";\n    repeat = bottom = \"\\u23a5\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rceil\";\n    viewBoxWidth = 667;\n  } else if (delim === \"(\" || delim === \"\\\\lparen\") {\n    top = \"\\u239b\";\n    repeat = \"\\u239c\";\n    bottom = \"\\u239d\";\n    font = \"Size4-Regular\";\n    svgLabel = \"lparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \")\" || delim === \"\\\\rparen\") {\n    top = \"\\u239e\";\n    repeat = \"\\u239f\";\n    bottom = \"\\u23a0\";\n    font = \"Size4-Regular\";\n    svgLabel = \"rparen\";\n    viewBoxWidth = 875;\n  } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n    top = \"\\u23a7\";\n    middle = \"\\u23a8\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n    top = \"\\u23ab\";\n    middle = \"\\u23ac\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lgroup\" || delim === \"\\u27ee\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rgroup\" || delim === \"\\u27ef\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\lmoustache\" || delim === \"\\u23b0\") {\n    top = \"\\u23a7\";\n    bottom = \"\\u23ad\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  } else if (delim === \"\\\\rmoustache\" || delim === \"\\u23b1\") {\n    top = \"\\u23ab\";\n    bottom = \"\\u23a9\";\n    repeat = \"\\u23aa\";\n    font = \"Size4-Regular\";\n  }\n  // Get the metrics of the four sections\n  var topMetrics = getMetrics(top, font, mode);\n  var topHeightTotal = topMetrics.height + topMetrics.depth;\n  var repeatMetrics = getMetrics(repeat, font, mode);\n  var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n  var bottomMetrics = getMetrics(bottom, font, mode);\n  var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n  var middleHeightTotal = 0;\n  var middleFactor = 1;\n  if (middle !== null) {\n    var middleMetrics = getMetrics(middle, font, mode);\n    middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n    middleFactor = 2; // repeat symmetrically above and below middle\n  }\n  // Calculate the minimal height that the delimiter can have.\n  // It is at least the size of the top, bottom, and optional middle combined.\n  var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal;\n  // Compute the number of copies of the repeat symbol we will need\n  var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)));\n  // Compute the total height of the delimiter including all the symbols\n  var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal;\n  // The center of the delimiter is placed at the center of the axis. Note\n  // that in this context, \"center\" means that the delimiter should be\n  // centered around the axis in the current style, while normally it is\n  // centered around the axis in textstyle.\n  var axisHeight = options.fontMetrics().axisHeight;\n  if (center) {\n    axisHeight *= options.sizeMultiplier;\n  }\n  // Calculate the depth\n  var depth = realHeightTotal / 2 - axisHeight;\n  // Now, we start building the pieces that will go into the vlist\n  // Keep a list of the pieces of the stacked delimiter\n  var stack = [];\n  if (svgLabel.length > 0) {\n    // Instead of stacking glyphs, create a single SVG.\n    // This evades browser problems with imprecise positioning of spans.\n    var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;\n    var viewBoxHeight = Math.round(realHeightTotal * 1000);\n    var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1000));\n    var path = new PathNode(svgLabel, pathStr);\n    var width = makeEm(viewBoxWidth / 1000);\n    var height = makeEm(viewBoxHeight / 1000);\n    var svg = new SvgNode([path], {\n      \"width\": width,\n      \"height\": height,\n      \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight\n    });\n    var wrapper = makeSvgSpan([], [svg], options);\n    wrapper.height = viewBoxHeight / 1000;\n    wrapper.style.width = width;\n    wrapper.style.height = height;\n    stack.push({\n      type: \"elem\",\n      elem: wrapper\n    });\n  } else {\n    // Stack glyphs\n    // Start by adding the bottom symbol\n    stack.push(makeGlyphSpan(bottom, font, mode));\n    stack.push(lap); // overlap\n    if (middle === null) {\n      // The middle section will be an SVG. Make it an extra 0.016em tall.\n      // We'll overlap by 0.008em at top and bottom.\n      var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms;\n      stack.push(makeInner(repeat, innerHeight, options));\n    } else {\n      // When there is a middle bit, we need the middle part and two repeated\n      // sections\n      var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms;\n      stack.push(makeInner(repeat, _innerHeight, options));\n      // Now insert the middle of the brace.\n      stack.push(lap);\n      stack.push(makeGlyphSpan(middle, font, mode));\n      stack.push(lap);\n      stack.push(makeInner(repeat, _innerHeight, options));\n    }\n    // Add the top symbol\n    stack.push(lap);\n    stack.push(makeGlyphSpan(top, font, mode));\n  }\n  // Finally, build the vlist\n  var newOptions = options.havingBaseStyle(Style$1.TEXT);\n  var inner = makeVList({\n    positionType: \"bottom\",\n    positionData: depth,\n    children: stack\n  });\n  return styleWrap(makeSpan([\"delimsizing\", \"mult\"], [inner], newOptions), Style$1.TEXT, options, classes);\n};\n// All surds have 0.08em padding above the vinculum inside the SVG.\n// That keeps browser span height rounding error from pinching the line.\nvar vbPad = 80; // padding above the surd, measured inside the viewBox.\nvar emPad = 0.08; // padding, in ems, measured in the document.\nvar sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraVinculum, options) {\n  var path = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);\n  var pathNode = new PathNode(sqrtName, path);\n  var svg = new SvgNode([pathNode], {\n    // Note: 1000:1 ratio of viewBox to document em width.\n    \"width\": \"400em\",\n    \"height\": makeEm(height),\n    \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n    \"preserveAspectRatio\": \"xMinYMin slice\"\n  });\n  return makeSvgSpan([\"hide-tail\"], [svg], options);\n};\n/**\n * Make a sqrt image of the given height,\n */\nvar makeSqrtImage = function makeSqrtImage(height, options) {\n  // Define a newOptions that removes the effect of size changes such as \\Huge.\n  // We don't pick different a height surd for \\Huge. For it, we scale up.\n  var newOptions = options.havingBaseSizing();\n  // Pick the desired surd glyph from a sequence of surds.\n  var delim = traverseSequence(\"\\\\surd\", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);\n  var sizeMultiplier = newOptions.sizeMultiplier; // default\n  // The standard sqrt SVGs each have a 0.04em thick vinculum.\n  // If Settings.minRuleThickness is larger than that, we add extraVinculum.\n  var extraVinculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness);\n  // Create a span containing an SVG image of a sqrt symbol.\n  var span;\n  var spanHeight = 0;\n  var texHeight = 0;\n  var viewBoxHeight = 0;\n  var advanceWidth;\n  // We create viewBoxes with 80 units of \"padding\" above each surd.\n  // Then browser rounding error on the parent span height will not\n  // encroach on the ink of the vinculum. But that padding is not\n  // included in the TeX-like `height` used for calculation of\n  // vertical alignment. So texHeight = span.height < span.style.height.\n  if (delim.type === \"small\") {\n    // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.\n    // 1000 unit normal glyph height.\n    viewBoxHeight = 1000 + 1000 * extraVinculum + vbPad;\n    if (height < 1.0) {\n      sizeMultiplier = 1.0; // mimic a \\textfont radical\n    } else if (height < 1.4) {\n      sizeMultiplier = 0.7; // mimic a \\scriptfont radical\n    }\n    spanHeight = (1.0 + extraVinculum + emPad) / sizeMultiplier;\n    texHeight = (1.00 + extraVinculum) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtMain\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.853em\";\n    advanceWidth = 0.833 / sizeMultiplier; // from the font.\n  } else if (delim.type === \"large\") {\n    // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.\n    viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];\n    texHeight = (sizeToMaxHeight[delim.size] + extraVinculum) / sizeMultiplier;\n    spanHeight = (sizeToMaxHeight[delim.size] + extraVinculum + emPad) / sizeMultiplier;\n    span = sqrtSvg(\"sqrtSize\" + delim.size, spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"1.02em\";\n    advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.\n  } else {\n    // Tall sqrt. In TeX, this would be stacked using multiple glyphs.\n    // We'll use a single SVG to accomplish the same thing.\n    spanHeight = height + extraVinculum + emPad;\n    texHeight = height + extraVinculum;\n    viewBoxHeight = Math.floor(1000 * height + extraVinculum) + vbPad;\n    span = sqrtSvg(\"sqrtTall\", spanHeight, viewBoxHeight, extraVinculum, options);\n    span.style.minWidth = \"0.742em\";\n    advanceWidth = 1.056;\n  }\n  span.height = texHeight;\n  span.style.height = makeEm(spanHeight);\n  return {\n    span,\n    advanceWidth,\n    // Calculate the actual line width.\n    // This actually should depend on the chosen font -- e.g. \\boldmath\n    // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and\n    // have thicker rules.\n    ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraVinculum) * sizeMultiplier\n  };\n};\n// There are three kinds of delimiters, delimiters that stack when they become\n// too large\nvar stackLargeDelimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"\\\\surd\"]);\n// delimiters that always stack\nvar stackAlwaysDelimiters = new Set([\"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\", \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\", \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\"]);\n// and delimiters that never stack\nvar stackNeverDelimiters = new Set([\"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\"]);\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\nvar makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {\n  // < and > turn into \\langle and \\rangle in delimiters\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Sized delimiters are never centered.\n  if (stackLargeDelimiters.has(delim) || stackNeverDelimiters.has(delim)) {\n    return makeLargeDelim(delim, size, false, options, mode, classes);\n  } else if (stackAlwaysDelimiters.has(delim)) {\n    return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);\n  } else {\n    throw new ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n  }\n};\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}];\n// Delimiters that always stack try the small delimiters first, then stack\nvar stackAlwaysDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"stack\"\n}];\n// Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\nvar stackLargeDelimiterSequence = [{\n  type: \"small\",\n  style: Style$1.SCRIPTSCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.SCRIPT\n}, {\n  type: \"small\",\n  style: Style$1.TEXT\n}, {\n  type: \"large\",\n  size: 1\n}, {\n  type: \"large\",\n  size: 2\n}, {\n  type: \"large\",\n  size: 3\n}, {\n  type: \"large\",\n  size: 4\n}, {\n  type: \"stack\"\n}];\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n * TODO(#963) Use more specific font family return type once that is introduced.\n */\nvar delimTypeToFont = function delimTypeToFont(type) {\n  if (type.type === \"small\") {\n    return \"Main-Regular\";\n  } else if (type.type === \"large\") {\n    return \"Size\" + type.size + \"-Regular\";\n  } else if (type.type === \"stack\") {\n    return \"Size4-Regular\";\n  } else {\n    var delimKind = type.type;\n    throw new Error(\"Add support for delim type '\" + delimKind + \"' here.\");\n  }\n};\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\nvar traverseSequence = function traverseSequence(delim, height, sequence, options) {\n  // Here, we choose the index we should start at in the sequences. In smaller\n  // sizes (which correspond to larger numbers in style.size) we start earlier\n  // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n  // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n  var start = Math.min(2, 3 - options.style.size);\n  for (var i = start; i < sequence.length; i++) {\n    var delimType = sequence[i];\n    if (delimType.type === \"stack\") {\n      // This is always the last delimiter, so we just break the loop now.\n      break;\n    }\n    var metrics = getMetrics(delim, delimTypeToFont(delimType), \"math\");\n    var heightDepth = metrics.height + metrics.depth;\n    // Small delimiters are scaled down versions of the same font, so we\n    // account for the style change size.\n    if (delimType.type === \"small\") {\n      var newOptions = options.havingBaseStyle(delimType.style);\n      heightDepth *= newOptions.sizeMultiplier;\n    }\n    // Check if the delimiter at this size works for the given height.\n    if (heightDepth > height) {\n      return delimType;\n    }\n  }\n  // If we reached the end of the sequence, return the last sequence element.\n  return sequence[sequence.length - 1];\n};\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\nvar makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {\n  if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n    delim = \"\\\\langle\";\n  } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n    delim = \"\\\\rangle\";\n  }\n  // Decide what sequence to use\n  var sequence;\n  if (stackNeverDelimiters.has(delim)) {\n    sequence = stackNeverDelimiterSequence;\n  } else if (stackLargeDelimiters.has(delim)) {\n    sequence = stackLargeDelimiterSequence;\n  } else {\n    sequence = stackAlwaysDelimiterSequence;\n  }\n  // Look through the sequence\n  var delimType = traverseSequence(delim, height, sequence, options);\n  // Get the delimiter from font glyphs.\n  // Depending on the sequence element we decided on, call the\n  // appropriate function.\n  if (delimType.type === \"small\") {\n    return makeSmallDelim(delim, delimType.style, center, options, mode, classes);\n  } else if (delimType.type === \"large\") {\n    return makeLargeDelim(delim, delimType.size, center, options, mode, classes);\n  } else /* if (delimType.type === \"stack\") */{\n      return makeStackedDelim(delim, height, center, options, mode, classes);\n    }\n};\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\nvar makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {\n  // We always center \\left/\\right delimiters, so the axis is always shifted\n  var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier;\n  // Taken from TeX source, tex.web, function make_left_right\n  var delimiterFactor = 901;\n  var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;\n  var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);\n  var totalHeight = Math.max(\n  // In real TeX, calculations are done using integral values which are\n  // 65536 per pt, or 655360 per em. So, the division here truncates in\n  // TeX but doesn't here, producing different results. If we wanted to\n  // exactly match TeX's calculation, we could do\n  //   Math.floor(655360 * maxDistFromAxis / 500) *\n  //    delimiterFactor / 655360\n  // (To see the difference, compare\n  //    x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n  // in TeX and KaTeX)\n  maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend);\n  // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n  // height\n  return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);\n};\n\n// Extra data needed for the delimiter handler down below\nvar delimiterSizes = {\n  \"\\\\bigl\": {\n    mclass: \"mopen\",\n    size: 1\n  },\n  \"\\\\Bigl\": {\n    mclass: \"mopen\",\n    size: 2\n  },\n  \"\\\\biggl\": {\n    mclass: \"mopen\",\n    size: 3\n  },\n  \"\\\\Biggl\": {\n    mclass: \"mopen\",\n    size: 4\n  },\n  \"\\\\bigr\": {\n    mclass: \"mclose\",\n    size: 1\n  },\n  \"\\\\Bigr\": {\n    mclass: \"mclose\",\n    size: 2\n  },\n  \"\\\\biggr\": {\n    mclass: \"mclose\",\n    size: 3\n  },\n  \"\\\\Biggr\": {\n    mclass: \"mclose\",\n    size: 4\n  },\n  \"\\\\bigm\": {\n    mclass: \"mrel\",\n    size: 1\n  },\n  \"\\\\Bigm\": {\n    mclass: \"mrel\",\n    size: 2\n  },\n  \"\\\\biggm\": {\n    mclass: \"mrel\",\n    size: 3\n  },\n  \"\\\\Biggm\": {\n    mclass: \"mrel\",\n    size: 4\n  },\n  \"\\\\big\": {\n    mclass: \"mord\",\n    size: 1\n  },\n  \"\\\\Big\": {\n    mclass: \"mord\",\n    size: 2\n  },\n  \"\\\\bigg\": {\n    mclass: \"mord\",\n    size: 3\n  },\n  \"\\\\Bigg\": {\n    mclass: \"mord\",\n    size: 4\n  }\n};\nvar delimiters = new Set([\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"<\", \">\", \"\\\\langle\", \"\\u27e8\", \"\\\\rangle\", \"\\u27e9\", \"\\\\lt\", \"\\\\gt\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\", \"/\", \"\\\\backslash\", \"|\", \"\\\\vert\", \"\\\\|\", \"\\\\Vert\", \"\\\\uparrow\", \"\\\\Uparrow\", \"\\\\downarrow\", \"\\\\Downarrow\", \"\\\\updownarrow\", \"\\\\Updownarrow\", \".\"]);\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n  var symDelim = checkSymbolNodeType(delim);\n  if (symDelim && delimiters.has(symDelim.text)) {\n    return symDelim;\n  } else if (symDelim) {\n    throw new ParseError(\"Invalid delimiter '\" + symDelim.text + \"' after '\" + context.funcName + \"'\", delim);\n  } else {\n    throw new ParseError(\"Invalid delimiter type '\" + delim.type + \"'\", delim);\n  }\n}\ndefineFunction({\n  type: \"delimsizing\",\n  names: [\"\\\\bigl\", \"\\\\Bigl\", \"\\\\biggl\", \"\\\\Biggl\", \"\\\\bigr\", \"\\\\Bigr\", \"\\\\biggr\", \"\\\\Biggr\", \"\\\\bigm\", \"\\\\Bigm\", \"\\\\biggm\", \"\\\\Biggm\", \"\\\\big\", \"\\\\Big\", \"\\\\bigg\", \"\\\\Bigg\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    return {\n      type: \"delimsizing\",\n      mode: context.parser.mode,\n      size: delimiterSizes[context.funcName].size,\n      mclass: delimiterSizes[context.funcName].mclass,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    if (group.delim === \".\") {\n      // Empty delimiters still count as elements, even though they don't\n      // show anything.\n      return makeSpan([group.mclass]);\n    }\n    return makeSizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);\n  },\n  mathmlBuilder: group => {\n    var children = [];\n    if (group.delim !== \".\") {\n      children.push(makeText(group.delim, group.mode));\n    }\n    var node = new MathNode(\"mo\", children);\n    if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      // Only some of the delimsizing functions act as fences, and they\n      // return \"mopen\" or \"mclose\" mclass.\n      node.setAttribute(\"fence\", \"true\");\n    } else {\n      // Explicitly disable fencing if it's not a fence, to override the\n      // defaults.\n      node.setAttribute(\"fence\", \"false\");\n    }\n    node.setAttribute(\"stretchy\", \"true\");\n    var size = makeEm(sizeToMaxHeight[group.size]);\n    node.setAttribute(\"minsize\", size);\n    node.setAttribute(\"maxsize\", size);\n    return node;\n  }\n});\nfunction assertParsed(group) {\n  if (!group.body) {\n    throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n  }\n}\ndefineFunction({\n  type: \"leftright-right\",\n  names: [\"\\\\right\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    // \\left case below triggers parsing of \\right in\n    //   `const right = parser.parseFunction();`\n    // uses this return value.\n    var color = context.parser.gullet.macros.get(\"\\\\current@color\");\n    if (color && typeof color !== \"string\") {\n      throw new ParseError(\"\\\\current@color set to non-string in \\\\right\");\n    }\n    return {\n      type: \"leftright-right\",\n      mode: context.parser.mode,\n      delim: checkDelimiter(args[0], context).text,\n      color: color // undefined if not set via \\color\n    };\n  }\n});\ndefineFunction({\n  type: \"leftright\",\n  names: [\"\\\\left\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    var parser = context.parser;\n    // Parse out the implicit body\n    ++parser.leftrightDepth;\n    // parseExpression stops before '\\\\right'\n    var body = parser.parseExpression(false);\n    --parser.leftrightDepth;\n    // Check the next token\n    parser.expect(\"\\\\right\", false);\n    var right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n    return {\n      type: \"leftright\",\n      mode: parser.mode,\n      body,\n      left: delim.text,\n      right: right.delim,\n      rightColor: right.color\n    };\n  },\n  htmlBuilder: (group, options) => {\n    assertParsed(group);\n    // Build the inner expression\n    var inner = buildExpression$1(group.body, options, true, [\"mopen\", \"mclose\"]);\n    var innerHeight = 0;\n    var innerDepth = 0;\n    var hadMiddle = false;\n    // Calculate its height and depth\n    for (var i = 0; i < inner.length; i++) {\n      // Property `isMiddle` not defined on `span`. See comment in\n      // \"middle\"'s htmlBuilder.\n      // TODO(ts)\n      if (inner[i].isMiddle) {\n        hadMiddle = true;\n      } else {\n        innerHeight = Math.max(inner[i].height, innerHeight);\n        innerDepth = Math.max(inner[i].depth, innerDepth);\n      }\n    }\n    // The size of delimiters is the same, regardless of what style we are\n    // in. Thus, to correctly calculate the size of delimiter we need around\n    // a group, we scale down the inner size based on the size.\n    innerHeight *= options.sizeMultiplier;\n    innerDepth *= options.sizeMultiplier;\n    var leftDelim;\n    if (group.left === \".\") {\n      // Empty delimiters in \\left and \\right make null delimiter spaces.\n      leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n    } else {\n      // Otherwise, use leftRightDelim to generate the correct sized\n      // delimiter.\n      leftDelim = makeLeftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, [\"mopen\"]);\n    }\n    // Add it to the beginning of the expression\n    inner.unshift(leftDelim);\n    // Handle middle delimiters\n    if (hadMiddle) {\n      for (var _i = 1; _i < inner.length; _i++) {\n        var middleDelim = inner[_i];\n        // Property `isMiddle` not defined on `span`. See comment in\n        // \"middle\"'s htmlBuilder.\n        // TODO(ts)\n        var isMiddle = middleDelim.isMiddle;\n        if (isMiddle) {\n          // Apply the options that were active when \\middle was called\n          inner[_i] = makeLeftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);\n        }\n      }\n    }\n    var rightDelim;\n    // Same for the right delimiter, but using color specified by \\color\n    if (group.right === \".\") {\n      rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n    } else {\n      var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;\n      rightDelim = makeLeftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, [\"mclose\"]);\n    }\n    // Add it to the end of the expression.\n    inner.push(rightDelim);\n    return makeSpan([\"minner\"], inner, options);\n  },\n  mathmlBuilder: (group, options) => {\n    assertParsed(group);\n    var inner = buildExpression(group.body, options);\n    if (group.left !== \".\") {\n      var leftNode = new MathNode(\"mo\", [makeText(group.left, group.mode)]);\n      leftNode.setAttribute(\"fence\", \"true\");\n      inner.unshift(leftNode);\n    }\n    if (group.right !== \".\") {\n      var rightNode = new MathNode(\"mo\", [makeText(group.right, group.mode)]);\n      rightNode.setAttribute(\"fence\", \"true\");\n      if (group.rightColor) {\n        rightNode.setAttribute(\"mathcolor\", group.rightColor);\n      }\n      inner.push(rightNode);\n    }\n    return makeRow(inner);\n  }\n});\ndefineFunction({\n  type: \"middle\",\n  names: [\"\\\\middle\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (context, args) => {\n    var delim = checkDelimiter(args[0], context);\n    if (!context.parser.leftrightDepth) {\n      throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n    }\n    return {\n      type: \"middle\",\n      mode: context.parser.mode,\n      delim: delim.text\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var middleDelim;\n    if (group.delim === \".\") {\n      middleDelim = makeNullDelimiter(options, []);\n    } else {\n      middleDelim = makeSizedDelim(group.delim, 1, options, group.mode, []);\n      var isMiddle = {\n        delim: group.delim,\n        options\n      };\n      // Property `isMiddle` not defined on `span`. It is only used in\n      // this file above.\n      // TODO: Fix this violation of the `span` type and possibly rename\n      // things since `isMiddle` sounds like a boolean, but is a struct.\n      // TODO(ts)\n      middleDelim.isMiddle = isMiddle;\n    }\n    return middleDelim;\n  },\n  mathmlBuilder: (group, options) => {\n    // A Firefox \\middle will stretch a character vertically only if it\n    // is in the fence part of the operator dictionary at:\n    // https://www.w3.org/TR/MathML3/appendixc.html.\n    // So we need to avoid U+2223 and use plain \"|\" instead.\n    var textNode = group.delim === \"\\\\vert\" || group.delim === \"|\" ? makeText(\"|\", \"text\") : makeText(group.delim, group.mode);\n    var middleNode = new MathNode(\"mo\", [textNode]);\n    middleNode.setAttribute(\"fence\", \"true\");\n    // MathML gives 5/18em spacing to each <mo> element.\n    // \\middle should get delimiter spacing instead.\n    middleNode.setAttribute(\"lspace\", \"0.05em\");\n    middleNode.setAttribute(\"rspace\", \"0.05em\");\n    return middleNode;\n  }\n});\n\nvar htmlBuilder$7 = (group, options) => {\n  // \\cancel, \\bcancel, \\xcancel, \\sout, \\fbox, \\colorbox, \\fcolorbox, \\phase\n  // Some groups can return document fragments.  Handle those by wrapping\n  // them in a span.\n  var inner = wrapFragment(buildGroup$1(group.body, options), options);\n  var label = group.label.slice(1);\n  var scale = options.sizeMultiplier;\n  var img;\n  var imgShift = 0;\n  // In the LaTeX cancel package, line geometry is slightly different\n  // depending on whether the subject is wider than it is tall, or vice versa.\n  // We don't know the width of a group, so as a proxy, we test if\n  // the subject is a single character. This captures most of the\n  // subjects that should get the \"tall\" treatment.\n  var isSingleChar = isCharacterBox(group.body);\n  if (label === \"sout\") {\n    img = makeSpan([\"stretchy\", \"sout\"]);\n    img.height = options.fontMetrics().defaultRuleThickness / scale;\n    imgShift = -0.5 * options.fontMetrics().xHeight;\n  } else if (label === \"phase\") {\n    // Set a couple of dimensions from the steinmetz package.\n    var lineWeight = calculateSize({\n      number: 0.6,\n      unit: \"pt\"\n    }, options);\n    var clearance = calculateSize({\n      number: 0.35,\n      unit: \"ex\"\n    }, options);\n    // Prevent size changes like \\Huge from affecting line thickness\n    var newOptions = options.havingBaseSizing();\n    scale = scale / newOptions.sizeMultiplier;\n    var angleHeight = inner.height + inner.depth + lineWeight + clearance;\n    // Reserve a left pad for the angle.\n    inner.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight);\n    // Create an SVG\n    var viewBoxHeight = Math.floor(1000 * angleHeight * scale);\n    var path = phasePath(viewBoxHeight);\n    var svgNode = new SvgNode([new PathNode(\"phase\", path)], {\n      \"width\": \"400em\",\n      \"height\": makeEm(viewBoxHeight / 1000),\n      \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n      \"preserveAspectRatio\": \"xMinYMin slice\"\n    });\n    // Wrap it in a span with overflow: hidden.\n    img = makeSvgSpan([\"hide-tail\"], [svgNode], options);\n    img.style.height = makeEm(angleHeight);\n    imgShift = inner.depth + lineWeight + clearance;\n  } else {\n    // Add horizontal padding\n    if (/cancel/.test(label)) {\n      if (!isSingleChar) {\n        inner.classes.push(\"cancel-pad\");\n      }\n    } else if (label === \"angl\") {\n      inner.classes.push(\"anglpad\");\n    } else {\n      inner.classes.push(\"boxpad\");\n    }\n    // Add vertical padding\n    var topPad = 0;\n    var bottomPad = 0;\n    var ruleThickness = 0;\n    // ref: cancel package: \\advance\\totalheight2\\p@ % \"+2\"\n    if (/box/.test(label)) {\n      ruleThickness = Math.max(options.fontMetrics().fboxrule,\n      // default\n      options.minRuleThickness);\n      topPad = options.fontMetrics().fboxsep + (label === \"colorbox\" ? 0 : ruleThickness);\n      bottomPad = topPad;\n    } else if (label === \"angl\") {\n      ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n      topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself.\n      bottomPad = Math.max(0, 0.25 - inner.depth);\n    } else {\n      topPad = isSingleChar ? 0.2 : 0;\n      bottomPad = topPad;\n    }\n    img = stretchyEnclose(inner, label, topPad, bottomPad, options);\n    if (/fbox|boxed|fcolorbox/.test(label)) {\n      img.style.borderStyle = \"solid\";\n      img.style.borderWidth = makeEm(ruleThickness);\n    } else if (label === \"angl\" && ruleThickness !== 0.049) {\n      img.style.borderTopWidth = makeEm(ruleThickness);\n      img.style.borderRightWidth = makeEm(ruleThickness);\n    }\n    imgShift = inner.depth + bottomPad;\n    if (group.backgroundColor) {\n      img.style.backgroundColor = group.backgroundColor;\n      if (group.borderColor) {\n        img.style.borderColor = group.borderColor;\n      }\n    }\n  }\n  var vlist;\n  if (group.backgroundColor) {\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Put the color background behind inner;\n      {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift\n      }, {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }]\n    });\n  } else {\n    var classes = /cancel|phase/.test(label) ? [\"svg-align\"] : [];\n    vlist = makeVList({\n      positionType: \"individualShift\",\n      children: [\n      // Write the \\cancel stroke on top of inner.\n      {\n        type: \"elem\",\n        elem: inner,\n        shift: 0\n      }, {\n        type: \"elem\",\n        elem: img,\n        shift: imgShift,\n        wrapperClasses: classes\n      }]\n    });\n  }\n  if (/cancel/.test(label)) {\n    // The cancel package documentation says that cancel lines add their height\n    // to the expression, but tests show that isn't how it actually works.\n    vlist.height = inner.height;\n    vlist.depth = inner.depth;\n  }\n  if (/cancel/.test(label) && !isSingleChar) {\n    // cancel does not create horiz space for its line extension.\n    return makeSpan([\"mord\", \"cancel-lap\"], [vlist], options);\n  } else {\n    return makeSpan([\"mord\"], [vlist], options);\n  }\n};\nvar mathmlBuilder$6 = (group, options) => {\n  var fboxsep = 0;\n  var node = new MathNode(group.label.includes(\"colorbox\") ? \"mpadded\" : \"menclose\", [buildGroup(group.body, options)]);\n  switch (group.label) {\n    case \"\\\\cancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike\");\n      break;\n    case \"\\\\bcancel\":\n      node.setAttribute(\"notation\", \"downdiagonalstrike\");\n      break;\n    case \"\\\\phase\":\n      node.setAttribute(\"notation\", \"phasorangle\");\n      break;\n    case \"\\\\sout\":\n      node.setAttribute(\"notation\", \"horizontalstrike\");\n      break;\n    case \"\\\\fbox\":\n      node.setAttribute(\"notation\", \"box\");\n      break;\n    case \"\\\\angl\":\n      node.setAttribute(\"notation\", \"actuarial\");\n      break;\n    case \"\\\\fcolorbox\":\n    case \"\\\\colorbox\":\n      // <menclose> doesn't have a good notation option. So use <mpadded>\n      // instead. Set some attributes that come included with <menclose>.\n      fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;\n      node.setAttribute(\"width\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"height\", \"+\" + 2 * fboxsep + \"pt\");\n      node.setAttribute(\"lspace\", fboxsep + \"pt\"); //\n      node.setAttribute(\"voffset\", fboxsep + \"pt\");\n      if (group.label === \"\\\\fcolorbox\") {\n        var thk = Math.max(options.fontMetrics().fboxrule,\n        // default\n        options.minRuleThickness);\n        node.setAttribute(\"style\", \"border: \" + makeEm(thk) + \" solid \" + group.borderColor);\n      }\n      break;\n    case \"\\\\xcancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n      break;\n  }\n  if (group.backgroundColor) {\n    node.setAttribute(\"mathbackground\", group.backgroundColor);\n  }\n  return node;\n};\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\colorbox\"],\n  props: {\n    numArgs: 2,\n    allowedInText: true,\n    argTypes: [\"color\", \"text\"]\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var color = assertNodeType(args[0], \"color-token\").color;\n    var body = args[1];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor: color,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fcolorbox\"],\n  props: {\n    numArgs: 3,\n    allowedInText: true,\n    argTypes: [\"color\", \"color\", \"text\"]\n  },\n  handler(_ref2, args, optArgs) {\n    var {\n      parser,\n      funcName\n    } = _ref2;\n    var borderColor = assertNodeType(args[0], \"color-token\").color;\n    var backgroundColor = assertNodeType(args[1], \"color-token\").color;\n    var body = args[2];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor,\n      borderColor,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\fbox\",\n      body: args[0]\n    };\n  }\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\phase\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\sout\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref5, args) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    if (parser.mode === \"math\") {\n      parser.settings.reportNonstrict(\"mathVsSout\", \"LaTeX's \\\\sout works only in text mode\");\n    }\n    var body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$7,\n  mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\angl\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: false\n  },\n  handler(_ref6, args) {\n    var {\n      parser\n    } = _ref6;\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\angl\",\n      body: args[0]\n    };\n  }\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nvar _environments = {};\nfunction defineEnvironment(_ref) {\n  var {\n    type,\n    names,\n    props,\n    handler,\n    htmlBuilder,\n    mathmlBuilder\n  } = _ref;\n  // Set default values of environments.\n  var data = {\n    type,\n    numArgs: props.numArgs || 0,\n    allowedInText: false,\n    numOptionalArgs: 0,\n    handler\n  };\n  for (var i = 0; i < names.length; ++i) {\n    // TODO: The value type of _environments should be a type union of all\n    // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is\n    // an existential type.\n    _environments[names[i]] = data;\n  }\n  if (htmlBuilder) {\n    _htmlGroupBuilders[type] = htmlBuilder;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nvar _macros = {};\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n  _macros[name] = body;\n}\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n  // The + prefix indicates that these fields aren't writeable\n  // Lexer holding the input string.\n  // Start offset, zero-based inclusive.\n  // End offset, zero-based exclusive.\n  constructor(lexer, start, end) {\n    this.lexer = lexer;\n    this.start = start;\n    this.end = end;\n  }\n  /**\n   * Merges two `SourceLocation`s from location providers, given they are\n   * provided in order of appearance.\n   * - Returns the first one's location if only the first is provided.\n   * - Returns a merged range of the first and the last if both are provided\n   *   and their lexers match.\n   * - Otherwise, returns null.\n   */\n  static range(first, second) {\n    if (!second) {\n      return first && first.loc;\n    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n      return null;\n    } else {\n      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n    }\n  }\n}\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n  // don't expand the token\n  // used in \\noexpand\n  constructor(text,\n  // the text of this token\n  loc) {\n    this.text = text;\n    this.loc = loc;\n  }\n  /**\n   * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n   * the whole input range enclosed by these two.\n   */\n  range(endToken,\n  // last token of the range, inclusive\n  text) {\n    return new Token(text, SourceLocation.range(this, endToken));\n  }\n}\n\n// Helper functions\nfunction getHLines(parser) {\n  // Return an array. The array length = number of hlines.\n  // Each element in the array tells if the line is dashed.\n  var hlineInfo = [];\n  parser.consumeSpaces();\n  var nxt = parser.fetch().text;\n  if (nxt === \"\\\\relax\") {\n    // \\relax is an artifact of the \\cr macro below\n    parser.consume();\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n    parser.consume();\n    hlineInfo.push(nxt === \"\\\\hdashline\");\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  return hlineInfo;\n}\nvar validateAmsEnvironmentContext = context => {\n  var settings = context.parser.settings;\n  if (!settings.displayMode) {\n    throw new ParseError(\"{\" + context.envName + \"} can be used only in\" + \" display mode.\");\n  }\n};\nvar gatherEnvironments = new Set([\"gather\", \"gather*\"]);\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n  if (!name.includes(\"ed\")) {\n    return !name.includes(\"*\");\n  }\n  // return undefined;\n}\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell.  If given an optional argument style\n * (\"text\", \"display\", etc.), then each cell is cast into that style.\n */\nfunction parseArray(parser, _ref, style) {\n  var {\n    hskipBeforeAndAfter,\n    addJot,\n    cols,\n    arraystretch,\n    colSeparationType,\n    autoTag,\n    singleRow,\n    emptySingleRow,\n    maxNumCols,\n    leqno\n  } = _ref;\n  parser.gullet.beginGroup();\n  if (!singleRow) {\n    // \\cr is equivalent to \\\\ without the optional size argument (see below)\n    // TODO: provide helpful error when \\cr is used outside array environment\n    parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  }\n  // Get current arraystretch if it's not set by the environment\n  if (!arraystretch) {\n    var stretch = parser.gullet.expandMacroAsText(\"\\\\arraystretch\");\n    if (stretch == null) {\n      // Default \\arraystretch from lttab.dtx\n      arraystretch = 1;\n    } else {\n      arraystretch = parseFloat(stretch);\n      if (!arraystretch || arraystretch < 0) {\n        throw new ParseError(\"Invalid \\\\arraystretch: \" + stretch);\n      }\n    }\n  }\n  // Start group for first cell\n  parser.gullet.beginGroup();\n  var row = [];\n  var body = [row];\n  var rowGaps = [];\n  var hLinesBeforeRow = [];\n  var tags = autoTag != null ? [] : undefined;\n  // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n  // whether this row should have an equation number.  Simulate this with\n  // a \\@eqnsw macro set to 1 or 0.\n  function beginRow() {\n    if (autoTag) {\n      parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n    }\n  }\n  function endRow() {\n    if (tags) {\n      if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n        tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n        parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n      } else {\n        tags.push(Boolean(autoTag) && parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n      }\n    }\n  }\n  beginRow();\n  // Test for \\hline at the top of the array.\n  hLinesBeforeRow.push(getHLines(parser));\n  while (true) {\n    // eslint-disable-line no-constant-condition\n    // Parse each cell in its own group (namespace)\n    var cellBody = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    var cell = {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body: cellBody\n    };\n    if (style) {\n      cell = {\n        type: \"styling\",\n        mode: parser.mode,\n        style,\n        body: [cell]\n      };\n    }\n    row.push(cell);\n    var next = parser.fetch().text;\n    if (next === \"&\") {\n      if (maxNumCols && row.length === maxNumCols) {\n        if (singleRow || colSeparationType) {\n          // {equation} or {split}\n          throw new ParseError(\"Too many tab characters: &\", parser.nextToken);\n        } else {\n          // {array} environment\n          parser.settings.reportNonstrict(\"textEnv\", \"Too few columns \" + \"specified in the {array} column argument.\");\n        }\n      }\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      endRow();\n      // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n      // the last line is empty.  However, AMS environments keep the\n      // empty row if it's the only one.\n      // NOTE: Currently, `cell` is the last item added into `row`.\n      if (row.length === 1 && cell.type === \"styling\" && cell.body.length === 1 && cell.body[0].type === \"ordgroup\" && cell.body[0].body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n        body.pop();\n      }\n      if (hLinesBeforeRow.length < body.length + 1) {\n        hLinesBeforeRow.push([]);\n      }\n      break;\n    } else if (next === \"\\\\\\\\\") {\n      parser.consume();\n      var size = void 0;\n      // \\def\\Let@{\\let\\\\\\math@cr}\n      // \\def\\math@cr{...\\math@cr@}\n      // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n      // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n      // \\def\\math@cr@@@{\\cr}\n      if (parser.gullet.future().text !== \" \") {\n        size = parser.parseSizeGroup(true);\n      }\n      rowGaps.push(size ? size.value : null);\n      endRow();\n      // check for \\hline(s) following the row separator\n      hLinesBeforeRow.push(getHLines(parser));\n      row = [];\n      body.push(row);\n      beginRow();\n    } else {\n      throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n  // End cell group\n  parser.gullet.endGroup();\n  // End array group defining \\cr\n  parser.gullet.endGroup();\n  return {\n    type: \"array\",\n    mode: parser.mode,\n    addJot,\n    arraystretch,\n    body,\n    cols,\n    rowGaps,\n    hskipBeforeAndAfter,\n    hLinesBeforeRow,\n    colSeparationType,\n    tags,\n    leqno\n  };\n}\n// Decides on a style for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n  if (envName.slice(0, 1) === \"d\") {\n    return \"display\";\n  } else {\n    return \"text\";\n  }\n}\nvar htmlBuilder$6 = function htmlBuilder(group, options) {\n  var r;\n  var c;\n  var nr = group.body.length;\n  var hLinesBeforeRow = group.hLinesBeforeRow;\n  var nc = 0;\n  var body = new Array(nr);\n  var hlines = [];\n  var ruleThickness = Math.max(\n  // From LaTeX \\showthe\\arrayrulewidth. Equals 0.04 em.\n  options.fontMetrics().arrayRuleWidth, options.minRuleThickness);\n  // Horizontal spacing\n  var pt = 1 / options.fontMetrics().ptPerEm;\n  var arraycolsep = 5 * pt; // default value, i.e. \\arraycolsep in article.cls\n  if (group.colSeparationType && group.colSeparationType === \"small\") {\n    // We're in a {smallmatrix}. Default column space is \\thickspace,\n    // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.\n    // But that needs adjustment because LaTeX applies \\scriptstyle to the\n    // entire array, including the colspace, but this function applies\n    // \\scriptstyle only inside each element.\n    var localMultiplier = options.havingStyle(Style$1.SCRIPT).sizeMultiplier;\n    arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);\n  }\n  // Vertical spacing\n  var baselineskip = group.colSeparationType === \"CD\" ? calculateSize({\n    number: 3,\n    unit: \"ex\"\n  }, options) : 12 * pt; // see size10.clo\n  // Default \\jot from ltmath.dtx\n  // TODO(edemaine): allow overriding \\jot via \\setlength (#687)\n  var jot = 3 * pt;\n  var arrayskip = group.arraystretch * baselineskip;\n  var arstrutHeight = 0.7 * arrayskip; // \\strutbox in ltfsstrc.dtx and\n  var arstrutDepth = 0.3 * arrayskip; // \\@arstrutbox in lttab.dtx\n  var totalHeight = 0;\n  // Set a position for \\hline(s) at the top of the array, if any.\n  function setHLinePos(hlinesInGap) {\n    for (var i = 0; i < hlinesInGap.length; ++i) {\n      if (i > 0) {\n        totalHeight += 0.25;\n      }\n      hlines.push({\n        pos: totalHeight,\n        isDashed: hlinesInGap[i]\n      });\n    }\n  }\n  setHLinePos(hLinesBeforeRow[0]);\n  for (r = 0; r < group.body.length; ++r) {\n    var inrow = group.body[r];\n    var height = arstrutHeight; // \\@array adds an \\@arstrut\n    var depth = arstrutDepth; // to each tow (via the template)\n    if (nc < inrow.length) {\n      nc = inrow.length;\n    }\n    var outrow = new Array(inrow.length);\n    for (c = 0; c < inrow.length; ++c) {\n      var elt = buildGroup$1(inrow[c], options);\n      if (depth < elt.depth) {\n        depth = elt.depth;\n      }\n      if (height < elt.height) {\n        height = elt.height;\n      }\n      outrow[c] = elt;\n    }\n    var rowGap = group.rowGaps[r];\n    var gap = 0;\n    if (rowGap) {\n      gap = calculateSize(rowGap, options);\n      if (gap > 0) {\n        // \\@argarraycr\n        gap += arstrutDepth;\n        if (depth < gap) {\n          depth = gap; // \\@xargarraycr\n        }\n        gap = 0;\n      }\n    }\n    // In AMS multiline environments such as aligned and gathered, rows\n    // correspond to lines that have additional \\jot added between lines\n    // via \\openup.\n    // We simulate this by adding \\jot depth to each row except the last.\n    if (group.addJot && r < group.body.length - 1) {\n      depth += jot;\n    }\n    outrow.height = height;\n    outrow.depth = depth;\n    totalHeight += height;\n    outrow.pos = totalHeight;\n    totalHeight += depth + gap; // \\@yargarraycr\n    body[r] = outrow;\n    // Set a position for \\hline(s), if any.\n    setHLinePos(hLinesBeforeRow[r + 1]);\n  }\n  var offset = totalHeight / 2 + options.fontMetrics().axisHeight;\n  var colDescriptions = group.cols || [];\n  var cols = [];\n  var colSep;\n  var colDescrNum;\n  var tagSpans = [];\n  if (group.tags && group.tags.some(tag => tag)) {\n    // An environment with manual tags and/or automatic equation numbers.\n    // Create node(s), the latter of which trigger CSS counter increment.\n    for (r = 0; r < nr; ++r) {\n      var rw = body[r];\n      var shift = rw.pos - offset;\n      var tag = group.tags[r];\n      var tagSpan = void 0;\n      if (tag === true) {\n        // automatic numbering\n        tagSpan = makeSpan([\"eqn-num\"], [], options);\n      } else if (tag === false) {\n        // \\nonumber/\\notag or starred environment\n        tagSpan = makeSpan([], [], options);\n      } else {\n        // manual \\tag\n        tagSpan = makeSpan([], buildExpression$1(tag, options, true), options);\n      }\n      tagSpan.depth = rw.depth;\n      tagSpan.height = rw.height;\n      tagSpans.push({\n        type: \"elem\",\n        elem: tagSpan,\n        shift\n      });\n    }\n  }\n  for (c = 0, colDescrNum = 0;\n  // Continue while either there are more columns or more column\n  // descriptions, so trailing separators don't get lost.\n  c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {\n    var _colDescr3;\n    var colDescr = colDescriptions[colDescrNum];\n    var firstSeparator = true;\n    while (((_colDescr = colDescr) == null ? void 0 : _colDescr.type) === \"separator\") {\n      var _colDescr;\n      // If there is more than one separator in a row, add a space\n      // between them.\n      if (!firstSeparator) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(options.fontMetrics().doubleRuleSep);\n        cols.push(colSep);\n      }\n      if (colDescr.separator === \"|\" || colDescr.separator === \":\") {\n        var lineType = colDescr.separator === \"|\" ? \"solid\" : \"dashed\";\n        var separator = makeSpan([\"vertical-separator\"], [], options);\n        separator.style.height = makeEm(totalHeight);\n        separator.style.borderRightWidth = makeEm(ruleThickness);\n        separator.style.borderRightStyle = lineType;\n        separator.style.margin = \"0 \" + makeEm(-ruleThickness / 2);\n        var _shift = totalHeight - offset;\n        if (_shift) {\n          separator.style.verticalAlign = makeEm(-_shift);\n        }\n        cols.push(separator);\n      } else {\n        throw new ParseError(\"Invalid separator type: \" + colDescr.separator);\n      }\n      colDescrNum++;\n      colDescr = colDescriptions[colDescrNum];\n      firstSeparator = false;\n    }\n    if (c >= nc) {\n      continue;\n    }\n    var sepwidth = void 0;\n    if (c > 0 || group.hskipBeforeAndAfter) {\n      var _colDescr$pregap, _colDescr2;\n      sepwidth = (_colDescr$pregap = (_colDescr2 = colDescr) == null ? void 0 : _colDescr2.pregap) != null ? _colDescr$pregap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n    var colElems = [];\n    for (r = 0; r < nr; ++r) {\n      var row = body[r];\n      var elem = row[c];\n      if (!elem) {\n        continue;\n      }\n      var _shift2 = row.pos - offset;\n      elem.depth = row.depth;\n      elem.height = row.height;\n      colElems.push({\n        type: \"elem\",\n        elem: elem,\n        shift: _shift2\n      });\n    }\n    var colVList = makeVList({\n      positionType: \"individualShift\",\n      children: colElems\n    });\n    var colSpan = makeSpan([\"col-align-\" + (((_colDescr3 = colDescr) == null ? void 0 : _colDescr3.align) || \"c\")], [colVList]);\n    cols.push(colSpan);\n    if (c < nc - 1 || group.hskipBeforeAndAfter) {\n      var _colDescr$postgap, _colDescr4;\n      sepwidth = (_colDescr$postgap = (_colDescr4 = colDescr) == null ? void 0 : _colDescr4.postgap) != null ? _colDescr$postgap : arraycolsep;\n      if (sepwidth !== 0) {\n        colSep = makeSpan([\"arraycolsep\"], []);\n        colSep.style.width = makeEm(sepwidth);\n        cols.push(colSep);\n      }\n    }\n  }\n  var tableBody = makeSpan([\"mtable\"], cols);\n  // Add \\hline(s), if any.\n  if (hlines.length > 0) {\n    var line = makeLineSpan(\"hline\", options, ruleThickness);\n    var dashes = makeLineSpan(\"hdashline\", options, ruleThickness);\n    var vListElems = [{\n      type: \"elem\",\n      elem: tableBody,\n      shift: 0\n    }];\n    while (hlines.length > 0) {\n      var hline = hlines.pop();\n      var lineShift = hline.pos - offset;\n      if (hline.isDashed) {\n        vListElems.push({\n          type: \"elem\",\n          elem: dashes,\n          shift: lineShift\n        });\n      } else {\n        vListElems.push({\n          type: \"elem\",\n          elem: line,\n          shift: lineShift\n        });\n      }\n    }\n    tableBody = makeVList({\n      positionType: \"individualShift\",\n      children: vListElems\n    });\n  }\n  if (tagSpans.length === 0) {\n    return makeSpan([\"mord\"], [tableBody], options);\n  } else {\n    var eqnNumCol = makeVList({\n      positionType: \"individualShift\",\n      children: tagSpans\n    });\n    var tagCol = makeSpan([\"tag\"], [eqnNumCol], options);\n    return makeFragment([tableBody, tagCol]);\n  }\n};\nvar alignMap = {\n  c: \"center \",\n  l: \"left \",\n  r: \"right \"\n};\nvar mathmlBuilder$5 = function mathmlBuilder(group, options) {\n  var tbl = [];\n  var glue = new MathNode(\"mtd\", [], [\"mtr-glue\"]);\n  var tag = new MathNode(\"mtd\", [], [\"mml-eqn-num\"]);\n  for (var i = 0; i < group.body.length; i++) {\n    var rw = group.body[i];\n    var row = [];\n    for (var j = 0; j < rw.length; j++) {\n      row.push(new MathNode(\"mtd\", [buildGroup(rw[j], options)]));\n    }\n    if (group.tags && group.tags[i]) {\n      row.unshift(glue);\n      row.push(glue);\n      if (group.leqno) {\n        row.unshift(tag);\n      } else {\n        row.push(tag);\n      }\n    }\n    tbl.push(new MathNode(\"mtr\", row));\n  }\n  var table = new MathNode(\"mtable\", tbl);\n  // Set column alignment, row spacing, column spacing, and\n  // array lines by setting attributes on the table element.\n  // Set the row spacing. In MathML, we specify a gap distance.\n  // We do not use rowGap[] because MathML automatically increases\n  // cell height with the height/depth of the element content.\n  // LaTeX \\arraystretch multiplies the row baseline-to-baseline distance.\n  // We simulate this by adding (arraystretch - 1)em to the gap. This\n  // does a reasonable job of adjusting arrays containing 1 em tall content.\n  // The 0.16 and 0.09 values are found empirically. They produce an array\n  // similar to LaTeX and in which content does not interfere with \\hlines.\n  var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}\n  : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);\n  table.setAttribute(\"rowspacing\", makeEm(gap));\n  // MathML table lines go only between cells.\n  // To place a line on an edge we'll use <menclose>, if necessary.\n  var menclose = \"\";\n  var align = \"\";\n  if (group.cols && group.cols.length > 0) {\n    // Find column alignment, column spacing, and  vertical lines.\n    var cols = group.cols;\n    var columnLines = \"\";\n    var prevTypeWasAlign = false;\n    var iStart = 0;\n    var iEnd = cols.length;\n    if (cols[0].type === \"separator\") {\n      menclose += \"top \";\n      iStart = 1;\n    }\n    if (cols[cols.length - 1].type === \"separator\") {\n      menclose += \"bottom \";\n      iEnd -= 1;\n    }\n    for (var _i = iStart; _i < iEnd; _i++) {\n      var col = cols[_i];\n      if (col.type === \"align\") {\n        align += alignMap[col.align];\n        if (prevTypeWasAlign) {\n          columnLines += \"none \";\n        }\n        prevTypeWasAlign = true;\n      } else if (col.type === \"separator\") {\n        // MathML accepts only single lines between cells.\n        // So we read only the first of consecutive separators.\n        if (prevTypeWasAlign) {\n          columnLines += col.separator === \"|\" ? \"solid \" : \"dashed \";\n          prevTypeWasAlign = false;\n        }\n      }\n    }\n    table.setAttribute(\"columnalign\", align.trim());\n    if (/[sd]/.test(columnLines)) {\n      table.setAttribute(\"columnlines\", columnLines.trim());\n    }\n  }\n  // Set column spacing.\n  if (group.colSeparationType === \"align\") {\n    var _cols = group.cols || [];\n    var spacing = \"\";\n    for (var _i2 = 1; _i2 < _cols.length; _i2++) {\n      spacing += _i2 % 2 ? \"0em \" : \"1em \";\n    }\n    table.setAttribute(\"columnspacing\", spacing.trim());\n  } else if (group.colSeparationType === \"alignat\" || group.colSeparationType === \"gather\") {\n    table.setAttribute(\"columnspacing\", \"0em\");\n  } else if (group.colSeparationType === \"small\") {\n    table.setAttribute(\"columnspacing\", \"0.2778em\");\n  } else if (group.colSeparationType === \"CD\") {\n    table.setAttribute(\"columnspacing\", \"0.5em\");\n  } else {\n    table.setAttribute(\"columnspacing\", \"1em\");\n  }\n  // Address \\hline and \\hdashline\n  var rowLines = \"\";\n  var hlines = group.hLinesBeforeRow;\n  menclose += hlines[0].length > 0 ? \"left \" : \"\";\n  menclose += hlines[hlines.length - 1].length > 0 ? \"right \" : \"\";\n  for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) {\n    rowLines += hlines[_i3].length === 0 ? \"none \"\n    // MathML accepts only a single line between rows. Read one element.\n    : hlines[_i3][0] ? \"dashed \" : \"solid \";\n  }\n  if (/[sd]/.test(rowLines)) {\n    table.setAttribute(\"rowlines\", rowLines.trim());\n  }\n  if (menclose !== \"\") {\n    table = new MathNode(\"menclose\", [table]);\n    table.setAttribute(\"notation\", menclose.trim());\n  }\n  if (group.arraystretch && group.arraystretch < 1) {\n    // A small array. Wrap in scriptstyle so row gap is not too large.\n    table = new MathNode(\"mstyle\", [table]);\n    table.setAttribute(\"scriptlevel\", \"1\");\n  }\n  return table;\n};\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat.\nvar alignedHandler = function alignedHandler(context, args) {\n  if (!context.envName.includes(\"ed\")) {\n    validateAmsEnvironmentContext(context);\n  }\n  var cols = [];\n  var separationType = context.envName.includes(\"at\") ? \"alignat\" : \"align\";\n  var isSplit = context.envName === \"split\";\n  var res = parseArray(context.parser, {\n    cols,\n    addJot: true,\n    autoTag: isSplit ? undefined : getAutoTag(context.envName),\n    emptySingleRow: true,\n    colSeparationType: separationType,\n    maxNumCols: isSplit ? 2 : undefined,\n    leqno: context.parser.settings.leqno\n  }, \"display\");\n  // Determining number of columns.\n  // 1. If the first argument is given, we use it as a number of columns,\n  //    and makes sure that each row doesn't exceed that number.\n  // 2. Otherwise, just count number of columns = maximum number\n  //    of cells in each row (\"aligned\" mode -- isAligned will be true).\n  //\n  // At the same time, prepend empty group {} at beginning of every second\n  // cell in each row (starting with second cell) so that operators become\n  // binary.  This behavior is implemented in amsmath's \\start@aligned.\n  var numMaths = 0;\n  var numCols = 0;\n  var emptyGroup = {\n    type: \"ordgroup\",\n    mode: context.mode,\n    body: []\n  };\n  if (args[0] && args[0].type === \"ordgroup\") {\n    var arg0 = \"\";\n    for (var i = 0; i < args[0].body.length; i++) {\n      var textord = assertNodeType(args[0].body[i], \"textord\");\n      arg0 += textord.text;\n    }\n    numMaths = Number(arg0);\n    numCols = numMaths * 2;\n  }\n  var isAligned = !numCols;\n  res.body.forEach(function (row) {\n    for (var _i4 = 1; _i4 < row.length; _i4 += 2) {\n      // Modify ordgroup node within styling node\n      var styling = assertNodeType(row[_i4], \"styling\");\n      var ordgroup = assertNodeType(styling.body[0], \"ordgroup\");\n      ordgroup.body.unshift(emptyGroup);\n    }\n    if (!isAligned) {\n      // Case 1\n      var curMaths = row.length / 2;\n      if (numMaths < curMaths) {\n        throw new ParseError(\"Too many math in a row: \" + (\"expected \" + numMaths + \", but got \" + curMaths), row[0]);\n      }\n    } else if (numCols < row.length) {\n      // Case 2\n      numCols = row.length;\n    }\n  });\n  // Adjusting alignment.\n  // In aligned mode, we add one \\qquad between columns;\n  // otherwise we add nothing.\n  for (var _i5 = 0; _i5 < numCols; ++_i5) {\n    var align = \"r\";\n    var pregap = 0;\n    if (_i5 % 2 === 1) {\n      align = \"l\";\n    } else if (_i5 > 0 && isAligned) {\n      // \"aligned\" mode.\n      pregap = 1; // add one \\quad\n    }\n    cols[_i5] = {\n      type: \"align\",\n      align: align,\n      pregap: pregap,\n      postgap: 0\n    };\n  }\n  res.colSeparationType = isAligned ? \"align\" : \"alignat\";\n  return res;\n};\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"array\", \"darray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Since no types are specified above, the two possibilities are\n    // - The argument is wrapped in {} or [], in which case Parser's\n    //   parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n    // - The argument is a bare symbol node.\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      if (\"lcr\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      } else if (ca === \"|\") {\n        return {\n          type: \"separator\",\n          separator: \"|\"\n        };\n      } else if (ca === \":\") {\n        return {\n          type: \"separator\",\n          separator: \":\"\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    var res = {\n      cols,\n      hskipBeforeAndAfter: true,\n      // \\@preamble in lttab.dtx\n      maxNumCols: cols.length\n    };\n    return parseArray(context.parser, res, dCellStyle(context.envName));\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"matrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\", \"matrix*\", \"pmatrix*\", \"bmatrix*\", \"Bmatrix*\", \"vmatrix*\", \"Vmatrix*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var delimiters = {\n      \"matrix\": null,\n      \"pmatrix\": [\"(\", \")\"],\n      \"bmatrix\": [\"[\", \"]\"],\n      \"Bmatrix\": [\"\\\\{\", \"\\\\}\"],\n      \"vmatrix\": [\"|\", \"|\"],\n      \"Vmatrix\": [\"\\\\Vert\", \"\\\\Vert\"]\n    }[context.envName.replace(\"*\", \"\")];\n    // \\hskip -\\arraycolsep in amsmath\n    var colAlign = \"c\";\n    var payload = {\n      hskipBeforeAndAfter: false,\n      cols: [{\n        type: \"align\",\n        align: colAlign\n      }]\n    };\n    if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n      // It's one of the mathtools starred functions.\n      // Parse the optional alignment argument.\n      var parser = context.parser;\n      parser.consumeSpaces();\n      if (parser.fetch().text === \"[\") {\n        parser.consume();\n        parser.consumeSpaces();\n        colAlign = parser.fetch().text;\n        if (!\"lcr\".includes(colAlign)) {\n          throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n        }\n        parser.consume();\n        parser.consumeSpaces();\n        parser.expect(\"]\");\n        parser.consume();\n        payload.cols = [{\n          type: \"align\",\n          align: colAlign\n        }];\n      }\n    }\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    // Populate cols with the correct number of column alignment specs.\n    var numCols = Math.max(0, ...res.body.map(row => row.length));\n    res.cols = new Array(numCols).fill({\n      type: \"align\",\n      align: colAlign\n    });\n    return delimiters ? {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: delimiters[0],\n      right: delimiters[1],\n      rightColor: undefined // \\right uninfluenced by \\color in array\n    } : res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"smallmatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    res.colSeparationType = \"small\";\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"subarray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Parsing of {subarray} is similar to {array}\n    var symNode = checkSymbolNodeType(args[0]);\n    var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    var cols = colalign.map(function (nde) {\n      var node = assertSymbolNodeType(nde);\n      var ca = node.text;\n      // {subarray} only recognizes \"l\" & \"c\"\n      if (\"lc\".includes(ca)) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    if (cols.length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    var payload = {\n      cols,\n      hskipBeforeAndAfter: false,\n      arraystretch: 0.5\n    };\n    var res = parseArray(context.parser, payload, \"script\");\n    if (res.body.length > 0 && res.body[0].length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    return res;\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\\arraystretch{1.2}%\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    var payload = {\n      arraystretch: 1.2,\n      cols: [{\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        // TODO(kevinb) get the current style.\n        // For now we use the metrics for TEXT style which is what we were\n        // doing before.  Before attempting to get the current style we\n        // should look at TeX's behavior especially for \\over and matrices.\n        postgap: 1.0 /* 1em quad */\n      }, {\n        type: \"align\",\n        align: \"l\",\n        pregap: 0,\n        postgap: 0\n      }]\n    };\n    var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    return {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: context.envName.includes(\"r\") ? \".\" : \"\\\\{\",\n      right: context.envName.includes(\"r\") ? \"\\\\}\" : \".\",\n      rightColor: undefined\n    };\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\n// Note that we assume \\nomallineskiplimit to be zero,\n// so that \\strut@ is the same as \\strut.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"align\", \"align*\", \"aligned\", \"split\"],\n  props: {\n    numArgs: 0\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"gathered\", \"gather\", \"gather*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    if (gatherEnvironments.has(context.envName)) {\n      validateAmsEnvironmentContext(context);\n    }\n    var res = {\n      cols: [{\n        type: \"align\",\n        align: \"c\"\n      }],\n      addJot: true,\n      colSeparationType: \"gather\",\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust spacing between\n// each columns.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"alignat\", \"alignat*\", \"alignedat\"],\n  props: {\n    numArgs: 1\n  },\n  handler: alignedHandler,\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"equation\", \"equation*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    var res = {\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      singleRow: true,\n      maxNumCols: 1,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n  type: \"array\",\n  names: [\"CD\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    return parseCD(context.parser);\n  },\n  htmlBuilder: htmlBuilder$6,\n  mathmlBuilder: mathmlBuilder$5\n});\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\n// Catch \\hline outside array environment\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\hline\", \"\\\\hdashline\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: true\n  },\n  handler(context, args) {\n    throw new ParseError(context.funcName + \" valid only within array environment\");\n  }\n});\n\nvar environments = _environments;\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n  type: \"environment\",\n  names: [\"\\\\begin\", \"\\\\end\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"]\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var nameGroup = args[0];\n    if (nameGroup.type !== \"ordgroup\") {\n      throw new ParseError(\"Invalid environment name\", nameGroup);\n    }\n    var envName = \"\";\n    for (var i = 0; i < nameGroup.body.length; ++i) {\n      envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n    }\n    if (funcName === \"\\\\begin\") {\n      // begin...end is similar to left...right\n      if (!environments.hasOwnProperty(envName)) {\n        throw new ParseError(\"No such environment: \" + envName, nameGroup);\n      }\n      // Build the environment object. Arguments and other information will\n      // be made available to the begin and end methods using properties.\n      var env = environments[envName];\n      var {\n        args: _args,\n        optArgs\n      } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n      var context = {\n        mode: parser.mode,\n        envName,\n        parser\n      };\n      var result = env.handler(context, _args, optArgs);\n      parser.expect(\"\\\\end\", false);\n      var endNameToken = parser.nextToken;\n      var end = assertNodeType(parser.parseFunction(), \"environment\");\n      if (end.name !== envName) {\n        throw new ParseError(\"Mismatch: \\\\begin{\" + envName + \"} matched by \\\\end{\" + end.name + \"}\", endNameToken);\n      }\n      // TODO(ts), \"environment\" handler returns an environment ParseNode\n      return result;\n    }\n    return {\n      type: \"environment\",\n      mode: parser.mode,\n      name: envName,\n      nameGroup\n    };\n  }\n});\n\n// TODO(kevinb): implement \\\\sl and \\\\sc\nvar htmlBuilder$5 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup$1(group.body, newOptions);\n};\nvar mathmlBuilder$4 = (group, options) => {\n  var font = group.font;\n  var newOptions = options.withFont(font);\n  return buildGroup(group.body, newOptions);\n};\nvar fontAliases = {\n  \"\\\\Bbb\": \"\\\\mathbb\",\n  \"\\\\bold\": \"\\\\mathbf\",\n  \"\\\\frak\": \"\\\\mathfrak\",\n  \"\\\\bm\": \"\\\\boldsymbol\"\n};\ndefineFunction({\n  type: \"font\",\n  names: [\n  // styles, except \\boldsymbol defined below\n  \"\\\\mathrm\", \"\\\\mathit\", \"\\\\mathbf\", \"\\\\mathnormal\", \"\\\\mathsfit\",\n  // families\n  \"\\\\mathbb\", \"\\\\mathcal\", \"\\\\mathfrak\", \"\\\\mathscr\", \"\\\\mathsf\", \"\\\\mathtt\",\n  // aliases, except \\bm defined below\n  \"\\\\Bbb\", \"\\\\bold\", \"\\\\frak\"],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = normalizeArgument(args[0]);\n    var func = funcName;\n    if (func in fontAliases) {\n      func = fontAliases[func];\n    }\n    return {\n      type: \"font\",\n      mode: parser.mode,\n      font: func.slice(1),\n      body\n    };\n  },\n  htmlBuilder: htmlBuilder$5,\n  mathmlBuilder: mathmlBuilder$4\n});\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\boldsymbol\", \"\\\\bm\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    // amsbsy.sty's \\boldsymbol uses \\binrel spacing to inherit the\n    // argument's bin|rel|ord status\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(body),\n      body: [{\n        type: \"font\",\n        mode: parser.mode,\n        font: \"boldsymbol\",\n        body\n      }],\n      isCharacterBox: isCharacterBox(body)\n    };\n  }\n});\n// Old font changing functions\ndefineFunction({\n  type: \"font\",\n  names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: (_ref3, args) => {\n    var {\n      parser,\n      funcName,\n      breakOnTokenText\n    } = _ref3;\n    var {\n      mode\n    } = parser;\n    var body = parser.parseExpression(true, breakOnTokenText);\n    var style = \"math\" + funcName.slice(1);\n    return {\n      type: \"font\",\n      mode: mode,\n      font: style,\n      body: {\n        type: \"ordgroup\",\n        mode: parser.mode,\n        body\n      }\n    };\n  },\n  htmlBuilder: htmlBuilder$5,\n  mathmlBuilder: mathmlBuilder$4\n});\n\nvar htmlBuilder$4 = (group, options) => {\n  // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).\n  var style = options.style;\n  var nstyle = style.fracNum();\n  var dstyle = style.fracDen();\n  var newOptions;\n  newOptions = options.havingStyle(nstyle);\n  var numerm = buildGroup$1(group.numer, newOptions, options);\n  if (group.continued) {\n    // \\cfrac inserts a \\strut into the numerator.\n    // Get \\strut dimensions from TeXbook page 353.\n    var hStrut = 8.5 / options.fontMetrics().ptPerEm;\n    var dStrut = 3.5 / options.fontMetrics().ptPerEm;\n    numerm.height = numerm.height < hStrut ? hStrut : numerm.height;\n    numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;\n  }\n  newOptions = options.havingStyle(dstyle);\n  var denomm = buildGroup$1(group.denom, newOptions, options);\n  var rule;\n  var ruleWidth;\n  var ruleSpacing;\n  if (group.hasBarLine) {\n    if (group.barSize) {\n      ruleWidth = calculateSize(group.barSize, options);\n      rule = makeLineSpan(\"frac-line\", options, ruleWidth);\n    } else {\n      rule = makeLineSpan(\"frac-line\", options);\n    }\n    ruleWidth = rule.height;\n    ruleSpacing = rule.height;\n  } else {\n    rule = null;\n    ruleWidth = 0;\n    ruleSpacing = options.fontMetrics().defaultRuleThickness;\n  }\n  // Rule 15b\n  var numShift;\n  var clearance;\n  var denomShift;\n  if (style.size === Style$1.DISPLAY.size) {\n    numShift = options.fontMetrics().num1;\n    if (ruleWidth > 0) {\n      clearance = 3 * ruleSpacing;\n    } else {\n      clearance = 7 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom1;\n  } else {\n    if (ruleWidth > 0) {\n      numShift = options.fontMetrics().num2;\n      clearance = ruleSpacing;\n    } else {\n      numShift = options.fontMetrics().num3;\n      clearance = 3 * ruleSpacing;\n    }\n    denomShift = options.fontMetrics().denom2;\n  }\n  var frac;\n  if (!rule) {\n    // Rule 15c\n    var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);\n    if (candidateClearance < clearance) {\n      numShift += 0.5 * (clearance - candidateClearance);\n      denomShift += 0.5 * (clearance - candidateClearance);\n    }\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  } else {\n    // Rule 15d\n    var axisHeight = options.fontMetrics().axisHeight;\n    if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {\n      numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));\n    }\n    if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {\n      denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));\n    }\n    var midShift = -(axisHeight - 0.5 * ruleWidth);\n    frac = makeVList({\n      positionType: \"individualShift\",\n      children: [{\n        type: \"elem\",\n        elem: denomm,\n        shift: denomShift\n      }, {\n        type: \"elem\",\n        elem: rule,\n        shift: midShift\n      }, {\n        type: \"elem\",\n        elem: numerm,\n        shift: -numShift\n      }]\n    });\n  }\n  // Since we manually change the style sometimes (with \\dfrac or \\tfrac),\n  // account for the possible size change here.\n  newOptions = options.havingStyle(style);\n  frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier;\n  // Rule 15e\n  var delimSize;\n  if (style.size === Style$1.DISPLAY.size) {\n    delimSize = options.fontMetrics().delim1;\n  } else if (style.size === Style$1.SCRIPTSCRIPT.size) {\n    delimSize = options.havingStyle(Style$1.SCRIPT).fontMetrics().delim2;\n  } else {\n    delimSize = options.fontMetrics().delim2;\n  }\n  var leftDelim;\n  var rightDelim;\n  if (group.leftDelim == null) {\n    leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n  } else {\n    leftDelim = makeCustomSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mopen\"]);\n  }\n  if (group.continued) {\n    rightDelim = makeSpan([]); // zero width for \\cfrac\n  } else if (group.rightDelim == null) {\n    rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n  } else {\n    rightDelim = makeCustomSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mclose\"]);\n  }\n  return makeSpan([\"mord\"].concat(newOptions.sizingClasses(options)), [leftDelim, makeSpan([\"mfrac\"], [frac]), rightDelim], options);\n};\nvar mathmlBuilder$3 = (group, options) => {\n  var node = new MathNode(\"mfrac\", [buildGroup(group.numer, options), buildGroup(group.denom, options)]);\n  if (!group.hasBarLine) {\n    node.setAttribute(\"linethickness\", \"0px\");\n  } else if (group.barSize) {\n    var ruleWidth = calculateSize(group.barSize, options);\n    node.setAttribute(\"linethickness\", makeEm(ruleWidth));\n  }\n  if (group.leftDelim != null || group.rightDelim != null) {\n    var withDelims = [];\n    if (group.leftDelim != null) {\n      var leftOp = new MathNode(\"mo\", [new TextNode(group.leftDelim.replace(\"\\\\\", \"\"))]);\n      leftOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(leftOp);\n    }\n    withDelims.push(node);\n    if (group.rightDelim != null) {\n      var rightOp = new MathNode(\"mo\", [new TextNode(group.rightDelim.replace(\"\\\\\", \"\"))]);\n      rightOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(rightOp);\n    }\n    return makeRow(withDelims);\n  }\n  return node;\n};\nvar wrapWithStyle = (frac, style) => {\n  if (!style) {\n    return frac;\n  }\n  var wrapper = {\n    type: \"styling\",\n    mode: frac.mode,\n    style,\n    body: [frac]\n  };\n  // @ts-ignore defineFunction handler needs to return ParseNode<\"genfrac\">\n  return wrapper;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\cfrac\", \"\\\\dfrac\", \"\\\\frac\", \"\\\\tfrac\", \"\\\\dbinom\", \"\\\\binom\", \"\\\\tbinom\", \"\\\\\\\\atopfrac\",\n  // can’t be entered directly\n  \"\\\\\\\\bracefrac\", \"\\\\\\\\brackfrac\" // ditto\n  ],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var numer = args[0];\n    var denom = args[1];\n    var hasBarLine;\n    var leftDelim = null;\n    var rightDelim = null;\n    switch (funcName) {\n      case \"\\\\cfrac\":\n      case \"\\\\dfrac\":\n      case \"\\\\frac\":\n      case \"\\\\tfrac\":\n        hasBarLine = true;\n        break;\n      case \"\\\\\\\\atopfrac\":\n        hasBarLine = false;\n        break;\n      case \"\\\\dbinom\":\n      case \"\\\\binom\":\n      case \"\\\\tbinom\":\n        hasBarLine = false;\n        leftDelim = \"(\";\n        rightDelim = \")\";\n        break;\n      case \"\\\\\\\\bracefrac\":\n        hasBarLine = false;\n        leftDelim = \"\\\\{\";\n        rightDelim = \"\\\\}\";\n        break;\n      case \"\\\\\\\\brackfrac\":\n        hasBarLine = false;\n        leftDelim = \"[\";\n        rightDelim = \"]\";\n        break;\n      default:\n        throw new Error(\"Unrecognized genfrac command\");\n    }\n    var continued = funcName === \"\\\\cfrac\";\n    var style = null;\n    if (continued || funcName.startsWith(\"\\\\d\")) {\n      style = \"display\";\n    } else if (funcName.startsWith(\"\\\\t\")) {\n      style = \"text\";\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued,\n      hasBarLine,\n      leftDelim,\n      rightDelim,\n      barSize: null\n    }, style);\n  },\n  htmlBuilder: htmlBuilder$4,\n  mathmlBuilder: mathmlBuilder$3\n});\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n  props: {\n    numArgs: 0,\n    infix: true\n  },\n  handler(_ref2) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref2;\n    var replaceWith;\n    switch (funcName) {\n      case \"\\\\over\":\n        replaceWith = \"\\\\frac\";\n        break;\n      case \"\\\\choose\":\n        replaceWith = \"\\\\binom\";\n        break;\n      case \"\\\\atop\":\n        replaceWith = \"\\\\\\\\atopfrac\";\n        break;\n      case \"\\\\brace\":\n        replaceWith = \"\\\\\\\\bracefrac\";\n        break;\n      case \"\\\\brack\":\n        replaceWith = \"\\\\\\\\brackfrac\";\n        break;\n      default:\n        throw new Error(\"Unrecognized infix genfrac command\");\n    }\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith,\n      token\n    };\n  }\n});\nvar stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nvar delimFromValue = function delimFromValue(delimString) {\n  var delim = null;\n  if (delimString.length > 0) {\n    delim = delimString;\n    delim = delim === \".\" ? null : delim;\n  }\n  return delim;\n};\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\genfrac\"],\n  props: {\n    numArgs: 6,\n    allowedInArgument: true,\n    argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n  },\n  handler(_ref3, args) {\n    var {\n      parser\n    } = _ref3;\n    var numer = args[4];\n    var denom = args[5];\n    // Look into the parse nodes to get the desired delimiters.\n    var leftNode = normalizeArgument(args[0]);\n    var leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\" ? delimFromValue(leftNode.text) : null;\n    var rightNode = normalizeArgument(args[1]);\n    var rightDelim = rightNode.type === \"atom\" && rightNode.family === \"close\" ? delimFromValue(rightNode.text) : null;\n    var barNode = assertNodeType(args[2], \"size\");\n    var hasBarLine;\n    var barSize = null;\n    if (barNode.isBlank) {\n      // \\genfrac acts differently than \\above.\n      // \\genfrac treats an empty size group as a signal to use a\n      // standard bar size. \\above would see size = 0 and omit the bar.\n      hasBarLine = true;\n    } else {\n      barSize = barNode.value;\n      hasBarLine = barSize.number > 0;\n    }\n    // Find out if we want displaystyle, textstyle, etc.\n    var size = null;\n    var styl = args[3];\n    if (styl.type === \"ordgroup\") {\n      if (styl.body.length > 0) {\n        var textOrd = assertNodeType(styl.body[0], \"textord\");\n        size = stylArray[Number(textOrd.text)];\n      }\n    } else {\n      styl = assertNodeType(styl, \"textord\");\n      size = stylArray[Number(styl.text)];\n    }\n    return wrapWithStyle({\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim,\n      rightDelim\n    }, size);\n  }\n});\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\above\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    infix: true\n  },\n  handler(_ref4, args) {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref4;\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith: \"\\\\\\\\abovefrac\",\n      size: assertNodeType(args[0], \"size\").value,\n      token\n    };\n  }\n});\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\\\\\abovefrac\"],\n  props: {\n    numArgs: 3,\n    argTypes: [\"math\", \"size\", \"math\"]\n  },\n  handler: (_ref5, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var numer = args[0];\n    var barSize = assertNodeType(args[1], \"infix\").size;\n    if (!barSize) {\n      throw new Error(\"\\\\\\\\abovefrac expected size, but got \" + String(barSize));\n    }\n    var denom = args[2];\n    var hasBarLine = barSize.number > 0;\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim: null,\n      rightDelim: null\n    };\n  }\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"horizBrace\", but\n// also \"supsub\" since an over/underbrace can affect super/subscripting.\nvar htmlBuilder$3 = (grp, options) => {\n  var style = options.style;\n  // Pull out the `ParseNode<\"horizBrace\">` if `grp` is a \"supsub\" node.\n  var supSubGroup;\n  var group;\n  if (grp.type === \"supsub\") {\n    // Ref: LaTeX source2e: }}}}\\limits}\n    // i.e. LaTeX treats the brace similar to an op and passes it\n    // with \\limits, so we need to assign supsub style.\n    supSubGroup = grp.sup ? buildGroup$1(grp.sup, options.havingStyle(style.sup()), options) : buildGroup$1(grp.sub, options.havingStyle(style.sub()), options);\n    group = assertNodeType(grp.base, \"horizBrace\");\n  } else {\n    group = assertNodeType(grp, \"horizBrace\");\n  }\n  // Build the base group\n  var body = buildGroup$1(group.base, options.havingBaseStyle(Style$1.DISPLAY));\n  // Create the stretchy element\n  var braceBody = stretchySvg(group, options);\n  // Generate the vlist, with the appropriate kerns        ┏━━━━━━━━┓\n  // This first vlist contains the content and the brace:   equation\n  var vlist;\n  if (group.isOver) {\n    vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: body\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: braceBody\n      }]\n    });\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n  } else {\n    vlist = makeVList({\n      positionType: \"bottom\",\n      positionData: body.depth + 0.1 + braceBody.height,\n      children: [{\n        type: \"elem\",\n        elem: braceBody\n      }, {\n        type: \"kern\",\n        size: 0.1\n      }, {\n        type: \"elem\",\n        elem: body\n      }]\n    });\n    // TODO(ts): Replace this with passing \"svg-align\" into makeVList.\n    vlist.children[0].children[0].children[0].classes.push(\"svg-align\");\n  }\n  if (supSubGroup) {\n    // To write the supsub, wrap the first vlist in another vlist:\n    // They can't all go in the same vlist, because the note might be\n    // wider than the equation. We want the equation to control the\n    // brace width.\n    //      note          long note           long note\n    //   ┏━━━━━━━━┓   or    ┏━━━┓     not    ┏━━━━━━━━━┓\n    //    equation           eqn                 eqn\n    var vSpan = makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n    if (group.isOver) {\n      vlist = makeVList({\n        positionType: \"firstBaseline\",\n        children: [{\n          type: \"elem\",\n          elem: vSpan\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: supSubGroup\n        }]\n      });\n    } else {\n      vlist = makeVList({\n        positionType: \"bottom\",\n        positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,\n        children: [{\n          type: \"elem\",\n          elem: supSubGroup\n        }, {\n          type: \"kern\",\n          size: 0.2\n        }, {\n          type: \"elem\",\n          elem: vSpan\n        }]\n      });\n    }\n  }\n  return makeSpan([\"minner\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n};\nvar mathmlBuilder$2 = (group, options) => {\n  var accentNode = stretchyMathML(group.label);\n  return new MathNode(group.isOver ? \"mover\" : \"munder\", [buildGroup(group.base, options), accentNode]);\n};\n// Horizontal stretchy braces\ndefineFunction({\n  type: \"horizBrace\",\n  names: [\"\\\\overbrace\", \"\\\\underbrace\", \"\\\\overbracket\", \"\\\\underbracket\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    return {\n      type: \"horizBrace\",\n      mode: parser.mode,\n      label: funcName,\n      isOver: funcName.includes(\"\\\\over\"),\n      base: args[0]\n    };\n  },\n  htmlBuilder: htmlBuilder$3,\n  mathmlBuilder: mathmlBuilder$2\n});\n\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\href\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"url\", \"original\"],\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[1];\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\href\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\href\");\n    }\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    return makeAnchor(group.href, [], elements, options);\n  },\n  mathmlBuilder: (group, options) => {\n    var math = buildExpressionRow(group.body, options);\n    if (!(math instanceof MathNode)) {\n      math = new MathNode(\"mrow\", [math]);\n    }\n    math.setAttribute(\"href\", group.href);\n    return math;\n  }\n});\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\url\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"url\"],\n    allowedInText: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var href = assertNodeType(args[0], \"url\").url;\n    if (!parser.settings.isTrusted({\n      command: \"\\\\url\",\n      url: href\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\url\");\n    }\n    var chars = [];\n    for (var i = 0; i < href.length; i++) {\n      var c = href[i];\n      if (c === \"~\") {\n        c = \"\\\\textasciitilde\";\n      }\n      chars.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: c\n      });\n    }\n    var body = {\n      type: \"text\",\n      mode: parser.mode,\n      font: \"\\\\texttt\",\n      body: chars\n    };\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  }\n});\n\n// \\hbox is provided for compatibility with LaTeX \\vcenter.\n// In LaTeX, \\vcenter can act only on a box, as in\n// \\vcenter{\\hbox{$\\frac{a+b}{\\dfrac{c}{d}}$}}\n// This function by itself doesn't do anything but prevent a soft line break.\ndefineFunction({\n  type: \"hbox\",\n  names: [\"\\\\hbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"hbox\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    };\n  },\n  htmlBuilder(group, options) {\n    var elements = buildExpression$1(group.body, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder(group, options) {\n    return new MathNode(\"mrow\", buildExpression(group.body, options));\n  }\n});\n\ndefineFunction({\n  type: \"html\",\n  names: [\"\\\\htmlClass\", \"\\\\htmlId\", \"\\\\htmlStyle\", \"\\\\htmlData\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"raw\", \"original\"],\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName,\n      token\n    } = _ref;\n    var value = assertNodeType(args[0], \"raw\").string;\n    var body = args[1];\n    if (parser.settings.strict) {\n      parser.settings.reportNonstrict(\"htmlExtension\", \"HTML extension is disabled on strict mode\");\n    }\n    var trustContext;\n    var attributes = {};\n    switch (funcName) {\n      case \"\\\\htmlClass\":\n        attributes.class = value;\n        trustContext = {\n          command: \"\\\\htmlClass\",\n          class: value\n        };\n        break;\n      case \"\\\\htmlId\":\n        attributes.id = value;\n        trustContext = {\n          command: \"\\\\htmlId\",\n          id: value\n        };\n        break;\n      case \"\\\\htmlStyle\":\n        attributes.style = value;\n        trustContext = {\n          command: \"\\\\htmlStyle\",\n          style: value\n        };\n        break;\n      case \"\\\\htmlData\":\n        {\n          var data = value.split(\",\");\n          for (var i = 0; i < data.length; i++) {\n            var item = data[i];\n            var firstEquals = item.indexOf(\"=\");\n            if (firstEquals < 0) {\n              throw new ParseError(\"\\\\htmlData key/value '\" + item + \"'\" + \" missing equals sign\");\n            }\n            var key = item.slice(0, firstEquals);\n            var _value = item.slice(firstEquals + 1);\n            attributes[\"data-\" + key.trim()] = _value;\n          }\n          trustContext = {\n            command: \"\\\\htmlData\",\n            attributes\n          };\n          break;\n        }\n      default:\n        throw new Error(\"Unrecognized html command\");\n    }\n    if (!parser.settings.isTrusted(trustContext)) {\n      return parser.formatUnsupportedCmd(funcName);\n    }\n    return {\n      type: \"html\",\n      mode: parser.mode,\n      attributes,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options, false);\n    var classes = [\"enclosing\"];\n    if (group.attributes.class) {\n      classes.push(...group.attributes.class.trim().split(/\\s+/));\n    }\n    var span = makeSpan(classes, elements, options);\n    for (var attr in group.attributes) {\n      if (attr !== \"class\" && group.attributes.hasOwnProperty(attr)) {\n        span.setAttribute(attr, group.attributes[attr]);\n      }\n    }\n    return span;\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.body, options);\n  }\n});\n\ndefineFunction({\n  type: \"htmlmathml\",\n  names: [\"\\\\html@mathml\"],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"htmlmathml\",\n      mode: parser.mode,\n      html: ordargument(args[0]),\n      mathml: ordargument(args[1])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.html, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    return buildExpressionRow(group.mathml, options);\n  }\n});\n\nvar sizeData = function sizeData(str) {\n  if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n    // str is a number with no unit specified.\n    // default unit is bp, per graphix package.\n    return {\n      number: +str,\n      unit: \"bp\"\n    };\n  } else {\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n    }\n    return data;\n  }\n};\ndefineFunction({\n  type: \"includegraphics\",\n  names: [\"\\\\includegraphics\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    argTypes: [\"raw\", \"url\"],\n    allowedInText: false\n  },\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var width = {\n      number: 0,\n      unit: \"em\"\n    };\n    var height = {\n      number: 0.9,\n      unit: \"em\"\n    }; // sorta character sized.\n    var totalheight = {\n      number: 0,\n      unit: \"em\"\n    };\n    var alt = \"\";\n    if (optArgs[0]) {\n      var attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n      // Parser.js does not parse key/value pairs. We get a string.\n      var attributes = attributeStr.split(\",\");\n      for (var i = 0; i < attributes.length; i++) {\n        var keyVal = attributes[i].split(\"=\");\n        if (keyVal.length === 2) {\n          var str = keyVal[1].trim();\n          switch (keyVal[0].trim()) {\n            case \"alt\":\n              alt = str;\n              break;\n            case \"width\":\n              width = sizeData(str);\n              break;\n            case \"height\":\n              height = sizeData(str);\n              break;\n            case \"totalheight\":\n              totalheight = sizeData(str);\n              break;\n            default:\n              throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\");\n          }\n        }\n      }\n    }\n    var src = assertNodeType(args[0], \"url\").url;\n    if (alt === \"\") {\n      // No alt given. Use the file name. Strip away the path.\n      alt = src;\n      alt = alt.replace(/^.*[\\\\/]/, '');\n      alt = alt.substring(0, alt.lastIndexOf('.'));\n    }\n    if (!parser.settings.isTrusted({\n      command: \"\\\\includegraphics\",\n      url: src\n    })) {\n      return parser.formatUnsupportedCmd(\"\\\\includegraphics\");\n    }\n    return {\n      type: \"includegraphics\",\n      mode: parser.mode,\n      alt: alt,\n      width: width,\n      height: height,\n      totalheight: totalheight,\n      src: src\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n    }\n    var width = 0;\n    if (group.width.number > 0) {\n      width = calculateSize(group.width, options);\n    }\n    var style = {\n      height: makeEm(height + depth)\n    };\n    if (width > 0) {\n      style.width = makeEm(width);\n    }\n    if (depth > 0) {\n      style.verticalAlign = makeEm(-depth);\n    }\n    var node = new Img(group.src, group.alt, style);\n    node.height = height;\n    node.depth = depth;\n    return node;\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mglyph\", []);\n    node.setAttribute(\"alt\", group.alt);\n    var height = calculateSize(group.height, options);\n    var depth = 0;\n    if (group.totalheight.number > 0) {\n      depth = calculateSize(group.totalheight, options) - height;\n      node.setAttribute(\"valign\", makeEm(-depth));\n    }\n    node.setAttribute(\"height\", makeEm(height + depth));\n    if (group.width.number > 0) {\n      var width = calculateSize(group.width, options);\n      node.setAttribute(\"width\", makeEm(width));\n    }\n    node.setAttribute(\"src\", group.src);\n    return node;\n  }\n});\n\n// Horizontal spacing commands\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\ndefineFunction({\n  type: \"kern\",\n  names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    primitive: true,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var size = assertNodeType(args[0], \"size\");\n    if (parser.settings.strict) {\n      var mathFunction = funcName[1] === 'm'; // \\mkern, \\mskip\n      var muUnit = size.value.unit === 'mu';\n      if (mathFunction) {\n        if (!muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" supports only mu units, \" + (\"not \" + size.value.unit + \" units\"));\n        }\n        if (parser.mode !== \"math\") {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" works only in math mode\");\n        }\n      } else {\n        // !mathFunction\n        if (muUnit) {\n          parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" doesn't support mu units\");\n        }\n      }\n    }\n    return {\n      type: \"kern\",\n      mode: parser.mode,\n      dimension: size.value\n    };\n  },\n  htmlBuilder(group, options) {\n    return makeGlue(group.dimension, options);\n  },\n  mathmlBuilder(group, options) {\n    var dimension = calculateSize(group.dimension, options);\n    return new SpaceNode(dimension);\n  }\n});\n\n// Horizontal overlap functions\ndefineFunction({\n  type: \"lap\",\n  names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"lap\",\n      mode: parser.mode,\n      alignment: funcName.slice(5),\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var inner;\n    if (group.alignment === \"clap\") {\n      // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/\n      inner = makeSpan([], [buildGroup$1(group.body, options)]);\n      // wrap, since CSS will center a .clap > .inner > span\n      inner = makeSpan([\"inner\"], [inner], options);\n    } else {\n      inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options)]);\n    }\n    var fix = makeSpan([\"fix\"], []);\n    var node = makeSpan([group.alignment], [inner, fix], options);\n    // At this point, we have correctly set horizontal alignment of the\n    // two items involved in the lap.\n    // Next, use a strut to set the height of the HTML bounding box.\n    // Otherwise, a tall argument may be misplaced.\n    // This code resolved issue #1153\n    var strut = makeSpan([\"strut\"]);\n    strut.style.height = makeEm(node.height + node.depth);\n    if (node.depth) {\n      strut.style.verticalAlign = makeEm(-node.depth);\n    }\n    node.children.unshift(strut);\n    // Next, prevent vertical misplacement when next to something tall.\n    // This code resolves issue #1234\n    node = makeSpan([\"thinbox\"], [node], options);\n    return makeSpan([\"mord\", \"vbox\"], [node], options);\n  },\n  mathmlBuilder: (group, options) => {\n    // mathllap, mathrlap, mathclap\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.alignment !== \"rlap\") {\n      var offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n      node.setAttribute(\"lspace\", offset + \"width\");\n    }\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\(\", \"$\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(_ref, args) {\n    var {\n      funcName,\n      parser\n    } = _ref;\n    var outerMode = parser.mode;\n    parser.switchMode(\"math\");\n    var close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n    var body = parser.parseExpression(false, close);\n    parser.expect(close);\n    parser.switchMode(outerMode);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      style: \"text\",\n      body\n    };\n  }\n});\n// Check for extra closing math delimiters\ndefineFunction({\n  type: \"text\",\n  // Doesn't matter what this is.\n  names: [\"\\\\)\", \"\\\\]\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(context, args) {\n    throw new ParseError(\"Mismatched \" + context.funcName);\n  }\n});\n\nvar chooseMathStyle = (group, options) => {\n  switch (options.style.size) {\n    case Style$1.DISPLAY.size:\n      return group.display;\n    case Style$1.TEXT.size:\n      return group.text;\n    case Style$1.SCRIPT.size:\n      return group.script;\n    case Style$1.SCRIPTSCRIPT.size:\n      return group.scriptscript;\n    default:\n      return group.text;\n  }\n};\ndefineFunction({\n  type: \"mathchoice\",\n  names: [\"\\\\mathchoice\"],\n  props: {\n    numArgs: 4,\n    primitive: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"mathchoice\",\n      mode: parser.mode,\n      display: ordargument(args[0]),\n      text: ordargument(args[1]),\n      script: ordargument(args[2]),\n      scriptscript: ordargument(args[3])\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    var elements = buildExpression$1(body, options, false);\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var body = chooseMathStyle(group, options);\n    return buildExpressionRow(body, options);\n  }\n});\n\n// For an operator with limits, assemble the base, sup, and sub into a span.\nvar assembleSupSub = (base, supGroup, subGroup, options, style, slant, baseShift) => {\n  base = makeSpan([], [base]);\n  var subIsSingleCharacter = subGroup && isCharacterBox(subGroup);\n  var sub;\n  var sup;\n  // We manually have to handle the superscripts and subscripts. This,\n  // aside from the kern calculations, is copied from supsub.\n  if (supGroup) {\n    var elem = buildGroup$1(supGroup, options.havingStyle(style.sup()), options);\n    sup = {\n      elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)\n    };\n  }\n  if (subGroup) {\n    var _elem = buildGroup$1(subGroup, options.havingStyle(style.sub()), options);\n    sub = {\n      elem: _elem,\n      kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)\n    };\n  }\n  // Build the final group as a vlist of the possible subscript, base,\n  // and possible superscript.\n  var finalGroup;\n  if (sup && sub) {\n    var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: bottom,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else if (sub) {\n    var top = base.height - baseShift;\n    // Shift the limits by the slant of the symbol. Note\n    // that we are supposed to shift the limits by 1/2 of the slant,\n    // but since we are centering the limits adding a full slant of\n    // margin will shift by 1/2 that.\n    finalGroup = makeVList({\n      positionType: \"top\",\n      positionData: top,\n      children: [{\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }, {\n        type: \"elem\",\n        elem: sub.elem,\n        marginLeft: makeEm(-slant)\n      }, {\n        type: \"kern\",\n        size: sub.kern\n      }, {\n        type: \"elem\",\n        elem: base\n      }]\n    });\n  } else if (sup) {\n    var _bottom = base.depth + baseShift;\n    finalGroup = makeVList({\n      positionType: \"bottom\",\n      positionData: _bottom,\n      children: [{\n        type: \"elem\",\n        elem: base\n      }, {\n        type: \"kern\",\n        size: sup.kern\n      }, {\n        type: \"elem\",\n        elem: sup.elem,\n        marginLeft: makeEm(slant)\n      }, {\n        type: \"kern\",\n        size: options.fontMetrics().bigOpSpacing5\n      }]\n    });\n  } else {\n    // This case probably shouldn't occur (this would mean the\n    // supsub was sending us a group with no superscript or\n    // subscript) but be safe.\n    return base;\n  }\n  var parts = [finalGroup];\n  if (sub && slant !== 0 && !subIsSingleCharacter) {\n    // A negative margin-left was applied to the lower limit.\n    // Avoid an overlap by placing a spacer on the left on the group.\n    var spacer = makeSpan([\"mspace\"], [], options);\n    spacer.style.marginRight = makeEm(slant);\n    parts.unshift(spacer);\n  }\n  return makeSpan([\"mop\", \"op-limits\"], parts, options);\n};\n\n// Limits, symbols\n// Most operators have a large successor symbol, but these don't.\nvar noSuccessor = new Set([\"\\\\smallint\"]);\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\nvar htmlBuilder$2 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"op\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"op\");\n  }\n  var style = options.style;\n  var large = false;\n  if (style.size === Style$1.DISPLAY.size && group.symbol && !noSuccessor.has(group.name)) {\n    // Most symbol operators get larger in displaystyle (rule 13)\n    large = true;\n  }\n  var base;\n  if (group.symbol) {\n    // If this is a symbol, create the symbol.\n    var fontName = large ? \"Size2-Regular\" : \"Size1-Regular\";\n    var stash = \"\";\n    if (group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") {\n      // No font glyphs yet, so use a glyph w/o the oval.\n      // TODO: When font glyphs are available, delete this code.\n      stash = group.name.slice(1);\n      group.name = stash === \"oiint\" ? \"\\\\iint\" : \"\\\\iiint\";\n    }\n    base = makeSymbol(group.name, fontName, \"math\", options, [\"mop\", \"op-symbol\", large ? \"large-op\" : \"small-op\"]);\n    if (stash.length > 0) {\n      // We're in \\oiint or \\oiiint. Overlay the oval.\n      // TODO: When font glyphs are available, delete this code.\n      var italic = base.italic;\n      var oval = staticSvg(stash + \"Size\" + (large ? \"2\" : \"1\"), options);\n      base = makeVList({\n        positionType: \"individualShift\",\n        children: [{\n          type: \"elem\",\n          elem: base,\n          shift: 0\n        }, {\n          type: \"elem\",\n          elem: oval,\n          shift: large ? 0.08 : 0\n        }]\n      });\n      group.name = \"\\\\\" + stash;\n      base.classes.unshift(\"mop\");\n      // TODO(ts)\n      base.italic = italic;\n    }\n  } else if (group.body) {\n    // If this is a list, compose that list.\n    var inner = buildExpression$1(group.body, options, true);\n    if (inner.length === 1 && inner[0] instanceof SymbolNode) {\n      base = inner[0];\n      base.classes[0] = \"mop\"; // replace old mclass\n    } else {\n      base = makeSpan([\"mop\"], inner, options);\n    }\n  } else {\n    // Otherwise, this is a text operator. Build the text from the\n    // operator's name.\n    var output = [];\n    for (var i = 1; i < group.name.length; i++) {\n      output.push(mathsym(group.name[i], group.mode, options));\n    }\n    base = makeSpan([\"mop\"], output, options);\n  }\n  // If content of op is a single symbol, shift it vertically.\n  var baseShift = 0;\n  var slant = 0;\n  if ((base instanceof SymbolNode || group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") && !group.suppressBaseShift) {\n    // We suppress the shift of the base of \\overset and \\underset. Otherwise,\n    // shift the symbol so its center lies on the axis (rule 13). It\n    // appears that our fonts have the centers of the symbols already\n    // almost on the axis, so these numbers are very small. Note we\n    // don't actually apply this here, but instead it is used either in\n    // the vlist creation or separately when there are no limits.\n    baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight;\n    // The slant of the symbol is just its italic correction.\n    // TODO(ts)\n    slant = base.italic || 0;\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);\n  } else {\n    if (baseShift) {\n      base.style.position = \"relative\";\n      base.style.top = makeEm(baseShift);\n    }\n    return base;\n  }\n};\nvar mathmlBuilder$1 = (group, options) => {\n  var node;\n  if (group.symbol) {\n    // This is a symbol. Just add the symbol.\n    node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n    if (noSuccessor.has(group.name)) {\n      node.setAttribute(\"largeop\", \"false\");\n    }\n  } else if (group.body) {\n    // This is an operator with children. Add them.\n    node = new MathNode(\"mo\", buildExpression(group.body, options));\n  } else {\n    // This is a text operator. Add all the characters from the\n    // operator's name.\n    node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n    // Append an <mo>&ApplyFunction;</mo>.\n    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n    var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n    if (group.parentIsSupSub) {\n      node = new MathNode(\"mrow\", [node, operator]);\n    } else {\n      node = newDocumentFragment([node, operator]);\n    }\n  }\n  return node;\n};\nvar singleCharBigOps = {\n  \"\\u220F\": \"\\\\prod\",\n  \"\\u2210\": \"\\\\coprod\",\n  \"\\u2211\": \"\\\\sum\",\n  \"\\u22c0\": \"\\\\bigwedge\",\n  \"\\u22c1\": \"\\\\bigvee\",\n  \"\\u22c2\": \"\\\\bigcap\",\n  \"\\u22c3\": \"\\\\bigcup\",\n  \"\\u2a00\": \"\\\\bigodot\",\n  \"\\u2a01\": \"\\\\bigoplus\",\n  \"\\u2a02\": \"\\\\bigotimes\",\n  \"\\u2a04\": \"\\\\biguplus\",\n  \"\\u2a06\": \"\\\\bigsqcup\"\n};\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\coprod\", \"\\\\bigvee\", \"\\\\bigwedge\", \"\\\\biguplus\", \"\\\\bigcap\", \"\\\\bigcup\", \"\\\\intop\", \"\\\\prod\", \"\\\\sum\", \"\\\\bigotimes\", \"\\\\bigoplus\", \"\\\\bigodot\", \"\\\\bigsqcup\", \"\\\\smallint\", \"\\u220F\", \"\\u2210\", \"\\u2211\", \"\\u22c0\", \"\\u22c1\", \"\\u22c2\", \"\\u22c3\", \"\\u2a00\", \"\\u2a01\", \"\\u2a02\", \"\\u2a04\", \"\\u2a06\"],\n  props: {\n    numArgs: 0\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharBigOps[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same htmlBuilder and mathmlBuilder are being used.\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\mathop\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\nvar singleCharIntegrals = {\n  \"\\u222b\": \"\\\\int\",\n  \"\\u222c\": \"\\\\iint\",\n  \"\\u222d\": \"\\\\iiint\",\n  \"\\u222e\": \"\\\\oint\",\n  \"\\u222f\": \"\\\\oiint\",\n  \"\\u2230\": \"\\\\oiiint\"\n};\n// No limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\arcsin\", \"\\\\arccos\", \"\\\\arctan\", \"\\\\arctg\", \"\\\\arcctg\", \"\\\\arg\", \"\\\\ch\", \"\\\\cos\", \"\\\\cosec\", \"\\\\cosh\", \"\\\\cot\", \"\\\\cotg\", \"\\\\coth\", \"\\\\csc\", \"\\\\ctg\", \"\\\\cth\", \"\\\\deg\", \"\\\\dim\", \"\\\\exp\", \"\\\\hom\", \"\\\\ker\", \"\\\\lg\", \"\\\\ln\", \"\\\\log\", \"\\\\sec\", \"\\\\sin\", \"\\\\sinh\", \"\\\\sh\", \"\\\\tan\", \"\\\\tanh\", \"\\\\tg\", \"\\\\th\"],\n  props: {\n    numArgs: 0\n  },\n  handler(_ref3) {\n    var {\n      parser,\n      funcName\n    } = _ref3;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// Limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n  props: {\n    numArgs: 0\n  },\n  handler(_ref4) {\n    var {\n      parser,\n      funcName\n    } = _ref4;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: false,\n      name: funcName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n// No limits, symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\int\", \"\\\\iint\", \"\\\\iiint\", \"\\\\oint\", \"\\\\oiint\", \"\\\\oiiint\", \"\\u222b\", \"\\u222c\", \"\\u222d\", \"\\u222e\", \"\\u222f\", \"\\u2230\"],\n  props: {\n    numArgs: 0,\n    allowedInArgument: true\n  },\n  handler(_ref5) {\n    var {\n      parser,\n      funcName\n    } = _ref5;\n    var fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharIntegrals[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: true,\n      name: fName\n    };\n  },\n  htmlBuilder: htmlBuilder$2,\n  mathmlBuilder: mathmlBuilder$1\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only\n// \"operatorname\", but also  \"supsub\" since \\operatorname* can\n// affect super/subscripting.\nvar htmlBuilder$1 = (grp, options) => {\n  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n  var supGroup;\n  var subGroup;\n  var hasLimits = false;\n  var group;\n  if (grp.type === \"supsub\") {\n    // If we have limits, supsub will pass us its group to handle. Pull\n    // out the superscript and subscript and set the group to the op in\n    // its base.\n    supGroup = grp.sup;\n    subGroup = grp.sub;\n    group = assertNodeType(grp.base, \"operatorname\");\n    hasLimits = true;\n  } else {\n    group = assertNodeType(grp, \"operatorname\");\n  }\n  var base;\n  if (group.body.length > 0) {\n    var body = group.body.map(child => {\n      var childText = \"text\" in child ? child.text : undefined;\n      if (typeof childText === \"string\") {\n        return {\n          type: \"textord\",\n          mode: child.mode,\n          text: childText\n        };\n      } else {\n        return child;\n      }\n    });\n    // Consolidate function names into symbol characters.\n    var expression = buildExpression$1(body, options.withFont(\"mathrm\"), true);\n    for (var i = 0; i < expression.length; i++) {\n      var child = expression[i];\n      if (child instanceof SymbolNode) {\n        // Per amsopn package,\n        // change minus to hyphen and \\ast to asterisk\n        child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n      }\n    }\n    base = makeSpan([\"mop\"], expression, options);\n  } else {\n    base = makeSpan([\"mop\"], [], options);\n  }\n  if (hasLimits) {\n    return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);\n  } else {\n    return base;\n  }\n};\nvar mathmlBuilder = (group, options) => {\n  // The steps taken here are similar to the html version.\n  var expression = buildExpression(group.body, options.withFont(\"mathrm\"));\n  // Is expression a string or has it something like a fraction?\n  var isAllString = true; // default\n  for (var i = 0; i < expression.length; i++) {\n    var node = expression[i];\n    if (node instanceof SpaceNode) ; else if (node instanceof MathNode) {\n      switch (node.type) {\n        case \"mi\":\n        case \"mn\":\n        case \"mspace\":\n        case \"mtext\":\n          break;\n        // Do nothing yet.\n        case \"mo\":\n          {\n            var child = node.children[0];\n            if (node.children.length === 1 && child instanceof TextNode) {\n              child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n            } else {\n              isAllString = false;\n            }\n            break;\n          }\n        default:\n          isAllString = false;\n      }\n    } else {\n      isAllString = false;\n    }\n  }\n  if (isAllString) {\n    // Write a single TextNode instead of multiple nested tags.\n    var word = expression.map(node => node.toText()).join(\"\");\n    expression = [new TextNode(word)];\n  }\n  var identifier = new MathNode(\"mi\", expression);\n  identifier.setAttribute(\"mathvariant\", \"normal\");\n  // \\u2061 is the same as &ApplyFunction;\n  // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp\n  var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n  if (group.parentIsSupSub) {\n    return new MathNode(\"mrow\", [identifier, operator]);\n  } else {\n    return newDocumentFragment([identifier, operator]);\n  }\n};\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n  type: \"operatorname\",\n  names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n  props: {\n    numArgs: 1\n  },\n  handler: (_ref, args) => {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"operatorname\",\n      mode: parser.mode,\n      body: ordargument(body),\n      alwaysHandleSupSub: funcName === \"\\\\operatornamewithlimits\",\n      limits: false,\n      parentIsSupSub: false\n    };\n  },\n  htmlBuilder: htmlBuilder$1,\n  mathmlBuilder\n});\ndefineMacro(\"\\\\operatorname\", \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n  type: \"ordgroup\",\n  htmlBuilder(group, options) {\n    if (group.semisimple) {\n      return makeFragment(buildExpression$1(group.body, options, false));\n    }\n    return makeSpan([\"mord\"], buildExpression$1(group.body, options, true), options);\n  },\n  mathmlBuilder(group, options) {\n    return buildExpressionRow(group.body, options, true);\n  }\n});\n\ndefineFunction({\n  type: \"overline\",\n  names: [\"\\\\overline\"],\n  props: {\n    numArgs: 1\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"overline\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Overlines are handled in the TeXbook pg 443, Rule 9.\n    // Build the inner group in the cramped style.\n    var innerGroup = buildGroup$1(group.body, options.havingCrampedStyle());\n    // Create the line above the body\n    var line = makeLineSpan(\"overline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: innerGroup\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: defaultRuleThickness\n      }]\n    });\n    return makeSpan([\"mord\", \"overline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"mover\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accent\", \"true\");\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"phantom\",\n  names: [\"\\\\phantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      parser\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"phantom\",\n      mode: parser.mode,\n      body: ordargument(body)\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var elements = buildExpression$1(group.body, options.withPhantom(), false);\n    // \\phantom isn't supposed to affect the elements it contains.\n    // See \"color\" for more details.\n    return makeFragment(elements);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(group.body, options);\n    return new MathNode(\"mphantom\", inner);\n  }\n});\ndefineMacro(\"\\\\hphantom\", \"\\\\smash{\\\\phantom{#1}}\");\ndefineFunction({\n  type: \"vphantom\",\n  names: [\"\\\\vphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref2, args) => {\n    var {\n      parser\n    } = _ref2;\n    var body = args[0];\n    return {\n      type: \"vphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var inner = makeSpan([\"inner\"], [buildGroup$1(group.body, options.withPhantom())]);\n    var fix = makeSpan([\"fix\"], []);\n    return makeSpan([\"mord\", \"rlap\"], [inner, fix], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var inner = buildExpression(ordargument(group.body), options);\n    var phantom = new MathNode(\"mphantom\", inner);\n    var node = new MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// Box manipulation\ndefineFunction({\n  type: \"raisebox\",\n  names: [\"\\\\raisebox\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"hbox\"],\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    var amount = assertNodeType(args[0], \"size\").value;\n    var body = args[1];\n    return {\n      type: \"raisebox\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var dy = calculateSize(group.dy, options);\n    return makeVList({\n      positionType: \"shift\",\n      positionData: -dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    var dy = group.dy.number + group.dy.unit;\n    node.setAttribute(\"voffset\", dy);\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\relax\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInArgument: true\n  },\n  handler(_ref) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\ndefineFunction({\n  type: \"rule\",\n  names: [\"\\\\rule\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"size\", \"size\", \"size\"]\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var shift = optArgs[0];\n    var width = assertNodeType(args[0], \"size\");\n    var height = assertNodeType(args[1], \"size\");\n    return {\n      type: \"rule\",\n      mode: parser.mode,\n      shift: shift && assertNodeType(shift, \"size\").value,\n      width: width.value,\n      height: height.value\n    };\n  },\n  htmlBuilder(group, options) {\n    // Make an empty span for the rule\n    var rule = makeSpan([\"mord\", \"rule\"], [], options);\n    // Calculate the shift, width, and height of the rule, and account for units\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    // Style the rule to the right size\n    rule.style.borderRightWidth = makeEm(width);\n    rule.style.borderTopWidth = makeEm(height);\n    rule.style.bottom = makeEm(shift);\n    // Record the height and width\n    rule.width = width;\n    rule.height = height + shift;\n    rule.depth = -shift;\n    // Font size is the number large enough that the browser will\n    // reserve at least `absHeight` space above the baseline.\n    // The 1.125 factor was empirically determined\n    rule.maxFontSize = height * 1.125 * options.sizeMultiplier;\n    return rule;\n  },\n  mathmlBuilder(group, options) {\n    var width = calculateSize(group.width, options);\n    var height = calculateSize(group.height, options);\n    var shift = group.shift ? calculateSize(group.shift, options) : 0;\n    var color = options.color && options.getColor() || \"black\";\n    var rule = new MathNode(\"mspace\");\n    rule.setAttribute(\"mathbackground\", color);\n    rule.setAttribute(\"width\", makeEm(width));\n    rule.setAttribute(\"height\", makeEm(height));\n    var wrapper = new MathNode(\"mpadded\", [rule]);\n    if (shift >= 0) {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n    } else {\n      wrapper.setAttribute(\"height\", makeEm(shift));\n      wrapper.setAttribute(\"depth\", makeEm(-shift));\n    }\n    wrapper.setAttribute(\"voffset\", makeEm(shift));\n    return wrapper;\n  }\n});\n\nfunction sizingGroup(value, options, baseOptions) {\n  var inner = buildExpression$1(value, options, false);\n  var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n  // Add size-resetting classes to the inner list and set maxFontSize\n  // manually. Handle nested size changes.\n  for (var i = 0; i < inner.length; i++) {\n    var pos = inner[i].classes.indexOf(\"sizing\");\n    if (pos < 0) {\n      Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));\n    } else if (inner[i].classes[pos + 1] === \"reset-size\" + options.size) {\n      // This is a nested size change: e.g., inner[i] is the \"b\" in\n      // `\\Huge a \\small b`. Override the old size (the `reset-` class)\n      // but not the new size.\n      inner[i].classes[pos + 1] = \"reset-size\" + baseOptions.size;\n    }\n    inner[i].height *= multiplier;\n    inner[i].depth *= multiplier;\n  }\n  return makeFragment(inner);\n}\nvar sizeFuncs = [\"\\\\tiny\", \"\\\\sixptsize\", \"\\\\scriptsize\", \"\\\\footnotesize\", \"\\\\small\", \"\\\\normalsize\", \"\\\\large\", \"\\\\Large\", \"\\\\LARGE\", \"\\\\huge\", \"\\\\Huge\"];\nvar htmlBuilder = (group, options) => {\n  // Handle sizing operators like \\Huge. Real TeX doesn't actually allow\n  // these functions inside of math expressions, so we do some special\n  // handling.\n  var newOptions = options.havingSize(group.size);\n  return sizingGroup(group.body, newOptions, options);\n};\ndefineFunction({\n  type: \"sizing\",\n  names: sizeFuncs,\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: (_ref, args) => {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    var body = parser.parseExpression(false, breakOnTokenText);\n    return {\n      type: \"sizing\",\n      mode: parser.mode,\n      // Figure out what size to use based on the list of functions above\n      size: sizeFuncs.indexOf(funcName) + 1,\n      body\n    };\n  },\n  htmlBuilder,\n  mathmlBuilder: (group, options) => {\n    var newOptions = options.havingSize(group.size);\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    // TODO(emily): This doesn't produce the correct size for nested size\n    // changes, because we don't keep state of what style we're currently\n    // in, so we can't reset the size to normal before changing it.  Now\n    // that we're passing an options parameter we should be able to fix\n    // this.\n    node.setAttribute(\"mathsize\", makeEm(newOptions.sizeMultiplier));\n    return node;\n  }\n});\n\n// smash, with optional [tb], as in AMS\ndefineFunction({\n  type: \"smash\",\n  names: [\"\\\\smash\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true\n  },\n  handler: (_ref, args, optArgs) => {\n    var {\n      parser\n    } = _ref;\n    var smashHeight = false;\n    var smashDepth = false;\n    var tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n    if (tbArg) {\n      // Optional [tb] argument is engaged.\n      // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n      //               def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n      var letter = \"\";\n      for (var i = 0; i < tbArg.body.length; ++i) {\n        var node = tbArg.body[i];\n        letter = assertSymbolNodeType(node).text;\n        if (letter === \"t\") {\n          smashHeight = true;\n        } else if (letter === \"b\") {\n          smashDepth = true;\n        } else {\n          smashHeight = false;\n          smashDepth = false;\n          break;\n        }\n      }\n    } else {\n      smashHeight = true;\n      smashDepth = true;\n    }\n    var body = args[0];\n    return {\n      type: \"smash\",\n      mode: parser.mode,\n      body,\n      smashHeight,\n      smashDepth\n    };\n  },\n  htmlBuilder: (group, options) => {\n    var node = makeSpan([], [buildGroup$1(group.body, options)]);\n    if (!group.smashHeight && !group.smashDepth) {\n      return node;\n    }\n    if (group.smashHeight) {\n      node.height = 0;\n    }\n    if (group.smashDepth) {\n      node.depth = 0;\n    }\n    if (group.smashHeight && group.smashDepth) {\n      // Symmetric \\smash can stay in inline layout.\n      return makeSpan([\"mord\", \"smash\"], [node], options);\n    }\n    // In order to influence makeVList for asymmetric smashing, we have to\n    // reset the children.\n    if (node.children) {\n      for (var i = 0; i < node.children.length; i++) {\n        if (group.smashHeight) {\n          node.children[i].height = 0;\n        }\n        if (group.smashDepth) {\n          node.children[i].depth = 0;\n        }\n      }\n    }\n    // At this point, we've reset the TeX-like height and depth values.\n    // But the span still has an HTML line height.\n    // makeVList applies \"display: table-cell\", which prevents the browser\n    // from acting on that line height. So we'll call makeVList now.\n    var smashedNode = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: node\n      }]\n    });\n    // For spacing, TeX treats \\smash as a math group (same spacing as ord).\n    return makeSpan([\"mord\"], [smashedNode], options);\n  },\n  mathmlBuilder: (group, options) => {\n    var node = new MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n    if (group.smashHeight) {\n      node.setAttribute(\"height\", \"0px\");\n    }\n    if (group.smashDepth) {\n      node.setAttribute(\"depth\", \"0px\");\n    }\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"sqrt\",\n  names: [\"\\\\sqrt\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler(_ref, args, optArgs) {\n    var {\n      parser\n    } = _ref;\n    var index = optArgs[0];\n    var body = args[0];\n    return {\n      type: \"sqrt\",\n      mode: parser.mode,\n      body,\n      index\n    };\n  },\n  htmlBuilder(group, options) {\n    // Square roots are handled in the TeXbook pg. 443, Rule 11.\n    // First, we do the same steps as in overline to build the inner group\n    // and line\n    var inner = buildGroup$1(group.body, options.havingCrampedStyle());\n    if (inner.height === 0) {\n      // Render a small surd.\n      inner.height = options.fontMetrics().xHeight;\n    }\n    // Some groups can return document fragments.  Handle those by wrapping\n    // them in a span.\n    inner = wrapFragment(inner, options);\n    // Calculate the minimum size for the \\surd delimiter\n    var metrics = options.fontMetrics();\n    var theta = metrics.defaultRuleThickness;\n    var phi = theta;\n    if (options.style.id < Style$1.TEXT.id) {\n      phi = options.fontMetrics().xHeight;\n    }\n    // Calculate the clearance between the body and line\n    var lineClearance = theta + phi / 4;\n    var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta;\n    // Create a sqrt SVG of the required minimum size\n    var {\n      span: img,\n      ruleWidth,\n      advanceWidth\n    } = makeSqrtImage(minDelimiterHeight, options);\n    var delimDepth = img.height - ruleWidth;\n    // Adjust the clearance based on the delimiter size\n    if (delimDepth > inner.height + inner.depth + lineClearance) {\n      lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;\n    }\n    // Shift the sqrt image\n    var imgShift = img.height - inner.height - lineClearance - ruleWidth;\n    inner.style.paddingLeft = makeEm(advanceWidth);\n    // Overlay the image and the argument.\n    var body = makeVList({\n      positionType: \"firstBaseline\",\n      children: [{\n        type: \"elem\",\n        elem: inner,\n        wrapperClasses: [\"svg-align\"]\n      }, {\n        type: \"kern\",\n        size: -(inner.height + imgShift)\n      }, {\n        type: \"elem\",\n        elem: img\n      }, {\n        type: \"kern\",\n        size: ruleWidth\n      }]\n    });\n    if (!group.index) {\n      return makeSpan([\"mord\", \"sqrt\"], [body], options);\n    } else {\n      // Handle the optional root index\n      // The index is always in scriptscript style\n      var newOptions = options.havingStyle(Style$1.SCRIPTSCRIPT);\n      var rootm = buildGroup$1(group.index, newOptions, options);\n      // The amount the index is shifted by. This is taken from the TeX\n      // source, in the definition of `\\r@@t`.\n      var toShift = 0.6 * (body.height - body.depth);\n      // Build a VList with the superscript shifted up correctly\n      var rootVList = makeVList({\n        positionType: \"shift\",\n        positionData: -toShift,\n        children: [{\n          type: \"elem\",\n          elem: rootm\n        }]\n      });\n      // Add a class surrounding it so we can add on the appropriate\n      // kerning\n      var rootVListWrap = makeSpan([\"root\"], [rootVList]);\n      return makeSpan([\"mord\", \"sqrt\"], [rootVListWrap, body], options);\n    }\n  },\n  mathmlBuilder(group, options) {\n    var {\n      body,\n      index\n    } = group;\n    return index ? new MathNode(\"mroot\", [buildGroup(body, options), buildGroup(index, options)]) : new MathNode(\"msqrt\", [buildGroup(body, options)]);\n  }\n});\n\nvar styleMap = {\n  \"display\": Style$1.DISPLAY,\n  \"text\": Style$1.TEXT,\n  \"script\": Style$1.SCRIPT,\n  \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler(_ref, args) {\n    var {\n      breakOnTokenText,\n      funcName,\n      parser\n    } = _ref;\n    // parse out the implicit body\n    var body = parser.parseExpression(true, breakOnTokenText);\n    // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.\n    // here and in buildHTML and de-dupe the enumeration of all the styles).\n    // TODO(ts): The names above exactly match the styles.\n    var style = funcName.slice(1, funcName.length - 5);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      // Figure out what style to use by pulling out the style from\n      // the function name\n      style,\n      body\n    };\n  },\n  htmlBuilder(group, options) {\n    // Style changes are handled in the TeXbook on pg. 442, Rule 3.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle).withFont('');\n    return sizingGroup(group.body, newOptions, options);\n  },\n  mathmlBuilder(group, options) {\n    // Figure out what style we're changing to.\n    var newStyle = styleMap[group.style];\n    var newOptions = options.havingStyle(newStyle);\n    var inner = buildExpression(group.body, newOptions);\n    var node = new MathNode(\"mstyle\", inner);\n    var styleAttributes = {\n      \"display\": [\"0\", \"true\"],\n      \"text\": [\"0\", \"false\"],\n      \"script\": [\"1\", \"false\"],\n      \"scriptscript\": [\"2\", \"false\"]\n    };\n    var attr = styleAttributes[group.style];\n    node.setAttribute(\"scriptlevel\", attr[0]);\n    node.setAttribute(\"displaystyle\", attr[1]);\n    return node;\n  }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\nvar htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {\n  var base = group.base;\n  if (!base) {\n    return null;\n  } else if (base.type === \"op\") {\n    // Operators handle supsubs differently when they have limits\n    // (e.g. `\\displaystyle\\sum_2^3`)\n    var delegate = base.limits && (options.style.size === Style$1.DISPLAY.size || base.alwaysHandleSupSub);\n    return delegate ? htmlBuilder$2 : null;\n  } else if (base.type === \"operatorname\") {\n    var _delegate = base.alwaysHandleSupSub && (options.style.size === Style$1.DISPLAY.size || base.limits);\n    return _delegate ? htmlBuilder$1 : null;\n  } else if (base.type === \"accent\") {\n    return isCharacterBox(base.base) ? htmlBuilder$a : null;\n  } else if (base.type === \"horizBrace\") {\n    var isSup = !group.sub;\n    return isSup === base.isOver ? htmlBuilder$3 : null;\n  } else {\n    return null;\n  }\n};\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n  type: \"supsub\",\n  htmlBuilder(group, options) {\n    // Superscript and subscripts are handled in the TeXbook on page\n    // 445-446, rules 18(a-f).\n    // Here is where we defer to the inner group if it should handle\n    // superscripts and subscripts itself.\n    var builderDelegate = htmlBuilderDelegate(group, options);\n    if (builderDelegate) {\n      return builderDelegate(group, options);\n    }\n    var {\n      base: valueBase,\n      sup: valueSup,\n      sub: valueSub\n    } = group;\n    var base = buildGroup$1(valueBase, options);\n    var supm;\n    var subm;\n    var metrics = options.fontMetrics();\n    // Rule 18a\n    var supShift = 0;\n    var subShift = 0;\n    var isCharBox = valueBase && isCharacterBox(valueBase);\n    if (valueSup) {\n      var newOptions = options.havingStyle(options.style.sup());\n      supm = buildGroup$1(valueSup, newOptions, options);\n      if (!isCharBox) {\n        supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    if (valueSub) {\n      var _newOptions = options.havingStyle(options.style.sub());\n      subm = buildGroup$1(valueSub, _newOptions, options);\n      if (!isCharBox) {\n        subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;\n      }\n    }\n    // Rule 18c\n    var minSupShift;\n    if (options.style === Style$1.DISPLAY) {\n      minSupShift = metrics.sup1;\n    } else if (options.style.cramped) {\n      minSupShift = metrics.sup3;\n    } else {\n      minSupShift = metrics.sup2;\n    }\n    // scriptspace is a font-size-independent size, so scale it\n    // appropriately for use as the marginRight.\n    var multiplier = options.sizeMultiplier;\n    var marginRight = makeEm(0.5 / metrics.ptPerEm / multiplier);\n    var marginLeft = null;\n    if (subm) {\n      // Subscripts shouldn't be shifted by the base's italic correction.\n      // Account for that by shifting the subscript back the appropriate\n      // amount. Note we only do this when the base is a single symbol.\n      var isOiint = group.base && group.base.type === \"op\" && group.base.name && (group.base.name === \"\\\\oiint\" || group.base.name === \"\\\\oiiint\");\n      if (base instanceof SymbolNode || isOiint) {\n        // @ts-ignore\n        marginLeft = makeEm(-base.italic);\n      }\n    }\n    var supsub;\n    if (supm && subm) {\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      subShift = Math.max(subShift, metrics.sub2);\n      var ruleWidth = metrics.defaultRuleThickness;\n      // Rule 18e\n      var maxWidth = 4 * ruleWidth;\n      if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {\n        subShift = maxWidth - (supShift - supm.depth) + subm.height;\n        var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);\n        if (psi > 0) {\n          supShift += psi;\n          subShift -= psi;\n        }\n      }\n      var vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        shift: subShift,\n        marginRight,\n        marginLeft\n      }, {\n        type: \"elem\",\n        elem: supm,\n        shift: -supShift,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"individualShift\",\n        children: vlistElem\n      });\n    } else if (subm) {\n      // Rule 18b\n      subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);\n      var _vlistElem = [{\n        type: \"elem\",\n        elem: subm,\n        marginLeft,\n        marginRight\n      }];\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: subShift,\n        children: _vlistElem\n      });\n    } else if (supm) {\n      // Rule 18c, d\n      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n      supsub = makeVList({\n        positionType: \"shift\",\n        positionData: -supShift,\n        children: [{\n          type: \"elem\",\n          elem: supm,\n          marginRight\n        }]\n      });\n    } else {\n      throw new Error(\"supsub must have either sup or sub.\");\n    }\n    // Wrap the supsub vlist in a span.msupsub to reset text-align.\n    var mclass = getTypeOfDomTree(base, \"right\") || \"mord\";\n    return makeSpan([mclass], [base, makeSpan([\"msupsub\"], [supsub])], options);\n  },\n  mathmlBuilder(group, options) {\n    // Is the inner group a relevant horizontal brace?\n    var isBrace = false;\n    var isOver;\n    var isSup;\n    if (group.base && group.base.type === \"horizBrace\") {\n      isSup = !!group.sup;\n      if (isSup === group.base.isOver) {\n        isBrace = true;\n        isOver = group.base.isOver;\n      }\n    }\n    if (group.base && (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n      group.base.parentIsSupSub = true;\n    }\n    var children = [buildGroup(group.base, options)];\n    if (group.sub) {\n      children.push(buildGroup(group.sub, options));\n    }\n    if (group.sup) {\n      children.push(buildGroup(group.sup, options));\n    }\n    var nodeType;\n    if (isBrace) {\n      nodeType = isOver ? \"mover\" : \"munder\";\n    } else if (!group.sub) {\n      var base = group.base;\n      if (base && base.type === \"op\" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {\n        nodeType = \"mover\";\n      } else if (base && base.type === \"operatorname\" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"mover\";\n      } else {\n        nodeType = \"msup\";\n      }\n    } else if (!group.sup) {\n      var _base = group.base;\n      if (_base && _base.type === \"op\" && _base.limits && (options.style === Style$1.DISPLAY || _base.alwaysHandleSupSub)) {\n        nodeType = \"munder\";\n      } else if (_base && _base.type === \"operatorname\" && _base.alwaysHandleSupSub && (_base.limits || options.style === Style$1.DISPLAY)) {\n        nodeType = \"munder\";\n      } else {\n        nodeType = \"msub\";\n      }\n    } else {\n      var _base2 = group.base;\n      if (_base2 && _base2.type === \"op\" && _base2.limits && options.style === Style$1.DISPLAY) {\n        nodeType = \"munderover\";\n      } else if (_base2 && _base2.type === \"operatorname\" && _base2.alwaysHandleSupSub && (options.style === Style$1.DISPLAY || _base2.limits)) {\n        nodeType = \"munderover\";\n      } else {\n        nodeType = \"msubsup\";\n      }\n    }\n    return new MathNode(nodeType, children);\n  }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\ndefineFunctionBuilders({\n  type: \"atom\",\n  htmlBuilder(group, options) {\n    return mathsym(group.text, group.mode, options, [\"m\" + group.family]);\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mo\", [makeText(group.text, group.mode)]);\n    if (group.family === \"bin\") {\n      var variant = getVariant(group, options);\n      if (variant === \"bold-italic\") {\n        node.setAttribute(\"mathvariant\", variant);\n      }\n    } else if (group.family === \"punct\") {\n      node.setAttribute(\"separator\", \"true\");\n    } else if (group.family === \"open\" || group.family === \"close\") {\n      // Delims built here should not stretch vertically.\n      // See delimsizing.js for stretchy delims.\n      node.setAttribute(\"stretchy\", \"false\");\n    }\n    return node;\n  }\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\nvar defaultVariant = {\n  \"mi\": \"italic\",\n  \"mn\": \"normal\",\n  \"mtext\": \"normal\"\n};\ndefineFunctionBuilders({\n  type: \"mathord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options, \"mathord\");\n  },\n  mathmlBuilder(group, options) {\n    var node = new MathNode(\"mi\", [makeText(group.text, group.mode, options)]);\n    var variant = getVariant(group, options) || \"italic\";\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\ndefineFunctionBuilders({\n  type: \"textord\",\n  htmlBuilder(group, options) {\n    return makeOrd(group, options, \"textord\");\n  },\n  mathmlBuilder(group, options) {\n    var text = makeText(group.text, group.mode, options);\n    var variant = getVariant(group, options) || \"normal\";\n    var node;\n    if (group.mode === 'text') {\n      node = new MathNode(\"mtext\", [text]);\n    } else if (/[0-9]/.test(group.text)) {\n      node = new MathNode(\"mn\", [text]);\n    } else if (group.text === \"\\\\prime\") {\n      node = new MathNode(\"mo\", [text]);\n    } else {\n      node = new MathNode(\"mi\", [text]);\n    }\n    if (variant !== defaultVariant[node.type]) {\n      node.setAttribute(\"mathvariant\", variant);\n    }\n    return node;\n  }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nvar cssSpace = {\n  \"\\\\nobreak\": \"nobreak\",\n  \"\\\\allowbreak\": \"allowbreak\"\n};\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character.  If a symbol or command is a key\n// in this table, then it should be a regular space character.  Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nvar regularSpace = {\n  \" \": {},\n  \"\\\\ \": {},\n  \"~\": {\n    className: \"nobreak\"\n  },\n  \"\\\\space\": {},\n  \"\\\\nobreakspace\": {\n    className: \"nobreak\"\n  }\n};\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n  type: \"spacing\",\n  htmlBuilder(group, options) {\n    if (regularSpace.hasOwnProperty(group.text)) {\n      var className = regularSpace[group.text].className || \"\";\n      // Spaces are generated by adding an actual space. Each of these\n      // things has an entry in the symbols table, so these will be turned\n      // into appropriate outputs.\n      if (group.mode === \"text\") {\n        var ord = makeOrd(group, options, \"textord\");\n        ord.classes.push(className);\n        return ord;\n      } else {\n        return makeSpan([\"mspace\", className], [mathsym(group.text, group.mode, options)], options);\n      }\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // Spaces based on just a CSS class.\n      return makeSpan([\"mspace\", cssSpace[group.text]], [], options);\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n  },\n  mathmlBuilder(group, options) {\n    var node;\n    if (regularSpace.hasOwnProperty(group.text)) {\n      node = new MathNode(\"mtext\", [new TextNode(\"\\u00a0\")]);\n    } else if (cssSpace.hasOwnProperty(group.text)) {\n      // CSS-based MathML spaces (\\nobreak, \\allowbreak) are ignored\n      return new MathNode(\"mspace\");\n    } else {\n      throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n    }\n    return node;\n  }\n});\n\nvar pad = () => {\n  var padNode = new MathNode(\"mtd\", []);\n  padNode.setAttribute(\"width\", \"50%\");\n  return padNode;\n};\ndefineFunctionBuilders({\n  type: \"tag\",\n  mathmlBuilder(group, options) {\n    var table = new MathNode(\"mtable\", [new MathNode(\"mtr\", [pad(), new MathNode(\"mtd\", [buildExpressionRow(group.body, options)]), pad(), new MathNode(\"mtd\", [buildExpressionRow(group.tag, options)])])]);\n    table.setAttribute(\"width\", \"100%\");\n    return table;\n    // TODO: Left-aligned tags.\n    // Currently, the group and options passed here do not contain\n    // enough info to set tag alignment. `leqno` is in Settings but it is\n    // not passed to Options. On the HTML side, leqno is\n    // set by a CSS class applied in buildTree.js. That would have worked\n    // in MathML if browsers supported <mlabeledtr>. Since they don't, we\n    // need to rewrite the way this function is called.\n  }\n});\n\n// Non-mathy text, possibly in a font\nvar textFontFamilies = {\n  \"\\\\text\": undefined,\n  \"\\\\textrm\": \"textrm\",\n  \"\\\\textsf\": \"textsf\",\n  \"\\\\texttt\": \"texttt\",\n  \"\\\\textnormal\": \"textrm\"\n};\nvar textFontWeights = {\n  \"\\\\textbf\": \"textbf\",\n  \"\\\\textmd\": \"textmd\"\n};\nvar textFontShapes = {\n  \"\\\\textit\": \"textit\",\n  \"\\\\textup\": \"textup\"\n};\nvar optionsWithFont = (group, options) => {\n  var font = group.font;\n  // Checks if the argument is a font family or a font style.\n  if (!font) {\n    return options;\n  } else if (textFontFamilies[font]) {\n    return options.withTextFontFamily(textFontFamilies[font]);\n  } else if (textFontWeights[font]) {\n    return options.withTextFontWeight(textFontWeights[font]);\n  } else if (font === \"\\\\emph\") {\n    return options.fontShape === \"textit\" ? options.withTextFontShape(\"textup\") : options.withTextFontShape(\"textit\");\n  }\n  return options.withTextFontShape(textFontShapes[font]);\n};\ndefineFunction({\n  type: \"text\",\n  names: [\n  // Font families\n  \"\\\\text\", \"\\\\textrm\", \"\\\\textsf\", \"\\\\texttt\", \"\\\\textnormal\",\n  // Font weights\n  \"\\\\textbf\", \"\\\\textmd\",\n  // Font Shapes\n  \"\\\\textit\", \"\\\\textup\", \"\\\\emph\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser,\n      funcName\n    } = _ref;\n    var body = args[0];\n    return {\n      type: \"text\",\n      mode: parser.mode,\n      body: ordargument(body),\n      font: funcName\n    };\n  },\n  htmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    var inner = buildExpression$1(group.body, newOptions, true);\n    return makeSpan([\"mord\", \"text\"], inner, newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var newOptions = optionsWithFont(group, options);\n    return buildExpressionRow(group.body, newOptions);\n  }\n});\n\ndefineFunction({\n  type: \"underline\",\n  names: [\"\\\\underline\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"underline\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    // Underlines are handled in the TeXbook pg 443, Rule 10.\n    // Build the inner group.\n    var innerGroup = buildGroup$1(group.body, options);\n    // Create the line to go below the body\n    var line = makeLineSpan(\"underline-line\", options);\n    // Generate the vlist, with the appropriate kerns\n    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n    var vlist = makeVList({\n      positionType: \"top\",\n      positionData: innerGroup.height,\n      children: [{\n        type: \"kern\",\n        size: defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: line\n      }, {\n        type: \"kern\",\n        size: 3 * defaultRuleThickness\n      }, {\n        type: \"elem\",\n        elem: innerGroup\n      }]\n    });\n    return makeSpan([\"mord\", \"underline\"], [vlist], options);\n  },\n  mathmlBuilder(group, options) {\n    var operator = new MathNode(\"mo\", [new TextNode(\"\\u203e\")]);\n    operator.setAttribute(\"stretchy\", \"true\");\n    var node = new MathNode(\"munder\", [buildGroup(group.body, options), operator]);\n    node.setAttribute(\"accentunder\", \"true\");\n    return node;\n  }\n});\n\n// \\vcenter:  Vertically center the argument group on the math axis.\ndefineFunction({\n  type: \"vcenter\",\n  names: [\"\\\\vcenter\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"original\"],\n    // In LaTeX, \\vcenter can act only on a box.\n    allowedInText: false\n  },\n  handler(_ref, args) {\n    var {\n      parser\n    } = _ref;\n    return {\n      type: \"vcenter\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  htmlBuilder(group, options) {\n    var body = buildGroup$1(group.body, options);\n    var axisHeight = options.fontMetrics().axisHeight;\n    var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight));\n    return makeVList({\n      positionType: \"shift\",\n      positionData: dy,\n      children: [{\n        type: \"elem\",\n        elem: body\n      }]\n    });\n  },\n  mathmlBuilder(group, options) {\n    // There is no way to do this in MathML.\n    // Write a class as a breadcrumb in case some post-processor wants\n    // to perform a vcenter adjustment.\n    // Wrap in mrow to ensure valid MathML when placed inside mo (e.g., \\mathrel)\n    var mpadded = new MathNode(\"mpadded\", [buildGroup(group.body, options)], [\"vcenter\"]);\n    return new MathNode(\"mrow\", [mpadded]);\n  }\n});\n\ndefineFunction({\n  type: \"verb\",\n  names: [\"\\\\verb\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(context, args, optArgs) {\n    // \\verb and \\verb* are dealt with directly in Parser.js.\n    // If we end up here, it's because of a failure to match the two delimiters\n    // in the regex in Lexer.js.  LaTeX raises the following error when \\verb is\n    // terminated by end of line (or file).\n    throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n  },\n  htmlBuilder(group, options) {\n    var text = makeVerb(group);\n    var body = [];\n    // \\verb enters text mode and therefore is sized like \\textstyle\n    var newOptions = options.havingStyle(options.style.text());\n    for (var i = 0; i < text.length; i++) {\n      var c = text[i];\n      if (c === '~') {\n        c = '\\\\textasciitilde';\n      }\n      body.push(makeSymbol(c, \"Typewriter-Regular\", group.mode, newOptions, [\"mord\", \"texttt\"]));\n    }\n    return makeSpan([\"mord\", \"text\"].concat(newOptions.sizingClasses(options)), tryCombineChars(body), newOptions);\n  },\n  mathmlBuilder(group, options) {\n    var text = new TextNode(makeVerb(group));\n    var node = new MathNode(\"mtext\", [text]);\n    node.setAttribute(\"mathvariant\", \"monospace\");\n    return node;\n  }\n});\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nvar makeVerb = group => group.body.replace(/ /g, group.star ? '\\u2423' : '\\xA0');\n\n/** Include this to ensure that all functions are defined. */\nvar functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first group\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n *   [1] regular whitespace\n *   [2] backslash followed by whitespace\n *   [3] anything else, which may include:\n *     [4] left character of \\verb*\n *     [5] left character of \\verb\n *     [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nvar spaceRegexString = \"[ \\r\\n\\t]\";\nvar controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nvar controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nvar controlWordWhitespaceRegexString = \"(\" + controlWordRegexString + \")\" + spaceRegexString + \"*\";\nvar controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nvar combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nvar combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + \"+$\");\nvar tokenRegexString = \"(\" + spaceRegexString + \"+)|\" + (// whitespace\ncontrolSpaceRegexString + \"|\") +\n// \\whitespace\n\"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + (// single codepoint\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + (// surrogate pair\ncombiningDiacriticalMarkString + \"*\") +\n// ...plus accents\n\"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" +\n// \\verb*\n\"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + (// \\verb unstarred\n\"|\" + controlWordWhitespaceRegexString) + (// \\macroName + spaces\n\"|\" + controlSymbolRegexString + \")\"); // \\\\, \\', etc.\n/** Main Lexer class */\nclass Lexer {\n  // Category codes. The lexer only supports comment characters (14) for now.\n  // MacroExpander additionally distinguishes active (13).\n\n  constructor(input, settings) {\n    // Separate accents from characters\n    this.input = input;\n    this.settings = settings;\n    this.tokenRegex = new RegExp(tokenRegexString, 'g');\n    this.catcodes = {\n      \"%\": 14,\n      // comment character\n      \"~\": 13 // active character\n    };\n  }\n  setCatcode(char, code) {\n    this.catcodes[char] = code;\n  }\n  /**\n   * This function lexes a single token.\n   */\n  lex() {\n    var input = this.input;\n    var pos = this.tokenRegex.lastIndex;\n    if (pos === input.length) {\n      return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n    }\n    var match = this.tokenRegex.exec(input);\n    if (match === null || match.index !== pos) {\n      throw new ParseError(\"Unexpected character: '\" + input[pos] + \"'\", new Token(input[pos], new SourceLocation(this, pos, pos + 1)));\n    }\n    var text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n    if (this.catcodes[text] === 14) {\n      // comment character\n      var nlIndex = input.indexOf('\\n', this.tokenRegex.lastIndex);\n      if (nlIndex === -1) {\n        this.tokenRegex.lastIndex = input.length; // EOF\n        this.settings.reportNonstrict(\"commentAtEnd\", \"% comment has no terminating newline; LaTeX would \" + \"fail because of commenting the end of math mode (e.g. $)\");\n      } else {\n        this.tokenRegex.lastIndex = nlIndex + 1;\n      }\n      return this.lex();\n    }\n    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n  }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\nclass Namespace {\n  /**\n   * Both arguments are optional.  The first argument is an object of\n   * built-in mappings which never change.  The second argument is an object\n   * of initial (global-level) mappings, which will constantly change\n   * according to any global/top-level `set`s done.\n   */\n  constructor(builtins, globalMacros) {\n    if (builtins === void 0) {\n      builtins = {};\n    }\n    if (globalMacros === void 0) {\n      globalMacros = {};\n    }\n    this.current = globalMacros;\n    this.builtins = builtins;\n    this.undefStack = [];\n  }\n  /**\n   * Start a new nested group, affecting future local `set`s.\n   */\n  beginGroup() {\n    this.undefStack.push({});\n  }\n  /**\n   * End current nested group, restoring values before the group began.\n   */\n  endGroup() {\n    if (this.undefStack.length === 0) {\n      throw new ParseError(\"Unbalanced namespace destruction: attempt \" + \"to pop global namespace; please report this as a bug\");\n    }\n    var undefs = this.undefStack.pop();\n    for (var undef in undefs) {\n      if (undefs.hasOwnProperty(undef)) {\n        if (undefs[undef] == null) {\n          delete this.current[undef];\n        } else {\n          this.current[undef] = undefs[undef];\n        }\n      }\n    }\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    while (this.undefStack.length > 0) {\n      this.endGroup();\n    }\n  }\n  /**\n   * Detect whether `name` has a definition.  Equivalent to\n   * `get(name) != null`.\n   */\n  has(name) {\n    return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);\n  }\n  /**\n   * Get the current value of a name, or `undefined` if there is no value.\n   *\n   * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n   * is defined, as the definition may be the empty string which evaluates\n   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or\n   * `if (namespace.has(...))`.\n   */\n  get(name) {\n    if (this.current.hasOwnProperty(name)) {\n      return this.current[name];\n    } else {\n      return this.builtins[name];\n    }\n  }\n  /**\n   * Set the current value of a name, and optionally set it globally too.\n   * Local set() sets the current value and (when appropriate) adds an undo\n   * operation to the undo stack.  Global set() may change the undo\n   * operation at every level, so takes time linear in their number.\n   * A value of undefined means to delete existing definitions.\n   */\n  set(name, value, global) {\n    if (global === void 0) {\n      global = false;\n    }\n    if (global) {\n      // Global set is equivalent to setting in all groups.  Simulate this\n      // by destroying any undos currently scheduled for this name,\n      // and adding an undo with the *new* value (in case it later gets\n      // locally reset within this environment).\n      for (var i = 0; i < this.undefStack.length; i++) {\n        delete this.undefStack[i][name];\n      }\n      if (this.undefStack.length > 0) {\n        this.undefStack[this.undefStack.length - 1][name] = value;\n      }\n    } else {\n      // Undo this set at end of this group (possibly to `undefined`),\n      // unless an undo is already in place, in which case that older\n      // value is the correct one.\n      var top = this.undefStack[this.undefStack.length - 1];\n      if (top && !top.hasOwnProperty(name)) {\n        top[name] = this.current[name];\n      }\n    }\n    if (value == null) {\n      delete this.current[name];\n    } else {\n      this.current[name] = value;\n    }\n  }\n}\n\n/**\n * Predefined macros for KaTeX.\n * This can be used to define some commands in terms of others.\n */\nvar macros = _macros;\n//////////////////////////////////////////////////////////////////////\n// macro tools\ndefineMacro(\"\\\\noexpand\", function (context) {\n  // The expansion is the token itself; but that token is interpreted\n  // as if its meaning were ‘\\relax’ if it is a control sequence that\n  // would ordinarily be expanded by TeX’s expansion rules.\n  var t = context.popToken();\n  if (context.isExpandable(t.text)) {\n    t.noexpand = true;\n    t.treatAsRelax = true;\n  }\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\ndefineMacro(\"\\\\expandafter\", function (context) {\n  // TeX first reads the token that comes immediately after \\expandafter,\n  // without expanding it; let’s call this token t. Then TeX reads the\n  // token that comes after t (and possibly more tokens, if that token\n  // has an argument), replacing it by its expansion. Finally TeX puts\n  // t back in front of that expansion.\n  var t = context.popToken();\n  context.expandOnce(true); // expand only an expandable token\n  return {\n    tokens: [t],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[0],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function (context) {\n  var args = context.consumeArgs(2);\n  return {\n    tokens: args[1],\n    numArgs: 0\n  };\n});\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character.  If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function (context) {\n  var args = context.consumeArgs(3); // symbol, if, else\n  context.consumeSpaces();\n  var nextToken = context.future();\n  if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[2],\n      numArgs: 0\n    };\n  }\n});\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function (context) {\n  var args = context.consumeArgs(2);\n  if (context.mode === 'text') {\n    return {\n      tokens: args[0],\n      numArgs: 0\n    };\n  } else {\n    return {\n      tokens: args[1],\n      numArgs: 0\n    };\n  }\n});\n// Lookup table for parsing numbers in base 8 through 16\nvar digitToNumber = {\n  \"0\": 0,\n  \"1\": 1,\n  \"2\": 2,\n  \"3\": 3,\n  \"4\": 4,\n  \"5\": 5,\n  \"6\": 6,\n  \"7\": 7,\n  \"8\": 8,\n  \"9\": 9,\n  \"a\": 10,\n  \"A\": 10,\n  \"b\": 11,\n  \"B\": 11,\n  \"c\": 12,\n  \"C\": 12,\n  \"d\": 13,\n  \"D\": 13,\n  \"e\": 14,\n  \"E\": 14,\n  \"f\": 15,\n  \"F\": 15\n};\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n//   \\char123  -- decimal\n//   \\char'123 -- octal\n//   \\char\"123 -- hex\n//   \\char`x   -- character that can be written (i.e. isn't active)\n//   \\char`\\x  -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function (context) {\n  var token = context.popToken();\n  var base;\n  var number = 0;\n  if (token.text === \"'\") {\n    base = 8;\n    token = context.popToken();\n  } else if (token.text === '\"') {\n    base = 16;\n    token = context.popToken();\n  } else if (token.text === \"`\") {\n    token = context.popToken();\n    if (token.text[0] === \"\\\\\") {\n      number = token.text.charCodeAt(1);\n    } else if (token.text === \"EOF\") {\n      throw new ParseError(\"\\\\char` missing argument\");\n    } else {\n      number = token.text.charCodeAt(0);\n    }\n  } else {\n    base = 10;\n  }\n  if (base) {\n    // Parse a number in the given base, starting with first `token`.\n    number = digitToNumber[token.text];\n    if (number == null || number >= base) {\n      throw new ParseError(\"Invalid base-\" + base + \" digit \" + token.text);\n    }\n    var digit;\n    while ((digit = digitToNumber[context.future().text]) != null && digit < base) {\n      number *= base;\n      number += digit;\n      context.popToken();\n    }\n  }\n  return \"\\\\@char{\" + number + \"}\";\n});\n// \\newcommand{\\macro}[args]{definition}\n// \\renewcommand{\\macro}[args]{definition}\n// TODO: Optional arguments: \\newcommand{\\macro}[args][default]{definition}\nvar newcommand = (context, existsOK, nonexistsOK, skipIfExists) => {\n  var arg = context.consumeArg().tokens;\n  if (arg.length !== 1) {\n    throw new ParseError(\"\\\\newcommand's first argument must be a macro name\");\n  }\n  var name = arg[0].text;\n  var exists = context.isDefined(name);\n  if (exists && !existsOK) {\n    throw new ParseError(\"\\\\newcommand{\" + name + \"} attempting to redefine \" + (name + \"; use \\\\renewcommand\"));\n  }\n  if (!exists && !nonexistsOK) {\n    throw new ParseError(\"\\\\renewcommand{\" + name + \"} when command \" + name + \" \" + \"does not yet exist; use \\\\newcommand\");\n  }\n  var numArgs = 0;\n  arg = context.consumeArg().tokens;\n  if (arg.length === 1 && arg[0].text === \"[\") {\n    var argText = '';\n    var token = context.expandNextToken();\n    while (token.text !== \"]\" && token.text !== \"EOF\") {\n      // TODO: Should properly expand arg, e.g., ignore {}s\n      argText += token.text;\n      token = context.expandNextToken();\n    }\n    if (!argText.match(/^\\s*[0-9]+\\s*$/)) {\n      throw new ParseError(\"Invalid number of arguments: \" + argText);\n    }\n    numArgs = parseInt(argText);\n    arg = context.consumeArg().tokens;\n  }\n  if (!(exists && skipIfExists)) {\n    // Final arg is the expansion of the macro\n    context.macros.set(name, {\n      tokens: arg,\n      numArgs\n    });\n  }\n  return '';\n};\ndefineMacro(\"\\\\newcommand\", context => newcommand(context, false, true, false));\ndefineMacro(\"\\\\renewcommand\", context => newcommand(context, true, false, false));\ndefineMacro(\"\\\\providecommand\", context => newcommand(context, true, true, true));\n// terminal (console) tools\ndefineMacro(\"\\\\message\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.log(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\errmessage\", context => {\n  var arg = context.consumeArgs(1)[0];\n  // eslint-disable-next-line no-console\n  console.error(arg.reverse().map(token => token.text).join(\"\"));\n  return '';\n});\ndefineMacro(\"\\\\show\", context => {\n  var tok = context.popToken();\n  var name = tok.text;\n  // eslint-disable-next-line no-console\n  console.log(tok, context.macros.get(name), functions[name], symbols.math[name], symbols.text[name]);\n  return '';\n});\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\n// \\def \\AA {\\r A}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\ndefineMacro(\"\\\\AA\", \"\\\\r A\");\n// Copyright (C) and registered (R) symbols. Use raw symbol in MathML.\n// \\DeclareTextCommandDefault{\\textcopyright}{\\textcircled{c}}\n// \\DeclareTextCommandDefault{\\textregistered}{\\textcircled{%\n//      \\check@mathfonts\\fontsize\\sf@size\\z@\\math@fontsfalse\\selectfont R}}\n// \\DeclareRobustCommand{\\copyright}{%\n//    \\ifmmode{\\nfss@text{\\textcopyright}}\\else\\textcopyright\\fi}\ndefineMacro(\"\\\\textcopyright\", \"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`©}\");\ndefineMacro(\"\\\\copyright\", \"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\");\ndefineMacro(\"\\\\textregistered\", \"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`®}\");\n// Characters omitted from Unicode range 1D400–1D7FF\ndefineMacro(\"\\u212C\", \"\\\\mathscr{B}\"); // script\ndefineMacro(\"\\u2130\", \"\\\\mathscr{E}\");\ndefineMacro(\"\\u2131\", \"\\\\mathscr{F}\");\ndefineMacro(\"\\u210B\", \"\\\\mathscr{H}\");\ndefineMacro(\"\\u2110\", \"\\\\mathscr{I}\");\ndefineMacro(\"\\u2112\", \"\\\\mathscr{L}\");\ndefineMacro(\"\\u2133\", \"\\\\mathscr{M}\");\ndefineMacro(\"\\u211B\", \"\\\\mathscr{R}\");\ndefineMacro(\"\\u212D\", \"\\\\mathfrak{C}\"); // Fraktur\ndefineMacro(\"\\u210C\", \"\\\\mathfrak{H}\");\ndefineMacro(\"\\u2128\", \"\\\\mathfrak{Z}\");\n// Define \\Bbbk with a macro that works in both HTML and MathML.\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n// \\llap and \\rlap render their contents in text mode\ndefineMacro(\"\\\\llap\", \"\\\\mathllap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\rlap\", \"\\\\mathrlap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\clap\", \"\\\\mathclap{\\\\textrm{#1}}\");\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n// \\not is defined by base/fontmath.ltx via\n// \\DeclareMathSymbol{\\not}{\\mathrel}{symbols}{\"36}\n// It's thus treated like a \\mathrel, but defined by a symbol that has zero\n// width but extends to the right.  We use \\rlap to get that spacing.\n// For MathML we write U+0338 here. buildMathML.js will then do the overlay.\ndefineMacro(\"\\\\not\", \"\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}\\\\nobreak}\" + \"{\\\\char\\\"338}\");\n// Negated symbols from base/fontmath.ltx:\n// \\def\\neq{\\not=} \\let\\ne=\\neq\n// \\DeclareRobustCommand\n//   \\notin{\\mathrel{\\m@th\\mathpalette\\c@ncel\\in}}\n// \\def\\c@ncel#1#2{\\m@th\\ooalign{$\\hfil#1\\mkern1mu/\\hfil$\\crcr$#1#2$}}\ndefineMacro(\"\\\\neq\", \"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`≠}}\");\ndefineMacro(\"\\\\ne\", \"\\\\neq\");\ndefineMacro(\"\\u2260\", \"\\\\neq\");\ndefineMacro(\"\\\\notin\", \"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}\" + \"{\\\\mathrel{\\\\char`∉}}\");\ndefineMacro(\"\\u2209\", \"\\\\notin\");\n// Unicode stacked relations\ndefineMacro(\"\\u2258\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}\" + \"}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u2259\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u225A\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225A}}\");\ndefineMacro(\"\\u225B\", \"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225B}}\");\ndefineMacro(\"\\u225D\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225D}}\");\ndefineMacro(\"\\u225E\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225E}}\");\ndefineMacro(\"\\u225F\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225F}}\");\n// Misc Unicode\ndefineMacro(\"\\u27C2\", \"\\\\perp\");\ndefineMacro(\"\\u203C\", \"\\\\mathclose{!\\\\mkern-0.8mu!}\");\ndefineMacro(\"\\u220C\", \"\\\\notni\");\ndefineMacro(\"\\u231C\", \"\\\\ulcorner\");\ndefineMacro(\"\\u231D\", \"\\\\urcorner\");\ndefineMacro(\"\\u231E\", \"\\\\llcorner\");\ndefineMacro(\"\\u231F\", \"\\\\lrcorner\");\ndefineMacro(\"\\u00A9\", \"\\\\copyright\");\ndefineMacro(\"\\u00AE\", \"\\\\textregistered\");\n// The KaTeX fonts have corners at codepoints that don't match Unicode.\n// For MathML purposes, use the Unicode code point.\ndefineMacro(\"\\\\ulcorner\", \"\\\\html@mathml{\\\\@ulcorner}{\\\\mathop{\\\\char\\\"231c}}\");\ndefineMacro(\"\\\\urcorner\", \"\\\\html@mathml{\\\\@urcorner}{\\\\mathop{\\\\char\\\"231d}}\");\ndefineMacro(\"\\\\llcorner\", \"\\\\html@mathml{\\\\@llcorner}{\\\\mathop{\\\\char\\\"231e}}\");\ndefineMacro(\"\\\\lrcorner\", \"\\\\html@mathml{\\\\@lrcorner}{\\\\mathop{\\\\char\\\"231f}}\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n// \\vdots{\\vbox{\\baselineskip4\\p@  \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n// Italic Greek capital letters.  AMS defines these with \\DeclareMathSymbol,\n// but they are equivalent to \\mathit{\\Letter}.\ndefineMacro(\"\\\\varGamma\", \"\\\\mathit{\\\\Gamma}\");\ndefineMacro(\"\\\\varDelta\", \"\\\\mathit{\\\\Delta}\");\ndefineMacro(\"\\\\varTheta\", \"\\\\mathit{\\\\Theta}\");\ndefineMacro(\"\\\\varLambda\", \"\\\\mathit{\\\\Lambda}\");\ndefineMacro(\"\\\\varXi\", \"\\\\mathit{\\\\Xi}\");\ndefineMacro(\"\\\\varPi\", \"\\\\mathit{\\\\Pi}\");\ndefineMacro(\"\\\\varSigma\", \"\\\\mathit{\\\\Sigma}\");\ndefineMacro(\"\\\\varUpsilon\", \"\\\\mathit{\\\\Upsilon}\");\ndefineMacro(\"\\\\varPhi\", \"\\\\mathit{\\\\Phi}\");\ndefineMacro(\"\\\\varPsi\", \"\\\\mathit{\\\\Psi}\");\ndefineMacro(\"\\\\varOmega\", \"\\\\mathit{\\\\Omega}\");\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n// \\renewcommand{\\colon}{\\nobreak\\mskip2mu\\mathpunct{}\\nonscript\n// \\mkern-\\thinmuskip{:}\\mskip6muplus1mu\\relax}\ndefineMacro(\"\\\\colon\", \"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\" + \"\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\\\\relax\");\n// \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}}\ndefineMacro(\"\\\\boxed\", \"\\\\fbox{$\\\\displaystyle{#1}$}\");\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n// \\def\\dddot#1{{\\mathop{#1}\\limits^{\\vbox to-1.4\\ex@{\\kern-\\tw@\\ex@\n//  \\hbox{\\normalfont ...}\\vss}}}}\n// We use \\overset which avoids the vertical shift of \\mathop.\ndefineMacro(\"\\\\dddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ...}}{#1}}\");\ndefineMacro(\"\\\\ddddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ....}}{#1}}\");\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nvar dotsByToken = {\n  ',': '\\\\dotsc',\n  '\\\\not': '\\\\dotsb',\n  // \\keybin@ checks for the following:\n  '+': '\\\\dotsb',\n  '=': '\\\\dotsb',\n  '<': '\\\\dotsb',\n  '>': '\\\\dotsb',\n  '-': '\\\\dotsb',\n  '*': '\\\\dotsb',\n  ':': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSB:\n  '\\\\DOTSB': '\\\\dotsb',\n  '\\\\coprod': '\\\\dotsb',\n  '\\\\bigvee': '\\\\dotsb',\n  '\\\\bigwedge': '\\\\dotsb',\n  '\\\\biguplus': '\\\\dotsb',\n  '\\\\bigcap': '\\\\dotsb',\n  '\\\\bigcup': '\\\\dotsb',\n  '\\\\prod': '\\\\dotsb',\n  '\\\\sum': '\\\\dotsb',\n  '\\\\bigotimes': '\\\\dotsb',\n  '\\\\bigoplus': '\\\\dotsb',\n  '\\\\bigodot': '\\\\dotsb',\n  '\\\\bigsqcup': '\\\\dotsb',\n  '\\\\And': '\\\\dotsb',\n  '\\\\longrightarrow': '\\\\dotsb',\n  '\\\\Longrightarrow': '\\\\dotsb',\n  '\\\\longleftarrow': '\\\\dotsb',\n  '\\\\Longleftarrow': '\\\\dotsb',\n  '\\\\longleftrightarrow': '\\\\dotsb',\n  '\\\\Longleftrightarrow': '\\\\dotsb',\n  '\\\\mapsto': '\\\\dotsb',\n  '\\\\longmapsto': '\\\\dotsb',\n  '\\\\hookrightarrow': '\\\\dotsb',\n  '\\\\doteq': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathbin:\n  '\\\\mathbin': '\\\\dotsb',\n  // Symbols whose definition starts with \\mathrel:\n  '\\\\mathrel': '\\\\dotsb',\n  '\\\\relbar': '\\\\dotsb',\n  '\\\\Relbar': '\\\\dotsb',\n  '\\\\xrightarrow': '\\\\dotsb',\n  '\\\\xleftarrow': '\\\\dotsb',\n  // Symbols whose definition starts with \\DOTSI:\n  '\\\\DOTSI': '\\\\dotsi',\n  '\\\\int': '\\\\dotsi',\n  '\\\\oint': '\\\\dotsi',\n  '\\\\iint': '\\\\dotsi',\n  '\\\\iiint': '\\\\dotsi',\n  '\\\\iiiint': '\\\\dotsi',\n  '\\\\idotsint': '\\\\dotsi',\n  // Symbols whose definition starts with \\DOTSX:\n  '\\\\DOTSX': '\\\\dotsx'\n};\nvar dotsbGroups = new Set(['bin', 'rel']);\ndefineMacro(\"\\\\dots\", function (context) {\n  // TODO: If used in text mode, should expand to \\textellipsis.\n  // However, in KaTeX, \\textellipsis and \\ldots behave the same\n  // (in text mode), and it's unlikely we'd see any of the math commands\n  // that affect the behavior of \\dots when in text mode.  So fine for now\n  // (until we support \\ifmmode ... \\else ... \\fi).\n  var thedots = '\\\\dotso';\n  var next = context.expandAfterFuture().text;\n  if (next in dotsByToken) {\n    thedots = dotsByToken[next];\n  } else if (next.slice(0, 4) === '\\\\not') {\n    thedots = '\\\\dotsb';\n  } else if (next in symbols.math) {\n    if (dotsbGroups.has(symbols.math[next].group)) {\n      thedots = '\\\\dotsb';\n    }\n  }\n  return thedots;\n});\nvar spaceAfterDots = {\n  // \\rightdelim@ checks for the following:\n  ')': true,\n  ']': true,\n  '\\\\rbrack': true,\n  '\\\\}': true,\n  '\\\\rbrace': true,\n  '\\\\rangle': true,\n  '\\\\rceil': true,\n  '\\\\rfloor': true,\n  '\\\\rgroup': true,\n  '\\\\rmoustache': true,\n  '\\\\right': true,\n  '\\\\bigr': true,\n  '\\\\biggr': true,\n  '\\\\Bigr': true,\n  '\\\\Biggr': true,\n  // \\extra@ also tests for the following:\n  '$': true,\n  // \\extrap@ checks for the following:\n  ';': true,\n  '.': true,\n  ',': true\n};\ndefineMacro(\"\\\\dotso\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\dotsc\", function (context) {\n  var next = context.future().text;\n  // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n  // ';' and '.', but doesn't check for ','.\n  if (next in spaceAfterDots && next !== ',') {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\ndefineMacro(\"\\\\cdots\", function (context) {\n  var next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\@cdots\\\\,\";\n  } else {\n    return \"\\\\@cdots\";\n  }\n});\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n//   \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"\\\\tmspace+{3mu}{.1667em}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"\\\\tmspace+{4mu}{.2222em}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"\\\\tmspace+{5mu}{.2777em}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"\\\\tmspace-{3mu}{.1667em}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"\\\\tmspace-{4mu}{.2222em}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"\\\\tmspace-{5mu}{.277em}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", context => {\n  if (context.macros.get(\"\\\\df@tag\")) {\n    throw new ParseError(\"Multiple \\\\tag\");\n  }\n  return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n//   {\\operator@font mod}\\penalty900\n//   \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n//   \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n//   \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\" + \"\\\\mathbin{\\\\rm mod}\" + \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\");\ndefineMacro(\"\\\\pod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\");\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\"\\\\mod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" + \"{\\\\rm mod}\\\\,\\\\,#1\");\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n// \\expandafter\\let\\expandafter\\@normalcr\n//     \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.  KaTeX doesn't\n// support \\@ yet, so that's omitted, and we add \\text so that the result\n// doesn't look funny in math mode.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{\\\\html@mathml{\" + \"T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX\" + \"}{TeX}}\");\n// \\DeclareRobustCommand{\\LaTeX}{L\\kern-.36em%\n//         {\\sbox\\z@ T%\n//          \\vbox to\\ht\\z@{\\hbox{\\check@mathfonts\n//                               \\fontsize\\sf@size\\z@\n//                               \\math@fontsfalse\\selectfont\n//                               A}%\n//                         \\vss}%\n//         }%\n//         \\kern-.15em%\n//         \\TeX}\n// This code aligns the top of the A with the T (from the perspective of TeX's\n// boxes, though visually the A appears to extend above slightly).\n// We compute the corresponding \\raisebox when A is rendered in \\normalsize\n// \\scriptstyle, which has a scale factor of 0.7 (see Options.js).\nvar latexRaiseA = makeEm(fontMetricsData['Main-Regular'][\"T\".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular'][\"A\".charCodeAt(0)][1]);\ndefineMacro(\"\\\\LaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"L\\\\kern-.36em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{LaTeX}}\");\n// New KaTeX logo based on tweaking LaTeX logo\ndefineMacro(\"\\\\KaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"K\\\\kern-.17em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{KaTeX}}\");\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip  #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n//                 \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", \":\");\n//\\def\\vcentcolon{\\mathrel{\\mathop\\ordinarycolon}}\n//TODO(edemaine): Not yet centered. Fix via \\raisebox or #726\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\");\n// \\providecommand*\\dblcolon{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}\ndefineMacro(\"\\\\dblcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2237}}\");\n// \\providecommand*\\coloneqq{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2254}}\"); // ≔\n// \\providecommand*\\Coloneqq{\\dblcolon\\mathrel{\\mkern-1.2mu}=}\ndefineMacro(\"\\\\Coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"3d}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2212}}\");\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2212}}\");\n// \\providecommand*\\eqqcolon{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2255}}\"); // ≕\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"3d\\\\char\\\"2237}}\");\n// \\providecommand*\\eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}\ndefineMacro(\"\\\\eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2239}}\");\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"2212\\\\char\\\"2237}}\");\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2248}}\");\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2248}}\");\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"223c}}\");\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"223c}}\");\n// Some Unicode characters are implemented with macros to mathtools functions.\ndefineMacro(\"\\u2237\", \"\\\\dblcolon\"); // ::\ndefineMacro(\"\\u2239\", \"\\\\eqcolon\"); // -:\ndefineMacro(\"\\u2254\", \"\\\\coloneqq\"); // :=\ndefineMacro(\"\\u2255\", \"\\\\eqqcolon\"); // =:\ndefineMacro(\"\\u2A74\", \"\\\\Coloneqq\"); // ::=\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n// Additional macros, implemented by analogy with mathtools definitions:\ndefineMacro(\"\\\\simcolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\simcoloncolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\ndefineMacro(\"\\\\approxcolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\approxcoloncolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220C}}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{lim}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{lim}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{lim}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{lim}}\");\n//////////////////////////////////////////////////////////////////////\n// MathML alternates for KaTeX glyphs in the Unicode private area\ndefineMacro(\"\\\\gvertneqq\", \"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\");\ndefineMacro(\"\\\\lvertneqq\", \"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\");\ndefineMacro(\"\\\\ngeqq\", \"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\");\ndefineMacro(\"\\\\ngeqslant\", \"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\");\ndefineMacro(\"\\\\nleqq\", \"\\\\html@mathml{\\\\@nleqq}{\\u2270}\");\ndefineMacro(\"\\\\nleqslant\", \"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\");\ndefineMacro(\"\\\\nshortmid\", \"\\\\html@mathml{\\\\@nshortmid}{∤}\");\ndefineMacro(\"\\\\nshortparallel\", \"\\\\html@mathml{\\\\@nshortparallel}{∦}\");\ndefineMacro(\"\\\\nsubseteqq\", \"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\");\ndefineMacro(\"\\\\nsupseteqq\", \"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\");\ndefineMacro(\"\\\\varsubsetneq\", \"\\\\html@mathml{\\\\@varsubsetneq}{⊊}\");\ndefineMacro(\"\\\\varsubsetneqq\", \"\\\\html@mathml{\\\\@varsubsetneqq}{⫋}\");\ndefineMacro(\"\\\\varsupsetneq\", \"\\\\html@mathml{\\\\@varsupsetneq}{⊋}\");\ndefineMacro(\"\\\\varsupsetneqq\", \"\\\\html@mathml{\\\\@varsupsetneqq}{⫌}\");\ndefineMacro(\"\\\\imath\", \"\\\\html@mathml{\\\\@imath}{\\u0131}\");\ndefineMacro(\"\\\\jmath\", \"\\\\html@mathml{\\\\@jmath}{\\u0237}\");\n//////////////////////////////////////////////////////////////////////\n// stmaryrd and semantic\n// The stmaryrd and semantic packages render the next four items by calling a\n// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.\ndefineMacro(\"\\\\llbracket\", \"\\\\html@mathml{\" + \"\\\\mathopen{[\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u27e6}}\");\ndefineMacro(\"\\\\rrbracket\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu]}}\" + \"{\\\\mathclose{\\\\char`\\u27e7}}\");\ndefineMacro(\"\\u27e6\", \"\\\\llbracket\"); // blackboard bold [\ndefineMacro(\"\\u27e7\", \"\\\\rrbracket\"); // blackboard bold ]\ndefineMacro(\"\\\\lBrace\", \"\\\\html@mathml{\" + \"\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u2983}}\");\ndefineMacro(\"\\\\rBrace\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}\" + \"{\\\\mathclose{\\\\char`\\u2984}}\");\ndefineMacro(\"\\u2983\", \"\\\\lBrace\"); // blackboard bold {\ndefineMacro(\"\\u2984\", \"\\\\rBrace\"); // blackboard bold }\n// TODO: Create variable sized versions of the last two items. I believe that\n// will require new font glyphs.\n// The stmaryrd function `\\minuso` provides a \"Plimsoll\" symbol that\n// superimposes the characters \\circ and \\mathminus. Used in chemistry.\ndefineMacro(\"\\\\minuso\", \"\\\\mathbin{\\\\html@mathml{\" + \"{\\\\mathrlap{\\\\mathchoice{\\\\kern{0.145em}}{\\\\kern{0.145em}}\" + \"{\\\\kern{0.1015em}}{\\\\kern{0.0725em}}\\\\circ}{-}}}\" + \"{\\\\char`⦵}}\");\ndefineMacro(\"⦵\", \"\\\\minuso\");\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\Alpha\", \"\\\\mathrm{A}\");\ndefineMacro(\"\\\\Beta\", \"\\\\mathrm{B}\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\Chi\", \"\\\\mathrm{X}\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\Epsilon\", \"\\\\mathrm{E}\");\ndefineMacro(\"\\\\Eta\", \"\\\\mathrm{H}\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\Iota\", \"\\\\mathrm{I}\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\Kappa\", \"\\\\mathrm{K}\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Mu\", \"\\\\mathrm{M}\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\Nu\", \"\\\\mathrm{N}\");\ndefineMacro(\"\\\\Omicron\", \"\\\\mathrm{O}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Rho\", \"\\\\mathrm{P}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\Tau\", \"\\\\mathrm{T}\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\n// TODO: defineMacro(\"\\\\varcoppa\", \"\\\\\\mbox{\\\\coppa}\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\ndefineMacro(\"\\\\Zeta\", \"\\\\mathrm{Z}\");\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\mathop{\\\\operatorname{plim}}\\\\limits\");\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\nvar braketHelper = one => context => {\n  var left = context.consumeArg().tokens;\n  var middle = context.consumeArg().tokens;\n  var middleDouble = context.consumeArg().tokens;\n  var right = context.consumeArg().tokens;\n  var oldMiddle = context.macros.get(\"|\");\n  var oldMiddleDouble = context.macros.get(\"\\\\|\");\n  context.macros.beginGroup();\n  var midMacro = double => context => {\n    if (one) {\n      // Only modify the first instance of | or \\|\n      context.macros.set(\"|\", oldMiddle);\n      if (middleDouble.length) {\n        context.macros.set(\"\\\\|\", oldMiddleDouble);\n      }\n    }\n    var doubled = double;\n    if (!double && middleDouble.length) {\n      // Mimic \\@ifnextchar\n      var nextToken = context.future();\n      if (nextToken.text === \"|\") {\n        context.popToken();\n        doubled = true;\n      }\n    }\n    return {\n      tokens: doubled ? middleDouble : middle,\n      numArgs: 0\n    };\n  };\n  context.macros.set(\"|\", midMacro(false));\n  if (middleDouble.length) {\n    context.macros.set(\"\\\\|\", midMacro(true));\n  }\n  var arg = context.consumeArg().tokens;\n  var expanded = context.expandTokens([...right, ...arg, ...left // reversed\n  ]);\n  context.macros.endGroup();\n  return {\n    tokens: expanded.reverse(),\n    numArgs: 0\n  };\n};\ndefineMacro(\"\\\\bra@ket\", braketHelper(false));\ndefineMacro(\"\\\\bra@set\", braketHelper(true));\ndefineMacro(\"\\\\Braket\", \"\\\\bra@ket{\\\\left\\\\langle}\" + \"{\\\\,\\\\middle\\\\vert\\\\,}{\\\\,\\\\middle\\\\vert\\\\,}{\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\Set\", \"\\\\bra@set{\\\\left\\\\{\\\\:}\" + \"{\\\\;\\\\middle\\\\vert\\\\;}{\\\\;\\\\middle\\\\Vert\\\\;}{\\\\:\\\\right\\\\}}\");\ndefineMacro(\"\\\\set\", \"\\\\bra@set{\\\\{\\\\,}{\\\\mid}{}{\\\\,\\\\}}\");\n// has no support for special || or \\|\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n// Custom Khan Academy colors, should be moved to an optional package\ndefineMacro(\"\\\\blue\", \"\\\\textcolor{##6495ed}{#1}\");\ndefineMacro(\"\\\\orange\", \"\\\\textcolor{##ffa500}{#1}\");\ndefineMacro(\"\\\\pink\", \"\\\\textcolor{##ff00af}{#1}\");\ndefineMacro(\"\\\\red\", \"\\\\textcolor{##df0030}{#1}\");\ndefineMacro(\"\\\\green\", \"\\\\textcolor{##28ae7b}{#1}\");\ndefineMacro(\"\\\\gray\", \"\\\\textcolor{gray}{#1}\");\ndefineMacro(\"\\\\purple\", \"\\\\textcolor{##9d38bd}{#1}\");\ndefineMacro(\"\\\\blueA\", \"\\\\textcolor{##ccfaff}{#1}\");\ndefineMacro(\"\\\\blueB\", \"\\\\textcolor{##80f6ff}{#1}\");\ndefineMacro(\"\\\\blueC\", \"\\\\textcolor{##63d9ea}{#1}\");\ndefineMacro(\"\\\\blueD\", \"\\\\textcolor{##11accd}{#1}\");\ndefineMacro(\"\\\\blueE\", \"\\\\textcolor{##0c7f99}{#1}\");\ndefineMacro(\"\\\\tealA\", \"\\\\textcolor{##94fff5}{#1}\");\ndefineMacro(\"\\\\tealB\", \"\\\\textcolor{##26edd5}{#1}\");\ndefineMacro(\"\\\\tealC\", \"\\\\textcolor{##01d1c1}{#1}\");\ndefineMacro(\"\\\\tealD\", \"\\\\textcolor{##01a995}{#1}\");\ndefineMacro(\"\\\\tealE\", \"\\\\textcolor{##208170}{#1}\");\ndefineMacro(\"\\\\greenA\", \"\\\\textcolor{##b6ffb0}{#1}\");\ndefineMacro(\"\\\\greenB\", \"\\\\textcolor{##8af281}{#1}\");\ndefineMacro(\"\\\\greenC\", \"\\\\textcolor{##74cf70}{#1}\");\ndefineMacro(\"\\\\greenD\", \"\\\\textcolor{##1fab54}{#1}\");\ndefineMacro(\"\\\\greenE\", \"\\\\textcolor{##0d923f}{#1}\");\ndefineMacro(\"\\\\goldA\", \"\\\\textcolor{##ffd0a9}{#1}\");\ndefineMacro(\"\\\\goldB\", \"\\\\textcolor{##ffbb71}{#1}\");\ndefineMacro(\"\\\\goldC\", \"\\\\textcolor{##ff9c39}{#1}\");\ndefineMacro(\"\\\\goldD\", \"\\\\textcolor{##e07d10}{#1}\");\ndefineMacro(\"\\\\goldE\", \"\\\\textcolor{##a75a05}{#1}\");\ndefineMacro(\"\\\\redA\", \"\\\\textcolor{##fca9a9}{#1}\");\ndefineMacro(\"\\\\redB\", \"\\\\textcolor{##ff8482}{#1}\");\ndefineMacro(\"\\\\redC\", \"\\\\textcolor{##f9685d}{#1}\");\ndefineMacro(\"\\\\redD\", \"\\\\textcolor{##e84d39}{#1}\");\ndefineMacro(\"\\\\redE\", \"\\\\textcolor{##bc2612}{#1}\");\ndefineMacro(\"\\\\maroonA\", \"\\\\textcolor{##ffbde0}{#1}\");\ndefineMacro(\"\\\\maroonB\", \"\\\\textcolor{##ff92c6}{#1}\");\ndefineMacro(\"\\\\maroonC\", \"\\\\textcolor{##ed5fa6}{#1}\");\ndefineMacro(\"\\\\maroonD\", \"\\\\textcolor{##ca337c}{#1}\");\ndefineMacro(\"\\\\maroonE\", \"\\\\textcolor{##9e034e}{#1}\");\ndefineMacro(\"\\\\purpleA\", \"\\\\textcolor{##ddd7ff}{#1}\");\ndefineMacro(\"\\\\purpleB\", \"\\\\textcolor{##c6b9fc}{#1}\");\ndefineMacro(\"\\\\purpleC\", \"\\\\textcolor{##aa87ff}{#1}\");\ndefineMacro(\"\\\\purpleD\", \"\\\\textcolor{##7854ab}{#1}\");\ndefineMacro(\"\\\\purpleE\", \"\\\\textcolor{##543b78}{#1}\");\ndefineMacro(\"\\\\mintA\", \"\\\\textcolor{##f5f9e8}{#1}\");\ndefineMacro(\"\\\\mintB\", \"\\\\textcolor{##edf2df}{#1}\");\ndefineMacro(\"\\\\mintC\", \"\\\\textcolor{##e0e5cc}{#1}\");\ndefineMacro(\"\\\\grayA\", \"\\\\textcolor{##f6f7f7}{#1}\");\ndefineMacro(\"\\\\grayB\", \"\\\\textcolor{##f0f1f2}{#1}\");\ndefineMacro(\"\\\\grayC\", \"\\\\textcolor{##e3e5e6}{#1}\");\ndefineMacro(\"\\\\grayD\", \"\\\\textcolor{##d6d8da}{#1}\");\ndefineMacro(\"\\\\grayE\", \"\\\\textcolor{##babec2}{#1}\");\ndefineMacro(\"\\\\grayF\", \"\\\\textcolor{##888d93}{#1}\");\ndefineMacro(\"\\\\grayG\", \"\\\\textcolor{##626569}{#1}\");\ndefineMacro(\"\\\\grayH\", \"\\\\textcolor{##3b3e40}{#1}\");\ndefineMacro(\"\\\\grayI\", \"\\\\textcolor{##21242c}{#1}\");\ndefineMacro(\"\\\\kaBlue\", \"\\\\textcolor{##314453}{#1}\");\ndefineMacro(\"\\\\kaGreen\", \"\\\\textcolor{##71B307}{#1}\");\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol.  Used in `isDefined`.\nvar implicitCommands = {\n  \"^\": true,\n  // Parser.js\n  \"_\": true,\n  // Parser.js\n  \"\\\\limits\": true,\n  // Parser.js\n  \"\\\\nolimits\": true // Parser.js\n};\nclass MacroExpander {\n  constructor(input, settings, mode) {\n    this.settings = settings;\n    this.expansionCount = 0;\n    this.feed(input);\n    // Make new global namespace\n    this.macros = new Namespace(macros, settings.macros);\n    this.mode = mode;\n    this.stack = []; // contains tokens in REVERSE order\n  }\n  /**\n   * Feed a new input string to the same MacroExpander\n   * (with existing macros etc.).\n   */\n  feed(input) {\n    this.lexer = new Lexer(input, this.settings);\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n  }\n  /**\n   * Start a new group nesting within all namespaces.\n   */\n  beginGroup() {\n    this.macros.beginGroup();\n  }\n  /**\n   * End current group nesting within all namespaces.\n   */\n  endGroup() {\n    this.macros.endGroup();\n  }\n  /**\n   * Ends all currently nested groups (if any), restoring values before the\n   * groups began.  Useful in case of an error in the middle of parsing.\n   */\n  endGroups() {\n    this.macros.endGroups();\n  }\n  /**\n   * Returns the topmost token on the stack, without expanding it.\n   * Similar in behavior to TeX's `\\futurelet`.\n   */\n  future() {\n    if (this.stack.length === 0) {\n      this.pushToken(this.lexer.lex());\n    }\n    return this.stack[this.stack.length - 1];\n  }\n  /**\n   * Remove and return the next unexpanded token.\n   */\n  popToken() {\n    this.future(); // ensure non-empty stack\n    return this.stack.pop();\n  }\n  /**\n   * Add a given token to the token stack.  In particular, this get be used\n   * to put back a token returned from one of the other methods.\n   */\n  pushToken(token) {\n    this.stack.push(token);\n  }\n  /**\n   * Append an array of tokens to the token stack.\n   */\n  pushTokens(tokens) {\n    this.stack.push(...tokens);\n  }\n  /**\n   * Find an macro argument without expanding tokens and append the array of\n   * tokens to the token stack. Uses Token as a container for the result.\n   */\n  scanArgument(isOptional) {\n    var start;\n    var end;\n    var tokens;\n    if (isOptional) {\n      this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n      if (this.future().text !== \"[\") {\n        return null;\n      }\n      start = this.popToken(); // don't include [ in tokens\n      ({\n        tokens,\n        end\n      } = this.consumeArg([\"]\"]));\n    } else {\n      ({\n        tokens,\n        start,\n        end\n      } = this.consumeArg());\n    }\n    // indicate the end of an argument\n    this.pushToken(new Token(\"EOF\", end.loc));\n    this.pushTokens(tokens);\n    return new Token(\"\", SourceLocation.range(start, end));\n  }\n  /**\n   * Consume all following space tokens, without expansion.\n   */\n  consumeSpaces() {\n    for (;;) {\n      var token = this.future();\n      if (token.text === \" \") {\n        this.stack.pop();\n      } else {\n        break;\n      }\n    }\n  }\n  /**\n   * Consume an argument from the token stream, and return the resulting array\n   * of tokens and start/end token.\n   */\n  consumeArg(delims) {\n    // The argument for a delimited parameter is the shortest (possibly\n    // empty) sequence of tokens with properly nested {...} groups that is\n    // followed ... by this particular list of non-parameter tokens.\n    // The argument for an undelimited parameter is the next nonblank\n    // token, unless that token is ‘{’, when the argument will be the\n    // entire {...} group that follows.\n    var tokens = [];\n    var isDelimited = delims && delims.length > 0;\n    if (!isDelimited) {\n      // Ignore spaces between arguments.  As the TeXbook says:\n      // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n      //  put spaces between the arguments (e.g., ‘\\row x n’), because\n      //  TeX doesn’t use single spaces as undelimited arguments.\"\n      this.consumeSpaces();\n    }\n    var start = this.future();\n    var tok;\n    var depth = 0;\n    var match = 0;\n    do {\n      tok = this.popToken();\n      tokens.push(tok);\n      if (tok.text === \"{\") {\n        ++depth;\n      } else if (tok.text === \"}\") {\n        --depth;\n        if (depth === -1) {\n          throw new ParseError(\"Extra }\", tok);\n        }\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Unexpected end of input in a macro argument\" + \", expected '\" + (delims && isDelimited ? delims[match] : \"}\") + \"'\", tok);\n      }\n      if (delims && isDelimited) {\n        if ((depth === 0 || depth === 1 && delims[match] === \"{\") && tok.text === delims[match]) {\n          ++match;\n          if (match === delims.length) {\n            // don't include delims in tokens\n            tokens.splice(-match, match);\n            break;\n          }\n        } else {\n          match = 0;\n        }\n      }\n    } while (depth !== 0 || isDelimited);\n    // If the argument found ... has the form ‘{<nested tokens>}’,\n    // ... the outermost braces enclosing the argument are removed\n    if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n      tokens.pop();\n      tokens.shift();\n    }\n    tokens.reverse(); // to fit in with stack order\n    return {\n      tokens,\n      start,\n      end: tok\n    };\n  }\n  /**\n   * Consume the specified number of (delimited) arguments from the token\n   * stream and return the resulting array of arguments.\n   */\n  consumeArgs(numArgs, delimiters) {\n    if (delimiters) {\n      if (delimiters.length !== numArgs + 1) {\n        throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n      }\n      var delims = delimiters[0];\n      for (var i = 0; i < delims.length; i++) {\n        var tok = this.popToken();\n        if (delims[i] !== tok.text) {\n          throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n        }\n      }\n    }\n    var args = [];\n    for (var _i = 0; _i < numArgs; _i++) {\n      args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens);\n    }\n    return args;\n  }\n  /**\n   * Increment `expansionCount` by the specified amount.\n   * Throw an error if it exceeds `maxExpand`.\n   */\n  countExpansion(amount) {\n    this.expansionCount += amount;\n    if (this.expansionCount > this.settings.maxExpand) {\n      throw new ParseError(\"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\");\n    }\n  }\n  /**\n   * Expand the next token only once if possible.\n   *\n   * If the token is expanded, the resulting tokens will be pushed onto\n   * the stack in reverse order, and the number of such tokens will be\n   * returned.  This number might be zero or positive.\n   *\n   * If not, the return value is `false`, and the next token remains at the\n   * top of the stack.\n   *\n   * In either case, the next token will be on the top of the stack,\n   * or the stack will be empty (in case of empty expansion\n   * and no other tokens).\n   *\n   * Used to implement `expandAfterFuture` and `expandNextToken`.\n   *\n   * If expandableOnly, only expandable tokens are expanded and\n   * an undefined control sequence results in an error.\n   */\n  expandOnce(expandableOnly) {\n    var topToken = this.popToken();\n    var name = topToken.text;\n    var expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n    if (expansion == null || expandableOnly && expansion.unexpandable) {\n      if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n        throw new ParseError(\"Undefined control sequence: \" + name);\n      }\n      this.pushToken(topToken);\n      return false;\n    }\n    this.countExpansion(1);\n    var tokens = expansion.tokens;\n    var args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n    if (expansion.numArgs) {\n      // paste arguments in place of the placeholders\n      tokens = tokens.slice(); // make a shallow copy\n      for (var i = tokens.length - 1; i >= 0; --i) {\n        var tok = tokens[i];\n        if (tok.text === \"#\") {\n          if (i === 0) {\n            throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n          }\n          tok = tokens[--i]; // next token on stack\n          if (tok.text === \"#\") {\n            // ## → #\n            tokens.splice(i + 1, 1); // drop first #\n          } else if (/^[1-9]$/.test(tok.text)) {\n            // replace the placeholder with the indicated argument\n            tokens.splice(i, 2, ...args[+tok.text - 1]);\n          } else {\n            throw new ParseError(\"Not a valid argument number\", tok);\n          }\n        }\n      }\n    }\n    // Concatenate expansion onto top of stack.\n    this.pushTokens(tokens);\n    return tokens.length;\n  }\n  /**\n   * Expand the next token only once (if possible), and return the resulting\n   * top token on the stack (without removing anything from the stack).\n   * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n   * Equivalent to expandOnce() followed by future().\n   */\n  expandAfterFuture() {\n    this.expandOnce();\n    return this.future();\n  }\n  /**\n   * Recursively expand first token, then return first non-expandable token.\n   */\n  expandNextToken() {\n    for (;;) {\n      if (this.expandOnce() === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        // the token after \\noexpand is interpreted as if its meaning\n        // were ‘\\relax’\n        if (token.treatAsRelax) {\n          token.text = \"\\\\relax\";\n        }\n        return token;\n      }\n    }\n  }\n  /**\n   * Fully expand the given macro name and return the resulting list of\n   * tokens, or return `undefined` if no such macro is defined.\n   */\n  expandMacro(name) {\n    return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n  }\n  /**\n   * Fully expand the given token stream and return the resulting list of\n   * tokens.  Note that the input tokens are in reverse order, but the\n   * output tokens are in forward order.\n   */\n  expandTokens(tokens) {\n    var output = [];\n    var oldStackLength = this.stack.length;\n    this.pushTokens(tokens);\n    while (this.stack.length > oldStackLength) {\n      // Expand only expandable tokens\n      if (this.expandOnce(true) === false) {\n        // fully expanded\n        var token = this.stack.pop();\n        if (token.treatAsRelax) {\n          // the expansion of \\noexpand is the token itself\n          token.noexpand = false;\n          token.treatAsRelax = false;\n        }\n        output.push(token);\n      }\n    }\n    // Count all of these tokens as additional expansions, to prevent\n    // exponential blowup from linearly many \\edef's.\n    this.countExpansion(output.length);\n    return output;\n  }\n  /**\n   * Fully expand the given macro name and return the result as a string,\n   * or return `undefined` if no such macro is defined.\n   */\n  expandMacroAsText(name) {\n    var tokens = this.expandMacro(name);\n    if (tokens) {\n      return tokens.map(token => token.text).join(\"\");\n    } else {\n      return tokens;\n    }\n  }\n  /**\n   * Returns the expanded macro as a reversed array of tokens and a macro\n   * argument count.  Or returns `null` if no such macro.\n   */\n  _getExpansion(name) {\n    var definition = this.macros.get(name);\n    if (definition == null) {\n      // mainly checking for undefined here\n      return definition;\n    }\n    // If a single character has an associated catcode other than 13\n    // (active character), then don't expand it.\n    if (name.length === 1) {\n      var catcode = this.lexer.catcodes[name];\n      if (catcode != null && catcode !== 13) {\n        return;\n      }\n    }\n    var expansion = typeof definition === \"function\" ? definition(this) : definition;\n    if (typeof expansion === \"string\") {\n      var numArgs = 0;\n      if (expansion.includes(\"#\")) {\n        var stripped = expansion.replace(/##/g, \"\");\n        while (stripped.includes(\"#\" + (numArgs + 1))) {\n          ++numArgs;\n        }\n      }\n      var bodyLexer = new Lexer(expansion, this.settings);\n      var tokens = [];\n      var tok = bodyLexer.lex();\n      while (tok.text !== \"EOF\") {\n        tokens.push(tok);\n        tok = bodyLexer.lex();\n      }\n      tokens.reverse(); // to fit in with stack using push and pop\n      var expanded = {\n        tokens,\n        numArgs\n      };\n      return expanded;\n    }\n    return expansion;\n  }\n  /**\n   * Determine whether a command is currently \"defined\" (has some\n   * functionality), meaning that it's a macro (in the current group),\n   * a function, a symbol, or one of the special commands listed in\n   * `implicitCommands`.\n   */\n  isDefined(name) {\n    return this.macros.has(name) || functions.hasOwnProperty(name) || symbols.math.hasOwnProperty(name) || symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);\n  }\n  /**\n   * Determine whether a command is expandable.\n   */\n  isExpandable(name) {\n    var macro = this.macros.get(name);\n    return macro != null ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable : functions.hasOwnProperty(name) && !functions[name].primitive;\n  }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\nvar unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\nvar uSubsAndSups = Object.freeze({\n  '₊': '+',\n  '₋': '-',\n  '₌': '=',\n  '₍': '(',\n  '₎': ')',\n  '₀': '0',\n  '₁': '1',\n  '₂': '2',\n  '₃': '3',\n  '₄': '4',\n  '₅': '5',\n  '₆': '6',\n  '₇': '7',\n  '₈': '8',\n  '₉': '9',\n  '\\u2090': 'a',\n  '\\u2091': 'e',\n  '\\u2095': 'h',\n  '\\u1D62': 'i',\n  '\\u2C7C': 'j',\n  '\\u2096': 'k',\n  '\\u2097': 'l',\n  '\\u2098': 'm',\n  '\\u2099': 'n',\n  '\\u2092': 'o',\n  '\\u209A': 'p',\n  '\\u1D63': 'r',\n  '\\u209B': 's',\n  '\\u209C': 't',\n  '\\u1D64': 'u',\n  '\\u1D65': 'v',\n  '\\u2093': 'x',\n  '\\u1D66': 'β',\n  '\\u1D67': 'γ',\n  '\\u1D68': 'ρ',\n  '\\u1D69': '\\u03d5',\n  '\\u1D6A': 'χ',\n  '⁺': '+',\n  '⁻': '-',\n  '⁼': '=',\n  '⁽': '(',\n  '⁾': ')',\n  '⁰': '0',\n  '¹': '1',\n  '²': '2',\n  '³': '3',\n  '⁴': '4',\n  '⁵': '5',\n  '⁶': '6',\n  '⁷': '7',\n  '⁸': '8',\n  '⁹': '9',\n  '\\u1D2C': 'A',\n  '\\u1D2E': 'B',\n  '\\u1D30': 'D',\n  '\\u1D31': 'E',\n  '\\u1D33': 'G',\n  '\\u1D34': 'H',\n  '\\u1D35': 'I',\n  '\\u1D36': 'J',\n  '\\u1D37': 'K',\n  '\\u1D38': 'L',\n  '\\u1D39': 'M',\n  '\\u1D3A': 'N',\n  '\\u1D3C': 'O',\n  '\\u1D3E': 'P',\n  '\\u1D3F': 'R',\n  '\\u1D40': 'T',\n  '\\u1D41': 'U',\n  '\\u2C7D': 'V',\n  '\\u1D42': 'W',\n  '\\u1D43': 'a',\n  '\\u1D47': 'b',\n  '\\u1D9C': 'c',\n  '\\u1D48': 'd',\n  '\\u1D49': 'e',\n  '\\u1DA0': 'f',\n  '\\u1D4D': 'g',\n  '\\u02B0': 'h',\n  '\\u2071': 'i',\n  '\\u02B2': 'j',\n  '\\u1D4F': 'k',\n  '\\u02E1': 'l',\n  '\\u1D50': 'm',\n  '\\u207F': 'n',\n  '\\u1D52': 'o',\n  '\\u1D56': 'p',\n  '\\u02B3': 'r',\n  '\\u02E2': 's',\n  '\\u1D57': 't',\n  '\\u1D58': 'u',\n  '\\u1D5B': 'v',\n  '\\u02B7': 'w',\n  '\\u02E3': 'x',\n  '\\u02B8': 'y',\n  '\\u1DBB': 'z',\n  '\\u1D5D': 'β',\n  '\\u1D5E': 'γ',\n  '\\u1D5F': 'δ',\n  '\\u1D60': '\\u03d5',\n  '\\u1D61': 'χ',\n  '\\u1DBF': 'θ'\n});\n\n/* eslint no-constant-condition:0 */\n// Pre-evaluate both modules as unicodeSymbols require String.normalize()\nvar unicodeAccents = {\n  \"́\": {\n    \"text\": \"\\\\'\",\n    \"math\": \"\\\\acute\"\n  },\n  \"̀\": {\n    \"text\": \"\\\\`\",\n    \"math\": \"\\\\grave\"\n  },\n  \"̈\": {\n    \"text\": \"\\\\\\\"\",\n    \"math\": \"\\\\ddot\"\n  },\n  \"̃\": {\n    \"text\": \"\\\\~\",\n    \"math\": \"\\\\tilde\"\n  },\n  \"̄\": {\n    \"text\": \"\\\\=\",\n    \"math\": \"\\\\bar\"\n  },\n  \"̆\": {\n    \"text\": \"\\\\u\",\n    \"math\": \"\\\\breve\"\n  },\n  \"̌\": {\n    \"text\": \"\\\\v\",\n    \"math\": \"\\\\check\"\n  },\n  \"̂\": {\n    \"text\": \"\\\\^\",\n    \"math\": \"\\\\hat\"\n  },\n  \"̇\": {\n    \"text\": \"\\\\.\",\n    \"math\": \"\\\\dot\"\n  },\n  \"̊\": {\n    \"text\": \"\\\\r\",\n    \"math\": \"\\\\mathring\"\n  },\n  \"̋\": {\n    \"text\": \"\\\\H\"\n  },\n  \"̧\": {\n    \"text\": \"\\\\c\"\n  }\n};\nvar unicodeSymbols = {\n  \"á\": \"á\",\n  \"à\": \"à\",\n  \"ä\": \"ä\",\n  \"ǟ\": \"ǟ\",\n  \"ã\": \"ã\",\n  \"ā\": \"ā\",\n  \"ă\": \"ă\",\n  \"ắ\": \"ắ\",\n  \"ằ\": \"ằ\",\n  \"ẵ\": \"ẵ\",\n  \"ǎ\": \"ǎ\",\n  \"â\": \"â\",\n  \"ấ\": \"ấ\",\n  \"ầ\": \"ầ\",\n  \"ẫ\": \"ẫ\",\n  \"ȧ\": \"ȧ\",\n  \"ǡ\": \"ǡ\",\n  \"å\": \"å\",\n  \"ǻ\": \"ǻ\",\n  \"ḃ\": \"ḃ\",\n  \"ć\": \"ć\",\n  \"ḉ\": \"ḉ\",\n  \"č\": \"č\",\n  \"ĉ\": \"ĉ\",\n  \"ċ\": \"ċ\",\n  \"ç\": \"ç\",\n  \"ď\": \"ď\",\n  \"ḋ\": \"ḋ\",\n  \"ḑ\": \"ḑ\",\n  \"é\": \"é\",\n  \"è\": \"è\",\n  \"ë\": \"ë\",\n  \"ẽ\": \"ẽ\",\n  \"ē\": \"ē\",\n  \"ḗ\": \"ḗ\",\n  \"ḕ\": \"ḕ\",\n  \"ĕ\": \"ĕ\",\n  \"ḝ\": \"ḝ\",\n  \"ě\": \"ě\",\n  \"ê\": \"ê\",\n  \"ế\": \"ế\",\n  \"ề\": \"ề\",\n  \"ễ\": \"ễ\",\n  \"ė\": \"ė\",\n  \"ȩ\": \"ȩ\",\n  \"ḟ\": \"ḟ\",\n  \"ǵ\": \"ǵ\",\n  \"ḡ\": \"ḡ\",\n  \"ğ\": \"ğ\",\n  \"ǧ\": \"ǧ\",\n  \"ĝ\": \"ĝ\",\n  \"ġ\": \"ġ\",\n  \"ģ\": \"ģ\",\n  \"ḧ\": \"ḧ\",\n  \"ȟ\": \"ȟ\",\n  \"ĥ\": \"ĥ\",\n  \"ḣ\": \"ḣ\",\n  \"ḩ\": \"ḩ\",\n  \"í\": \"í\",\n  \"ì\": \"ì\",\n  \"ï\": \"ï\",\n  \"ḯ\": \"ḯ\",\n  \"ĩ\": \"ĩ\",\n  \"ī\": \"ī\",\n  \"ĭ\": \"ĭ\",\n  \"ǐ\": \"ǐ\",\n  \"î\": \"î\",\n  \"ǰ\": \"ǰ\",\n  \"ĵ\": \"ĵ\",\n  \"ḱ\": \"ḱ\",\n  \"ǩ\": \"ǩ\",\n  \"ķ\": \"ķ\",\n  \"ĺ\": \"ĺ\",\n  \"ľ\": \"ľ\",\n  \"ļ\": \"ļ\",\n  \"ḿ\": \"ḿ\",\n  \"ṁ\": \"ṁ\",\n  \"ń\": \"ń\",\n  \"ǹ\": \"ǹ\",\n  \"ñ\": \"ñ\",\n  \"ň\": \"ň\",\n  \"ṅ\": \"ṅ\",\n  \"ņ\": \"ņ\",\n  \"ó\": \"ó\",\n  \"ò\": \"ò\",\n  \"ö\": \"ö\",\n  \"ȫ\": \"ȫ\",\n  \"õ\": \"õ\",\n  \"ṍ\": \"ṍ\",\n  \"ṏ\": \"ṏ\",\n  \"ȭ\": \"ȭ\",\n  \"ō\": \"ō\",\n  \"ṓ\": \"ṓ\",\n  \"ṑ\": \"ṑ\",\n  \"ŏ\": \"ŏ\",\n  \"ǒ\": \"ǒ\",\n  \"ô\": \"ô\",\n  \"ố\": \"ố\",\n  \"ồ\": \"ồ\",\n  \"ỗ\": \"ỗ\",\n  \"ȯ\": \"ȯ\",\n  \"ȱ\": \"ȱ\",\n  \"ő\": \"ő\",\n  \"ṕ\": \"ṕ\",\n  \"ṗ\": \"ṗ\",\n  \"ŕ\": \"ŕ\",\n  \"ř\": \"ř\",\n  \"ṙ\": \"ṙ\",\n  \"ŗ\": \"ŗ\",\n  \"ś\": \"ś\",\n  \"ṥ\": \"ṥ\",\n  \"š\": \"š\",\n  \"ṧ\": \"ṧ\",\n  \"ŝ\": \"ŝ\",\n  \"ṡ\": \"ṡ\",\n  \"ş\": \"ş\",\n  \"ẗ\": \"ẗ\",\n  \"ť\": \"ť\",\n  \"ṫ\": \"ṫ\",\n  \"ţ\": \"ţ\",\n  \"ú\": \"ú\",\n  \"ù\": \"ù\",\n  \"ü\": \"ü\",\n  \"ǘ\": \"ǘ\",\n  \"ǜ\": \"ǜ\",\n  \"ǖ\": \"ǖ\",\n  \"ǚ\": \"ǚ\",\n  \"ũ\": \"ũ\",\n  \"ṹ\": \"ṹ\",\n  \"ū\": \"ū\",\n  \"ṻ\": \"ṻ\",\n  \"ŭ\": \"ŭ\",\n  \"ǔ\": \"ǔ\",\n  \"û\": \"û\",\n  \"ů\": \"ů\",\n  \"ű\": \"ű\",\n  \"ṽ\": \"ṽ\",\n  \"ẃ\": \"ẃ\",\n  \"ẁ\": \"ẁ\",\n  \"ẅ\": \"ẅ\",\n  \"ŵ\": \"ŵ\",\n  \"ẇ\": \"ẇ\",\n  \"ẘ\": \"ẘ\",\n  \"ẍ\": \"ẍ\",\n  \"ẋ\": \"ẋ\",\n  \"ý\": \"ý\",\n  \"ỳ\": \"ỳ\",\n  \"ÿ\": \"ÿ\",\n  \"ỹ\": \"ỹ\",\n  \"ȳ\": \"ȳ\",\n  \"ŷ\": \"ŷ\",\n  \"ẏ\": \"ẏ\",\n  \"ẙ\": \"ẙ\",\n  \"ź\": \"ź\",\n  \"ž\": \"ž\",\n  \"ẑ\": \"ẑ\",\n  \"ż\": \"ż\",\n  \"Á\": \"Á\",\n  \"À\": \"À\",\n  \"Ä\": \"Ä\",\n  \"Ǟ\": \"Ǟ\",\n  \"Ã\": \"Ã\",\n  \"Ā\": \"Ā\",\n  \"Ă\": \"Ă\",\n  \"Ắ\": \"Ắ\",\n  \"Ằ\": \"Ằ\",\n  \"Ẵ\": \"Ẵ\",\n  \"Ǎ\": \"Ǎ\",\n  \"Â\": \"Â\",\n  \"Ấ\": \"Ấ\",\n  \"Ầ\": \"Ầ\",\n  \"Ẫ\": \"Ẫ\",\n  \"Ȧ\": \"Ȧ\",\n  \"Ǡ\": \"Ǡ\",\n  \"Å\": \"Å\",\n  \"Ǻ\": \"Ǻ\",\n  \"Ḃ\": \"Ḃ\",\n  \"Ć\": \"Ć\",\n  \"Ḉ\": \"Ḉ\",\n  \"Č\": \"Č\",\n  \"Ĉ\": \"Ĉ\",\n  \"Ċ\": \"Ċ\",\n  \"Ç\": \"Ç\",\n  \"Ď\": \"Ď\",\n  \"Ḋ\": \"Ḋ\",\n  \"Ḑ\": \"Ḑ\",\n  \"É\": \"É\",\n  \"È\": \"È\",\n  \"Ë\": \"Ë\",\n  \"Ẽ\": \"Ẽ\",\n  \"Ē\": \"Ē\",\n  \"Ḗ\": \"Ḗ\",\n  \"Ḕ\": \"Ḕ\",\n  \"Ĕ\": \"Ĕ\",\n  \"Ḝ\": \"Ḝ\",\n  \"Ě\": \"Ě\",\n  \"Ê\": \"Ê\",\n  \"Ế\": \"Ế\",\n  \"Ề\": \"Ề\",\n  \"Ễ\": \"Ễ\",\n  \"Ė\": \"Ė\",\n  \"Ȩ\": \"Ȩ\",\n  \"Ḟ\": \"Ḟ\",\n  \"Ǵ\": \"Ǵ\",\n  \"Ḡ\": \"Ḡ\",\n  \"Ğ\": \"Ğ\",\n  \"Ǧ\": \"Ǧ\",\n  \"Ĝ\": \"Ĝ\",\n  \"Ġ\": \"Ġ\",\n  \"Ģ\": \"Ģ\",\n  \"Ḧ\": \"Ḧ\",\n  \"Ȟ\": \"Ȟ\",\n  \"Ĥ\": \"Ĥ\",\n  \"Ḣ\": \"Ḣ\",\n  \"Ḩ\": \"Ḩ\",\n  \"Í\": \"Í\",\n  \"Ì\": \"Ì\",\n  \"Ï\": \"Ï\",\n  \"Ḯ\": \"Ḯ\",\n  \"Ĩ\": \"Ĩ\",\n  \"Ī\": \"Ī\",\n  \"Ĭ\": \"Ĭ\",\n  \"Ǐ\": \"Ǐ\",\n  \"Î\": \"Î\",\n  \"İ\": \"İ\",\n  \"Ĵ\": \"Ĵ\",\n  \"Ḱ\": \"Ḱ\",\n  \"Ǩ\": \"Ǩ\",\n  \"Ķ\": \"Ķ\",\n  \"Ĺ\": \"Ĺ\",\n  \"Ľ\": \"Ľ\",\n  \"Ļ\": \"Ļ\",\n  \"Ḿ\": \"Ḿ\",\n  \"Ṁ\": \"Ṁ\",\n  \"Ń\": \"Ń\",\n  \"Ǹ\": \"Ǹ\",\n  \"Ñ\": \"Ñ\",\n  \"Ň\": \"Ň\",\n  \"Ṅ\": \"Ṅ\",\n  \"Ņ\": \"Ņ\",\n  \"Ó\": \"Ó\",\n  \"Ò\": \"Ò\",\n  \"Ö\": \"Ö\",\n  \"Ȫ\": \"Ȫ\",\n  \"Õ\": \"Õ\",\n  \"Ṍ\": \"Ṍ\",\n  \"Ṏ\": \"Ṏ\",\n  \"Ȭ\": \"Ȭ\",\n  \"Ō\": \"Ō\",\n  \"Ṓ\": \"Ṓ\",\n  \"Ṑ\": \"Ṑ\",\n  \"Ŏ\": \"Ŏ\",\n  \"Ǒ\": \"Ǒ\",\n  \"Ô\": \"Ô\",\n  \"Ố\": \"Ố\",\n  \"Ồ\": \"Ồ\",\n  \"Ỗ\": \"Ỗ\",\n  \"Ȯ\": \"Ȯ\",\n  \"Ȱ\": \"Ȱ\",\n  \"Ő\": \"Ő\",\n  \"Ṕ\": \"Ṕ\",\n  \"Ṗ\": \"Ṗ\",\n  \"Ŕ\": \"Ŕ\",\n  \"Ř\": \"Ř\",\n  \"Ṙ\": \"Ṙ\",\n  \"Ŗ\": \"Ŗ\",\n  \"Ś\": \"Ś\",\n  \"Ṥ\": \"Ṥ\",\n  \"Š\": \"Š\",\n  \"Ṧ\": \"Ṧ\",\n  \"Ŝ\": \"Ŝ\",\n  \"Ṡ\": \"Ṡ\",\n  \"Ş\": \"Ş\",\n  \"Ť\": \"Ť\",\n  \"Ṫ\": \"Ṫ\",\n  \"Ţ\": \"Ţ\",\n  \"Ú\": \"Ú\",\n  \"Ù\": \"Ù\",\n  \"Ü\": \"Ü\",\n  \"Ǘ\": \"Ǘ\",\n  \"Ǜ\": \"Ǜ\",\n  \"Ǖ\": \"Ǖ\",\n  \"Ǚ\": \"Ǚ\",\n  \"Ũ\": \"Ũ\",\n  \"Ṹ\": \"Ṹ\",\n  \"Ū\": \"Ū\",\n  \"Ṻ\": \"Ṻ\",\n  \"Ŭ\": \"Ŭ\",\n  \"Ǔ\": \"Ǔ\",\n  \"Û\": \"Û\",\n  \"Ů\": \"Ů\",\n  \"Ű\": \"Ű\",\n  \"Ṽ\": \"Ṽ\",\n  \"Ẃ\": \"Ẃ\",\n  \"Ẁ\": \"Ẁ\",\n  \"Ẅ\": \"Ẅ\",\n  \"Ŵ\": \"Ŵ\",\n  \"Ẇ\": \"Ẇ\",\n  \"Ẍ\": \"Ẍ\",\n  \"Ẋ\": \"Ẋ\",\n  \"Ý\": \"Ý\",\n  \"Ỳ\": \"Ỳ\",\n  \"Ÿ\": \"Ÿ\",\n  \"Ỹ\": \"Ỹ\",\n  \"Ȳ\": \"Ȳ\",\n  \"Ŷ\": \"Ŷ\",\n  \"Ẏ\": \"Ẏ\",\n  \"Ź\": \"Ź\",\n  \"Ž\": \"Ž\",\n  \"Ẑ\": \"Ẑ\",\n  \"Ż\": \"Ż\",\n  \"ά\": \"ά\",\n  \"ὰ\": \"ὰ\",\n  \"ᾱ\": \"ᾱ\",\n  \"ᾰ\": \"ᾰ\",\n  \"έ\": \"έ\",\n  \"ὲ\": \"ὲ\",\n  \"ή\": \"ή\",\n  \"ὴ\": \"ὴ\",\n  \"ί\": \"ί\",\n  \"ὶ\": \"ὶ\",\n  \"ϊ\": \"ϊ\",\n  \"ΐ\": \"ΐ\",\n  \"ῒ\": \"ῒ\",\n  \"ῑ\": \"ῑ\",\n  \"ῐ\": \"ῐ\",\n  \"ό\": \"ό\",\n  \"ὸ\": \"ὸ\",\n  \"ύ\": \"ύ\",\n  \"ὺ\": \"ὺ\",\n  \"ϋ\": \"ϋ\",\n  \"ΰ\": \"ΰ\",\n  \"ῢ\": \"ῢ\",\n  \"ῡ\": \"ῡ\",\n  \"ῠ\": \"ῠ\",\n  \"ώ\": \"ώ\",\n  \"ὼ\": \"ὼ\",\n  \"Ύ\": \"Ύ\",\n  \"Ὺ\": \"Ὺ\",\n  \"Ϋ\": \"Ϋ\",\n  \"Ῡ\": \"Ῡ\",\n  \"Ῠ\": \"Ῠ\",\n  \"Ώ\": \"Ώ\",\n  \"Ὼ\": \"Ὼ\"\n};\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\nclass Parser {\n  constructor(input, settings) {\n    // Start in math mode\n    this.mode = \"math\";\n    // Create a new macro expander (gullet) and (indirectly via that) also a\n    // new lexer (mouth) for this parser (stomach, in the language of TeX)\n    this.gullet = new MacroExpander(input, settings, this.mode);\n    // Store the settings for use in parsing\n    this.settings = settings;\n    // Count leftright depth (for \\middle errors)\n    this.leftrightDepth = 0;\n    this.nextToken = null;\n  }\n  /**\n   * Checks a result to make sure it has the right type, and throws an\n   * appropriate error otherwise.\n   */\n  expect(text, consume) {\n    if (consume === void 0) {\n      consume = true;\n    }\n    if (this.fetch().text !== text) {\n      throw new ParseError(\"Expected '\" + text + \"', got '\" + this.fetch().text + \"'\", this.fetch());\n    }\n    if (consume) {\n      this.consume();\n    }\n  }\n  /**\n   * Discards the current lookahead token, considering it consumed.\n   */\n  consume() {\n    this.nextToken = null;\n  }\n  /**\n   * Return the current lookahead token, or if there isn't one (at the\n   * beginning, or if the previous lookahead token was consume()d),\n   * fetch the next token as the new lookahead token and return it.\n   */\n  fetch() {\n    if (this.nextToken == null) {\n      this.nextToken = this.gullet.expandNextToken();\n    }\n    return this.nextToken;\n  }\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n    this.gullet.switchMode(newMode);\n  }\n  /**\n   * Main parsing function, which parses an entire input.\n   */\n  parse() {\n    if (!this.settings.globalGroup) {\n      // Create a group namespace for the math expression.\n      // (LaTeX creates a new group for every $...$, $$...$$, \\[...\\].)\n      this.gullet.beginGroup();\n    }\n    // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n    // We do this within the group for the math expression, so it doesn't\n    // pollute settings.macros.\n    if (this.settings.colorIsTextColor) {\n      this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n    }\n    try {\n      // Try to parse the input\n      var parse = this.parseExpression(false);\n      // If we succeeded, make sure there's an EOF at the end\n      this.expect(\"EOF\");\n      // End the group namespace for the expression\n      if (!this.settings.globalGroup) {\n        this.gullet.endGroup();\n      }\n      return parse;\n      // Close any leftover groups in case of a parse error.\n    } finally {\n      this.gullet.endGroups();\n    }\n  }\n  /**\n   * Fully parse a separate sequence of tokens as a separate job.\n   * Tokens should be specified in reverse order, as in a MacroDefinition.\n   */\n  subparse(tokens) {\n    // Save the next token from the current job.\n    var oldToken = this.nextToken;\n    this.consume();\n    // Run the new job, terminating it with an excess '}'\n    this.gullet.pushToken(new Token(\"}\"));\n    this.gullet.pushTokens(tokens);\n    var parse = this.parseExpression(false);\n    this.expect(\"}\");\n    // Restore the next token from the current job.\n    this.nextToken = oldToken;\n    return parse;\n  }\n  /**\n   * Parses an \"expression\", which is a list of atoms.\n   *\n   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n   *                 happens when functions have higher precedence than infix\n   *                 nodes in implicit parses.\n   *\n   * `breakOnTokenText`: The text of the token that the expression should end\n   *                     with, or `null` if something else should end the\n   *                     expression.\n   */\n  parseExpression(breakOnInfix, breakOnTokenText) {\n    var body = [];\n    // Keep adding atoms to the body until we can't parse any more atoms (either\n    // we reached the end, a }, or a \\right)\n    while (true) {\n      // Ignore spaces in math mode\n      if (this.mode === \"math\") {\n        this.consumeSpaces();\n      }\n      var lex = this.fetch();\n      if (Parser.endOfExpression.has(lex.text)) {\n        break;\n      }\n      if (breakOnTokenText && lex.text === breakOnTokenText) {\n        break;\n      }\n      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n        break;\n      }\n      var atom = this.parseAtom(breakOnTokenText);\n      if (!atom) {\n        break;\n      } else if (atom.type === \"internal\") {\n        // Internal nodes do not appear in parse tree\n        continue;\n      }\n      body.push(atom);\n    }\n    if (this.mode === \"text\") {\n      this.formLigatures(body);\n    }\n    return this.handleInfixNodes(body);\n  }\n  /**\n   * Rewrites infix operators such as \\over with corresponding commands such\n   * as \\frac.\n   *\n   * There can only be one infix operator per group.  If there's more than one\n   * then the expression is ambiguous.  This can be resolved by adding {}.\n   */\n  handleInfixNodes(body) {\n    var overIndex = -1;\n    var funcName;\n    for (var i = 0; i < body.length; i++) {\n      var node = body[i];\n      if (node.type === \"infix\") {\n        if (overIndex !== -1) {\n          throw new ParseError(\"only one infix operator per group\", node.token);\n        }\n        overIndex = i;\n        funcName = node.replaceWith;\n      }\n    }\n    if (overIndex !== -1 && funcName) {\n      var numerNode;\n      var denomNode;\n      var numerBody = body.slice(0, overIndex);\n      var denomBody = body.slice(overIndex + 1);\n      if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n        numerNode = numerBody[0];\n      } else {\n        numerNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: numerBody\n        };\n      }\n      if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n        denomNode = denomBody[0];\n      } else {\n        denomNode = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: denomBody\n        };\n      }\n      var _node;\n      if (funcName === \"\\\\\\\\abovefrac\") {\n        _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n      } else {\n        _node = this.callFunction(funcName, [numerNode, denomNode], []);\n      }\n      return [_node];\n    } else {\n      return body;\n    }\n  }\n  /**\n   * Handle a subscript or superscript with nice errors.\n   */\n  handleSupSubscript(name) {\n    var symbolToken = this.fetch();\n    var symbol = symbolToken.text;\n    this.consume();\n    this.consumeSpaces(); // ignore spaces before sup/subscript argument\n    // Skip over allowed internal nodes such as \\relax\n    var group;\n    do {\n      var _group;\n      group = this.parseGroup(name);\n    } while (((_group = group) == null ? void 0 : _group.type) === \"internal\");\n    if (!group) {\n      throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n    }\n    return group;\n  }\n  /**\n   * Converts the textual input of an unsupported command into a text node\n   * contained within a color node whose color is determined by errorColor\n   */\n  formatUnsupportedCmd(text) {\n    var textordArray = [];\n    for (var i = 0; i < text.length; i++) {\n      textordArray.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: text[i]\n      });\n    }\n    var textNode = {\n      type: \"text\",\n      mode: this.mode,\n      body: textordArray\n    };\n    var colorNode = {\n      type: \"color\",\n      mode: this.mode,\n      color: this.settings.errorColor,\n      body: [textNode]\n    };\n    return colorNode;\n  }\n  /**\n   * Parses a group with optional super/subscripts.\n   */\n  parseAtom(breakOnTokenText) {\n    // The body of an atom is an implicit group, so that things like\n    // \\left(x\\right)^2 work correctly.\n    var base = this.parseGroup(\"atom\", breakOnTokenText);\n    // Internal nodes (e.g. \\relax) cannot support super/subscripts.\n    // Instead we will pick up super/subscripts with blank base next round.\n    if ((base == null ? void 0 : base.type) === \"internal\") {\n      return base;\n    }\n    // In text mode, we don't have superscripts or subscripts\n    if (this.mode === \"text\") {\n      return base;\n    }\n    // Note that base may be empty (i.e. null) at this point.\n    var superscript;\n    var subscript;\n    while (true) {\n      // Guaranteed in math mode, so eat any spaces first.\n      this.consumeSpaces();\n      // Lex the first token\n      var lex = this.fetch();\n      if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n        // We got a limit control\n        if (base && base.type === \"op\") {\n          var limits = lex.text === \"\\\\limits\";\n          base.limits = limits;\n          base.alwaysHandleSupSub = true;\n        } else if (base && base.type === \"operatorname\") {\n          if (base.alwaysHandleSupSub) {\n            base.limits = lex.text === \"\\\\limits\";\n          }\n        } else {\n          throw new ParseError(\"Limit controls must follow a math operator\", lex);\n        }\n        this.consume();\n      } else if (lex.text === \"^\") {\n        // We got a superscript start\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        superscript = this.handleSupSubscript(\"superscript\");\n      } else if (lex.text === \"_\") {\n        // We got a subscript start\n        if (subscript) {\n          throw new ParseError(\"Double subscript\", lex);\n        }\n        subscript = this.handleSupSubscript(\"subscript\");\n      } else if (lex.text === \"'\") {\n        // We got a prime\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        var prime = {\n          type: \"textord\",\n          mode: this.mode,\n          text: \"\\\\prime\"\n        };\n        // Many primes can be grouped together, so we handle this here\n        var primes = [prime];\n        this.consume();\n        // Keep lexing tokens until we get something that's not a prime\n        while (this.fetch().text === \"'\") {\n          // For each one, add another prime to the list\n          primes.push(prime);\n          this.consume();\n        }\n        // If there's a superscript following the primes, combine that\n        // superscript in with the primes.\n        if (this.fetch().text === \"^\") {\n          primes.push(this.handleSupSubscript(\"superscript\"));\n        }\n        // Put everything into an ordgroup as the superscript\n        superscript = {\n          type: \"ordgroup\",\n          mode: this.mode,\n          body: primes\n        };\n      } else if (uSubsAndSups[lex.text]) {\n        // A Unicode subscript or superscript character.\n        // We treat these similarly to the unicode-math package.\n        // So we render a string of Unicode (sub|super)scripts the\n        // same as a (sub|super)script of regular characters.\n        var isSub = unicodeSubRegEx.test(lex.text);\n        var subsupTokens = [];\n        subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n        this.consume();\n        // Continue fetching tokens to fill out the string.\n        while (true) {\n          var token = this.fetch().text;\n          if (!uSubsAndSups[token]) {\n            break;\n          }\n          if (unicodeSubRegEx.test(token) !== isSub) {\n            break;\n          }\n          subsupTokens.unshift(new Token(uSubsAndSups[token]));\n          this.consume();\n        }\n        // Now create a (sub|super)script.\n        var body = this.subparse(subsupTokens);\n        if (isSub) {\n          subscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        } else {\n          superscript = {\n            type: \"ordgroup\",\n            mode: \"math\",\n            body\n          };\n        }\n      } else {\n        // If it wasn't ^, _, or ', stop parsing super/subscripts\n        break;\n      }\n    }\n    // Base must be set if superscript or subscript are set per logic above,\n    // but need to check here for type check to pass.\n    if (superscript || subscript) {\n      // If we got either a superscript or subscript, create a supsub\n      return {\n        type: \"supsub\",\n        mode: this.mode,\n        base: base,\n        sup: superscript,\n        sub: subscript\n      };\n    } else {\n      // Otherwise return the original body\n      return base;\n    }\n  }\n  /**\n   * Parses an entire function, including its base and all of its arguments.\n   */\n  parseFunction(breakOnTokenText, name) {\n    var token = this.fetch();\n    var func = token.text;\n    var funcData = functions[func];\n    if (!funcData) {\n      return null;\n    }\n    this.consume(); // consume command token\n    if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n      throw new ParseError(\"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"), token);\n    } else if (this.mode === \"text\" && !funcData.allowedInText) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n    } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n    }\n    var {\n      args,\n      optArgs\n    } = this.parseArguments(func, funcData);\n    return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n  }\n  /**\n   * Call a function handler with a suitable context and arguments.\n   */\n  callFunction(name, args, optArgs, token, breakOnTokenText) {\n    var context = {\n      funcName: name,\n      parser: this,\n      token,\n      breakOnTokenText\n    };\n    var func = functions[name];\n    if (func && func.handler) {\n      return func.handler(context, args, optArgs);\n    } else {\n      throw new ParseError(\"No function handler for \" + name);\n    }\n  }\n  /**\n   * Parses the arguments of a function or environment\n   */\n  parseArguments(func,\n  // Should look like \"\\name\" or \"\\begin{name}\".\n  funcData) {\n    var totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n    if (totalArgs === 0) {\n      return {\n        args: [],\n        optArgs: []\n      };\n    }\n    var args = [];\n    var optArgs = [];\n    for (var i = 0; i < totalArgs; i++) {\n      var argType = funcData.argTypes && funcData.argTypes[i];\n      var isOptional = i < funcData.numOptionalArgs;\n      if (\"primitive\" in funcData && funcData.primitive && argType == null ||\n      // \\sqrt expands into primitive if optional argument doesn't exist\n      funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null) {\n        argType = \"primitive\";\n      }\n      var arg = this.parseGroupOfType(\"argument to '\" + func + \"'\", argType, isOptional);\n      if (isOptional) {\n        optArgs.push(arg);\n      } else if (arg != null) {\n        args.push(arg);\n      } else {\n        // should be unreachable\n        throw new ParseError(\"Null argument, please report this as a bug\");\n      }\n    }\n    return {\n      args,\n      optArgs\n    };\n  }\n  /**\n   * Parses a group when the mode is changing.\n   */\n  parseGroupOfType(name, type, optional) {\n    switch (type) {\n      case \"color\":\n        return this.parseColorGroup(optional);\n      case \"size\":\n        return this.parseSizeGroup(optional);\n      case \"url\":\n        return this.parseUrlGroup(optional);\n      case \"math\":\n      case \"text\":\n        return this.parseArgumentGroup(optional, type);\n      case \"hbox\":\n        {\n          // hbox argument type wraps the argument in the equivalent of\n          // \\hbox, which is like \\text but switching to \\textstyle size.\n          var group = this.parseArgumentGroup(optional, \"text\");\n          return group != null ? {\n            type: \"styling\",\n            mode: group.mode,\n            body: [group],\n            style: \"text\" // simulate \\textstyle\n          } : null;\n        }\n      case \"raw\":\n        {\n          var token = this.parseStringGroup(\"raw\", optional);\n          return token != null ? {\n            type: \"raw\",\n            mode: \"text\",\n            string: token.text\n          } : null;\n        }\n      case \"primitive\":\n        {\n          if (optional) {\n            throw new ParseError(\"A primitive argument cannot be optional\");\n          }\n          var _group2 = this.parseGroup(name);\n          if (_group2 == null) {\n            throw new ParseError(\"Expected group as \" + name, this.fetch());\n          }\n          return _group2;\n        }\n      case \"original\":\n      case null:\n      case undefined:\n        return this.parseArgumentGroup(optional);\n      default:\n        throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n    }\n  }\n  /**\n   * Discard any space tokens, fetching the next non-space token.\n   */\n  consumeSpaces() {\n    while (this.fetch().text === \" \") {\n      this.consume();\n    }\n  }\n  /**\n   * Parses a group, essentially returning the string formed by the\n   * brace-enclosed tokens plus some position information.\n   */\n  parseStringGroup(modeName,\n  // Used to describe the mode in error messages.\n  optional) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\") {\n      str += nextToken.text;\n      this.consume();\n    }\n    this.consume(); // consume the end of the argument\n    argToken.text = str;\n    return argToken;\n  }\n  /**\n   * Parses a regex-delimited group: the largest sequence of tokens\n   * whose concatenated strings match `regex`. Returns the string\n   * formed by the tokens plus some position information.\n   */\n  parseRegexGroup(regex, modeName) {\n    var firstToken = this.fetch();\n    var lastToken = firstToken;\n    var str = \"\";\n    var nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n      lastToken = nextToken;\n      str += lastToken.text;\n      this.consume();\n    }\n    if (str === \"\") {\n      throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n    }\n    return firstToken.range(lastToken, str);\n  }\n  /**\n   * Parses a color description.\n   */\n  parseColorGroup(optional) {\n    var res = this.parseStringGroup(\"color\", optional);\n    if (res == null) {\n      return null;\n    }\n    var match = /^(#[a-f0-9]{3,4}|#[a-f0-9]{6}|#[a-f0-9]{8}|[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid color: '\" + res.text + \"'\", res);\n    }\n    var color = match[0];\n    if (/^[0-9a-f]{6}$/i.test(color)) {\n      // We allow a 6-digit HTML color spec without a leading \"#\".\n      // This follows the xcolor package's HTML color model.\n      // Predefined color names are all missed by this RegEx pattern.\n      color = \"#\" + color;\n    }\n    return {\n      type: \"color-token\",\n      mode: this.mode,\n      color\n    };\n  }\n  /**\n   * Parses a size specification, consisting of magnitude and unit.\n   */\n  parseSizeGroup(optional) {\n    var res;\n    var isBlank = false;\n    // don't expand before parseStringGroup\n    this.gullet.consumeSpaces();\n    if (!optional && this.gullet.future().text !== \"{\") {\n      res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n    } else {\n      res = this.parseStringGroup(\"size\", optional);\n    }\n    if (!res) {\n      return null;\n    }\n    if (!optional && res.text.length === 0) {\n      // Because we've tested for what is !optional, this block won't\n      // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n      // to \\genfrac and \\above.\n      res.text = \"0pt\"; // Enable \\above{}\n      isBlank = true; // This is here specifically for \\genfrac\n    }\n    var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n    }\n    var data = {\n      number: +(match[1] + match[2]),\n      // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n    }\n    return {\n      type: \"size\",\n      mode: this.mode,\n      value: data,\n      isBlank\n    };\n  }\n  /**\n   * Parses an URL, checking escaped letters and allowed protocols,\n   * and setting the catcode of % as an active character (as in \\hyperref).\n   */\n  parseUrlGroup(optional) {\n    this.gullet.lexer.setCatcode(\"%\", 13); // active character\n    this.gullet.lexer.setCatcode(\"~\", 12); // other character\n    var res = this.parseStringGroup(\"url\", optional);\n    this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n    this.gullet.lexer.setCatcode(\"~\", 13); // active character\n    if (res == null) {\n      return null;\n    }\n    // hyperref package allows backslashes alone in href, but doesn't\n    // generate valid links in such cases; we interpret this as\n    // \"undefined\" behaviour, and keep them as-is. Some browser will\n    // replace backslashes with forward slashes.\n    var url = res.text.replace(/\\\\([#$%&~_^{}])/g, '$1');\n    return {\n      type: \"url\",\n      mode: this.mode,\n      url\n    };\n  }\n  /**\n   * Parses an argument with the mode specified.\n   */\n  parseArgumentGroup(optional, mode) {\n    var argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    var outerMode = this.mode;\n    if (mode) {\n      // Switch to specified mode\n      this.switchMode(mode);\n    }\n    this.gullet.beginGroup();\n    var expression = this.parseExpression(false, \"EOF\");\n    // TODO: find an alternative way to denote the end\n    this.expect(\"EOF\"); // expect the end of the argument\n    this.gullet.endGroup();\n    var result = {\n      type: \"ordgroup\",\n      mode: this.mode,\n      loc: argToken.loc,\n      body: expression\n    };\n    if (mode) {\n      // Switch mode back\n      this.switchMode(outerMode);\n    }\n    return result;\n  }\n  /**\n   * Parses an ordinary group, which is either a single nucleus (like \"x\")\n   * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n   * that starts at the current position, and ends right before a higher explicit\n   * group ends, or at EOF.\n   */\n  parseGroup(name,\n  // For error reporting.\n  breakOnTokenText) {\n    var firstToken = this.fetch();\n    var text = firstToken.text;\n    var result;\n    // Try to parse an open brace or \\begingroup\n    if (text === \"{\" || text === \"\\\\begingroup\") {\n      this.consume();\n      var groupEnd = text === \"{\" ? \"}\" : \"\\\\endgroup\";\n      this.gullet.beginGroup();\n      // If we get a brace, parse an expression\n      var expression = this.parseExpression(false, groupEnd);\n      var lastToken = this.fetch();\n      this.expect(groupEnd); // Check that we got a matching closing brace\n      this.gullet.endGroup();\n      result = {\n        type: \"ordgroup\",\n        mode: this.mode,\n        loc: SourceLocation.range(firstToken, lastToken),\n        body: expression,\n        // A group formed by \\begingroup...\\endgroup is a semi-simple group\n        // which doesn't affect spacing in math mode, i.e., is transparent.\n        // https://tex.stackexchange.com/questions/1930/when-should-one-\n        // use-begingroup-instead-of-bgroup\n        semisimple: text === \"\\\\begingroup\" || undefined\n      };\n    } else {\n      // If there exists a function with this name, parse the function.\n      // Otherwise, just return a nucleus\n      result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n      if (result == null && text[0] === \"\\\\\" && !implicitCommands.hasOwnProperty(text)) {\n        if (this.settings.throwOnError) {\n          throw new ParseError(\"Undefined control sequence: \" + text, firstToken);\n        }\n        result = this.formatUnsupportedCmd(text);\n        this.consume();\n      }\n    }\n    return result;\n  }\n  /**\n   * Form ligature-like combinations of characters for text mode.\n   * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n   * The result will simply replace multiple textord nodes with a single\n   * character in each value by a single textord node having multiple\n   * characters in its value.  The representation is still ASCII source.\n   * The group will be modified in place.\n   */\n  formLigatures(group) {\n    var n = group.length - 1;\n    for (var i = 0; i < n; ++i) {\n      var a = group[i];\n      if (a.type !== \"textord\") {\n        continue;\n      }\n      var v = a.text;\n      var next = group[i + 1];\n      if (!next || next.type !== \"textord\") {\n        continue;\n      }\n      if (v === \"-\" && next.text === \"-\") {\n        var afterNext = group[i + 2];\n        if (i + 1 < n && afterNext && afterNext.type === \"textord\" && afterNext.text === \"-\") {\n          group.splice(i, 3, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, afterNext),\n            text: \"---\"\n          });\n          n -= 2;\n        } else {\n          group.splice(i, 2, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, next),\n            text: \"--\"\n          });\n          n -= 1;\n        }\n      }\n      if ((v === \"'\" || v === \"`\") && next.text === v) {\n        group.splice(i, 2, {\n          type: \"textord\",\n          mode: \"text\",\n          loc: SourceLocation.range(a, next),\n          text: v + v\n        });\n        n -= 1;\n      }\n    }\n  }\n  /**\n   * Parse a single symbol out of the string. Here, we handle single character\n   * symbols and special functions like \\verb.\n   */\n  parseSymbol() {\n    var nucleus = this.fetch();\n    var text = nucleus.text;\n    if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n      this.consume();\n      var arg = text.slice(5);\n      var star = arg.charAt(0) === \"*\";\n      if (star) {\n        arg = arg.slice(1);\n      }\n      // Lexer's tokenRegex is constructed to always have matching\n      // first/last characters.\n      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n        throw new ParseError(\"\\\\verb assertion failed --\\n                    please report what input caused this bug\");\n      }\n      arg = arg.slice(1, -1); // remove first and last char\n      return {\n        type: \"verb\",\n        mode: \"text\",\n        body: arg,\n        star\n      };\n    }\n    // At this point, we should have a symbol, possibly with accents.\n    // First expand any accented base symbol according to unicodeSymbols.\n    if (unicodeSymbols.hasOwnProperty(text[0]) && !symbols[this.mode][text[0]]) {\n      // This behavior is not strict (XeTeX-compatible) in math mode.\n      if (this.settings.strict && this.mode === \"math\") {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Accented Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      text = unicodeSymbols[text[0]] + text.slice(1);\n    }\n    // Strip off any combining characters\n    var match = combiningDiacriticalMarksEndRegex.exec(text);\n    if (match) {\n      text = text.substring(0, match.index);\n      if (text === 'i') {\n        text = '\\u0131'; // dotless i, in math and text mode\n      } else if (text === 'j') {\n        text = '\\u0237'; // dotless j, in math and text mode\n      }\n    }\n    // Recognize base symbol\n    var symbol;\n    if (symbols[this.mode][text]) {\n      if (this.settings.strict && this.mode === 'math' && extraLatin.includes(text)) {\n        this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Latin-1/Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n      }\n      var group = symbols[this.mode][text].group;\n      var loc = SourceLocation.range(nucleus);\n      var s;\n      if (ATOMS.hasOwnProperty(group)) {\n        // TODO(ts)\n        var family = group;\n        s = {\n          type: \"atom\",\n          mode: this.mode,\n          family,\n          loc,\n          text\n        };\n      } else {\n        // TODO(ts)\n        s = {\n          type: group,\n          mode: this.mode,\n          loc,\n          text\n        };\n      }\n      // TODO(ts)\n      symbol = s;\n    } else if (text.charCodeAt(0) >= 0x80) {\n      // no symbol for e.g. ^\n      if (this.settings.strict) {\n        if (!supportedCodepoint(text.charCodeAt(0))) {\n          this.settings.reportNonstrict(\"unknownSymbol\", \"Unrecognized Unicode character \\\"\" + text[0] + \"\\\"\" + (\" (\" + text.charCodeAt(0) + \")\"), nucleus);\n        } else if (this.mode === \"math\") {\n          this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Unicode text character \\\"\" + text[0] + \"\\\" used in math mode\", nucleus);\n        }\n      }\n      // All nonmathematical Unicode characters are rendered as if they\n      // are in text mode (wrapped in \\text) because that's what it\n      // takes to render them in LaTeX.  Setting `mode: this.mode` is\n      // another natural choice (the user requested math mode), but\n      // this makes it more difficult for getCharacterMetrics() to\n      // distinguish Unicode characters without metrics and those for\n      // which we want to simulate the letter M.\n      symbol = {\n        type: \"textord\",\n        mode: \"text\",\n        loc: SourceLocation.range(nucleus),\n        text\n      };\n    } else {\n      return null; // EOF, ^, _, {, }, etc.\n    }\n    this.consume();\n    // Transform combining characters into accents\n    if (match) {\n      for (var i = 0; i < match[0].length; i++) {\n        var accent = match[0][i];\n        if (!unicodeAccents[accent]) {\n          throw new ParseError(\"Unknown accent ' \" + accent + \"'\", nucleus);\n        }\n        var command = unicodeAccents[accent][this.mode] || unicodeAccents[accent].text;\n        if (!command) {\n          throw new ParseError(\"Accent \" + accent + \" unsupported in \" + this.mode + \" mode\", nucleus);\n        }\n        symbol = {\n          type: \"accent\",\n          mode: this.mode,\n          loc: SourceLocation.range(nucleus),\n          label: command,\n          isStretchy: false,\n          isShifty: true,\n          // TODO(ts)\n          base: symbol\n        };\n      }\n    }\n    // TODO(ts)\n    return symbol;\n  }\n}\nParser.endOfExpression = new Set([\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"&\"]);\n\n/**\n * Provides a single function for parsing an expression using a Parser\n * TODO(emily): Remove this\n */\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nvar parseTree = function parseTree(toParse, settings) {\n  if (!(typeof toParse === 'string' || toParse instanceof String)) {\n    throw new TypeError('KaTeX can only parse string typed expression');\n  }\n  var parser = new Parser(toParse, settings);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n  var tree = parser.parse();\n  // Prevent a color definition from persisting between calls to katex.render().\n  delete parser.gullet.macros.current[\"\\\\current@color\"];\n  delete parser.gullet.macros.current[\"\\\\color\"];\n  // If the input used \\tag, it will set the \\df@tag macro to the tag.\n  // In this case, we separately parse the tag and wrap the tree.\n  if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n    if (!settings.displayMode) {\n      throw new ParseError(\"\\\\tag works only in display equations\");\n    }\n    tree = [{\n      type: \"tag\",\n      mode: \"text\",\n      body: tree,\n      tag: parser.subparse([new Token(\"\\\\df@tag\")])\n    }];\n  }\n  return tree;\n};\n\n/* eslint no-console:0 */\n/**\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nvar render = function render(expression, baseNode, options) {\n  baseNode.textContent = \"\";\n  var node = renderToDomTree(expression, options).toNode();\n  baseNode.appendChild(node);\n};\n// KaTeX's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n  if (document.compatMode !== \"CSS1Compat\") {\n    typeof console !== \"undefined\" && console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your \" + \"website has a suitable doctype.\");\n    render = function render() {\n      throw new ParseError(\"KaTeX doesn't work in quirks mode.\");\n    };\n  }\n}\n/**\n * Parse and build an expression, and return the markup for that.\n */\nvar renderToString = function renderToString(expression, options) {\n  var markup = renderToDomTree(expression, options).toMarkup();\n  return markup;\n};\n/**\n * Parse an expression and return the parse tree.\n */\nvar generateParseTree = function generateParseTree(expression, options) {\n  var settings = new Settings(options);\n  return parseTree(expression, settings);\n};\n/**\n * If the given error is a KaTeX ParseError and options.throwOnError is false,\n * renders the invalid LaTeX as a span with hover title giving the KaTeX\n * error message.  Otherwise, simply throws the error.\n */\nvar renderError = function renderError(error, expression, options) {\n  if (options.throwOnError || !(error instanceof ParseError)) {\n    throw error;\n  }\n  var node = makeSpan([\"katex-error\"], [new SymbolNode(expression)]);\n  node.setAttribute(\"title\", error.toString());\n  node.setAttribute(\"style\", \"color:\" + options.errorColor);\n  return node;\n};\n/**\n * Generates and returns the katex build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nvar renderToDomTree = function renderToDomTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\n/**\n * Generates and returns the katex build tree, with just HTML (no MathML).\n * This is used for advanced use cases (like rendering to custom output).\n */\nvar renderToHTMLTree = function renderToHTMLTree(expression, options) {\n  var settings = new Settings(options);\n  try {\n    var tree = parseTree(expression, settings);\n    return buildHTMLTree(tree, expression, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\nvar version = \"0.16.45\";\nvar __domTree = {\n  Span,\n  Anchor,\n  SymbolNode,\n  SvgNode,\n  PathNode,\n  LineNode\n};\n// CJS exports and ESM default export\nvar katex = {\n  /**\n   * Current KaTeX version\n   */\n  version,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination, and adds\n   * it as a child to the specified DOM node.\n   */\n  render,\n  /**\n   * Renders the given LaTeX into an HTML+MathML combination string,\n   * for sending to the client.\n   */\n  renderToString,\n  /**\n   * KaTeX error, usually during parsing.\n   */\n  ParseError,\n  /**\n   * The schema of Settings\n   */\n  SETTINGS_SCHEMA,\n  /**\n   * Parses the given LaTeX into KaTeX's internal parse tree structure,\n   * without rendering to HTML or MathML.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __parse: generateParseTree,\n  /**\n   * Renders the given LaTeX into an HTML+MathML internal DOM tree\n   * representation, without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToDomTree: renderToDomTree,\n  /**\n   * Renders the given LaTeX into an HTML internal DOM tree representation,\n   * without MathML and without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToHTMLTree: renderToHTMLTree,\n  /**\n   * extends internal font metrics object with a new object\n   * each key in the new object represents a font name\n  */\n  __setFontMetrics: setFontMetrics,\n  /**\n   * adds a new symbol to builtin symbols table\n   */\n  __defineSymbol: defineSymbol,\n  /**\n   * adds a new function to builtin function list,\n   * which directly produce parse tree elements\n   * and have their own html/mathml builders\n   */\n  __defineFunction: defineFunction,\n  /**\n   * adds a new macro to builtin macro list\n   */\n  __defineMacro: defineMacro,\n  /**\n   * Expose the dom tree node types, which can be useful for type checking nodes.\n   *\n   * NOTE: These methods are not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __domTree\n};\n\nexport { ParseError, SETTINGS_SCHEMA, defineFunction as __defineFunction, defineMacro as __defineMacro, defineSymbol as __defineSymbol, __domTree, generateParseTree as __parse, renderToDomTree as __renderToDomTree, renderToHTMLTree as __renderToHTMLTree, setFontMetrics as __setFontMetrics, katex as default, render, renderToString, version };\n","'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n","'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n","'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n        );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n","// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n","'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        state.flags = 0;           /* expect zlib header */\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        else if (len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n        state.dmax = 1 << len;\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if (state.flags & 0x0200) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Array(state.head.extra_len);\n              }\n              utils.arraySet(\n                state.head.extra,\n                input,\n                next,\n                // extra field is limited to 65536 bytes\n                // - no need for additional size check\n                copy,\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if (state.flags & 0x0200) {\n              state.check = crc32(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          utils.arraySet(output, input, next, copy, put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inflate_fast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if (_out) {\n            strm.adler = state.check =\n                /*UPDATE(state.check, put - _out, _out);*/\n                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n","'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== c.Z_OK) {\n        throw new Error(msg[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 aligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n","// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n","\n\n\n\n;(function(){\nvar UTIF = {};\n\n// Make available for import by `require()`\nif (typeof module == \"object\") {module.exports = UTIF;}\nelse {self.UTIF = UTIF;}\n\nvar pako;\nif (typeof require == \"function\") {pako = require(\"pako\");}\nelse {pako = self.pako;}\n\nfunction log() { if (typeof process==\"undefined\" || process.env.NODE_ENV==\"development\") console.log.apply(console, arguments);  }\n\n(function(UTIF, pako){\n\t\n// Following lines add a JPEG decoder  to UTIF.JpegDecoder\n(function(){var V=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(g){return typeof g}:function(g){return g&&\"function\"===typeof Symbol&&g.constructor===Symbol&&g!==Symbol.prototype?\"symbol\":typeof g},D=function(){function g(g){this.message=\"JPEG error: \"+g}g.prototype=Error();g.prototype.name=\"JpegError\";return g.constructor=g}(),P=function(){function g(g,D){this.message=g;this.g=D}g.prototype=Error();g.prototype.name=\"DNLMarkerError\";return g.constructor=g}();(function(){function g(){this.M=\nnull;this.B=-1}function W(a,d){for(var f=0,e=[],b,B,k=16;0<k&&!a[k-1];)k--;e.push({children:[],index:0});var l=e[0],r;for(b=0;b<k;b++){for(B=0;B<a[b];B++){l=e.pop();for(l.children[l.index]=d[f];0<l.index;)l=e.pop();l.index++;for(e.push(l);e.length<=b;)e.push(r={children:[],index:0}),l.children[l.index]=r.children,l=r;f++}b+1<k&&(e.push(r={children:[],index:0}),l.children[l.index]=r.children,l=r)}return e[0].children}function X(a,d,f,e,b,B,k,l,r){function n(){if(0<x)return x--,z>>x&1;z=a[d++];if(255===\nz){var c=a[d++];if(c){if(220===c&&g){d+=2;var b=a[d++]<<8|a[d++];if(0<b&&b!==f.g)throw new P(\"Found DNL marker (0xFFDC) while parsing scan data\",b);}throw new D(\"unexpected marker \"+(z<<8|c).toString(16));}}x=7;return z>>>7}function q(a){for(;;){a=a[n()];if(\"number\"===typeof a)return a;if(\"object\"!==(\"undefined\"===typeof a?\"undefined\":V(a)))throw new D(\"invalid huffman sequence\");}}function h(a){for(var c=0;0<a;)c=c<<1|n(),a--;return c}function c(a){if(1===a)return 1===n()?1:-1;var c=h(a);return c>=\n1<<a-1?c:c+(-1<<a)+1}function C(a,b){var d=q(a.D);d=0===d?0:c(d);a.a[b]=a.m+=d;for(d=1;64>d;){var h=q(a.o),k=h&15;h>>=4;if(0===k){if(15>h)break;d+=16}else d+=h,a.a[b+J[d]]=c(k),d++}}function w(a,d){var b=q(a.D);b=0===b?0:c(b)<<r;a.a[d]=a.m+=b}function p(a,c){a.a[c]|=n()<<r}function m(a,b){if(0<A)A--;else for(var d=B;d<=k;){var e=q(a.o),f=e&15;e>>=4;if(0===f){if(15>e){A=h(e)+(1<<e)-1;break}d+=16}else d+=e,a.a[b+J[d]]=c(f)*(1<<r),d++}}function t(a,d){for(var b=B,e=0,f;b<=k;){f=d+J[b];var l=0>a.a[f]?\n-1:1;switch(E){case 0:e=q(a.o);f=e&15;e>>=4;if(0===f)15>e?(A=h(e)+(1<<e),E=4):(e=16,E=1);else{if(1!==f)throw new D(\"invalid ACn encoding\");Q=c(f);E=e?2:3}continue;case 1:case 2:a.a[f]?a.a[f]+=l*(n()<<r):(e--,0===e&&(E=2===E?3:0));break;case 3:a.a[f]?a.a[f]+=l*(n()<<r):(a.a[f]=Q<<r,E=0);break;case 4:a.a[f]&&(a.a[f]+=l*(n()<<r))}b++}4===E&&(A--,0===A&&(E=0))}var g=9<arguments.length&&void 0!==arguments[9]?arguments[9]:!1,u=f.P,v=d,z=0,x=0,A=0,E=0,Q,K=e.length,F,L,M,I;var R=f.S?0===B?0===l?w:p:0===l?\nm:t:C;var G=0;var O=1===K?e[0].c*e[0].l:u*f.O;for(var S,T;G<O;){var U=b?Math.min(O-G,b):O;for(F=0;F<K;F++)e[F].m=0;A=0;if(1===K){var y=e[0];for(I=0;I<U;I++)R(y,64*((y.c+1)*(G/y.c|0)+G%y.c)),G++}else for(I=0;I<U;I++){for(F=0;F<K;F++)for(y=e[F],S=y.h,T=y.j,L=0;L<T;L++)for(M=0;M<S;M++)R(y,64*((y.c+1)*((G/u|0)*y.j+L)+(G%u*y.h+M)));G++}x=0;(y=N(a,d))&&y.f&&((0,_util.warn)(\"decodeScan - unexpected MCU data, current marker is: \"+y.f),d=y.offset);y=y&&y.F;if(!y||65280>=y)throw new D(\"marker was not found\");\nif(65488<=y&&65495>=y)d+=2;else break}(y=N(a,d))&&y.f&&((0,_util.warn)(\"decodeScan - unexpected Scan data, current marker is: \"+y.f),d=y.offset);return d-v}function Y(a,d){for(var f=d.c,e=d.l,b=new Int16Array(64),B=0;B<e;B++)for(var k=0;k<f;k++){var l=64*((d.c+1)*B+k),r=b,n=d.G,q=d.a;if(!n)throw new D(\"missing required Quantization Table.\");for(var h=0;64>h;h+=8){var c=q[l+h];var C=q[l+h+1];var w=q[l+h+2];var p=q[l+h+3];var m=q[l+h+4];var t=q[l+h+5];var g=q[l+h+6];var u=q[l+h+7];c*=n[h];if(0===(C|\nw|p|m|t|g|u))c=5793*c+512>>10,r[h]=c,r[h+1]=c,r[h+2]=c,r[h+3]=c,r[h+4]=c,r[h+5]=c,r[h+6]=c,r[h+7]=c;else{C*=n[h+1];w*=n[h+2];p*=n[h+3];m*=n[h+4];t*=n[h+5];g*=n[h+6];u*=n[h+7];var v=5793*c+128>>8;var z=5793*m+128>>8;var x=w;var A=g;m=2896*(C-u)+128>>8;u=2896*(C+u)+128>>8;p<<=4;t<<=4;v=v+z+1>>1;z=v-z;c=3784*x+1567*A+128>>8;x=1567*x-3784*A+128>>8;A=c;m=m+t+1>>1;t=m-t;u=u+p+1>>1;p=u-p;v=v+A+1>>1;A=v-A;z=z+x+1>>1;x=z-x;c=2276*m+3406*u+2048>>12;m=3406*m-2276*u+2048>>12;u=c;c=799*p+4017*t+2048>>12;p=4017*\np-799*t+2048>>12;t=c;r[h]=v+u;r[h+7]=v-u;r[h+1]=z+t;r[h+6]=z-t;r[h+2]=x+p;r[h+5]=x-p;r[h+3]=A+m;r[h+4]=A-m}}for(n=0;8>n;++n)c=r[n],C=r[n+8],w=r[n+16],p=r[n+24],m=r[n+32],t=r[n+40],g=r[n+48],u=r[n+56],0===(C|w|p|m|t|g|u)?(c=5793*c+8192>>14,c=-2040>c?0:2024<=c?255:c+2056>>4,q[l+n]=c,q[l+n+8]=c,q[l+n+16]=c,q[l+n+24]=c,q[l+n+32]=c,q[l+n+40]=c,q[l+n+48]=c,q[l+n+56]=c):(v=5793*c+2048>>12,z=5793*m+2048>>12,x=w,A=g,m=2896*(C-u)+2048>>12,u=2896*(C+u)+2048>>12,v=(v+z+1>>1)+4112,z=v-z,c=3784*x+1567*A+2048>>\n12,x=1567*x-3784*A+2048>>12,A=c,m=m+t+1>>1,t=m-t,u=u+p+1>>1,p=u-p,v=v+A+1>>1,A=v-A,z=z+x+1>>1,x=z-x,c=2276*m+3406*u+2048>>12,m=3406*m-2276*u+2048>>12,u=c,c=799*p+4017*t+2048>>12,p=4017*p-799*t+2048>>12,t=c,c=v+u,u=v-u,C=z+t,g=z-t,w=x+p,t=x-p,p=A+m,m=A-m,c=16>c?0:4080<=c?255:c>>4,C=16>C?0:4080<=C?255:C>>4,w=16>w?0:4080<=w?255:w>>4,p=16>p?0:4080<=p?255:p>>4,m=16>m?0:4080<=m?255:m>>4,t=16>t?0:4080<=t?255:t>>4,g=16>g?0:4080<=g?255:g>>4,u=16>u?0:4080<=u?255:u>>4,q[l+n]=c,q[l+n+8]=C,q[l+n+16]=w,q[l+n+24]=\np,q[l+n+32]=m,q[l+n+40]=t,q[l+n+48]=g,q[l+n+56]=u)}return d.a}function N(a,d){var f=2<arguments.length&&void 0!==arguments[2]?arguments[2]:d,e=a.length-1;f=f<d?f:d;if(d>=e)return null;var b=a[d]<<8|a[d+1];if(65472<=b&&65534>=b)return{f:null,F:b,offset:d};for(var B=a[f]<<8|a[f+1];!(65472<=B&&65534>=B);){if(++f>=e)return null;B=a[f]<<8|a[f+1]}return{f:b.toString(16),F:B,offset:f}}var J=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,\n57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);g.prototype={parse:function(a){function d(){var d=a[k]<<8|a[k+1];k+=2;return d}function f(){var b=d();b=k+b-2;var c=N(a,b,k);c&&c.f&&((0,_util.warn)(\"readDataBlock - incorrect length, current marker is: \"+c.f),b=c.offset);b=a.subarray(k,b);k+=b.length;return b}function e(a){for(var b=Math.ceil(a.v/8/a.s),c=Math.ceil(a.g/8/a.u),d=0;d<a.b.length;d++){v=a.b[d];var e=Math.ceil(Math.ceil(a.v/8)*v.h/a.s),f=Math.ceil(Math.ceil(a.g/\n8)*v.j/a.u);v.a=new Int16Array(64*c*v.j*(b*v.h+1));v.c=e;v.l=f}a.P=b;a.O=c}var b=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).N,B=void 0===b?null:b,k=0,l=null,r=0;b=[];var n=[],q=[],h=d();if(65496!==h)throw new D(\"SOI not found\");for(h=d();65497!==h;){switch(h){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var c=f();65518===h&&65===c[0]&&100===\nc[1]&&111===c[2]&&98===c[3]&&101===c[4]&&(l={version:c[5]<<8|c[6],Y:c[7]<<8|c[8],Z:c[9]<<8|c[10],W:c[11]});break;case 65499:h=d()+k-2;for(var g;k<h;){var w=a[k++],p=new Uint16Array(64);if(0===w>>4)for(c=0;64>c;c++)g=J[c],p[g]=a[k++];else if(1===w>>4)for(c=0;64>c;c++)g=J[c],p[g]=d();else throw new D(\"DQT - invalid table spec\");b[w&15]=p}break;case 65472:case 65473:case 65474:if(m)throw new D(\"Only single frame JPEGs supported\");d();var m={};m.X=65473===h;m.S=65474===h;m.precision=a[k++];h=d();m.g=\nB||h;m.v=d();m.b=[];m.C={};c=a[k++];for(h=p=w=0;h<c;h++){g=a[k];var t=a[k+1]>>4;var H=a[k+1]&15;w<t&&(w=t);p<H&&(p=H);t=m.b.push({h:t,j:H,T:a[k+2],G:null});m.C[g]=t-1;k+=3}m.s=w;m.u=p;e(m);break;case 65476:g=d();for(h=2;h<g;){w=a[k++];p=new Uint8Array(16);for(c=t=0;16>c;c++,k++)t+=p[c]=a[k];H=new Uint8Array(t);for(c=0;c<t;c++,k++)H[c]=a[k];h+=17+t;(0===w>>4?q:n)[w&15]=W(p,H)}break;case 65501:d();var u=d();break;case 65498:c=1===++r&&!B;d();w=a[k++];g=[];for(h=0;h<w;h++){p=m.C[a[k++]];var v=m.b[p];\np=a[k++];v.D=q[p>>4];v.o=n[p&15];g.push(v)}h=a[k++];w=a[k++];p=a[k++];try{var z=X(a,k,m,g,u,h,w,p>>4,p&15,c);k+=z}catch(x){if(x instanceof P)return(0,_util.warn)('Attempting to re-parse JPEG image using \"scanLines\" parameter found in DNL marker (0xFFDC) segment.'),this.parse(a,{N:x.g});throw x;}break;case 65500:k+=4;break;case 65535:255!==a[k]&&k--;break;default:if(255===a[k-3]&&192<=a[k-2]&&254>=a[k-2])k-=3;else if((c=N(a,k-2))&&c.f)(0,_util.warn)(\"JpegImage.parse - unexpected data, current marker is: \"+\nc.f),k=c.offset;else throw new D(\"unknown marker \"+h.toString(16));}h=d()}this.width=m.v;this.height=m.g;this.A=l;this.b=[];for(h=0;h<m.b.length;h++){v=m.b[h];if(u=b[v.T])v.G=u;this.b.push({R:Y(m,v),U:v.h/m.s,V:v.j/m.u,c:v.c,l:v.l})}this.i=this.b.length},L:function(a,d){var f=this.width/a,e=this.height/d,b,g,k=this.b.length,l=a*d*k,r=new Uint8ClampedArray(l),n=new Uint32Array(a);for(g=0;g<k;g++){var q=this.b[g];var h=q.U*f;var c=q.V*e;var C=g;var w=q.R;var p=q.c+1<<3;for(b=0;b<a;b++)q=0|b*h,n[b]=\n(q&4294967288)<<3|q&7;for(h=0;h<d;h++)for(q=0|h*c,q=p*(q&4294967288)|(q&7)<<3,b=0;b<a;b++)r[C]=w[q+n[b]],C+=k}if(e=this.M)for(g=0;g<l;)for(f=q=0;q<k;q++,g++,f+=2)r[g]=(r[g]*e[f]>>8)+e[f+1];return r},w:function(){return this.A?!!this.A.W:3===this.i?0===this.B?!1:!0:1===this.B?!0:!1},I:function(a){for(var d,f,e,b=0,g=a.length;b<g;b+=3)d=a[b],f=a[b+1],e=a[b+2],a[b]=d-179.456+1.402*e,a[b+1]=d+135.459-.344*f-.714*e,a[b+2]=d-226.816+1.772*f;return a},K:function(a){for(var d,f,e,b,g=0,k=0,l=a.length;k<l;k+=\n4)d=a[k],f=a[k+1],e=a[k+2],b=a[k+3],a[g++]=-122.67195406894+f*(-6.60635669420364E-5*f+4.37130475926232E-4*e-5.4080610064599E-5*d+4.8449797120281E-4*b-.154362151871126)+e*(-9.57964378445773E-4*e+8.17076911346625E-4*d-.00477271405408747*b+1.53380253221734)+d*(9.61250184130688E-4*d-.00266257332283933*b+.48357088451265)+b*(-3.36197177618394E-4*b+.484791561490776),a[g++]=107.268039397724+f*(2.19927104525741E-5*f-6.40992018297945E-4*e+6.59397001245577E-4*d+4.26105652938837E-4*b-.176491792462875)+e*(-7.78269941513683E-4*\ne+.00130872261408275*d+7.70482631801132E-4*b-.151051492775562)+d*(.00126935368114843*d-.00265090189010898*b+.25802910206845)+b*(-3.18913117588328E-4*b-.213742400323665),a[g++]=-20.810012546947+f*(-5.70115196973677E-4*f-2.63409051004589E-5*e+.0020741088115012*d-.00288260236853442*b+.814272968359295)+e*(-1.53496057440975E-5*e-1.32689043961446E-4*d+5.60833691242812E-4*b-.195152027534049)+d*(.00174418132927582*d-.00255243321439347*b+.116935020465145)+b*(-3.43531996510555E-4*b+.24165260232407);return a.subarray(0,\ng)},J:function(a){for(var d,f,e,b=0,g=a.length;b<g;b+=4)d=a[b],f=a[b+1],e=a[b+2],a[b]=434.456-d-1.402*e,a[b+1]=119.541-d+.344*f+.714*e,a[b+2]=481.816-d-1.772*f;return a},H:function(a){for(var d,f,e,b,g=0,k=1/255,l=0,r=a.length;l<r;l+=4)d=a[l]*k,f=a[l+1]*k,e=a[l+2]*k,b=a[l+3]*k,a[g++]=255+d*(-4.387332384609988*d+54.48615194189176*f+18.82290502165302*e+212.25662451639585*b-285.2331026137004)+f*(1.7149763477362134*f-5.6096736904047315*e-17.873870861415444*b-5.497006427196366)+e*(-2.5217340131683033*\ne-21.248923337353073*b+17.5119270841813)-b*(21.86122147463605*b+189.48180835922747),a[g++]=255+d*(8.841041422036149*d+60.118027045597366*f+6.871425592049007*e+31.159100130055922*b-79.2970844816548)+f*(-15.310361306967817*f+17.575251261109482*e+131.35250912493976*b-190.9453302588951)+e*(4.444339102852739*e+9.8632861493405*b-24.86741582555878)-b*(20.737325471181034*b+187.80453709719578),a[g++]=255+d*(.8842522430003296*d+8.078677503112928*f+30.89978309703729*e-.23883238689178934*b-14.183576799673286)+\nf*(10.49593273432072*f+63.02378494754052*e+50.606957656360734*b-112.23884253719248)+e*(.03296041114873217*e+115.60384449646641*b-193.58209356861505)-b*(22.33816807309886*b+180.12613974708367);return a.subarray(0,g)},getData:function(a,d,f){if(4<this.i)throw new D(\"Unsupported color mode\");a=this.L(a,d);if(1===this.i&&f){f=a.length;d=new Uint8ClampedArray(3*f);for(var e=0,b=0;b<f;b++){var g=a[b];d[e++]=g;d[e++]=g;d[e++]=g}return d}if(3===this.i&&this.w())return this.I(a);if(4===this.i){if(this.w())return f?\nthis.K(a):this.J(a);if(f)return this.H(a)}return a}}; UTIF.JpegDecoder=g})()})();\n\n//UTIF.JpegDecoder = PDFJS.JpegImage;\n\n\nUTIF.encodeImage = function(rgba, w, h, metadata)\n{\n\tvar idf = { \"t256\":[w], \"t257\":[h], \"t258\":[8,8,8,8], \"t259\":[1], \"t262\":[2], \"t273\":[1000], // strips offset\n\t\t\t\t\"t277\":[4], \"t278\":[h], /* rows per strip */          \"t279\":[w*h*4], // strip byte counts\n\t\t\t\t\"t282\":[1], \"t283\":[1], \"t284\":[1], \"t286\":[0], \"t287\":[0], \"t296\":[1], \"t305\": [\"Photopea (UTIF.js)\"], \"t338\":[1]\n\t\t};\n\tif (metadata) for (var i in metadata) idf[i] = metadata[i];\n\t\n\tvar prfx = new Uint8Array(UTIF.encode([idf]));\n\tvar img = new Uint8Array(rgba);\n\tvar data = new Uint8Array(1000+w*h*4);\n\tfor(var i=0; i<prfx.length; i++) data[i] = prfx[i];\n\tfor(var i=0; i<img .length; i++) data[1000+i] = img[i];\n\treturn data.buffer;\n}\n\nUTIF.encode = function(ifds)\n{\n\tvar data = new Uint8Array(20000), offset = 4, bin = UTIF._binBE;\n\tdata[0]=77;  data[1]=77;  data[3]=42;\n\n\tvar ifdo = 8;\n\tbin.writeUint(data, offset, ifdo);  offset+=4;\n\tfor(var i=0; i<ifds.length; i++)\n\t{\n\t\tvar noffs = UTIF._writeIFD(bin, data, ifdo, ifds[i]);\n\t\tifdo = noffs[1];\n\t\tif(i<ifds.length-1) bin.writeUint(data, noffs[0], ifdo);\n\t}\n\treturn data.slice(0, ifdo).buffer;\n}\n//UTIF.encode._writeIFD\n\nUTIF.decode = function(buff)\n{\n\tUTIF.decode._decodeG3.allow2D = null;\n\tvar data = new Uint8Array(buff), offset = 0;\n\n\tvar id = UTIF._binBE.readASCII(data, offset, 2);  offset+=2;\n\tvar bin = id==\"II\" ? UTIF._binLE : UTIF._binBE;\n\tvar num = bin.readUshort(data, offset);  offset+=2;\n\n\tvar ifdo = bin.readUint(data, offset);  offset+=4;\n\tvar ifds = [];\n\twhile(true) {\n\t\tvar noff = UTIF._readIFD(bin, data, ifdo, ifds, 0, false);\n\t\tifdo = bin.readUint(data, noff);\n\t\tif(ifdo==0) break;\n\t}\n\treturn ifds;\n}\n\nUTIF.decodeImage = function(buff, img, ifds)\n{\n\tvar data = new Uint8Array(buff);\n\tvar id = UTIF._binBE.readASCII(data, 0, 2);\n\n\tif(img[\"t256\"]==null) return;\t// No width => probably not an image\n\timg.isLE = id==\"II\";\n\timg.width  = img[\"t256\"][0];  //delete img[\"t256\"];\n\timg.height = img[\"t257\"][0];  //delete img[\"t257\"];\n\n\tvar cmpr   = img[\"t259\"] ? img[\"t259\"][0] : 1;  //delete img[\"t259\"];\n\tvar fo = img[\"t266\"] ? img[\"t266\"][0] : 1;  //delete img[\"t266\"];\n\tif(img[\"t284\"] && img[\"t284\"][0]==2) log(\"PlanarConfiguration 2 should not be used!\");\n\n\tvar bipp;  // bits per pixel\n\tif(img[\"t258\"]) bipp = Math.min(32,img[\"t258\"][0])*img[\"t258\"].length;\n\telse            bipp = (img[\"t277\"]?img[\"t277\"][0]:1);  \n\t// Some .NEF files have t258==14, even though they use 16 bits per pixel\n\tif(cmpr==1 && img[\"t279\"]!=null && img[\"t278\"] && img[\"t262\"][0]==32803)  {\n\t\tbipp = Math.round((img[\"t279\"][0]*8)/(img.width*img[\"t278\"][0]));\n\t}\n\tvar bipl = Math.ceil(img.width*bipp/8)*8;\n\tvar soff = img[\"t273\"];  if(soff==null) soff = img[\"t324\"];\n\tvar bcnt = img[\"t279\"];  if(cmpr==1 && soff.length==1) bcnt = [img.height*(bipl>>>3)];  if(bcnt==null) bcnt = img[\"t325\"];\n\tvar bytes = new Uint8Array(img.height*(bipl>>>3)), bilen = 0;\n\n\tif(img[\"t322\"]!=null) // tiled\n\t{\n\t\tvar tw = img[\"t322\"][0], th = img[\"t323\"][0];\n\t\tvar tx = Math.floor((img.width  + tw - 1) / tw);\n\t\tvar ty = Math.floor((img.height + th - 1) / th);\n\t\tvar tbuff = new Uint8Array(Math.ceil(tw*th*bipp/8)|0);\n\t\tfor(var y=0; y<ty; y++)\n\t\t\tfor(var x=0; x<tx; x++)\n\t\t\t{\n\t\t\t\tvar i = y*tx+x;  for(var j=0; j<tbuff.length; j++) tbuff[j]=0;\n\t\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, tbuff, 0, fo);\n\t\t\t\t// Might be required for 7 too. Need to check\n\t\t\t\tif (cmpr==6) bytes = tbuff;\n\t\t\t\telse UTIF._copyTile(tbuff, Math.ceil(tw*bipp/8)|0, th, bytes, Math.ceil(img.width*bipp/8)|0, img.height, Math.ceil(x*tw*bipp/8)|0, y*th);\n\t\t\t}\n\t\tbilen = bytes.length*8;\n\t}\n\telse\t// stripped\n\t{\n\t\tvar rps = img[\"t278\"] ? img[\"t278\"][0] : img.height;   rps = Math.min(rps, img.height);\n\t\tfor(var i=0; i<soff.length; i++)\n\t\t{\n\t\t\tUTIF.decode._decompress(img,ifds, data, soff[i], bcnt[i], cmpr, bytes, Math.ceil(bilen/8)|0, fo);\n\t\t\tbilen += bipl * rps;\n\t\t}\n\t\tbilen = Math.min(bilen, bytes.length*8);\n\t}\n\timg.data = new Uint8Array(bytes.buffer, 0, Math.ceil(bilen/8)|0);\n}\n\nUTIF.decode._decompress = function(img,ifds, data, off, len, cmpr, tgt, toff, fo)  // fill order\n{\n\t//console.log(\"compression\", cmpr);\n\t//var time = Date.now();\n\tif(false) {}\n\telse if(cmpr==1 || (len==tgt.length && cmpr!=32767)) for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\telse if(cmpr==3) UTIF.decode._decodeG3 (data, off, len, tgt, toff, img.width, fo);\n\telse if(cmpr==4) UTIF.decode._decodeG4 (data, off, len, tgt, toff, img.width, fo);\n\telse if(cmpr==5) UTIF.decode._decodeLZW(data, off, tgt, toff);\n\telse if(cmpr==6) UTIF.decode._decodeOldJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==7) UTIF.decode._decodeNewJPEG(img, data, off, len, tgt, toff);\n\telse if(cmpr==8) {  var src = new Uint8Array(data.buffer,off,len);  var bin = pako[\"inflate\"](src);  for(var i=0; i<bin.length; i++) tgt[toff+i]=bin[i];  }\n\telse if(cmpr==32767) UTIF.decode._decodeARW(img, data, off, len, tgt, toff);\n\telse if(cmpr==32773) UTIF.decode._decodePackBits(data, off, len, tgt, toff);\n\telse if(cmpr==32809) UTIF.decode._decodeThunder (data, off, len, tgt, toff);\n\telse if(cmpr==34713) //for(var j=0; j<len; j++) tgt[toff+j] = data[off+j];\n\t\tUTIF.decode._decodeNikon   (img,ifds, data, off, len, tgt, toff);\n\telse log(\"Unknown compression\", cmpr);\n\t\n\t//console.log(Date.now()-time);\n\t\n\tvar bps = (img[\"t258\"]?Math.min(32,img[\"t258\"][0]):1);\n\tvar noc = (img[\"t277\"]?img[\"t277\"][0]:1), bpp=(bps*noc)>>>3, h = (img[\"t278\"] ? img[\"t278\"][0] : img.height), bpl = Math.ceil(bps*noc*img.width/8);\n\t\n\t// convert to Little Endian  /*\n\tif(bps==16 && !img.isLE && img[\"t33422\"]==null)  // not DNG\n\t\tfor(var y=0; y<h; y++) {\n\t\t\t//console.log(\"fixing endianity\");\n\t\t\tvar roff = toff+y*bpl;\n\t\t\tfor(var x=1; x<bpl; x+=2) {  var t=tgt[roff+x];  tgt[roff+x]=tgt[roff+x-1];  tgt[roff+x-1]=t;  }\n\t\t}  //*/\n\n\tif(img[\"t317\"] && img[\"t317\"][0]==2)\n\t{\n\t\tfor(var y=0; y<h; y++)\n\t\t{\n\t\t\tvar ntoff = toff+y*bpl;\n\t\t\tif(bps==16) for(var j=bpp; j<bpl; j+=2) {\n\t\t\t\tvar nv = ((tgt[ntoff+j+1]<<8)|tgt[ntoff+j])  +  ((tgt[ntoff+j-bpp+1]<<8)|tgt[ntoff+j-bpp]);\n\t\t\t\ttgt[ntoff+j] = nv&255;  tgt[ntoff+j+1] = (nv>>>8)&255;  \n\t\t\t}\n\t\t\telse if(noc==3) for(var j=  3; j<bpl; j+=3)\n\t\t\t{\n\t\t\t\ttgt[ntoff+j  ] = (tgt[ntoff+j  ] + tgt[ntoff+j-3])&255;\n\t\t\t\ttgt[ntoff+j+1] = (tgt[ntoff+j+1] + tgt[ntoff+j-2])&255;\n\t\t\t\ttgt[ntoff+j+2] = (tgt[ntoff+j+2] + tgt[ntoff+j-1])&255;\n\t\t\t}\n\t\t\telse for(var j=bpp; j<bpl; j++) tgt[ntoff+j] = (tgt[ntoff+j] + tgt[ntoff+j-bpp])&255;\n\t\t}\n\t}\n}\n\nUTIF.decode._ljpeg_diff = function(data, prm, huff) {\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\tvar len, diff;\n\tlen  = getbithuff(data, prm, huff[0], huff);\n\tdiff = getbithuff(data, prm, len, 0);\n\tif ((diff & (1 << (len-1))) == 0)  diff -= (1 << len) - 1;\n\treturn diff;\n}\nUTIF.decode._decodeARW = function(img, inp, off, src_length, tgt, toff) {\n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\tvar bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\t//console.log(raw_width, height, tiff_bps, raw_width*height, src_length);\n\tvar arw2 = (raw_width*height == src_length) || (raw_width*height*1.5 == src_length);\n\t//arw2 = true;\n\t//console.log(\"ARW2: \", arw2, raw_width*height, src_length, tgt.length);\n\tif(!arw2) {  //\"sony_arw_load_raw\"; // not arw2\n\t\theight+=8;\n\t\tvar prm = [off,0,0,0];\n\t\tvar huff = new Uint16Array(32770);\n\t\tvar tab = [ 0xf11,0xf10,0xe0f,0xd0e,0xc0d,0xb0c,0xa0b,0x90a,0x809,\n\t\t\t0x708,0x607,0x506,0x405,0x304,0x303,0x300,0x202,0x201 ];\n\t\tvar i, c, n, col, row, sum=0;\n\t\tvar ljpeg_diff = UTIF.decode._ljpeg_diff;\n\n\t\thuff[0] = 15;\n\t\tfor (n=i=0; i < 18; i++) {\n\t\t\tvar lim = 32768 >>> (tab[i] >>> 8);\n\t\t\tfor(var c=0; c<lim; c++) huff[++n] = tab[i];\n\t\t}\n\t\tfor (col = raw_width; col--; )\n\t\t\tfor (row=0; row < height+1; row+=2) {\n\t\t\t\tif (row == height) row = 1;\n\t\t\t\tsum += ljpeg_diff(inp, prm, huff);\n\t\t\t\tif (row < height) {\n\t\t\t\t\tvar clr =  (sum)&4095;\n\t\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t\t}\n\t\t\t}\n\t\treturn;\n\t}\n\tif(raw_width*height*1.5==src_length) {\n\t\t//console.log(\"weird compression\");\n\t\tfor(var i=0; i<src_length; i+=3) {  var b0=inp[off+i+0], b1=inp[off+i+1], b2=inp[off+i+2];  \n\t\t\ttgt[toff+i]=(b1<<4)|(b0>>>4);  tgt[toff+i+1]=(b0<<4)|(b2>>>4);  tgt[toff+i+2]=(b2<<4)|(b1>>>4);  }\n\t\treturn;\n\t}\n\t\n\tvar pix = new Uint16Array(16);\n\tvar row, col, val, max, min, imax, imin, sh, bit, i,    dp;\n\t\n\tvar data = new Uint8Array(raw_width+1);\n\tfor (row=0; row < height; row++) {\n\t\t//fread (data, 1, raw_width, ifp);\n\t\tfor(var j=0; j<raw_width; j++) data[j]=inp[off++];\n\t\tfor (dp=0, col=0; col < raw_width-30; dp+=16) {\n\t\t\tmax  = 0x7ff & (val = bin.readUint(data,dp));\n\t\t\tmin  = 0x7ff & (val >>> 11);\n\t\t\timax = 0x0f & (val >>> 22);\n\t\t\timin = 0x0f & (val >>> 26);\n\t\t\tfor (sh=0; sh < 4 && 0x80 << sh <= max-min; sh++);\n\t\t\tfor (bit=30, i=0; i < 16; i++)\n\t\t\t\tif      (i == imax) pix[i] = max;\n\t\t\t\telse if (i == imin) pix[i] = min;\n\t\t\t\telse {\n\t\t\t\t\tpix[i] = ((bin.readUshort(data, dp+(bit >> 3)) >>> (bit & 7) & 0x7f) << sh) + min;\n\t\t\t\t\tif (pix[i] > 0x7ff) pix[i] = 0x7ff;\n\t\t\t\t\tbit += 7;\n\t\t\t\t}\n\t\t\tfor (i=0; i < 16; i++, col+=2) {\n\t\t\t\t//RAW(row,col) = curve[pix[i] << 1] >> 2;\n\t\t\t\tvar clr =  pix[i]<<1;   //clr = 0xffff;\n\t\t\t\tUTIF.decode._putsF(tgt, (row*raw_width+col)*tiff_bps, clr<<(16-tiff_bps));\n\t\t\t}\n\t\t\tcol -= col & 1 ? 1:31;\n\t\t}\n\t}\n}\n\nUTIF.decode._decodeNikon = function(img,imgs, data, off, src_length, tgt, toff)\n{\n\tvar nikon_tree = [\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy */\n      5,4,3,6,2,7,1,0,8,9,11,10,12 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 12-bit lossy after split */\n      0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 ],\n    [ 0, 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,  /* 12-bit lossless */\n      5,4,6,3,7,2,8,1,9,0,10,11,12 ],\n    [ 0, 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0,\t/* 14-bit lossy */\n      5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 ],\n    [ 0, 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0,\t/* 14-bit lossy after split */\n      8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 ],\n    [ 0, 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0,\t/* 14-bit lossless */\n      7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 ] ];\n\t  \n\tvar raw_width = img[\"t256\"][0], height=img[\"t257\"][0], tiff_bps=img[\"t258\"][0];\n\t\n\tvar tree = 0, split = 0;\n\tvar make_decoder = UTIF.decode._make_decoder;\n\tvar getbithuff   = UTIF.decode._getbithuff;\n\t\n\tvar mn = imgs[0].exifIFD.makerNote, md = mn[\"t150\"]?mn[\"t150\"]:mn[\"t140\"], mdo=0;  //console.log(mn,md);\n\t//console.log(md[0].toString(16), md[1].toString(16), tiff_bps);\n\tvar ver0 = md[mdo++], ver1 = md[mdo++];\n\tif (ver0 == 0x49 || ver1 == 0x58)  mdo+=2110;\n\tif (ver0 == 0x46) tree = 2;\n\tif (tiff_bps == 14) tree += 3;\n\t\n\tvar vpred = [[0,0],[0,0]], bin=(img.isLE ? UTIF._binLE : UTIF._binBE);\n\tfor(var i=0; i<2; i++) for(var j=0; j<2; j++) {  vpred[i][j] = bin.readShort(md,mdo);  mdo+=2;   }  // not sure here ... [i][j] or [j][i]\n\t//console.log(vpred);\n\t\n\t\n\tvar max = 1 << tiff_bps & 0x7fff, step=0;\n\tvar csize = bin.readShort(md,mdo);  mdo+=2;\n\tif (csize > 1) step = Math.floor(max / (csize-1));\n\tif (ver0 == 0x44 && ver1 == 0x20 && step > 0)  split = bin.readShort(md,562);\n\t\n\t\n\tvar i;\n\tvar row, col;\n\tvar len, shl, diff;\n\tvar min_v = 0;\n\tvar hpred = [0,0];\n\tvar huff = make_decoder(nikon_tree[tree]);\n\t\n\t//var g_input_offset=0, bitbuf=0, vbits=0, reset=0;\n\tvar prm = [off,0,0,0];\n\t//console.log(split);  split = 170;\n\t\n\tfor (min_v=row=0; row < height; row++) {\n\t\tif (split && row == split) {\n\t\t\t//free (huff);\n\t\t\thuff = make_decoder (nikon_tree[tree+1]);\n\t\t\t//max_v += (min_v = 16) << 1;\n\t\t}\n\t\tfor (col=0; col < raw_width; col++) {\n\t\t\ti = getbithuff(data,prm,huff[0],huff);\n\t\t\tlen = i  & 15;\n\t\t\tshl = i >>> 4;\n\t\t\tdiff = (((getbithuff(data,prm,len-shl,0) << 1) + 1) << shl) >>> 1;\n\t\t\tif ((diff & (1 << (len-1))) == 0)\n\t\t\t\tdiff -= (1 << len) - (shl==0?1:0);\n\t\t\tif (col < 2) hpred[col] = vpred[row & 1][col] += diff;\n\t\t\telse         hpred[col & 1] += diff;\n\t\t\t\n\t\t\tvar clr = Math.min(Math.max(hpred[col & 1],0),(1<<tiff_bps)-1);\n\t\t\tvar bti = (row*raw_width+col)*tiff_bps;  \n\t\t\tUTIF.decode._putsF(tgt, bti, clr<<(16-tiff_bps));\n\t\t}\n\t}\n}\n// put 16 bits\nUTIF.decode._putsF= function(dt, pos, val) {  val = val<<(8-(pos&7));  var o=(pos>>>3);  dt[o]|=val>>>16;  dt[o+1]|=val>>>8;  dt[o+2]|=val;  }\n\n\nUTIF.decode._getbithuff = function(data,prm,nbits, huff) {\n\tvar zero_after_ff = 0;\n\tvar get_byte = UTIF.decode._get_byte;\n\tvar c;\n  \n\tvar off=prm[0], bitbuf=prm[1], vbits=prm[2], reset=prm[3];\n\n\t//if (nbits > 25) return 0;\n\t//if (nbits <  0) return bitbuf = vbits = reset = 0;\n\tif (nbits == 0 || vbits < 0) return 0; \n\twhile (!reset && vbits < nbits && (c = data[off++]) != -1 &&\n\t\t!(reset = zero_after_ff && c == 0xff && data[off++])) {\n\t\t//console.log(\"byte read into c\");\n\t\tbitbuf = (bitbuf << 8) + c;\n\t\tvbits += 8;\n\t} \n\tc = (bitbuf << (32-vbits)) >>> (32-nbits);\n\tif (huff) {\n\t\tvbits -= huff[c+1] >>> 8;  //console.log(c, huff[c]>>8);\n\t\tc =  huff[c+1]&255;\n\t} else\n\t\tvbits -= nbits;\n\tif (vbits < 0) throw \"e\";\n  \n\tprm[0]=off;  prm[1]=bitbuf;  prm[2]=vbits;  prm[3]=reset;\n  \n\treturn c;\n}\n\nUTIF.decode._make_decoder = function(source) {\n\tvar max, len, h, i, j;\n\tvar huff = [];\n\n\tfor (max=16; max!=0 && !source[max]; max--);\n\tvar si=17;\n\t\n\thuff[0] = max;\n\tfor (h=len=1; len <= max; len++)\n\t\tfor (i=0; i < source[len]; i++, ++si)\n\t\t\tfor (j=0; j < 1 << (max-len); j++)\n\t\t\t\tif (h <= 1 << max)\n\t\t\t\t\thuff[h++] = (len << 8) | source[si];\n\treturn huff;\n}\n\nUTIF.decode._decodeNewJPEG = function(img, data, off, len, tgt, toff)\n{\n\tvar tables = img[\"t347\"], tlen = tables ? tables.length : 0, buff = new Uint8Array(tlen + len);\n\t\n\tif (tables) {\n\t\tvar SOI = 216, EOI = 217, boff = 0;\n\t\tfor (var i=0; i<(tlen-1); i++)\n\t\t{\n\t\t\t// Skip EOI marker from JPEGTables\n\t\t\tif (tables[i]==255 && tables[i+1]==EOI) break;\n\t\t\tbuff[boff++] = tables[i];\n\t\t}\n\n\t\t// Skip SOI marker from data\n\t\tvar byte1 = data[off], byte2 = data[off + 1];\n\t\tif (byte1!=255 || byte2!=SOI)\n\t\t{\n\t\t\tbuff[boff++] = byte1;\n\t\t\tbuff[boff++] = byte2;\n\t\t}\n\t\tfor (var i=2; i<len; i++) buff[boff++] = data[off+i];\n\t}\n\telse for (var i=0; i<len; i++) buff[i] = data[off+i];\n\n\tif(img[\"t262\"][0]==32803 || img[\"t262\"][0]==34892) // lossless JPEG and lossy JPEG (used in DNG files)\n\t{\n\t\tvar bps = img[\"t258\"][0];//, dcdr = new LosslessJpegDecoder();\n\t\tvar out = UTIF.LosslessJpegDecode(buff), olen=out.length;  //console.log(olen);\n\t\t\n\t\tif(false) {}\n\t\telse if(bps==16) {\n\t\t\tif(img.isLE) for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]&255);  tgt[toff+(i<<1)+1] = (out[i]>>>8);  }\n\t\t\telse         for(var i=0; i<olen; i++ ) {  tgt[toff+(i<<1)] = (out[i]>>>8);  tgt[toff+(i<<1)+1] = (out[i]&255);  }\n\t\t}\n\t\telse if(bps==14 || bps==12) {  // 4 * 14 == 56 == 7 * 8\n\t\t\tvar rst = 16-bps;\n\t\t\tfor(var i=0; i<olen; i++) UTIF.decode._putsF(tgt, i*bps, out[i]<<rst);\n\t\t}\n\t\telse throw new Error(\"unsupported bit depth \"+bps);\n\t}\n\telse\n\t{\n\t\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\t\tvar decoded = parser.getData(parser.width, parser.height);\n\t\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\t}\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodeOldJPEGInit = function(img, data, off, len)\n{\n\tvar SOI = 216, EOI = 217, DQT = 219, DHT = 196, DRI = 221, SOF0 = 192, SOS = 218;\n\tvar joff = 0, soff = 0, tables, sosMarker, isTiled = false, i, j, k;\n\tvar jpgIchgFmt    = img[\"t513\"], jifoff = jpgIchgFmt ? jpgIchgFmt[0] : 0;\n\tvar jpgIchgFmtLen = img[\"t514\"], jiflen = jpgIchgFmtLen ? jpgIchgFmtLen[0] : 0;\n\tvar soffTag       = img[\"t324\"] || img[\"t273\"] || jpgIchgFmt;\n\tvar ycbcrss       = img[\"t530\"], ssx = 0, ssy = 0;\n\tvar spp           = img[\"t277\"]?img[\"t277\"][0]:1;\n\tvar jpgresint     = img[\"t515\"];\n\n\tif(soffTag)\n\t{\n\t\tsoff = soffTag[0];\n\t\tisTiled = (soffTag.length > 1);\n\t}\n\n\tif(!isTiled)\n\t{\n\t\tif(data[off]==255 && data[off+1]==SOI) return { jpegOffset: off };\n\t\tif(jpgIchgFmt!=null)\n\t\t{\n\t\t\tif(data[off+jifoff]==255 && data[off+jifoff+1]==SOI) joff = off+jifoff;\n\t\t\telse log(\"JPEGInterchangeFormat does not point to SOI\");\n\n\t\t\tif(jpgIchgFmtLen==null) log(\"JPEGInterchangeFormatLength field is missing\");\n\t\t\telse if(jifoff >= soff || (jifoff+jiflen) <= soff) log(\"JPEGInterchangeFormatLength field value is invalid\");\n\n\t\t\tif(joff != null) return { jpegOffset: joff };\n\t\t}\n\t}\n\n\tif(ycbcrss!=null) {  ssx = ycbcrss[0];  ssy = ycbcrss[1];  }\n\n\tif(jpgIchgFmt!=null)\n\t\tif(jpgIchgFmtLen!=null)\n\t\t\tif(jiflen >= 2 && (jifoff+jiflen) <= soff)\n\t\t\t{\n\t\t\t\tif(data[off+jifoff+jiflen-2]==255 && data[off+jifoff+jiflen-1]==SOI) tables = new Uint8Array(jiflen-2);\n\t\t\t\telse tables = new Uint8Array(jiflen);\n\n\t\t\t\tfor(i=0; i<tables.length; i++) tables[i] = data[off+jifoff+i];\n\t\t\t\tlog(\"Incorrect JPEG interchange format: using JPEGInterchangeFormat offset to derive tables\");\n\t\t\t}\n\t\t\telse log(\"JPEGInterchangeFormat+JPEGInterchangeFormatLength > offset to first strip or tile\");\n\n\tif(tables == null)\n\t{\n\t\tvar ooff = 0, out = [];\n\t\tout[ooff++] = 255; out[ooff++] = SOI;\n\n\t\tvar qtables = img[\"t519\"];\n\t\tif(qtables==null) throw new Error(\"JPEGQTables tag is missing\");\n\t\tfor(i=0; i<qtables.length; i++)\n\t\t{\n\t\t\tout[ooff++] = 255; out[ooff++] = DQT; out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\tfor(j=0; j<64; j++) out[ooff++] = data[off+qtables[i]+j];\n\t\t}\n\n\t\tfor(k=0; k<2; k++)\n\t\t{\n\t\t\tvar htables = img[(k == 0) ? \"t520\" : \"t521\"];\n\t\t\tif(htables==null) throw new Error(((k == 0) ? \"JPEGDCTables\" : \"JPEGACTables\") + \" tag is missing\");\n\t\t\tfor(i=0; i<htables.length; i++)\n\t\t\t{\n\t\t\t\tout[ooff++] = 255; out[ooff++] = DHT;\n\t\t\t\t//out[ooff++] = 0; out[ooff++] = 67; out[ooff++] = i;\n\t\t\t\tvar nc = 19;\n\t\t\t\tfor(j=0; j<16; j++) nc += data[off+htables[i]+j];\n\n\t\t\t\tout[ooff++] = (nc >>> 8); out[ooff++] = nc & 255;\n\t\t\t\tout[ooff++] = (i | (k << 4));\n\t\t\t\tfor(j=0; j<16; j++) out[ooff++] = data[off+htables[i]+j];\n\t\t\t\tfor(j=0; j<nc; j++) out[ooff++] = data[off+htables[i]+16+j];\n\t\t\t}\n\t\t}\n\n\t\tout[ooff++] = 255; out[ooff++] = SOF0;\n\t\tout[ooff++] = 0;  out[ooff++] = 8 + 3*spp;  out[ooff++] = 8;\n\t\tout[ooff++] = (img.height >>> 8) & 255;  out[ooff++] = img.height & 255;\n\t\tout[ooff++] = (img.width  >>> 8) & 255;  out[ooff++] = img.width  & 255;\n\t\tout[ooff++] = spp;\n\t\tif(spp==1) {  out[ooff++] = 1;  out[ooff++] = 17;  out[ooff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tout[ooff++] = i + 1;\n\t\t\tout[ooff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\tout[ooff++] = i;\n\t\t}\n\n\t\tif(jpgresint!=null && jpgresint[0]!=0)\n\t\t{\n\t\t\tout[ooff++] = 255;  out[ooff++] = DRI;  out[ooff++] = 0;  out[ooff++] = 4;\n\t\t\tout[ooff++] = (jpgresint[0] >>> 8) & 255;\n\t\t\tout[ooff++] = jpgresint[0] & 255;\n\t\t}\n\n\t\ttables = new Uint8Array(out);\n\t}\n\n\tvar sofpos = -1;\n\ti = 0;\n\twhile(i < (tables.length - 1)) {\n\t\tif(tables[i]==255 && tables[i+1]==SOF0) {  sofpos = i; break;  }\n\t\ti++;\n\t}\n\n\tif(sofpos == -1)\n\t{\n\t\tvar tmptab = new Uint8Array(tables.length + 10 + 3*spp);\n\t\ttmptab.set(tables);\n\t\tvar tmpoff = tables.length;\n\t\tsofpos = tables.length;\n\t\ttables = tmptab;\n\n\t\ttables[tmpoff++] = 255; tables[tmpoff++] = SOF0;\n\t\ttables[tmpoff++] = 0;  tables[tmpoff++] = 8 + 3*spp;  tables[tmpoff++] = 8;\n\t\ttables[tmpoff++] = (img.height >>> 8) & 255;  tables[tmpoff++] = img.height & 255;\n\t\ttables[tmpoff++] = (img.width  >>> 8) & 255;  tables[tmpoff++] = img.width  & 255;\n\t\ttables[tmpoff++] = spp;\n\t\tif(spp==1) {  tables[tmpoff++] = 1;  tables[tmpoff++] = 17;  tables[tmpoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\ttables[tmpoff++] = i + 1;\n\t\t\ttables[tmpoff++] = (i != 0) ? 17 : (((ssx & 15) << 4) | (ssy & 15));\n\t\t\ttables[tmpoff++] = i;\n\t\t}\n\t}\n\n\tif(data[soff]==255 && data[soff+1]==SOS)\n\t{\n\t\tvar soslen = (data[soff+2]<<8) | data[soff+3];\n\t\tsosMarker = new Uint8Array(soslen+2);\n\t\tsosMarker[0] = data[soff];  sosMarker[1] = data[soff+1]; sosMarker[2] = data[soff+2];  sosMarker[3] = data[soff+3];\n\t\tfor(i=0; i<(soslen-2); i++) sosMarker[i+4] = data[soff+i+4];\n\t}\n\telse\n\t{\n\t\tsosMarker = new Uint8Array(2 + 6 + 2*spp);\n\t\tvar sosoff = 0;\n\t\tsosMarker[sosoff++] = 255;  sosMarker[sosoff++] = SOS;\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 6 + 2*spp;  sosMarker[sosoff++] = spp;\n\t\tif(spp==1) {  sosMarker[sosoff++] = 1;  sosMarker[sosoff++] = 0;  }\n\t\telse for(i=0; i<3; i++)\n\t\t{\n\t\t\tsosMarker[sosoff++] = i+1;  sosMarker[sosoff++] = (i << 4) | i;\n\t\t}\n\t\tsosMarker[sosoff++] = 0;  sosMarker[sosoff++] = 63;  sosMarker[sosoff++] = 0;\n\t}\n\n\treturn { jpegOffset: off, tables: tables, sosMarker: sosMarker, sofPosition: sofpos };\n}\n\nUTIF.decode._decodeOldJPEG = function(img, data, off, len, tgt, toff)\n{\n\tvar i, dlen, tlen, buff, buffoff;\n\tvar jpegData = UTIF.decode._decodeOldJPEGInit(img, data, off, len);\n\n\tif(jpegData.jpegOffset!=null)\n\t{\n\t\tdlen = off+len-jpegData.jpegOffset;\n\t\tbuff = new Uint8Array(dlen);\n\t\tfor(i=0; i<dlen; i++) buff[i] = data[jpegData.jpegOffset+i];\n\t}\n\telse\n\t{\n\t\ttlen = jpegData.tables.length;\n\t\tbuff = new Uint8Array(tlen + jpegData.sosMarker.length + len + 2);\n\t\tbuff.set(jpegData.tables);\n\t\tbuffoff = tlen;\n\n\t\tbuff[jpegData.sofPosition+5] = (img.height >>> 8) & 255;  buff[jpegData.sofPosition+6] = img.height & 255;\n\t\tbuff[jpegData.sofPosition+7] = (img.width  >>> 8) & 255;  buff[jpegData.sofPosition+8] = img.width  & 255;\n\n\t\tif(data[off]!=255 || data[off+1]!=SOS)\n\t\t{\n\t\t\tbuff.set(jpegData.sosMarker, buffoff);\n\t\t\tbuffoff += sosMarker.length;\n\t\t}\n\t\tfor(i=0; i<len; i++) buff[buffoff++] = data[off+i];\n\t\tbuff[buffoff++] = 255;  buff[buffoff++] = EOI;\n\t}\n\n\tvar parser = new UTIF.JpegDecoder();  parser.parse(buff);\n\tvar decoded = parser.getData(parser.width, parser.height);\n\tfor (var i=0; i<decoded.length; i++) tgt[toff + i] = decoded[i];\n\n\t// PhotometricInterpretation is 6 (YCbCr) for JPEG, but after decoding we populate data in\n\t// RGB format, so updating the tag value\n\tif(img[\"t262\"] && img[\"t262\"][0] == 6)  img[\"t262\"][0] = 2;\n}\n\nUTIF.decode._decodePackBits = function(data, off, len, tgt, toff)\n{\n\tvar sa = new Int8Array(data.buffer), ta = new Int8Array(tgt.buffer), lim = off+len;\n\twhile(off<lim)\n\t{\n\t\tvar n = sa[off];  off++;\n\t\tif(n>=0  && n<128)    for(var i=0; i< n+1; i++) {  ta[toff]=sa[off];  toff++;  off++;   }\n\t\tif(n>=-127 && n<0) {  for(var i=0; i<-n+1; i++) {  ta[toff]=sa[off];  toff++;           }  off++;  }\n\t}\n}\n\nUTIF.decode._decodeThunder = function(data, off, len, tgt, toff)\n{\n\tvar d2 = [ 0, 1, 0, -1 ],  d3 = [ 0, 1, 2, 3, 0, -3, -2, -1 ];\n\tvar lim = off+len, qoff = toff*2, px = 0;\n\twhile(off<lim)\n\t{\n\t\tvar b = data[off], msk = (b>>>6), n = (b&63);  off++;\n\t\tif(msk==3) { px=(n&15);  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==0) for(var i=0; i<n; i++) {  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++;   }\n\t\tif(msk==2) for(var i=0; i<2; i++) {  var d=(n>>>(3*(1-i)))&7;  if(d!=4) { px+=d3[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t\tif(msk==1) for(var i=0; i<3; i++) {  var d=(n>>>(2*(2-i)))&3;  if(d!=2) { px+=d2[d];  tgt[qoff>>>1] |= (px<<(4*(1-qoff&1)));  qoff++; }  }\n\t}\n}\n\nUTIF.decode._dmap = { \"1\":0,\"011\":1,\"000011\":2,\"0000011\":3, \"010\":-1,\"000010\":-2,\"0000010\":-3  };\nUTIF.decode._lens = ( function()\n{\n\tvar addKeys = function(lens, arr, i0, inc) {  for(var i=0; i<arr.length; i++) lens[arr[i]] = i0 + i*inc;  }\n\n\tvar termW = \"00110101,000111,0111,1000,1011,1100,1110,1111,10011,10100,00111,01000,001000,000011,110100,110101,\" // 15\n\t+ \"101010,101011,0100111,0001100,0001000,0010111,0000011,0000100,0101000,0101011,0010011,0100100,0011000,00000010,00000011,00011010,\" // 31\n\t+ \"00011011,00010010,00010011,00010100,00010101,00010110,00010111,00101000,00101001,00101010,00101011,00101100,00101101,00000100,00000101,00001010,\" // 47\n\t+ \"00001011,01010010,01010011,01010100,01010101,00100100,00100101,01011000,01011001,01011010,01011011,01001010,01001011,00110010,00110011,00110100\";\n\n\tvar termB = \"0000110111,010,11,10,011,0011,0010,00011,000101,000100,0000100,0000101,0000111,00000100,00000111,000011000,\" // 15\n\t+ \"0000010111,0000011000,0000001000,00001100111,00001101000,00001101100,00000110111,00000101000,00000010111,00000011000,000011001010,000011001011,000011001100,000011001101,000001101000,000001101001,\" // 31\n\t+ \"000001101010,000001101011,000011010010,000011010011,000011010100,000011010101,000011010110,000011010111,000001101100,000001101101,000011011010,000011011011,000001010100,000001010101,000001010110,000001010111,\" // 47\n\t+ \"000001100100,000001100101,000001010010,000001010011,000000100100,000000110111,000000111000,000000100111,000000101000,000001011000,000001011001,000000101011,000000101100,000001011010,000001100110,000001100111\";\n\n\tvar makeW = \"11011,10010,010111,0110111,00110110,00110111,01100100,01100101,01101000,01100111,011001100,011001101,011010010,011010011,011010100,011010101,011010110,\"\n\t+ \"011010111,011011000,011011001,011011010,011011011,010011000,010011001,010011010,011000,010011011\";\n\n\tvar makeB = \"0000001111,000011001000,000011001001,000001011011,000000110011,000000110100,000000110101,0000001101100,0000001101101,0000001001010,0000001001011,0000001001100,\"\n\t+ \"0000001001101,0000001110010,0000001110011,0000001110100,0000001110101,0000001110110,0000001110111,0000001010010,0000001010011,0000001010100,0000001010101,0000001011010,\"\n\t+ \"0000001011011,0000001100100,0000001100101\";\n\n\tvar makeA = \"00000001000,00000001100,00000001101,000000010010,000000010011,000000010100,000000010101,000000010110,000000010111,000000011100,000000011101,000000011110,000000011111\";\n\n\ttermW = termW.split(\",\");  termB = termB.split(\",\");  makeW = makeW.split(\",\");  makeB = makeB.split(\",\");  makeA = makeA.split(\",\");\n\n\tvar lensW = {}, lensB = {};\n\taddKeys(lensW, termW, 0, 1);  addKeys(lensW, makeW, 64,64);  addKeys(lensW, makeA, 1792,64);\n\taddKeys(lensB, termB, 0, 1);  addKeys(lensB, makeB, 64,64);  addKeys(lensB, makeA, 1792,64);\n\treturn [lensW, lensB];\n} )();\n\nUTIF.decode._decodeG4 = function(data, off, slen, tgt, toff, w, fo)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\t// previous starts with 1\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) pline.push(0);  pline=U._makeDiff(pline);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=0, mode=\"\", toRead=0;\n\tvar bipl = Math.ceil(w/8)*8;\n\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\t\tif(mode==\"H\")\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t}\n\t\tif(line.length==w && mode==\"\")\n\t\t{\n\t\t\tU._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tclr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t\t//if(wrd.length>150) {  log(wrd);  break;  throw \"e\";  }\n\t}\n}\n\nUTIF.decode._findDiff = function(line, x, clr) {  for(var i=0; i<line.length; i+=2) if(line[i]>=x && line[i+1]==clr)  return line[i];  }\n\nUTIF.decode._makeDiff = function(line)\n{\n\tvar out = [];  if(line[0]==1) out.push(0,1);\n\tfor(var i=1; i<line.length; i++) if(line[i-1]!=line[i]) out.push(i, line[i]);\n\tout.push(line.length,0,line.length,1);  return out;\n}\n\nUTIF.decode._decodeG3 = function(data, off, slen, tgt, toff, w, fo)\n{\n\tvar U = UTIF.decode, boff=off<<3, len=0, wrd=\"\";\n\tvar line=[], pline=[];  for(var i=0; i<w; i++) line.push(0);\n\tvar a0=0, a1=0, a2=0, b1=0, b2=0, clr=0;\n\tvar y=-1, mode=\"\", toRead=0, is1D=false;\n\tvar bipl = Math.ceil(w/8)*8;\n\twhile((boff>>>3)<off+slen)\n\t{\n\t\tb1 = U._findDiff(pline, a0+(a0==0?0:1), 1-clr), b2 = U._findDiff(pline, b1, clr);\t// could be precomputed\n\t\tvar bit =0;\n\t\tif(fo==1) bit = (data[boff>>>3]>>>(7-(boff&7)))&1;\n\t\tif(fo==2) bit = (data[boff>>>3]>>>(  (boff&7)))&1;\n\t\tboff++;  wrd+=bit;\n\n\t\tif(is1D)\n\t\t{\n\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t{\n\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  clr=1-clr;  len=0;  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(mode==\"H\")\n\t\t\t{\n\t\t\t\tif(U._lens[clr][wrd]!=null)\n\t\t\t\t{\n\t\t\t\t\tvar dl=U._lens[clr][wrd];  wrd=\"\";  len+=dl;\n\t\t\t\t\tif(dl<64) {  U._addNtimes(line,len,clr);  a0+=len;  clr=1-clr;  len=0;  toRead--;  if(toRead==0) mode=\"\";  }\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(wrd==\"0001\")  {  wrd=\"\";  U._addNtimes(line,b2-a0,clr);  a0=b2;   }\n\t\t\t\tif(wrd==\"001\" )  {  wrd=\"\";  mode=\"H\";  toRead=2;  }\n\t\t\t\tif(U._dmap[wrd]!=null) {  a1 = b1+U._dmap[wrd];  U._addNtimes(line, a1-a0, clr);  a0=a1;  wrd=\"\";  clr=1-clr;  }\n\t\t\t}\n\t\t}\n\t\tif(wrd.endsWith(\"000000000001\")) // needed for some files\n\t\t{\n\t\t\tif(y>=0) U._writeBits(line, tgt, toff*8+y*bipl);\n\t\t\tif(fo==1) is1D = ((data[boff>>>3]>>>(7-(boff&7)))&1)==1;\n\t\t\tif(fo==2) is1D = ((data[boff>>>3]>>>(  (boff&7)))&1)==1;\n\t\t\tboff++;\n\t\t\tif(U._decodeG3.allow2D==null) U._decodeG3.allow2D=is1D;\n\t\t\tif(!U._decodeG3.allow2D) {  is1D = true;  boff--;  }\n\t\t\t//log(\"EOL\",y, \"next 1D:\", is1D);\n\t\t\twrd=\"\";  clr=0;  y++;  a0=0;\n\t\t\tpline=U._makeDiff(line);  line=[];\n\t\t}\n\t}\n\tif(line.length==w) U._writeBits(line, tgt, toff*8+y*bipl);\n}\n\nUTIF.decode._addNtimes = function(arr, n, val) {  for(var i=0; i<n; i++) arr.push(val);  }\n\nUTIF.decode._writeBits = function(bits, tgt, boff)\n{\n\tfor(var i=0; i<bits.length; i++) tgt[(boff+i)>>>3] |= (bits[i]<<(7-((boff+i)&7)));\n}\n\nUTIF.decode._decodeLZW = function(data, off, tgt, toff)\n{\n\tif(UTIF.decode._lzwTab==null)\n\t{\n\t\tvar tb=new Uint32Array(0xffff), tn=new Uint16Array(0xffff), chr=new Uint8Array(2e6);\n\t\tfor(var i=0; i<256; i++) { chr[i<<2]=i;  tb[i]=i<<2;  tn[i]=1;  }\n\t\tUTIF.decode._lzwTab = [tb,tn,chr];\n\t}\n\tvar copy = UTIF.decode._copyData;\n\tvar tab = UTIF.decode._lzwTab[0], tln=UTIF.decode._lzwTab[1], chr=UTIF.decode._lzwTab[2], totl = 258, chrl = 258<<2;\n\tvar bits = 9, boff = off<<3;  // offset in bits\n\n\tvar ClearCode = 256, EoiCode = 257;\n\tvar v = 0, Code = 0, OldCode = 0;\n\twhile(true)\n\t{\n\t\tv = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3];\n\t\tCode = ( v>>(24-(boff&7)-bits) )    &   ((1<<bits)-1);  boff+=bits;\n\n\t\tif(Code==EoiCode) break;\n\t\tif(Code==ClearCode)\n\t\t{\n\t\t\tbits=9;  totl = 258;  chrl = 258<<2;\n\n\t\t\tv = (data[boff>>>3]<<16) | (data[(boff+8)>>>3]<<8) | data[(boff+16)>>>3];\n\t\t\tCode = ( v>>(24-(boff&7)-bits) )    &   ((1<<bits)-1);  boff+=bits;\n\t\t\tif(Code==EoiCode) break;\n\t\t\ttgt[toff]=Code;  toff++;\n\t\t}\n\t\telse if(Code<totl)\n\t\t{\n\t\t\tvar cd = tab[Code], cl = tln[Code];\n\t\t\tcopy(chr,cd,tgt,toff,cl);  toff += cl;\n\n\t\t\tif(OldCode>=totl) {  tab[totl] = chrl;  chr[tab[totl]] = cd[0];  tln[totl]=1;  chrl=(chrl+1+3)&~0x03;  totl++;  }\n\t\t\telse\n\t\t\t{\n\t\t\t\ttab[totl] = chrl;\n\t\t\t\tvar nit = tab[OldCode], nil = tln[OldCode];\n\t\t\t\tcopy(chr,nit,chr,chrl,nil);\n\t\t\t\tchr[chrl+nil]=chr[cd];  nil++;\n\t\t\t\ttln[totl]=nil;  totl++;\n\n\t\t\t\tchrl=(chrl+nil+3)&~0x03;\n\t\t\t}\n\t\t\tif(totl+1==(1<<bits)) bits++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(OldCode>=totl) {  tab[totl] = chrl;  tln[totl]=0;  totl++;  }\n\t\t\telse\n\t\t\t{\n\t\t\t\ttab[totl] = chrl;\n\t\t\t\tvar nit = tab[OldCode], nil = tln[OldCode];\n\t\t\t\tcopy(chr,nit,chr,chrl,nil);\n\t\t\t\tchr[chrl+nil]=chr[chrl];  nil++;\n\t\t\t\ttln[totl]=nil;  totl++;\n\n\t\t\t\tcopy(chr,chrl,tgt,toff,nil);  toff += nil;\n\t\t\t\tchrl=(chrl+nil+3)&~0x03;\n\t\t\t}\n\t\t\tif(totl+1==(1<<bits)) bits++;\n\t\t}\n\t\tOldCode = Code;\n\t}\n}\n\nUTIF.decode._copyData = function(s,so,t,to,l) {  for(var i=0;i<l;i+=4) {  t[to+i]=s[so+i];  t[to+i+1]=s[so+i+1];  t[to+i+2]=s[so+i+2];  t[to+i+3]=s[so+i+3];  }  }\n\nUTIF.tags = {};\nUTIF.ttypes = {  256:3,257:3,258:3,   259:3, 262:3,  273:4,  274:3, 277:3,278:4,279:4, 282:5, 283:5, 284:3, 286:5,287:5, 296:3, 305:2, 306:2, 338:3, 513:4, 514:4, 34665:4  };\n\nUTIF._readIFD = function(bin, data, offset, ifds, depth, debug)\n{\n\tvar cnt = bin.readUshort(data, offset);  offset+=2;\n\tvar ifd = {};  ifds.push(ifd);\n\n\tif(debug) log(\"   \".repeat(depth),ifds.length-1,\">>>----------------\");\n\tfor(var i=0; i<cnt; i++)\n\t{\n\t\tvar tag  = bin.readUshort(data, offset);    offset+=2;\n\t\tvar type = bin.readUshort(data, offset);    offset+=2;\n\t\tvar num  = bin.readUint  (data, offset);    offset+=4;\n\t\tvar voff = bin.readUint  (data, offset);    offset+=4;\n\t\t//if(tag==33723) {type=1; num*=4;}//console.log(type,num,voff);//type = 1;  // IPTC/NAA\n\n\t\tvar arr = [];\n\t\t//ifd[\"t\"+tag+\"-\"+UTIF.tags[tag]] = arr;\n\t\tif(type== 1 || type==7) {  arr = new Uint8Array(data.buffer, (num<5 ? offset-4 : voff), num);  }\n\t\tif(type== 2) {  var o0 = (num<5 ? offset-4 : voff), c=data[o0];  \n\t\t\t\t\t\tif(c<128) arr.push( bin.readASCII(data, o0, num-1) );\n\t\t\t\t\t\telse      arr = new Uint8Array(data.buffer, o0, num-1);  }\n\t\tif(type== 3) {  for(var j=0; j<num; j++) arr.push(bin.readUshort(data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 4) {  for(var j=0; j<num; j++) arr.push(bin.readUint  (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type== 5) {  for(var j=0; j<num; j++) arr.push(bin.readUint  (data, voff+j*8) / bin.readUint(data,voff+j*8+4));  }\n\t\tif(type== 8) {  for(var j=0; j<num; j++) arr.push(bin.readShort (data, (num<3 ? offset-4 : voff)+2*j));  }\n\t\tif(type== 9) {  for(var j=0; j<num; j++) arr.push(bin.readInt   (data, (num<2 ? offset-4 : voff)+4*j));  }\n\t\tif(type==10) {  for(var j=0; j<num; j++) arr.push(bin.readInt   (data, voff+j*8) / bin.readInt (data,voff+j*8+4));  }\n\t\tif(type==11) {  for(var j=0; j<num; j++) arr.push(bin.readFloat (data, voff+j*4));  }\n\t\tif(type==12) {  for(var j=0; j<num; j++) arr.push(bin.readDouble(data, voff+j*8));  }\n\t\t\n\t\tifd[\"t\"+tag] = arr;\n\t\t\n\t\tif(num!=0 && arr.length==0) {  log(\"unknown TIFF tag type: \", type, \"num:\",num);  }\n\t\tif(debug) log(\"   \".repeat(depth), tag, type, UTIF.tags[tag], arr);\n\t\t\n\t\tif(tag==330 && ifd[\"t272\"] && ifd[\"t272\"][0]==\"DSLR-A100\") {  } \n\t\t// ifd[\"t258\"]=[12];  ifd[\"t259\"]=[32767];  ifd[\"t273\"]=[offset+arr[0]];  ifd[\"t277\"]=[1];  ifd[\"t279\"]=[1];  ifd[\"t33421\"]=[2,2];  ifd[\"t33422\"]=[0,1,1,2];\n\t\telse if(tag==330 || tag==34665 || (tag==50740 && bin.readUshort(data,bin.readUint(arr,0))<300  )) {\n\t\t\tvar oarr = tag==50740 ? [bin.readUint(arr,0)] : arr;\n\t\t\tvar subfd = [];\n\t\t\tfor(var j=0; j<oarr.length; j++) UTIF._readIFD(bin, data, oarr[j], subfd, depth+1, debug);\n\t\t\tif(tag==  330) ifd.subIFD = subfd;\n\t\t\tif(tag==34665) ifd.exifIFD = subfd[0];\n\t\t\tif(tag==50740) ifd.dngPrvt = subfd[0];\n\t\t}\n\t\tif(tag==37500) {\n\t\t\tvar mn = arr;\n\t\t\t//console.log(bin.readASCII(mn,0,mn.length), mn);\n\t\t\tif(bin.readASCII(mn,0,5)==\"Nikon\")  ifd.makerNote = UTIF[\"decode\"](mn.slice(10).buffer)[0];\n\t\t\telse if(bin.readUshort(data,voff)<300){\n\t\t\t\tvar subsub=[];  UTIF._readIFD(bin, data, voff, subsub, depth+1, debug);\n\t\t\t\tifd.makerNote = subsub[0];\n\t\t\t}\n\t\t}\n\t}\n\tif(debug) log(\"   \".repeat(depth),\"<<<---------------\");\n\treturn offset;\n}\n\nUTIF._writeIFD = function(bin, data, offset, ifd)\n{\n\tvar keys = Object.keys(ifd);\n\tbin.writeUshort(data, offset, keys.length);  offset+=2;\n\n\tvar eoff = offset + keys.length*12 + 4;\n\n\tfor(var ki=0; ki<keys.length; ki++)\n\t{\n\t\tvar key = keys[ki];\n\t\tvar tag = parseInt(key.slice(1)), type = UTIF.ttypes[tag];  if(type==null) throw new Error(\"unknown type of tag: \"+tag);\n\t\tvar val = ifd[key];  if(type==2) val=val[0]+\"\\u0000\";  var num = val.length;\n\t\tbin.writeUshort(data, offset, tag );  offset+=2;\n\t\tbin.writeUshort(data, offset, type);  offset+=2;\n\t\tbin.writeUint  (data, offset, num );  offset+=4;\n\n\t\tvar dlen = [-1, 1, 1, 2, 4, 8, 0, 0, 0, 0, 0, 0, 8][type] * num;\n\t\tvar toff = offset;\n\t\tif(dlen>4) {  bin.writeUint(data, offset, eoff);  toff=eoff;  }\n\n\t\tif(type==2) {  bin.writeASCII(data, toff, val);   }\n\t\tif(type==3) {  for(var i=0; i<num; i++) bin.writeUshort(data, toff+2*i, val[i]);    }\n\t\tif(type==4) {  for(var i=0; i<num; i++) bin.writeUint  (data, toff+4*i, val[i]);    }\n\t\tif(type==5) {  for(var i=0; i<num; i++) {  bin.writeUint(data, toff+8*i, Math.round(val[i]*10000));  bin.writeUint(data, toff+8*i+4, 10000);  }   }\n\t\tif (type == 12) {  for (var i = 0; i < num; i++) bin.writeDouble(data, toff + 8 * i, val[i]); }\n\n\t\tif(dlen>4) {  dlen += (dlen&1);  eoff += dlen;  }\n\t\toffset += 4;\n\t}\n\treturn [offset, eoff];\n}\n\nUTIF.toRGBA8 = function(out)\n{\n\tvar w = out.width, h = out.height, area = w*h, qarea = area*4, data = out.data;\n\tvar img = new Uint8Array(area*4);\n\t//console.log(out);\n\t// 0: WhiteIsZero, 1: BlackIsZero, 2: RGB, 3: Palette color, 4: Transparency mask, 5: CMYK\n\tvar intp = (out[\"t262\"] ? out[\"t262\"][0]: 2), bps = (out[\"t258\"]?Math.min(32,out[\"t258\"][0]):1);\n\t//log(\"interpretation: \", intp, \"bps\", bps, out);\n\tif(false) {}\n\telse if(intp==0)\n\t{\n\t\tvar bpl = Math.ceil(bps*w/8);\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))& 1;  img[qi]=img[qi+1]=img[qi+2]=( 1-px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 4) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>1)])>>(4-4*(i&1)))&15;  img[qi]=img[qi+1]=img[qi+2]=(15-px)* 17;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i];  img[qi]=img[qi+1]=img[qi+2]=255-px;  img[qi+3]=255;    }\n\t\t}\n\t}\n\telse if(intp==1)\n\t{\n\t\tvar bpl = Math.ceil(bps*w/8);\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tvar off = y*bpl, io = y*w;\n\t\t\tif(bps== 1) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>3)])>>(7-  (i&7)))&1;   img[qi]=img[qi+1]=img[qi+2]=(px)*255;  img[qi+3]=255;    }\n\t\t\tif(bps== 2) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=((data[off+(i>>2)])>>(6-2*(i&3)))&3;   img[qi]=img[qi+1]=img[qi+2]=(px)* 85;  img[qi+3]=255;    }\n\t\t\tif(bps== 8) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+i];  img[qi]=img[qi+1]=img[qi+2]=    px;  img[qi+3]=255;    }\n\t\t\tif(bps==16) for(var i=0; i<w; i++) {  var qi=(io+i)<<2, px=data[off+(2*i+1)];  img[qi]=img[qi+1]=img[qi+2]= Math.min(255,px);  img[qi+3]=255;    } // ladoga.tif\n\t\t}\n\t}\n\telse if(intp==2)\n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 3;\n\t\t\n\t\tif(bps== 8) \n\t\t{\n\t\t\tif(smpls==4) for(var i=0; i<qarea; i++) img[i] = data[i];\n\t\t\tif(smpls==3) for(var i=0; i< area; i++) {  var qi=i<<2, ti=i*3;  img[qi]=data[ti];  img[qi+1]=data[ti+1];  img[qi+2]=data[ti+2];  img[qi+3]=255;    }\n\t\t}\n\t\telse{  // 3x 16-bit channel\n\t\t\tif(smpls==4) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*8+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=data[ti+6];    }\n\t\t\tif(smpls==3) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6+1;  img[qi]=data[ti];  img[qi+1]=data[ti+2];  img[qi+2]=data[ti+4];  img[qi+3]=255;           }\n\t\t}\n\t}\n\telse if(intp==3)\n\t{\n\t\tvar map = out[\"t320\"];\n\t\tfor(var i=0; i<area; i++) {  var qi=i<<2, mi=data[i];  img[qi]=(map[mi]>>8);  img[qi+1]=(map[256+mi]>>8);  img[qi+2]=(map[512+mi]>>8);  img[qi+3]=255;    }\n\t}\n\telse if(intp==5) \n\t{\n\t\tvar smpls = out[\"t258\"]?out[\"t258\"].length : 4;\n\t\tvar gotAlpha = smpls>4 ? 1 : 0;\n\t\tfor(var i=0; i<area; i++) {\n\t\t\tvar qi=i<<2, si=i*smpls;  var C=255-data[si], M=255-data[si+1], Y=255-data[si+2], K=(255-data[si+3])*(1/255);\n\t\t\timg[qi]=~~(C*K+0.5);  img[qi+1]=~~(M*K+0.5);  img[qi+2]=~~(Y*K+0.5);  img[qi+3]=255*(1-gotAlpha)+data[si+4]*gotAlpha;\n\t\t}\n\t}\n\telse log(\"Unknown Photometric interpretation: \"+intp);\n\treturn img;\n}\n\nUTIF.replaceIMG = function(imgs)\n{\n\tif(imgs==null) imgs = document.getElementsByTagName(\"img\");\n\tvar sufs = [\"tif\",\"tiff\",\"dng\",\"cr2\",\"nef\"]\n\tfor (var i=0; i<imgs.length; i++)\n\t{\n\t\tvar img=imgs[i], src=img.getAttribute(\"src\");  if(src==null) continue;\n\t\tvar suff=src.split(\".\").pop().toLowerCase();\n\t\tif(sufs.indexOf(suff)==-1) continue;\n\t\tvar xhr = new XMLHttpRequest();  UTIF._xhrs.push(xhr);  UTIF._imgs.push(img);\n\t\txhr.open(\"GET\", src);  xhr.responseType = \"arraybuffer\";\n\t\txhr.onload = UTIF._imgLoaded;   xhr.send();\n\t}\n}\n\nUTIF._xhrs = [];  UTIF._imgs = [];\nUTIF._imgLoaded = function(e)\n{\n\tvar buff = e.target.response;\n\tvar ifds = UTIF.decode(buff);  //console.log(ifds);\n\tvar vsns = ifds, ma=0, page=vsns[0];  if(ifds[0].subIFD) vsns = vsns.concat(ifds[0].subIFD);\n\tfor(var i=0; i<vsns.length; i++) {\n\t\tvar img = vsns[i];\n\t\tif(img[\"t258\"]==null || img[\"t258\"].length<3) continue;\n\t\tvar ar = img[\"t256\"]*img[\"t257\"];\n\t\tif(ar>ma) {  ma=ar;  page=img;  }\n\t}\n\tUTIF.decodeImage(buff, page, ifds);\n\tvar rgba = UTIF.toRGBA8(page), w=page.width, h=page.height;\n\tvar ind = UTIF._xhrs.indexOf(e.target), img = UTIF._imgs[ind];\n\tUTIF._xhrs.splice(ind,1);  UTIF._imgs.splice(ind,1);\n\tvar cnv = document.createElement(\"canvas\");  cnv.width=w;  cnv.height=h;\n\tvar ctx = cnv.getContext(\"2d\"), imgd = ctx.createImageData(w,h);\n\tfor(var i=0; i<rgba.length; i++) imgd.data[i]=rgba[i];       ctx.putImageData(imgd,0,0);\n\timg.setAttribute(\"src\",cnv.toDataURL());\n}\n\n\nUTIF._binBE =\n{\n\tnextZero   : function(data, o) {  while(data[o]!=0) o++;  return o;  },\n\treadUshort : function(buff, p) {  return (buff[p]<< 8) |  buff[p+1];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+1];  a[1]=buff[p+0];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+3];  a[1]=buff[p+2];  a[2]=buff[p+1];  a[3]=buff[p+0];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : function(buff, p, l) {  var s = \"\";   for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);   return s; },\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+3-i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+7-i];  return UTIF._binBE.fl64[0];  },\n\n\twriteUshort: function(buff, p, n) {  buff[p] = (n>> 8)&255;  buff[p+1] =  n&255;  },\n\twriteUint  : function(buff, p, n) {  buff[p] = (n>>24)&255;  buff[p+1] = (n>>16)&255;  buff[p+2] = (n>>8)&255;  buff[p+3] = (n>>0)&255;  },\n\twriteASCII : function(buff, p, s) {  for(var i = 0; i < s.length; i++)  buff[p+i] = s.charCodeAt(i);  },\n\twriteDouble: function(buff, p, n)\n\t{\n\t\tUTIF._binBE.fl64[0] = n;\n\t\tfor (var i = 0; i < 8; i++) buff[p + i] = UTIF._binBE.ui8[7 - i];\n\t}\n}\nUTIF._binBE.ui8  = new Uint8Array  (8);\nUTIF._binBE.i16  = new Int16Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.i32  = new Int32Array  (UTIF._binBE.ui8.buffer);\nUTIF._binBE.ui32 = new Uint32Array (UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl32 = new Float32Array(UTIF._binBE.ui8.buffer);\nUTIF._binBE.fl64 = new Float64Array(UTIF._binBE.ui8.buffer);\n\nUTIF._binLE =\n{\n\tnextZero   : UTIF._binBE.nextZero,\n\treadUshort : function(buff, p) {  return (buff[p+1]<< 8) |  buff[p];  },\n\treadShort  : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];                                    return UTIF._binBE. i16[0];  },\n\treadInt    : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE. i32[0];  },\n\treadUint   : function(buff, p) {  var a=UTIF._binBE.ui8;  a[0]=buff[p+0];  a[1]=buff[p+1];  a[2]=buff[p+2];  a[3]=buff[p+3];  return UTIF._binBE.ui32[0];  },\n\treadASCII  : UTIF._binBE.readASCII,\n\treadFloat  : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<4;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl32[0];  },\n\treadDouble : function(buff, p) {  var a=UTIF._binBE.ui8;  for(var i=0;i<8;i++) a[i]=buff[p+  i];  return UTIF._binBE.fl64[0];  }\n}\nUTIF._copyTile = function(tb, tw, th, b, w, h, xoff, yoff)\n{\n\t//log(\"copyTile\", tw, th,  w, h, xoff, yoff);\n\tvar xlim = Math.min(tw, w-xoff);\n\tvar ylim = Math.min(th, h-yoff);\n\tfor(var y=0; y<ylim; y++)\n\t{\n\t\tvar tof = (yoff+y)*w+xoff;\n\t\tvar sof = y*tw;\n\t\tfor(var x=0; x<xlim; x++) b[tof+x] = tb[sof+x];\n\t}\n}\n\nUTIF.LosslessJpegDecode = (function(){function t(Z){this.w=Z;this.N=0;this._=0;this.G=0}t.prototype={t:function(Z){this.N=Math.max(0,Math.min(this.w.length,Z))},i:function(){return this.w[this.N++]},l:function(){var Z=this.N;\nthis.N+=2;return this.w[Z]<<8|this.w[Z+1]},J:function(){if(this._==0){this.G=this.w[this.N];this.N+=1+(this.G+1>>>8);\nthis._=8}return this.G>>>--this._&1},Z:function(Z){var X=this._,s=this.G,E=Math.min(X,Z);Z-=E;X-=E;var Y=s>>>X&(1<<E)-1;\nwhile(Z>0){s=this.w[this.N];this.N+=1+(s+1>>>8);E=Math.min(8,Z);Z-=E;X=8-E;Y<<=E;Y|=s>>>X&(1<<E)-1}this._=X;\nthis.G=s;return Y}};var i={};i.X=function(){return[0,0,-1]};i.s=function(Z,X,s){Z[i.Y(Z,0,s)+2]=X};i.Y=function(Z,X,s){if(Z[X+2]!=-1)return 0;\nif(s==0)return X;for(var E=0;E<2;E++){if(Z[X+E]==0){Z[X+E]=Z.length;Z.push(0);Z.push(0);Z.push(-1)}var Y=i.Y(Z,Z[X+E],s-1);\nif(Y!=0)return Y}return 0};i.B=function(Z,X){var s=0,E=0,Y=0,B=X._,$=X.G,e=X.N;while(!0){if(B==0){$=X.w[e];\ne+=1+($+1>>>8);B=8}Y=$>>>--B&1;s=Z[s+Y];E=Z[s+2];if(E!=-1){X._=B;X.G=$;X.N=e;return E}}return-1};function l(Z){this.z=new t(Z);\nthis.D(this.z)}l.prototype={$:function(Z,X){this.Q=Z.i();this.F=Z.l();this.o=Z.l();var s=this.O=Z.i();\nthis.L=[];for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();Z.i();this.L[Y]=E}Z.t(Z.N+X-(6+s*3))},e:function(){var Z=0,X=this.z.i();\nif(this.H==null)this.H={};var s=this.H[X]=i.X(),E=[];for(var Y=0;Y<16;Y++){E[Y]=this.z.i();Z+=E[Y]}for(var Y=0;\nY<16;Y++)for(var B=0;B<E[Y];B++)i.s(s,this.z.i(),Y+1);return Z+17},W:function(Z){while(Z>0)Z-=this.e()},p:function(Z,X){var s=Z.i();\nif(!this.U){this.U=[]}for(var E=0;E<s;E++){var Y=Z.i(),B=Z.i();this.U[this.L[Y]]=this.H[B>>>4]}this.g=Z.i();\nZ.t(Z.N+X-(2+s*2))},D:function(Z){var X=!1,s=Z.l();if(s!==l.q)return;do{var s=Z.l(),E=Z.l()-2;switch(s){case l.m:this.$(Z,E);\nbreak;case l.K:this.W(E);break;case l.V:this.p(Z,E);X=!0;break;default:Z.t(Z.N+E);break}}while(!X)},I:function(Z,X){var s=i.B(X,Z);\nif(s==16)return-32768;var E=Z.Z(s);if((E&1<<s-1)==0)E-=(1<<s)-1;return E},B:function(Z,X){var s=this.z,E=this.O,Y=this.F,B=this.I,$=this.g,e=this.o*E,W=this.U;\nfor(var p=0;p<E;p++){Z[p]=B(s,W[p])+(1<<this.Q-1)}for(var D=E;D<e;D+=E){for(var p=0;p<E;p++)Z[D+p]=B(s,W[p])+Z[D+p-E]}var I=X;\nfor(var m=1;m<Y;m++){for(var p=0;p<E;p++){Z[I+p]=B(s,W[p])+Z[I+p-X]}for(var D=E;D<e;D+=E){for(var p=0;\np<E;p++){var K=I+D+p,q=Z[K-E];if($==6)q=Z[K-X]+(q-Z[K-E-X]>>>1);Z[K]=q+B(s,W[p])}}I+=X}}};l.m=65475;\nl.K=65476;l.q=65496;l.V=65498;function J(Z){var X=new l(Z),s=X.Q>8?Uint16Array:Uint8Array,E=new s(X.o*X.F*X.O),Y=X.o*X.O;\nX.B(E,Y);return E}return J}())\n\n\n\n\n})(UTIF, pako);\n})();","\n/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//const Z_FILTERED          = 1;\n//const Z_HUFFMAN_ONLY      = 2;\n//const Z_RLE               = 3;\nconst Z_FIXED$1               = 4;\n//const Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nconst Z_BINARY              = 0;\nconst Z_TEXT                = 1;\n//const Z_ASCII             = 1; // = Z_TEXT\nconst Z_UNKNOWN$1             = 2;\n\n/*============================================================================*/\n\n\nfunction zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nconst STORED_BLOCK = 0;\nconst STATIC_TREES = 1;\nconst DYN_TREES    = 2;\n/* The three kinds of block type */\n\nconst MIN_MATCH$1    = 3;\nconst MAX_MATCH$1    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nconst LENGTH_CODES$1  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nconst LITERALS$1      = 256;\n/* number of literal bytes 0..255 */\n\nconst L_CODES$1       = LITERALS$1 + 1 + LENGTH_CODES$1;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nconst D_CODES$1       = 30;\n/* number of distance codes */\n\nconst BL_CODES$1      = 19;\n/* number of codes used to transfer the bit lengths */\n\nconst HEAP_SIZE$1     = 2 * L_CODES$1 + 1;\n/* maximum heap size */\n\nconst MAX_BITS$1      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nconst MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nconst END_BLOCK   = 256;\n/* end of block literal code */\n\nconst REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nconst REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nconst REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nconst extra_lbits =   /* extra bits for each length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]);\n\nconst extra_dbits =   /* extra bits for each distance code */\n  new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]);\n\nconst extra_blbits =  /* extra bits for each bit length code */\n  new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]);\n\nconst bl_order =\n  new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nconst DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nconst static_ltree  = new Array((L_CODES$1 + 2) * 2);\nzero$1(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nconst static_dtree  = new Array(D_CODES$1 * 2);\nzero$1(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nconst _dist_code    = new Array(DIST_CODE_LEN);\nzero$1(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nconst _length_code  = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1);\nzero$1(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nconst base_length   = new Array(LENGTH_CODES$1);\nzero$1(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nconst base_dist     = new Array(D_CODES$1);\nzero$1(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nlet static_l_desc;\nlet static_d_desc;\nlet static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nconst d_code = (dist) => {\n\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n};\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nconst put_short = (s, w) => {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n};\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nconst send_bits = (s, value, length) => {\n\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n};\n\n\nconst send_code = (s, c, tree) => {\n\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n};\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nconst bi_reverse = (code, len) => {\n\n  let res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nconst bi_flush = (s) => {\n\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n};\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nconst gen_bitlen = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n\n  const tree            = desc.dyn_tree;\n  const max_code        = desc.max_code;\n  const stree           = desc.stat_desc.static_tree;\n  const has_stree       = desc.stat_desc.has_stree;\n  const extra           = desc.stat_desc.extra_bits;\n  const base            = desc.stat_desc.extra_base;\n  const max_length      = desc.stat_desc.max_length;\n  let h;              /* heap index */\n  let n, m;           /* iterate over the tree elements */\n  let bits;           /* bit length */\n  let xbits;          /* extra bits */\n  let f;              /* frequency */\n  let overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Tracev((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Tracev((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nconst gen_codes = (tree, max_code, bl_count) => {\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n\n  const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */\n  let code = 0;              /* running code value */\n  let bits;                  /* bit index */\n  let n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS$1; bits++) {\n    code = (code + bl_count[bits - 1]) << 1;\n    next_code[bits] = code;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    let len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n};\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nconst tr_static_init = () => {\n\n  let n;        /* iterates over tree elements */\n  let bits;     /* bit counter */\n  let length;   /* length value */\n  let code;     /* code value */\n  let dist;     /* distance index */\n  const bl_count = new Array(MAX_BITS$1 + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES$1 - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES$1; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS$1; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES$1 + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES$1; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES$1, MAX_BITS$1);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES$1, MAX_BL_BITS);\n\n  //static_init_done = true;\n};\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nconst init_block = (s) => {\n\n  let n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES$1;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES$1;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.sym_next = s.matches = 0;\n};\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nconst bi_windup = (s) =>\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n};\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nconst smaller = (tree, n, m, depth) => {\n\n  const _n2 = n * 2;\n  const _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n};\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nconst pqdownheap = (s, tree, k) => {\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n\n  const v = s.heap[k];\n  let j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n};\n\n\n// inlined manually\n// const SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nconst compress_block = (s, ltree, dtree) => {\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n\n  let dist;           /* distance of matched string */\n  let lc;             /* match length or unmatched char (if dist == 0) */\n  let sx = 0;         /* running index in sym_buf */\n  let code;           /* the code to send */\n  let extra;          /* number of extra bits to send */\n\n  if (s.sym_next !== 0) {\n    do {\n      dist = s.pending_buf[s.sym_buf + sx++] & 0xff;\n      dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8;\n      lc = s.pending_buf[s.sym_buf + sx++];\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and sym_buf is ok: */\n      //Assert(s->pending < s->lit_bufsize + sx, \"pendingBuf overflow\");\n\n    } while (sx < s.sym_next);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n};\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nconst build_tree = (s, desc) => {\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n\n  const tree     = desc.dyn_tree;\n  const stree    = desc.stat_desc.static_tree;\n  const has_stree = desc.stat_desc.has_stree;\n  const elems    = desc.stat_desc.elems;\n  let n, m;          /* iterate over heap elements */\n  let max_code = -1; /* largest code with non zero frequency */\n  let node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE$1;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n};\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nconst scan_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nconst send_tree = (s, tree, max_code) => {\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n\n  let n;                     /* iterates over all tree elements */\n  let prevlen = -1;          /* last emitted length */\n  let curlen;                /* length of current code */\n\n  let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  let count = 0;             /* repeat count of the current code */\n  let max_count = 7;         /* max repeat count */\n  let min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n};\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nconst build_bl_tree = (s) => {\n\n  let max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n};\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nconst send_all_trees = (s, lcodes, dcodes, blcodes) => {\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n\n  let rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n};\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"block list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"allow list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nconst detect_data_type = (s) => {\n  /* block_mask is the bit mask of block-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  let block_mask = 0xf3ffc07f;\n  let n;\n\n  /* Check for non-textual (\"block-listed\") bytes. */\n  for (n = 0; n <= 31; n++, block_mask >>>= 1) {\n    if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"allow-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS$1; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"block-listed\" or \"allow-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n};\n\n\nlet static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nconst _tr_init$1 = (s) =>\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n};\n\n\n/* ===========================================================================\n * Send a stored block\n */\nconst _tr_stored_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  bi_windup(s);        /* align on byte boundary */\n  put_short(s, stored_len);\n  put_short(s, ~stored_len);\n  if (stored_len) {\n    s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending);\n  }\n  s.pending += stored_len;\n};\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nconst _tr_align$1 = (s) => {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n};\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and write out the encoded block.\n */\nconst _tr_flush_block$1 = (s, buf, stored_len, last) => {\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n\n  let opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  let max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN$1) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->sym_next / 3));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block$1(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n};\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nconst _tr_tally$1 = (s, dist, lc) => {\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist;\n  s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8;\n  s.pending_buf[s.sym_buf + s.sym_next++] = lc;\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n  return (s.sym_next === s.sym_end);\n};\n\nvar _tr_init_1  = _tr_init$1;\nvar _tr_stored_block_1 = _tr_stored_block$1;\nvar _tr_flush_block_1  = _tr_flush_block$1;\nvar _tr_tally_1 = _tr_tally$1;\nvar _tr_align_1 = _tr_align$1;\n\nvar trees = {\n\t_tr_init: _tr_init_1,\n\t_tr_stored_block: _tr_stored_block_1,\n\t_tr_flush_block: _tr_flush_block_1,\n\t_tr_tally: _tr_tally_1,\n\t_tr_align: _tr_align_1\n};\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst adler32 = (adler, buf, len, pos) => {\n  let s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n};\n\n\nvar adler32_1 = adler32;\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nconst makeTable = () => {\n  let c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n};\n\n// Create table on load. Just 255 signed longs. Not a problem.\nconst crcTable = new Uint32Array(makeTable());\n\n\nconst crc32 = (crc, buf, len, pos) => {\n  const t = crcTable;\n  const end = pos + len;\n\n  crc ^= -1;\n\n  for (let i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n};\n\n\nvar crc32_1 = crc32;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar messages = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar constants$2 = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  Z_MEM_ERROR:       -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees;\n\n\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,\n  Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,\n  Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,\n  Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,\n  Z_UNKNOWN,\n  Z_DEFLATED: Z_DEFLATED$2\n} = constants$2;\n\n/*============================================================================*/\n\n\nconst MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nconst MAX_WBITS$1 = 15;\n/* 32K LZ77 window */\nconst DEF_MEM_LEVEL = 8;\n\n\nconst LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nconst LITERALS      = 256;\n/* number of literal bytes 0..255 */\nconst L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nconst D_CODES       = 30;\n/* number of distance codes */\nconst BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nconst HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nconst MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nconst MIN_MATCH = 3;\nconst MAX_MATCH = 258;\nconst MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nconst PRESET_DICT = 0x20;\n\nconst INIT_STATE    =  42;    /* zlib header -> BUSY_STATE */\n//#ifdef GZIP\nconst GZIP_STATE    =  57;    /* gzip header -> BUSY_STATE | EXTRA_STATE */\n//#endif\nconst EXTRA_STATE   =  69;    /* gzip extra block -> NAME_STATE */\nconst NAME_STATE    =  73;    /* gzip file name -> COMMENT_STATE */\nconst COMMENT_STATE =  91;    /* gzip comment -> HCRC_STATE */\nconst HCRC_STATE    = 103;    /* gzip header CRC -> BUSY_STATE */\nconst BUSY_STATE    = 113;    /* deflate -> FINISH_STATE */\nconst FINISH_STATE  = 666;    /* stream complete */\n\nconst BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nconst BS_BLOCK_DONE     = 2; /* block flush performed */\nconst BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nconst BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nconst OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nconst err = (strm, errorCode) => {\n  strm.msg = messages[errorCode];\n  return errorCode;\n};\n\nconst rank = (f) => {\n  return ((f) * 2) - ((f) > 4 ? 9 : 0);\n};\n\nconst zero = (buf) => {\n  let len = buf.length; while (--len >= 0) { buf[len] = 0; }\n};\n\n/* ===========================================================================\n * Slide the hash table when sliding the window down (could be avoided with 32\n * bit values at the expense of memory usage). We slide even when level == 0 to\n * keep the hash table consistent if we switch back to level > 0 later.\n */\nconst slide_hash = (s) => {\n  let n, m;\n  let p;\n  let wsize = s.w_size;\n\n  n = s.hash_size;\n  p = n;\n  do {\n    m = s.head[--p];\n    s.head[p] = (m >= wsize ? m - wsize : 0);\n  } while (--n);\n  n = wsize;\n//#ifndef FASTEST\n  p = n;\n  do {\n    m = s.prev[--p];\n    s.prev[p] = (m >= wsize ? m - wsize : 0);\n    /* If n is not on any hash chain, prev[n] is garbage but\n     * its value will never be used.\n     */\n  } while (--n);\n//#endif\n};\n\n/* eslint-disable new-cap */\nlet HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;\n// This hash causes less collisions, https://github.com/nodeca/pako/issues/135\n// But breaks binary compatibility\n//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;\nlet HASH = HASH_ZLIB;\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output, except for\n * some deflate_stored() output, goes through this function so some\n * applications may wish to modify it to avoid allocating a large\n * strm->next_out buffer and copying into it. (See also read_buf()).\n */\nconst flush_pending = (strm) => {\n  const s = strm.state;\n\n  //_tr_flush_bits(s);\n  let len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out);\n  strm.next_out  += len;\n  s.pending_out  += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending      -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n};\n\n\nconst flush_block_only = (s, last) => {\n  _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n};\n\n\nconst put_byte = (s, b) => {\n  s.pending_buf[s.pending++] = b;\n};\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nconst putShortMSB = (s, b) => {\n\n  //  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n};\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nconst read_buf = (strm, buf, start, size) => {\n\n  let len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32_1(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32_1(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n};\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nconst longest_match = (s, cur_match) => {\n\n  let chain_length = s.max_chain_length;      /* max hash chain length */\n  let scan = s.strstart; /* current string */\n  let match;                       /* matched string */\n  let len;                           /* length of current match */\n  let best_len = s.prev_length;              /* best match length so far */\n  let nice_match = s.nice_match;             /* stop if match long enough */\n  const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  const _win = s.window; // shortcut\n\n  const wmask = s.w_mask;\n  const prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  const strend = s.strstart + MAX_MATCH;\n  let scan_end1  = _win[scan + best_len - 1];\n  let scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n};\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nconst fill_window = (s) => {\n\n  const _w_size = s.w_size;\n  let n, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n      if (s.insert > s.strstart) {\n        s.insert = s.strstart;\n      }\n      slide_hash(s);\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + 1]);\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    const curr = s.strstart + s.lookahead;\n//    let init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n};\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n *\n * In case deflateParams() is used to later switch to a non-zero compression\n * level, s->matches (otherwise unused when storing) keeps track of the number\n * of hash table slides to perform. If s->matches is 1, then one hash table\n * slide will be done when switching. If s->matches is 2, the maximum value\n * allowed here, then the hash table will be cleared, since two or more slides\n * is the same as a clear.\n *\n * deflate_stored() is written to minimize the number of times an input byte is\n * copied. It is most efficient with large input and output buffers, which\n * maximizes the opportunites to have a single copy from next_in to next_out.\n */\nconst deflate_stored = (s, flush) => {\n\n  /* Smallest worthy block size when not flushing or finishing. By default\n   * this is 32K. This can be as small as 507 bytes for memLevel == 1. For\n   * large input and output buffers, the stored block size will be larger.\n   */\n  let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5;\n\n  /* Copy as many min_block or larger stored blocks directly to next_out as\n   * possible. If flushing, copy the remaining available input to next_out as\n   * stored blocks, if there is enough space.\n   */\n  let len, left, have, last = 0;\n  let used = s.strm.avail_in;\n  do {\n    /* Set len to the maximum size block that we can copy directly with the\n     * available input data and output space. Set left to how much of that\n     * would be copied from what's left in the window.\n     */\n    len = 65535/* MAX_STORED */;     /* maximum deflate stored block length */\n    have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    if (s.strm.avail_out < have) {         /* need room for header */\n      break;\n    }\n      /* maximum stored block length that will fit in avail_out: */\n    have = s.strm.avail_out - have;\n    left = s.strstart - s.block_start;  /* bytes left in window */\n    if (len > left + s.strm.avail_in) {\n      len = left + s.strm.avail_in;   /* limit len to the input */\n    }\n    if (len > have) {\n      len = have;             /* limit len to the output */\n    }\n\n    /* If the stored block would be less than min_block in length, or if\n     * unable to copy all of the available input when flushing, then try\n     * copying to the window and the pending buffer instead. Also don't\n     * write an empty block when flushing -- deflate() does that.\n     */\n    if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) ||\n                        flush === Z_NO_FLUSH$2 ||\n                        len !== left + s.strm.avail_in)) {\n      break;\n    }\n\n    /* Make a dummy stored block in pending to get the header bytes,\n     * including any pending bits. This also updates the debugging counts.\n     */\n    last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0;\n    _tr_stored_block(s, 0, 0, last);\n\n    /* Replace the lengths in the dummy stored block with len. */\n    s.pending_buf[s.pending - 4] = len;\n    s.pending_buf[s.pending - 3] = len >> 8;\n    s.pending_buf[s.pending - 2] = ~len;\n    s.pending_buf[s.pending - 1] = ~len >> 8;\n\n    /* Write the stored block header bytes. */\n    flush_pending(s.strm);\n\n//#ifdef ZLIB_DEBUG\n//    /* Update debugging counts for the data about to be copied. */\n//    s->compressed_len += len << 3;\n//    s->bits_sent += len << 3;\n//#endif\n\n    /* Copy uncompressed bytes from the window to next_out. */\n    if (left) {\n      if (left > len) {\n        left = len;\n      }\n      //zmemcpy(s->strm->next_out, s->window + s->block_start, left);\n      s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out);\n      s.strm.next_out += left;\n      s.strm.avail_out -= left;\n      s.strm.total_out += left;\n      s.block_start += left;\n      len -= left;\n    }\n\n    /* Copy uncompressed bytes directly from next_in to next_out, updating\n     * the check value.\n     */\n    if (len) {\n      read_buf(s.strm, s.strm.output, s.strm.next_out, len);\n      s.strm.next_out += len;\n      s.strm.avail_out -= len;\n      s.strm.total_out += len;\n    }\n  } while (last === 0);\n\n  /* Update the sliding window with the last s->w_size bytes of the copied\n   * data, or append all of the copied data to the existing window if less\n   * than s->w_size bytes were copied. Also update the number of bytes to\n   * insert in the hash tables, in the event that deflateParams() switches to\n   * a non-zero compression level.\n   */\n  used -= s.strm.avail_in;    /* number of input bytes directly copied */\n  if (used) {\n    /* If any input was used, then no unused input remains in the window,\n     * therefore s->block_start == s->strstart.\n     */\n    if (used >= s.w_size) {  /* supplant the previous history */\n      s.matches = 2;     /* clear hash */\n      //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0);\n      s.strstart = s.w_size;\n      s.insert = s.strstart;\n    }\n    else {\n      if (s.window_size - s.strstart <= used) {\n        /* Slide the window down. */\n        s.strstart -= s.w_size;\n        //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n        s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n        if (s.matches < 2) {\n          s.matches++;   /* add a pending slide_hash() */\n        }\n        if (s.insert > s.strstart) {\n          s.insert = s.strstart;\n        }\n      }\n      //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);\n      s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart);\n      s.strstart += used;\n      s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used;\n    }\n    s.block_start = s.strstart;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* If the last block was written to next_out, then done. */\n  if (last) {\n    return BS_FINISH_DONE;\n  }\n\n  /* If flushing and all input has been consumed, then done. */\n  if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 &&\n    s.strm.avail_in === 0 && s.strstart === s.block_start) {\n    return BS_BLOCK_DONE;\n  }\n\n  /* Fill the window with any remaining input. */\n  have = s.window_size - s.strstart;\n  if (s.strm.avail_in > have && s.block_start >= s.w_size) {\n    /* Slide the window down. */\n    s.block_start -= s.w_size;\n    s.strstart -= s.w_size;\n    //zmemcpy(s->window, s->window + s->w_size, s->strstart);\n    s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0);\n    if (s.matches < 2) {\n      s.matches++;       /* add a pending slide_hash() */\n    }\n    have += s.w_size;      /* more space now */\n    if (s.insert > s.strstart) {\n      s.insert = s.strstart;\n    }\n  }\n  if (have > s.strm.avail_in) {\n    have = s.strm.avail_in;\n  }\n  if (have) {\n    read_buf(s.strm, s.window, s.strstart, have);\n    s.strstart += have;\n    s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have;\n  }\n  if (s.high_water < s.strstart) {\n    s.high_water = s.strstart;\n  }\n\n  /* There was not enough avail_out to write a complete worthy or flushed\n   * stored block to next_out. Write a stored block to pending instead, if we\n   * have enough input for a worthy block, or if flushing and there is enough\n   * room for the remaining input as a stored block in the pending buffer.\n   */\n  have = (s.bi_valid + 42) >> 3;     /* number of header bytes */\n    /* maximum stored block length that will fit in pending: */\n  have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have;\n  min_block = have > s.w_size ? s.w_size : have;\n  left = s.strstart - s.block_start;\n  if (left >= min_block ||\n     ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 &&\n     s.strm.avail_in === 0 && left <= have)) {\n    len = left > have ? have : left;\n    last = flush === Z_FINISH$3 && s.strm.avail_in === 0 &&\n         len === left ? 1 : 0;\n    _tr_stored_block(s, s.block_start, len, last);\n    s.block_start += len;\n    flush_pending(s.strm);\n  }\n\n  /* We've done all we can with the available input and output. */\n  return last ? BS_FINISH_STARTED : BS_NEED_MORE;\n};\n\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nconst deflate_fast = (s, flush) => {\n\n  let hash_head;        /* head of the hash chain */\n  let bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nconst deflate_slow = (s, flush) => {\n\n  let hash_head;          /* head of hash chain */\n  let bflush;              /* set if current block must be flushed */\n\n  let max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n};\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nconst deflate_rle = (s, flush) => {\n\n  let bflush;            /* set if current block must be flushed */\n  let prev;              /* byte at distance one to match */\n  let scan, strend;      /* scan goes up to strend for length of run */\n\n  const _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = _tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nconst deflate_huff = (s, flush) => {\n\n  let bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH$2) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = _tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH$3) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.sym_next) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n};\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nconst configuration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nconst lm_init = (s) => {\n\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n};\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED$2; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new Uint16Array(HEAP_SIZE * 2);\n  this.dyn_dtree  = new Uint16Array((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new Uint16Array((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new Uint16Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new Uint16Array(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.sym_buf = 0;        /* buffer for distances and literals/lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.sym_next = 0;      /* running index in sym_buf */\n  this.sym_end = 0;       /* symbol table full when sym_next reaches this */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\n/* =========================================================================\n * Check for a valid deflate stream state. Return 0 if ok, 1 if not.\n */\nconst deflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const s = strm.state;\n  if (!s || s.strm !== strm || (s.status !== INIT_STATE &&\n//#ifdef GZIP\n                                s.status !== GZIP_STATE &&\n//#endif\n                                s.status !== EXTRA_STATE &&\n                                s.status !== NAME_STATE &&\n                                s.status !== COMMENT_STATE &&\n                                s.status !== HCRC_STATE &&\n                                s.status !== BUSY_STATE &&\n                                s.status !== FINISH_STATE)) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst deflateResetKeep = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  const s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status =\n//#ifdef GZIP\n    s.wrap === 2 ? GZIP_STATE :\n//#endif\n    s.wrap ? INIT_STATE : BUSY_STATE;\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = -2;\n  _tr_init(s);\n  return Z_OK$3;\n};\n\n\nconst deflateReset = (strm) => {\n\n  const ret = deflateResetKeep(strm);\n  if (ret === Z_OK$3) {\n    lm_init(strm.state);\n  }\n  return ret;\n};\n\n\nconst deflateSetHeader = (strm, head) => {\n\n  if (deflateStateCheck(strm) || strm.state.wrap !== 2) {\n    return Z_STREAM_ERROR$2;\n  }\n  strm.state.gzhead = head;\n  return Z_OK$3;\n};\n\n\nconst deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {\n\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR$2;\n  }\n  let wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION$1) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) {\n    return err(strm, Z_STREAM_ERROR$2);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  const s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n  s.status = INIT_STATE;     /* to pass state test in deflateReset() */\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new Uint8Array(s.w_size * 2);\n  s.head = new Uint16Array(s.hash_size);\n  s.prev = new Uint16Array(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  /* We overlay pending_buf and sym_buf. This works since the average size\n   * for length/distance pairs over any compressed block is assured to be 31\n   * bits or less.\n   *\n   * Analysis: The longest fixed codes are a length code of 8 bits plus 5\n   * extra bits, for lengths 131 to 257. The longest fixed distance codes are\n   * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest\n   * possible fixed-codes length/distance pair is then 31 bits total.\n   *\n   * sym_buf starts one-fourth of the way into pending_buf. So there are\n   * three bytes in sym_buf for every four bytes in pending_buf. Each symbol\n   * in sym_buf is three bytes -- two for the distance and one for the\n   * literal/length. As each symbol is consumed, the pointer to the next\n   * sym_buf value to read moves forward three bytes. From that symbol, up to\n   * 31 bits are written to pending_buf. The closest the written pending_buf\n   * bits gets to the next sym_buf symbol to read is just before the last\n   * code is written. At that time, 31*(n-2) bits have been written, just\n   * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at\n   * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1\n   * symbols are written.) The closest the writing gets to what is unread is\n   * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and\n   * can range from 128 to 32768.\n   *\n   * Therefore, at a minimum, there are 142 bits of space between what is\n   * written and what is read in the overlain buffers, so the symbols cannot\n   * be overwritten by the compressed data. That space is actually 139 bits,\n   * due to the three-bit fixed-code block header.\n   *\n   * That covers the case where either Z_FIXED is specified, forcing fixed\n   * codes, or when the use of fixed codes is chosen, because that choice\n   * results in a smaller compressed block than dynamic codes. That latter\n   * condition then assures that the above analysis also covers all dynamic\n   * blocks. A dynamic-code block will only be chosen to be emitted if it has\n   * fewer bits than a fixed-code block would for the same set of symbols.\n   * Therefore its average symbol length is assured to be less than 31. So\n   * the compressed data for a dynamic block also cannot overwrite the\n   * symbols from which it is being constructed.\n   */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n  s.pending_buf = new Uint8Array(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->sym_buf = s->pending_buf + s->lit_bufsize;\n  s.sym_buf = s.lit_bufsize;\n\n  //s->sym_end = (s->lit_bufsize - 1) * 3;\n  s.sym_end = (s.lit_bufsize - 1) * 3;\n  /* We avoid equality with lit_bufsize*3 because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n};\n\nconst deflateInit = (strm, level) => {\n\n  return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1);\n};\n\n\n/* ========================================================================= */\nconst deflate$2 = (strm, flush) => {\n\n  if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n\n  if (!strm.output ||\n      (strm.avail_in !== 0 && !strm.input) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);\n  }\n\n  const old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH$3) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR$1);\n  }\n\n  /* Write the header */\n  if (s.status === INIT_STATE && s.wrap === 0) {\n    s.status = BUSY_STATE;\n  }\n  if (s.status === INIT_STATE) {\n    /* zlib header */\n    let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8;\n    let level_flags = -1;\n\n    if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n      level_flags = 0;\n    } else if (s.level < 6) {\n      level_flags = 1;\n    } else if (s.level === 6) {\n      level_flags = 2;\n    } else {\n      level_flags = 3;\n    }\n    header |= (level_flags << 6);\n    if (s.strstart !== 0) { header |= PRESET_DICT; }\n    header += 31 - (header % 31);\n\n    putShortMSB(s, header);\n\n    /* Save the adler32 of the preset dictionary: */\n    if (s.strstart !== 0) {\n      putShortMSB(s, strm.adler >>> 16);\n      putShortMSB(s, strm.adler & 0xffff);\n    }\n    strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#ifdef GZIP\n  if (s.status === GZIP_STATE) {\n    /* gzip header */\n    strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n    put_byte(s, 31);\n    put_byte(s, 139);\n    put_byte(s, 8);\n    if (!s.gzhead) { // s->gzhead == Z_NULL\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, 0);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, OS_CODE);\n      s.status = BUSY_STATE;\n\n      /* Compression must start with an empty pending buffer */\n      flush_pending(strm);\n      if (s.pending !== 0) {\n        s.last_flush = -1;\n        return Z_OK$3;\n      }\n    }\n    else {\n      put_byte(s, (s.gzhead.text ? 1 : 0) +\n                  (s.gzhead.hcrc ? 2 : 0) +\n                  (!s.gzhead.extra ? 0 : 4) +\n                  (!s.gzhead.name ? 0 : 8) +\n                  (!s.gzhead.comment ? 0 : 16)\n      );\n      put_byte(s, s.gzhead.time & 0xff);\n      put_byte(s, (s.gzhead.time >> 8) & 0xff);\n      put_byte(s, (s.gzhead.time >> 16) & 0xff);\n      put_byte(s, (s.gzhead.time >> 24) & 0xff);\n      put_byte(s, s.level === 9 ? 2 :\n                  (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                   4 : 0));\n      put_byte(s, s.gzhead.os & 0xff);\n      if (s.gzhead.extra && s.gzhead.extra.length) {\n        put_byte(s, s.gzhead.extra.length & 0xff);\n        put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n      }\n      if (s.gzhead.hcrc) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0);\n      }\n      s.gzindex = 0;\n      s.status = EXTRA_STATE;\n    }\n  }\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let left = (s.gzhead.extra.length & 0xffff) - s.gzindex;\n      while (s.pending + left > s.pending_buf_size) {\n        let copy = s.pending_buf_size - s.pending;\n        // zmemcpy(s.pending_buf + s.pending,\n        //    s.gzhead.extra + s.gzindex, copy);\n        s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending);\n        s.pending = s.pending_buf_size;\n        //--- HCRC_UPDATE(beg) ---//\n        if (s.gzhead.hcrc && s.pending > beg) {\n          strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n        }\n        //---//\n        s.gzindex += copy;\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n        beg = 0;\n        left -= copy;\n      }\n      // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility\n      //              TypedArray.slice and TypedArray.from don't exist in IE10-IE11\n      let gzhead_extra = new Uint8Array(s.gzhead.extra);\n      // zmemcpy(s->pending_buf + s->pending,\n      //     s->gzhead->extra + s->gzindex, left);\n      s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending);\n      s.pending += left;\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = NAME_STATE;\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n      s.gzindex = 0;\n    }\n    s.status = COMMENT_STATE;\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      let beg = s.pending;   /* start of bytes to update crc */\n      let val;\n      do {\n        if (s.pending === s.pending_buf_size) {\n          //--- HCRC_UPDATE(beg) ---//\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          //---//\n          flush_pending(strm);\n          if (s.pending !== 0) {\n            s.last_flush = -1;\n            return Z_OK$3;\n          }\n          beg = 0;\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n      //--- HCRC_UPDATE(beg) ---//\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      //---//\n    }\n    s.status = HCRC_STATE;\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n        if (s.pending !== 0) {\n          s.last_flush = -1;\n          return Z_OK$3;\n        }\n      }\n      put_byte(s, strm.adler & 0xff);\n      put_byte(s, (strm.adler >> 8) & 0xff);\n      strm.adler = 0; //crc32(0L, Z_NULL, 0);\n    }\n    s.status = BUSY_STATE;\n\n    /* Compression must start with an empty pending buffer */\n    flush_pending(strm);\n    if (s.pending !== 0) {\n      s.last_flush = -1;\n      return Z_OK$3;\n    }\n  }\n//#endif\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) {\n    let bstate = s.level === 0 ? deflate_stored(s, flush) :\n                 s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\n                 s.strategy === Z_RLE ? deflate_rle(s, flush) :\n                 configuration_table[s.level].func(s, flush);\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK$3;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        _tr_align(s);\n      }\n      else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        _tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH$1) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK$3;\n      }\n    }\n  }\n\n  if (flush !== Z_FINISH$3) { return Z_OK$3; }\n  if (s.wrap <= 0) { return Z_STREAM_END$3; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3;\n};\n\n\nconst deflateEnd = (strm) => {\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const status = strm.state.status;\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3;\n};\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nconst deflateSetDictionary = (strm, dictionary) => {\n\n  let dictLength = dictionary.length;\n\n  if (deflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  const s = strm.state;\n  const wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR$2;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    let tmpDict = new Uint8Array(s.w_size);\n    tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  const avail = strm.avail_in;\n  const next = strm.next_in;\n  const input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    let str = s.strstart;\n    let n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK$3;\n};\n\n\nvar deflateInit_1 = deflateInit;\nvar deflateInit2_1 = deflateInit2;\nvar deflateReset_1 = deflateReset;\nvar deflateResetKeep_1 = deflateResetKeep;\nvar deflateSetHeader_1 = deflateSetHeader;\nvar deflate_2$1 = deflate$2;\nvar deflateEnd_1 = deflateEnd;\nvar deflateSetDictionary_1 = deflateSetDictionary;\nvar deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.deflateBound = deflateBound;\nmodule.exports.deflateCopy = deflateCopy;\nmodule.exports.deflateGetDictionary = deflateGetDictionary;\nmodule.exports.deflateParams = deflateParams;\nmodule.exports.deflatePending = deflatePending;\nmodule.exports.deflatePrime = deflatePrime;\nmodule.exports.deflateTune = deflateTune;\n*/\n\nvar deflate_1$2 = {\n\tdeflateInit: deflateInit_1,\n\tdeflateInit2: deflateInit2_1,\n\tdeflateReset: deflateReset_1,\n\tdeflateResetKeep: deflateResetKeep_1,\n\tdeflateSetHeader: deflateSetHeader_1,\n\tdeflate: deflate_2$1,\n\tdeflateEnd: deflateEnd_1,\n\tdeflateSetDictionary: deflateSetDictionary_1,\n\tdeflateInfo: deflateInfo\n};\n\nconst _has = (obj, key) => {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n};\n\nvar assign = function (obj /*from1, from2, from3, ...*/) {\n  const sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    const source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (const p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// Join array of chunks to single array.\nvar flattenChunks = (chunks) => {\n  // calculate data length\n  let len = 0;\n\n  for (let i = 0, l = chunks.length; i < l; i++) {\n    len += chunks[i].length;\n  }\n\n  // join chunks\n  const result = new Uint8Array(len);\n\n  for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n    let chunk = chunks[i];\n    result.set(chunk, pos);\n    pos += chunk.length;\n  }\n\n  return result;\n};\n\nvar common = {\n\tassign: assign,\n\tflattenChunks: flattenChunks\n};\n\n// String encode/decode helpers\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nlet STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nconst _utf8len = new Uint8Array(256);\nfor (let q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nvar string2buf = (str) => {\n  if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n    return new TextEncoder().encode(str);\n  }\n\n  let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new Uint8Array(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper\nconst buf2binstring = (buf, len) => {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if (buf.subarray && STR_APPLY_UIA_OK) {\n      return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n    }\n  }\n\n  let result = '';\n  for (let i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n};\n\n\n// convert array to string\nvar buf2string = (buf, max) => {\n  const len = max || buf.length;\n\n  if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n    return new TextDecoder().decode(buf.subarray(0, max));\n  }\n\n  let i, out;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  const utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    let c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    let c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = (buf, max) => {\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  let pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\nvar strings = {\n\tstring2buf: string2buf,\n\tbuf2string: buf2string,\n\tutf8border: utf8border\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nvar zstream = ZStream;\n\nconst toString$1 = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2,\n  Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2,\n  Z_DEFAULT_COMPRESSION,\n  Z_DEFAULT_STRATEGY,\n  Z_DEFLATED: Z_DEFLATED$1\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n *   , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate$1(options) {\n  this.options = common.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED$1,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY\n  }, options || {});\n\n  let opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new zstream();\n  this.strm.avail_out = 0;\n\n  let status = deflate_1$2.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK$2) {\n    throw new Error(messages[status]);\n  }\n\n  if (opt.header) {\n    deflate_1$2.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    let dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = deflate_1$2.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK$2) {\n      throw new Error(messages[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must\n * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending\n * buffers and call [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  let status, _flush_mode;\n\n  if (this.ended) { return false; }\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1;\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString$1.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    // Make sure avail_out > 6 to avoid repeating markers\n    if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    status = deflate_1$2.deflate(strm, _flush_mode);\n\n    // Ended => flush and finish\n    if (status === Z_STREAM_END$2) {\n      if (strm.next_out > 0) {\n        this.onData(strm.output.subarray(0, strm.next_out));\n      }\n      status = deflate_1$2.deflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return status === Z_OK$2;\n    }\n\n    // Flush if out buffer full\n    if (strm.avail_out === 0) {\n      this.onData(strm.output);\n      continue;\n    }\n\n    // Flush if requested and has data\n    if (_flush_mode > 0 && strm.next_out > 0) {\n      this.onData(strm.output.subarray(0, strm.next_out));\n      strm.avail_out = 0;\n      continue;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array): output data.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK$2) {\n    this.result = common.flattenChunks(this.chunks);\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate$1(input, options) {\n  const deflator = new Deflate$1(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || messages[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate$1(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array\n * - data (Uint8Array|ArrayBuffer|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip$1(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate$1(input, options);\n}\n\n\nvar Deflate_1$1 = Deflate$1;\nvar deflate_2 = deflate$1;\nvar deflateRaw_1$1 = deflateRaw$1;\nvar gzip_1$1 = gzip$1;\nvar constants$1 = constants$2;\n\nvar deflate_1$1 = {\n\tDeflate: Deflate_1$1,\n\tdeflate: deflate_2,\n\tdeflateRaw: deflateRaw_1$1,\n\tgzip: gzip_1$1,\n\tconstants: constants$1\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nconst BAD$1 = 16209;       /* got a data error -- remain here until reset */\nconst TYPE$1 = 16191;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nvar inffast = function inflate_fast(strm, start) {\n  let _in;                    /* local strm.input */\n  let last;                   /* have enough input while in < last */\n  let _out;                   /* local strm.output */\n  let beg;                    /* inflate()'s initial strm.output */\n  let end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  let dmax;                   /* maximum distance from zlib header */\n//#endif\n  let wsize;                  /* window size or zero if not using window */\n  let whave;                  /* valid bytes in the window */\n  let wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  let s_window;               /* allocated sliding window, if wsize != 0 */\n  let hold;                   /* local strm.hold */\n  let bits;                   /* local strm.bits */\n  let lcode;                  /* local strm.lencode */\n  let dcode;                  /* local strm.distcode */\n  let lmask;                  /* mask for first level of length codes */\n  let dmask;                  /* mask for first level of distance codes */\n  let here;                   /* retrieved table entry */\n  let op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  let len;                    /* match length, unused bytes */\n  let dist;                   /* match distance */\n  let from;                   /* where to copy match from */\n  let from_source;\n\n\n  let input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  const state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD$1;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD$1;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD$1;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE$1;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD$1;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst MAXBITS = 15;\nconst ENOUGH_LENS$1 = 852;\nconst ENOUGH_DISTS$1 = 592;\n//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst CODES$1 = 0;\nconst LENS$1 = 1;\nconst DISTS$1 = 2;\n\nconst lbase = new Uint16Array([ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n]);\n\nconst lext = new Uint8Array([ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n]);\n\nconst dbase = new Uint16Array([ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n]);\n\nconst dext = new Uint8Array([ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n]);\n\nconst inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n{\n  const bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  let len = 0;               /* a code's length in bits */\n  let sym = 0;               /* index of code symbols */\n  let min = 0, max = 0;          /* minimum and maximum code lengths */\n  let root = 0;              /* number of index bits for root table */\n  let curr = 0;              /* number of index bits for current table */\n  let drop = 0;              /* code bits to drop for sub-table */\n  let left = 0;                   /* number of prefix codes available */\n  let used = 0;              /* code entries in table used */\n  let huff = 0;              /* Huffman code */\n  let incr;              /* for incrementing code, index */\n  let fill;              /* index for replicating entries */\n  let low;               /* low bits for current root entry */\n  let mask;              /* mask for low root bits */\n  let next;             /* next available space in table */\n  let base = null;     /* base value table to use */\n//  let shoextra;    /* extra bits table to use */\n  let match;                  /* use base and extra for symbol >= match */\n  const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  let extra = null;\n\n  let here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES$1 || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES$1) {\n    base = extra = work;    /* dummy value--not used */\n    match = 20;\n\n  } else if (type === LENS$1) {\n    base = lbase;\n    extra = lext;\n    match = 257;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    match = 0;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n    (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] + 1 < match) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] >= match) {\n      here_op = extra[work[sym] - match];\n      here_val = base[work[sym] - match];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n        (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n\nvar inftrees = inflate_table;\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\nconst CODES = 0;\nconst LENS = 1;\nconst DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n  Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n  Z_DEFLATED\n} = constants$2;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nconst    HEAD = 16180;       /* i: waiting for magic header */\nconst    FLAGS = 16181;      /* i: waiting for method and flags (gzip) */\nconst    TIME = 16182;       /* i: waiting for modification time (gzip) */\nconst    OS = 16183;         /* i: waiting for extra flags and operating system (gzip) */\nconst    EXLEN = 16184;      /* i: waiting for extra length (gzip) */\nconst    EXTRA = 16185;      /* i: waiting for extra bytes (gzip) */\nconst    NAME = 16186;       /* i: waiting for end of file name (gzip) */\nconst    COMMENT = 16187;    /* i: waiting for end of comment (gzip) */\nconst    HCRC = 16188;       /* i: waiting for header crc (gzip) */\nconst    DICTID = 16189;    /* i: waiting for dictionary check value */\nconst    DICT = 16190;      /* waiting for inflateSetDictionary() call */\nconst        TYPE = 16191;      /* i: waiting for type bits, including last-flag bit */\nconst        TYPEDO = 16192;    /* i: same, but skip check to exit inflate on new block */\nconst        STORED = 16193;    /* i: waiting for stored size (length and complement) */\nconst        COPY_ = 16194;     /* i/o: same as COPY below, but only first time in */\nconst        COPY = 16195;      /* i/o: waiting for input or output to copy stored block */\nconst        TABLE = 16196;     /* i: waiting for dynamic block table lengths */\nconst        LENLENS = 16197;   /* i: waiting for code length code lengths */\nconst        CODELENS = 16198;  /* i: waiting for length/lit and distance code lengths */\nconst            LEN_ = 16199;      /* i: same as LEN below, but only first time in */\nconst            LEN = 16200;       /* i: waiting for length/lit/eob code */\nconst            LENEXT = 16201;    /* i: waiting for length extra bits */\nconst            DIST = 16202;      /* i: waiting for distance code */\nconst            DISTEXT = 16203;   /* i: waiting for distance extra bits */\nconst            MATCH = 16204;     /* o: waiting for output space to copy string */\nconst            LIT = 16205;       /* o: waiting for output space to write literal */\nconst    CHECK = 16206;     /* i: waiting for 32-bit check value */\nconst    LENGTH = 16207;    /* i: waiting for 32-bit length (gzip) */\nconst    DONE = 16208;      /* finished check, done -- remain here until reset */\nconst    BAD = 16209;       /* got a data error -- remain here until reset */\nconst    MEM = 16210;       /* got an inflate() memory error -- remain here until reset */\nconst    SYNC = 16211;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nconst ENOUGH_LENS = 852;\nconst ENOUGH_DISTS = 592;\n//const ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nconst MAX_WBITS = 15;\n/* 32K LZ77 window */\nconst DEF_WBITS = MAX_WBITS;\n\n\nconst zswap32 = (q) => {\n\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n};\n\n\nfunction InflateState() {\n  this.strm = null;           /* pointer back to this zlib stream */\n  this.mode = 0;              /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip,\n                                 bit 2 true to validate check value */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib), or\n                                 -1 if raw or no header yet */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n  this.work = new Uint16Array(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new Int32Array(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\n\nconst inflateStateCheck = (strm) => {\n\n  if (!strm) {\n    return 1;\n  }\n  const state = strm.state;\n  if (!state || state.strm !== strm ||\n    state.mode < HEAD || state.mode > SYNC) {\n    return 1;\n  }\n  return 0;\n};\n\n\nconst inflateResetKeep = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.flags = -1;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n  state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK$1;\n};\n\n\nconst inflateReset = (strm) => {\n\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n};\n\n\nconst inflateReset2 = (strm, windowBits) => {\n  let wrap;\n\n  /* get the state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 5;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR$1;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n};\n\n\nconst inflateInit2 = (strm, windowBits) => {\n\n  if (!strm) { return Z_STREAM_ERROR$1; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  const state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.strm = strm;\n  state.window = null/*Z_NULL*/;\n  state.mode = HEAD;     /* to pass state test in inflateReset2() */\n  const ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK$1) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n};\n\n\nconst inflateInit = (strm) => {\n\n  return inflateInit2(strm, DEF_WBITS);\n};\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nlet virgin = true;\n\nlet lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\nconst fixedtables = (state) => {\n\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    lenfix = new Int32Array(512);\n    distfix = new Int32Array(32);\n\n    /* literal/length table */\n    let sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inftrees(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inftrees(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n};\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nconst updatewindow = (strm, src, end, copy) => {\n\n  let dist;\n  const state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new Uint8Array(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    state.window.set(src.subarray(end - state.wsize, end), 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      state.window.set(src.subarray(end - copy, end), 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n};\n\n\nconst inflate$2 = (strm, flush) => {\n\n  let state;\n  let input, output;          // input/output buffers\n  let next;                   /* next input INDEX */\n  let put;                    /* next output INDEX */\n  let have, left;             /* available input and output */\n  let hold;                   /* bit buffer */\n  let bits;                   /* bits in bit buffer */\n  let _in, _out;              /* save starting available input and output */\n  let copy;                   /* number of stored or match bytes to copy */\n  let from;                   /* where to copy match bytes from */\n  let from_source;\n  let here = 0;               /* current decoding table entry */\n  let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //let last;                   /* parent table entry */\n  let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  let len;                    /* length to copy for repeats, bits to drop */\n  let ret;                    /* return code */\n  const hbuf = new Uint8Array(4);    /* buffer for gzip header crc calculation */\n  let opts;\n\n  let n; // temporary variable for NEED_BITS\n\n  const order = /* permutation of code lengths */\n    new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n  if (inflateStateCheck(strm) || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK$1;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          if (state.wbits === 0) {\n            state.wbits = 15;\n          }\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        if (len > 15 || len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n\n        // !!! pako patch. Force use `options.windowBits` if passed.\n        // Required to always use max window size by default.\n        state.dmax = 1 << state.wbits;\n        //state.dmax = 1 << len;\n\n        state.flags = 0;               /* indicate zlib header */\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if ((state.flags & 0x0200) && (state.wrap & 4)) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32_1(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32_1(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Uint8Array(state.head.extra_len);\n              }\n              state.head.extra.set(\n                input.subarray(\n                  next,\n                  // extra field is limited to 65536 bytes\n                  // - no need for additional size check\n                  next + copy\n                ),\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if ((state.flags & 0x0200) && (state.wrap & 4)) {\n              state.check = crc32_1(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if ((state.flags & 0x0200) && (state.wrap & 4)) {\n            state.check = crc32_1(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT$1;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          output.set(input.subarray(next, next + copy), put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inffast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if ((state.wrap & 4) && _out) {\n            strm.adler = state.check =\n                /*UPDATE_CHECK(state.check, put - _out, _out);*/\n                (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END$1;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR$1;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR$1;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR$1;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH$1))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if ((state.wrap & 4) && _out) {\n    strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n};\n\n\nconst inflateEnd = (strm) => {\n\n  if (inflateStateCheck(strm)) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  let state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK$1;\n};\n\n\nconst inflateGetHeader = (strm, head) => {\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  const state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK$1;\n};\n\n\nconst inflateSetDictionary = (strm, dictionary) => {\n  const dictLength = dictionary.length;\n\n  let state;\n  let dictid;\n  let ret;\n\n  /* check state */\n  if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR$1;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32_1(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR$1;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR$1;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK$1;\n};\n\n\nvar inflateReset_1 = inflateReset;\nvar inflateReset2_1 = inflateReset2;\nvar inflateResetKeep_1 = inflateResetKeep;\nvar inflateInit_1 = inflateInit;\nvar inflateInit2_1 = inflateInit2;\nvar inflate_2$1 = inflate$2;\nvar inflateEnd_1 = inflateEnd;\nvar inflateGetHeader_1 = inflateGetHeader;\nvar inflateSetDictionary_1 = inflateSetDictionary;\nvar inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nmodule.exports.inflateCodesUsed = inflateCodesUsed;\nmodule.exports.inflateCopy = inflateCopy;\nmodule.exports.inflateGetDictionary = inflateGetDictionary;\nmodule.exports.inflateMark = inflateMark;\nmodule.exports.inflatePrime = inflatePrime;\nmodule.exports.inflateSync = inflateSync;\nmodule.exports.inflateSyncPoint = inflateSyncPoint;\nmodule.exports.inflateUndermine = inflateUndermine;\nmodule.exports.inflateValidate = inflateValidate;\n*/\n\nvar inflate_1$2 = {\n\tinflateReset: inflateReset_1,\n\tinflateReset2: inflateReset2_1,\n\tinflateResetKeep: inflateResetKeep_1,\n\tinflateInit: inflateInit_1,\n\tinflateInit2: inflateInit2_1,\n\tinflate: inflate_2$1,\n\tinflateEnd: inflateEnd_1,\n\tinflateGetHeader: inflateGetHeader_1,\n\tinflateSetDictionary: inflateSetDictionary_1,\n\tinflateInfo: inflateInfo\n};\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nvar gzheader = GZheader;\n\nconst toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nconst {\n  Z_NO_FLUSH, Z_FINISH,\n  Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n} = constants$2;\n\n/* ===========================================================================*/\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate$1(options) {\n  this.options = common.assign({\n    chunkSize: 1024 * 64,\n    windowBits: 15,\n    to: ''\n  }, options || {});\n\n  const opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new zstream();\n  this.strm.avail_out = 0;\n\n  let status  = inflate_1$2.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(messages[status]);\n  }\n\n  this.header = new gzheader();\n\n  inflate_1$2.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== Z_OK) {\n        throw new Error(messages[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n *   flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n *   `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate$1.prototype.push = function (data, flush_mode) {\n  const strm = this.strm;\n  const chunkSize = this.options.chunkSize;\n  const dictionary = this.options.dictionary;\n  let status, _flush_mode, last_avail_out;\n\n  if (this.ended) return false;\n\n  if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n  else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n  // Convert data if needed\n  if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  for (;;) {\n    if (strm.avail_out === 0) {\n      strm.output = new Uint8Array(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = inflate_1$2.inflate(strm, _flush_mode);\n\n    if (status === Z_NEED_DICT && dictionary) {\n      status = inflate_1$2.inflateSetDictionary(strm, dictionary);\n\n      if (status === Z_OK) {\n        status = inflate_1$2.inflate(strm, _flush_mode);\n      } else if (status === Z_DATA_ERROR) {\n        // Replace code with more verbose\n        status = Z_NEED_DICT;\n      }\n    }\n\n    // Skip snyc markers if more data follows and not raw mode\n    while (strm.avail_in > 0 &&\n           status === Z_STREAM_END &&\n           strm.state.wrap > 0 &&\n           data[strm.next_in] !== 0)\n    {\n      inflate_1$2.inflateReset(strm);\n      status = inflate_1$2.inflate(strm, _flush_mode);\n    }\n\n    switch (status) {\n      case Z_STREAM_ERROR:\n      case Z_DATA_ERROR:\n      case Z_NEED_DICT:\n      case Z_MEM_ERROR:\n        this.onEnd(status);\n        this.ended = true;\n        return false;\n    }\n\n    // Remember real `avail_out` value, because we may patch out buffer content\n    // to align utf8 strings boundaries.\n    last_avail_out = strm.avail_out;\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n        if (this.options.to === 'string') {\n\n          let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          let tail = strm.next_out - next_out_utf8;\n          let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail & realign counters\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n        }\n      }\n    }\n\n    // Must repeat iteration if out buffer is full\n    if (status === Z_OK && last_avail_out === 0) continue;\n\n    // Finalize if end of stream reached.\n    if (status === Z_STREAM_END) {\n      status = inflate_1$2.inflateEnd(this.strm);\n      this.onEnd(status);\n      this.ended = true;\n      return true;\n    }\n\n    if (strm.avail_in === 0) break;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n *   each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate$1.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate$1.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = common.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err) {\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate$1(input, options) {\n  const inflator = new Inflate$1(options);\n\n  inflator.push(input);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw$1(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate$1(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array|ArrayBuffer): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nvar Inflate_1$1 = Inflate$1;\nvar inflate_2 = inflate$1;\nvar inflateRaw_1$1 = inflateRaw$1;\nvar ungzip$1 = inflate$1;\nvar constants = constants$2;\n\nvar inflate_1$1 = {\n\tInflate: Inflate_1$1,\n\tinflate: inflate_2,\n\tinflateRaw: inflateRaw_1$1,\n\tungzip: ungzip$1,\n\tconstants: constants\n};\n\nconst { Deflate, deflate, deflateRaw, gzip } = deflate_1$1;\n\nconst { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1;\n\n\n\nvar Deflate_1 = Deflate;\nvar deflate_1 = deflate;\nvar deflateRaw_1 = deflateRaw;\nvar gzip_1 = gzip;\nvar Inflate_1 = Inflate;\nvar inflate_1 = inflate;\nvar inflateRaw_1 = inflateRaw;\nvar ungzip_1 = ungzip;\nvar constants_1 = constants$2;\n\nvar pako = {\n\tDeflate: Deflate_1,\n\tdeflate: deflate_1,\n\tdeflateRaw: deflateRaw_1,\n\tgzip: gzip_1,\n\tInflate: Inflate_1,\n\tinflate: inflate_1,\n\tinflateRaw: inflateRaw_1,\n\tungzip: ungzip_1,\n\tconstants: constants_1\n};\n\nexport { Deflate_1 as Deflate, Inflate_1 as Inflate, constants_1 as constants, pako as default, deflate_1 as deflate, deflateRaw_1 as deflateRaw, gzip_1 as gzip, inflate_1 as inflate, inflateRaw_1 as inflateRaw, ungzip_1 as ungzip };\n","// based on https://github.com/jpeg-js/jpeg-js\r\n/*\r\n   Copyright 2011 notmasteryet\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n*/\r\nvar dctZigZag = new Int32Array([\r\n    0,\r\n    1, 8,\r\n    16, 9, 2,\r\n    3, 10, 17, 24,\r\n    32, 25, 18, 11, 4,\r\n    5, 12, 19, 26, 33, 40,\r\n    48, 41, 34, 27, 20, 13, 6,\r\n    7, 14, 21, 28, 35, 42, 49, 56,\r\n    57, 50, 43, 36, 29, 22, 15,\r\n    23, 30, 37, 44, 51, 58,\r\n    59, 52, 45, 38, 31,\r\n    39, 46, 53, 60,\r\n    61, 54, 47,\r\n    55, 62,\r\n    63\r\n]);\r\nvar dctCos1 = 4017; // cos(pi/16)\r\nvar dctSin1 = 799; // sin(pi/16)\r\nvar dctCos3 = 3406; // cos(3*pi/16)\r\nvar dctSin3 = 2276; // sin(3*pi/16)\r\nvar dctCos6 = 1567; // cos(6*pi/16)\r\nvar dctSin6 = 3784; // sin(6*pi/16)\r\nvar dctSqrt2 = 5793; // sqrt(2)\r\nvar dctSqrt1d2 = 2896; // sqrt(2) / 2\r\nvar maxResolutionInMP = 100; // Don't decode more than 100 megapixels\r\nvar maxMemoryUsageBytes = 64 * 1024 * 1024; // Don't decode if memory footprint is more than 64MB\r\nvar totalBytesAllocated = 0; // avoid unexpected OOMs from untrusted content.\r\nfunction requestMemoryAllocation(increaseAmount) {\r\n    var totalMemoryImpactBytes = totalBytesAllocated + increaseAmount;\r\n    if (totalMemoryImpactBytes > maxMemoryUsageBytes) {\r\n        var exceededAmount = Math.ceil((totalMemoryImpactBytes - maxMemoryUsageBytes) / 1024 / 1024);\r\n        throw new Error(\"Max memory limit exceeded by at least \".concat(exceededAmount, \"MB\"));\r\n    }\r\n    totalBytesAllocated = totalMemoryImpactBytes;\r\n}\r\nfunction buildHuffmanTable(codeLengths, values) {\r\n    var length = 16;\r\n    while (length > 0 && !codeLengths[length - 1])\r\n        length--;\r\n    var code = [{ children: [], index: 0 }];\r\n    var k = 0;\r\n    var p = code[0];\r\n    for (var i = 0; i < length; i++) {\r\n        for (var j = 0; j < codeLengths[i]; j++) {\r\n            p = code.pop();\r\n            p.children[p.index] = values[k];\r\n            while (p.index > 0) {\r\n                if (code.length === 0)\r\n                    throw new Error('Could not recreate Huffman Table');\r\n                p = code.pop();\r\n            }\r\n            p.index++;\r\n            code.push(p);\r\n            while (code.length <= i) {\r\n                var q = { children: [], index: 0 };\r\n                code.push(q);\r\n                p.children[p.index] = q.children;\r\n                p = q;\r\n            }\r\n            k++;\r\n        }\r\n        if (i + 1 < length) {\r\n            // p here points to last code\r\n            var q = { children: [], index: 0 };\r\n            code.push(q);\r\n            p.children[p.index] = q.children;\r\n            p = q;\r\n        }\r\n    }\r\n    return code[0].children;\r\n}\r\nfunction decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {\r\n    var mcusPerLine = frame.mcusPerLine;\r\n    var progressive = frame.progressive;\r\n    var startOffset = offset;\r\n    var bitsData = 0;\r\n    var bitsCount = 0;\r\n    function readBit() {\r\n        if (bitsCount > 0) {\r\n            bitsCount--;\r\n            return (bitsData >> bitsCount) & 1;\r\n        }\r\n        bitsData = data[offset++];\r\n        if (bitsData == 0xFF) {\r\n            var nextByte = data[offset++];\r\n            if (nextByte)\r\n                throw new Error(\"unexpected marker: \".concat(((bitsData << 8) | nextByte).toString(16)));\r\n            // unstuff 0\r\n        }\r\n        bitsCount = 7;\r\n        return bitsData >>> 7;\r\n    }\r\n    function decodeHuffman(tree) {\r\n        var node = tree;\r\n        while (true) {\r\n            node = node[readBit()];\r\n            if (typeof node === 'number')\r\n                return node;\r\n            if (node === undefined)\r\n                throw new Error('invalid huffman sequence');\r\n        }\r\n    }\r\n    function receive(length) {\r\n        var n = 0;\r\n        while (length > 0) {\r\n            n = (n << 1) | readBit();\r\n            length--;\r\n        }\r\n        return n;\r\n    }\r\n    function receiveAndExtend(length) {\r\n        var n = receive(length);\r\n        if (n >= 1 << (length - 1))\r\n            return n;\r\n        return n + (-1 << length) + 1;\r\n    }\r\n    function decodeBaseline(component, zz) {\r\n        var t = decodeHuffman(component.huffmanTableDC);\r\n        var diff = t === 0 ? 0 : receiveAndExtend(t);\r\n        zz[0] = (component.pred += diff);\r\n        var k = 1;\r\n        while (k < 64) {\r\n            var rs = decodeHuffman(component.huffmanTableAC);\r\n            var s = rs & 15;\r\n            var r = rs >> 4;\r\n            if (s === 0) {\r\n                if (r < 15)\r\n                    break;\r\n                k += 16;\r\n                continue;\r\n            }\r\n            k += r;\r\n            var z = dctZigZag[k];\r\n            zz[z] = receiveAndExtend(s);\r\n            k++;\r\n        }\r\n    }\r\n    function decodeDCFirst(component, zz) {\r\n        var t = decodeHuffman(component.huffmanTableDC);\r\n        var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);\r\n        zz[0] = (component.pred += diff);\r\n    }\r\n    function decodeDCSuccessive(_component, zz) {\r\n        zz[0] |= readBit() << successive;\r\n    }\r\n    var eobrun = 0;\r\n    function decodeACFirst(component, zz) {\r\n        if (eobrun > 0) {\r\n            eobrun--;\r\n            return;\r\n        }\r\n        var k = spectralStart, e = spectralEnd;\r\n        while (k <= e) {\r\n            var rs = decodeHuffman(component.huffmanTableAC);\r\n            var s = rs & 15;\r\n            var r = rs >> 4;\r\n            if (s === 0) {\r\n                if (r < 15) {\r\n                    eobrun = receive(r) + (1 << r) - 1;\r\n                    break;\r\n                }\r\n                k += 16;\r\n                continue;\r\n            }\r\n            k += r;\r\n            var z = dctZigZag[k];\r\n            zz[z] = receiveAndExtend(s) * (1 << successive);\r\n            k++;\r\n        }\r\n    }\r\n    var successiveACState = 0;\r\n    var successiveACNextValue = 0;\r\n    function decodeACSuccessive(component, zz) {\r\n        var k = spectralStart;\r\n        var e = spectralEnd;\r\n        var r = 0;\r\n        while (k <= e) {\r\n            var z = dctZigZag[k];\r\n            var direction = zz[z] < 0 ? -1 : 1;\r\n            switch (successiveACState) {\r\n                case 0: // initial state\r\n                    var rs = decodeHuffman(component.huffmanTableAC);\r\n                    var s = rs & 15;\r\n                    r = rs >> 4; // this was new variable in old code\r\n                    if (s === 0) {\r\n                        if (r < 15) {\r\n                            eobrun = receive(r) + (1 << r);\r\n                            successiveACState = 4;\r\n                        }\r\n                        else {\r\n                            r = 16;\r\n                            successiveACState = 1;\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (s !== 1)\r\n                            throw new Error('invalid ACn encoding');\r\n                        successiveACNextValue = receiveAndExtend(s);\r\n                        successiveACState = r ? 2 : 3;\r\n                    }\r\n                    continue;\r\n                case 1: // skipping r zero items\r\n                case 2:\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    else {\r\n                        r--;\r\n                        if (r === 0)\r\n                            successiveACState = successiveACState == 2 ? 3 : 0;\r\n                    }\r\n                    break;\r\n                case 3: // set value for a zero item\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    else {\r\n                        zz[z] = successiveACNextValue << successive;\r\n                        successiveACState = 0;\r\n                    }\r\n                    break;\r\n                case 4: // eob\r\n                    if (zz[z]) {\r\n                        zz[z] += (readBit() << successive) * direction;\r\n                    }\r\n                    break;\r\n            }\r\n            k++;\r\n        }\r\n        if (successiveACState === 4) {\r\n            eobrun--;\r\n            if (eobrun === 0)\r\n                successiveACState = 0;\r\n        }\r\n    }\r\n    function decodeMcu(component, decode, mcu, row, col) {\r\n        var mcuRow = (mcu / mcusPerLine) | 0;\r\n        var mcuCol = mcu % mcusPerLine;\r\n        var blockRow = mcuRow * component.v + row;\r\n        var blockCol = mcuCol * component.h + col;\r\n        // If the block is missing, just skip it.\r\n        if (component.blocks[blockRow] === undefined)\r\n            return;\r\n        decode(component, component.blocks[blockRow][blockCol]);\r\n    }\r\n    function decodeBlock(component, decode, mcu) {\r\n        var blockRow = (mcu / component.blocksPerLine) | 0;\r\n        var blockCol = mcu % component.blocksPerLine;\r\n        // If the block is missing, just skip it.\r\n        if (component.blocks[blockRow] === undefined)\r\n            return;\r\n        decode(component, component.blocks[blockRow][blockCol]);\r\n    }\r\n    var componentsLength = components.length;\r\n    var component;\r\n    var decodeFn;\r\n    if (progressive) {\r\n        if (spectralStart === 0) {\r\n            decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\r\n        }\r\n        else {\r\n            decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\r\n        }\r\n    }\r\n    else {\r\n        decodeFn = decodeBaseline;\r\n    }\r\n    var mcu = 0;\r\n    var mcuExpected;\r\n    if (componentsLength == 1) {\r\n        mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\r\n    }\r\n    else {\r\n        mcuExpected = mcusPerLine * frame.mcusPerColumn;\r\n    }\r\n    if (!resetInterval)\r\n        resetInterval = mcuExpected;\r\n    var h;\r\n    var v;\r\n    var marker;\r\n    while (mcu < mcuExpected) {\r\n        // reset interval stuff\r\n        for (var i = 0; i < componentsLength; i++)\r\n            components[i].pred = 0;\r\n        eobrun = 0;\r\n        if (componentsLength == 1) {\r\n            component = components[0];\r\n            for (var n = 0; n < resetInterval; n++) {\r\n                decodeBlock(component, decodeFn, mcu);\r\n                mcu++;\r\n            }\r\n        }\r\n        else {\r\n            for (var n = 0; n < resetInterval; n++) {\r\n                for (var i = 0; i < componentsLength; i++) {\r\n                    component = components[i];\r\n                    h = component.h;\r\n                    v = component.v;\r\n                    for (var j = 0; j < v; j++) {\r\n                        for (var k = 0; k < h; k++) {\r\n                            decodeMcu(component, decodeFn, mcu, j, k);\r\n                        }\r\n                    }\r\n                }\r\n                mcu++;\r\n                // If we've reached our expected MCU's, stop decoding\r\n                if (mcu === mcuExpected)\r\n                    break;\r\n            }\r\n        }\r\n        if (mcu === mcuExpected) {\r\n            // Skip trailing bytes at the end of the scan - until we reach the next marker\r\n            do {\r\n                if (data[offset] === 0xFF) {\r\n                    if (data[offset + 1] !== 0x00) {\r\n                        break;\r\n                    }\r\n                }\r\n                offset += 1;\r\n            } while (offset < data.length - 2);\r\n        }\r\n        // find marker\r\n        bitsCount = 0;\r\n        marker = (data[offset] << 8) | data[offset + 1];\r\n        if (marker < 0xFF00)\r\n            throw new Error('marker was not found');\r\n        if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx\r\n            offset += 2;\r\n        }\r\n        else {\r\n            break;\r\n        }\r\n    }\r\n    return offset - startOffset;\r\n}\r\nfunction buildComponentData(component) {\r\n    var lines = [];\r\n    var blocksPerLine = component.blocksPerLine;\r\n    var blocksPerColumn = component.blocksPerColumn;\r\n    var samplesPerLine = blocksPerLine << 3;\r\n    // Only 1 used per invocation of this function and garbage collected after invocation, so no need to account for its memory footprint.\r\n    var R = new Int32Array(64);\r\n    var r = new Uint8Array(64);\r\n    // A port of poppler's IDCT method which in turn is taken from:\r\n    //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\r\n    //   \"Practical Fast 1-D DCT Algorithms with 11 Multiplications\",\r\n    //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\r\n    //   988-991.\r\n    function quantizeAndInverse(zz, dataOut, dataIn) {\r\n        var qt = component.quantizationTable;\r\n        var p = dataIn;\r\n        // dequant\r\n        for (var i = 0; i < 64; i++) {\r\n            p[i] = zz[i] * qt[i];\r\n        }\r\n        // inverse DCT on rows\r\n        for (var i = 0; i < 8; ++i) {\r\n            var row = 8 * i;\r\n            // check for all-zero AC coefficients\r\n            if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&\r\n                p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&\r\n                p[7 + row] == 0) {\r\n                var t_1 = (dctSqrt2 * p[0 + row] + 512) >> 10;\r\n                p[0 + row] = t_1;\r\n                p[1 + row] = t_1;\r\n                p[2 + row] = t_1;\r\n                p[3 + row] = t_1;\r\n                p[4 + row] = t_1;\r\n                p[5 + row] = t_1;\r\n                p[6 + row] = t_1;\r\n                p[7 + row] = t_1;\r\n                continue;\r\n            }\r\n            // stage 4\r\n            var v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;\r\n            var v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;\r\n            var v2 = p[2 + row];\r\n            var v3 = p[6 + row];\r\n            var v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;\r\n            var v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;\r\n            var v5 = p[3 + row] << 4;\r\n            var v6 = p[5 + row] << 4;\r\n            // stage 3\r\n            var t = (v0 - v1 + 1) >> 1;\r\n            v0 = (v0 + v1 + 1) >> 1;\r\n            v1 = t;\r\n            t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;\r\n            v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;\r\n            v3 = t;\r\n            t = (v4 - v6 + 1) >> 1;\r\n            v4 = (v4 + v6 + 1) >> 1;\r\n            v6 = t;\r\n            t = (v7 + v5 + 1) >> 1;\r\n            v5 = (v7 - v5 + 1) >> 1;\r\n            v7 = t;\r\n            // stage 2\r\n            t = (v0 - v3 + 1) >> 1;\r\n            v0 = (v0 + v3 + 1) >> 1;\r\n            v3 = t;\r\n            t = (v1 - v2 + 1) >> 1;\r\n            v1 = (v1 + v2 + 1) >> 1;\r\n            v2 = t;\r\n            t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\r\n            v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\r\n            v7 = t;\r\n            t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\r\n            v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\r\n            v6 = t;\r\n            // stage 1\r\n            p[0 + row] = v0 + v7;\r\n            p[7 + row] = v0 - v7;\r\n            p[1 + row] = v1 + v6;\r\n            p[6 + row] = v1 - v6;\r\n            p[2 + row] = v2 + v5;\r\n            p[5 + row] = v2 - v5;\r\n            p[3 + row] = v3 + v4;\r\n            p[4 + row] = v3 - v4;\r\n        }\r\n        // inverse DCT on columns\r\n        for (var i = 0; i < 8; ++i) {\r\n            var col = i;\r\n            // check for all-zero AC coefficients\r\n            if (p[1 * 8 + col] == 0 && p[2 * 8 + col] == 0 && p[3 * 8 + col] == 0 &&\r\n                p[4 * 8 + col] == 0 && p[5 * 8 + col] == 0 && p[6 * 8 + col] == 0 &&\r\n                p[7 * 8 + col] == 0) {\r\n                var t_2 = (dctSqrt2 * dataIn[i + 0] + 8192) >> 14;\r\n                p[0 * 8 + col] = t_2;\r\n                p[1 * 8 + col] = t_2;\r\n                p[2 * 8 + col] = t_2;\r\n                p[3 * 8 + col] = t_2;\r\n                p[4 * 8 + col] = t_2;\r\n                p[5 * 8 + col] = t_2;\r\n                p[6 * 8 + col] = t_2;\r\n                p[7 * 8 + col] = t_2;\r\n                continue;\r\n            }\r\n            // stage 4\r\n            var v0 = (dctSqrt2 * p[0 * 8 + col] + 2048) >> 12;\r\n            var v1 = (dctSqrt2 * p[4 * 8 + col] + 2048) >> 12;\r\n            var v2 = p[2 * 8 + col];\r\n            var v3 = p[6 * 8 + col];\r\n            var v4 = (dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048) >> 12;\r\n            var v7 = (dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048) >> 12;\r\n            var v5 = p[3 * 8 + col];\r\n            var v6 = p[5 * 8 + col];\r\n            // stage 3\r\n            var t = (v0 - v1 + 1) >> 1;\r\n            v0 = (v0 + v1 + 1) >> 1;\r\n            v1 = t;\r\n            t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;\r\n            v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;\r\n            v3 = t;\r\n            t = (v4 - v6 + 1) >> 1;\r\n            v4 = (v4 + v6 + 1) >> 1;\r\n            v6 = t;\r\n            t = (v7 + v5 + 1) >> 1;\r\n            v5 = (v7 - v5 + 1) >> 1;\r\n            v7 = t;\r\n            // stage 2\r\n            t = (v0 - v3 + 1) >> 1;\r\n            v0 = (v0 + v3 + 1) >> 1;\r\n            v3 = t;\r\n            t = (v1 - v2 + 1) >> 1;\r\n            v1 = (v1 + v2 + 1) >> 1;\r\n            v2 = t;\r\n            t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\r\n            v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\r\n            v7 = t;\r\n            t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\r\n            v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\r\n            v6 = t;\r\n            // stage 1\r\n            p[0 * 8 + col] = v0 + v7;\r\n            p[7 * 8 + col] = v0 - v7;\r\n            p[1 * 8 + col] = v1 + v6;\r\n            p[6 * 8 + col] = v1 - v6;\r\n            p[2 * 8 + col] = v2 + v5;\r\n            p[5 * 8 + col] = v2 - v5;\r\n            p[3 * 8 + col] = v3 + v4;\r\n            p[4 * 8 + col] = v3 - v4;\r\n        }\r\n        // convert to 8-bit integers\r\n        for (var i = 0; i < 64; ++i) {\r\n            var sample = 128 + ((p[i] + 8) >> 4);\r\n            dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;\r\n        }\r\n    }\r\n    requestMemoryAllocation(samplesPerLine * blocksPerColumn * 8);\r\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\r\n        var scanLine = blockRow << 3;\r\n        for (var i = 0; i < 8; i++)\r\n            lines.push(new Uint8Array(samplesPerLine));\r\n        for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\r\n            quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);\r\n            var offset = 0;\r\n            var sample = blockCol << 3;\r\n            for (var j = 0; j < 8; j++) {\r\n                var line = lines[scanLine + j];\r\n                for (var i = 0; i < 8; i++)\r\n                    line[sample + i] = r[offset++];\r\n            }\r\n        }\r\n    }\r\n    return lines;\r\n}\r\nfunction clampTo8bit(a) {\r\n    return a < 0 ? 0 : a > 255 ? 255 : a;\r\n}\r\nfunction parse(data) {\r\n    var self = {\r\n        width: 0,\r\n        height: 0,\r\n        comments: [],\r\n        adobe: undefined,\r\n        components: [],\r\n        exifBuffer: undefined,\r\n        jfif: undefined,\r\n    };\r\n    var maxResolutionInPixels = maxResolutionInMP * 1000 * 1000;\r\n    var offset = 0;\r\n    function readUint16() {\r\n        var value = (data[offset] << 8) | data[offset + 1];\r\n        offset += 2;\r\n        return value;\r\n    }\r\n    function readDataBlock() {\r\n        var length = readUint16();\r\n        var array = data.subarray(offset, offset + length - 2);\r\n        offset += array.length;\r\n        return array;\r\n    }\r\n    function prepareComponents(frame) {\r\n        var maxH = 0, maxV = 0;\r\n        for (var componentId in frame.components) {\r\n            if (frame.components.hasOwnProperty(componentId)) {\r\n                var component = frame.components[componentId];\r\n                if (maxH < component.h)\r\n                    maxH = component.h;\r\n                if (maxV < component.v)\r\n                    maxV = component.v;\r\n            }\r\n        }\r\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);\r\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);\r\n        for (var componentId in frame.components) {\r\n            if (frame.components.hasOwnProperty(componentId)) {\r\n                var component = frame.components[componentId];\r\n                var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);\r\n                var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);\r\n                var blocksPerLineForMcu = mcusPerLine * component.h;\r\n                var blocksPerColumnForMcu = mcusPerColumn * component.v;\r\n                var blocksToAllocate = blocksPerColumnForMcu * blocksPerLineForMcu;\r\n                var blocks = [];\r\n                // Each block is a Int32Array of length 64 (4 x 64 = 256 bytes)\r\n                requestMemoryAllocation(blocksToAllocate * 256);\r\n                for (var i = 0; i < blocksPerColumnForMcu; i++) {\r\n                    var row = [];\r\n                    for (var j = 0; j < blocksPerLineForMcu; j++) {\r\n                        row.push(new Int32Array(64));\r\n                    }\r\n                    blocks.push(row);\r\n                }\r\n                component.blocksPerLine = blocksPerLine;\r\n                component.blocksPerColumn = blocksPerColumn;\r\n                component.blocks = blocks;\r\n            }\r\n        }\r\n        frame.maxH = maxH;\r\n        frame.maxV = maxV;\r\n        frame.mcusPerLine = mcusPerLine;\r\n        frame.mcusPerColumn = mcusPerColumn;\r\n    }\r\n    var jfif = null;\r\n    var adobe = null;\r\n    var frame = undefined;\r\n    var resetInterval = 0;\r\n    var quantizationTables = [];\r\n    var frames = [];\r\n    var huffmanTablesAC = [];\r\n    var huffmanTablesDC = [];\r\n    var fileMarker = readUint16();\r\n    var malformedDataOffset = -1;\r\n    if (fileMarker != 0xFFD8) { // SOI (Start of Image)\r\n        throw new Error('SOI not found');\r\n    }\r\n    fileMarker = readUint16();\r\n    while (fileMarker != 0xFFD9) { // EOI (End of image)\r\n        switch (fileMarker) {\r\n            case 0xFF00: break;\r\n            case 0xFFE0: // APP0 (Application Specific)\r\n            case 0xFFE1: // APP1\r\n            case 0xFFE2: // APP2\r\n            case 0xFFE3: // APP3\r\n            case 0xFFE4: // APP4\r\n            case 0xFFE5: // APP5\r\n            case 0xFFE6: // APP6\r\n            case 0xFFE7: // APP7\r\n            case 0xFFE8: // APP8\r\n            case 0xFFE9: // APP9\r\n            case 0xFFEA: // APP10\r\n            case 0xFFEB: // APP11\r\n            case 0xFFEC: // APP12\r\n            case 0xFFED: // APP13\r\n            case 0xFFEE: // APP14\r\n            case 0xFFEF: // APP15\r\n            case 0xFFFE: { // COM (Comment)\r\n                var appData = readDataBlock();\r\n                if (fileMarker === 0xFFFE) {\r\n                    var comment = '';\r\n                    for (var ii = 0; ii < appData.byteLength; ii++) {\r\n                        comment += String.fromCharCode(appData[ii]);\r\n                    }\r\n                    self.comments.push(comment);\r\n                }\r\n                if (fileMarker === 0xFFE0) {\r\n                    if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&\r\n                        appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\\x00'\r\n                        jfif = {\r\n                            version: { major: appData[5], minor: appData[6] },\r\n                            densityUnits: appData[7],\r\n                            xDensity: (appData[8] << 8) | appData[9],\r\n                            yDensity: (appData[10] << 8) | appData[11],\r\n                            thumbWidth: appData[12],\r\n                            thumbHeight: appData[13],\r\n                            thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])\r\n                        };\r\n                    }\r\n                }\r\n                // TODO APP1 - Exif\r\n                if (fileMarker === 0xFFE1) {\r\n                    if (appData[0] === 0x45 &&\r\n                        appData[1] === 0x78 &&\r\n                        appData[2] === 0x69 &&\r\n                        appData[3] === 0x66 &&\r\n                        appData[4] === 0) { // 'EXIF\\x00'\r\n                        self.exifBuffer = appData.subarray(5, appData.length);\r\n                    }\r\n                }\r\n                if (fileMarker === 0xFFEE) {\r\n                    if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&\r\n                        appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\\x00'\r\n                        adobe = {\r\n                            version: appData[6],\r\n                            flags0: (appData[7] << 8) | appData[8],\r\n                            flags1: (appData[9] << 8) | appData[10],\r\n                            transformCode: appData[11]\r\n                        };\r\n                    }\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFDB: { // DQT (Define Quantization Tables)\r\n                var quantizationTablesLength = readUint16();\r\n                var quantizationTablesEnd = quantizationTablesLength + offset - 2;\r\n                while (offset < quantizationTablesEnd) {\r\n                    var quantizationTableSpec = data[offset++];\r\n                    requestMemoryAllocation(64 * 4);\r\n                    var tableData = new Int32Array(64);\r\n                    if ((quantizationTableSpec >> 4) === 0) { // 8 bit values\r\n                        for (var j = 0; j < 64; j++) {\r\n                            var z = dctZigZag[j];\r\n                            tableData[z] = data[offset++];\r\n                        }\r\n                    }\r\n                    else if ((quantizationTableSpec >> 4) === 1) { //16 bit\r\n                        for (var j = 0; j < 64; j++) {\r\n                            var z = dctZigZag[j];\r\n                            tableData[z] = readUint16();\r\n                        }\r\n                    }\r\n                    else\r\n                        throw new Error('DQT: invalid table spec');\r\n                    quantizationTables[quantizationTableSpec & 15] = tableData;\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)\r\n            case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)\r\n            case 0xFFC2: { // SOF2 (Start of Frame, Progressive DCT)\r\n                readUint16(); // skip data length\r\n                frame = {\r\n                    extended: (fileMarker === 0xFFC1),\r\n                    progressive: (fileMarker === 0xFFC2),\r\n                    precision: data[offset++],\r\n                    scanLines: readUint16(),\r\n                    samplesPerLine: readUint16(),\r\n                    components: {},\r\n                    componentsOrder: [],\r\n                    maxH: 0,\r\n                    maxV: 0,\r\n                    mcusPerLine: 0,\r\n                    mcusPerColumn: 0,\r\n                };\r\n                var pixelsInFrame = frame.scanLines * frame.samplesPerLine;\r\n                if (pixelsInFrame > maxResolutionInPixels) {\r\n                    var exceededAmount = Math.ceil((pixelsInFrame - maxResolutionInPixels) / 1e6);\r\n                    throw new Error(\"maxResolutionInMP limit exceeded by \".concat(exceededAmount, \"MP\"));\r\n                }\r\n                var componentsCount = data[offset++];\r\n                for (var i = 0; i < componentsCount; i++) {\r\n                    var componentId = data[offset];\r\n                    var h = data[offset + 1] >> 4;\r\n                    var v = data[offset + 1] & 15;\r\n                    var qId = data[offset + 2];\r\n                    frame.componentsOrder.push(componentId);\r\n                    frame.components[componentId] = {\r\n                        h: h,\r\n                        v: v,\r\n                        quantizationIdx: qId,\r\n                        blocksPerColumn: 0,\r\n                        blocksPerLine: 0,\r\n                        blocks: [],\r\n                        pred: 0,\r\n                    };\r\n                    offset += 3;\r\n                }\r\n                prepareComponents(frame);\r\n                frames.push(frame);\r\n                break;\r\n            }\r\n            case 0xFFC4: { // DHT (Define Huffman Tables)\r\n                var huffmanLength = readUint16();\r\n                for (var i = 2; i < huffmanLength;) {\r\n                    var huffmanTableSpec = data[offset++];\r\n                    var codeLengths = new Uint8Array(16);\r\n                    var codeLengthSum = 0;\r\n                    for (var j = 0; j < 16; j++, offset++) {\r\n                        codeLengthSum += (codeLengths[j] = data[offset]);\r\n                    }\r\n                    requestMemoryAllocation(16 + codeLengthSum);\r\n                    var huffmanValues = new Uint8Array(codeLengthSum);\r\n                    for (var j = 0; j < codeLengthSum; j++, offset++) {\r\n                        huffmanValues[j] = data[offset];\r\n                    }\r\n                    i += 17 + codeLengthSum;\r\n                    var index = huffmanTableSpec & 15;\r\n                    var table = (huffmanTableSpec >> 4) === 0 ? huffmanTablesDC : huffmanTablesAC;\r\n                    table[index] = buildHuffmanTable(codeLengths, huffmanValues);\r\n                }\r\n                break;\r\n            }\r\n            case 0xFFDD: // DRI (Define Restart Interval)\r\n                readUint16(); // skip data length\r\n                resetInterval = readUint16();\r\n                break;\r\n            case 0xFFDC: // Number of Lines marker\r\n                readUint16(); // skip data length\r\n                readUint16(); // Ignore this data since it represents the image height\r\n                break;\r\n            case 0xFFDA: { // SOS (Start of Scan)\r\n                readUint16(); // skip data length\r\n                var selectorsCount = data[offset++];\r\n                var components = [];\r\n                for (var i = 0; i < selectorsCount; i++) {\r\n                    var component = frame.components[data[offset++]];\r\n                    var tableSpec = data[offset++];\r\n                    component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\r\n                    component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\r\n                    components.push(component);\r\n                }\r\n                var spectralStart = data[offset++];\r\n                var spectralEnd = data[offset++];\r\n                var successiveApproximation = data[offset++];\r\n                var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);\r\n                offset += processed;\r\n                break;\r\n            }\r\n            case 0xFFFF: // Fill bytes\r\n                if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.\r\n                    offset--;\r\n                }\r\n                break;\r\n            default: {\r\n                if (data[offset - 3] == 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\r\n                    // could be incorrect encoding -- last 0xFF byte of the previous\r\n                    // block was eaten by the encoder\r\n                    offset -= 3;\r\n                    break;\r\n                }\r\n                else if (fileMarker === 0xE0 || fileMarker == 0xE1) {\r\n                    // Recover from malformed APP1 markers popular in some phone models.\r\n                    // See https://github.com/eugeneware/jpeg-js/issues/82\r\n                    if (malformedDataOffset !== -1) {\r\n                        throw new Error(\"first unknown JPEG marker at offset \".concat(malformedDataOffset.toString(16), \", second unknown JPEG marker \").concat(fileMarker.toString(16), \" at offset \").concat((offset - 1).toString(16)));\r\n                    }\r\n                    malformedDataOffset = offset - 1;\r\n                    var nextOffset = readUint16();\r\n                    if (data[offset + nextOffset - 2] === 0xFF) {\r\n                        offset += nextOffset - 2;\r\n                        break;\r\n                    }\r\n                }\r\n                throw new Error('unknown JPEG marker ' + fileMarker.toString(16));\r\n            }\r\n        }\r\n        fileMarker = readUint16();\r\n    }\r\n    if (frames.length != 1)\r\n        throw new Error('only single frame JPEGs supported');\r\n    // set each frame's components quantization table\r\n    for (var i = 0; i < frames.length; i++) {\r\n        var cp = frames[i].components;\r\n        for (var j in cp) { // TODO: don't use `in`\r\n            cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];\r\n            delete cp[j].quantizationIdx; // TODO: why ???\r\n        }\r\n    }\r\n    self.width = frame.samplesPerLine;\r\n    self.height = frame.scanLines;\r\n    self.jfif = jfif;\r\n    self.adobe = adobe;\r\n    self.components = [];\r\n    for (var i = 0; i < frame.componentsOrder.length; i++) {\r\n        var component = frame.components[frame.componentsOrder[i]];\r\n        self.components.push({\r\n            lines: buildComponentData(component),\r\n            scaleX: component.h / frame.maxH,\r\n            scaleY: component.v / frame.maxV\r\n        });\r\n    }\r\n    return self;\r\n}\r\nfunction getData(decoded) {\r\n    var offset = 0;\r\n    var colorTransform = false;\r\n    var width = decoded.width;\r\n    var height = decoded.height;\r\n    var dataLength = width * height * decoded.components.length;\r\n    requestMemoryAllocation(dataLength);\r\n    var data = new Uint8Array(dataLength);\r\n    switch (decoded.components.length) {\r\n        case 1: {\r\n            var component1 = decoded.components[0];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = component1Line[0 | (x * component1.scaleX)];\r\n                    data[offset++] = Y;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 2: {\r\n            // PDF might compress two component data in custom colorspace\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y1 = component1Line[0 | (x * component1.scaleX)];\r\n                    data[offset++] = Y1;\r\n                    var Y2 = component2Line[0 | (x * component2.scaleX)];\r\n                    data[offset++] = Y2;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 3: {\r\n            // The default transform for three components is true\r\n            colorTransform = true;\r\n            // The adobe transform marker overrides any previous setting\r\n            if (decoded.adobe && decoded.adobe.transformCode)\r\n                colorTransform = true;\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            var component3 = decoded.components[2];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                var component3Line = component3.lines[0 | (y * component3.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = void 0, Cb = void 0, Cr = void 0, R = void 0, G = void 0, B = void 0;\r\n                    if (!colorTransform) {\r\n                        R = component1Line[0 | (x * component1.scaleX)];\r\n                        G = component2Line[0 | (x * component2.scaleX)];\r\n                        B = component3Line[0 | (x * component3.scaleX)];\r\n                    }\r\n                    else {\r\n                        Y = component1Line[0 | (x * component1.scaleX)];\r\n                        Cb = component2Line[0 | (x * component2.scaleX)];\r\n                        Cr = component3Line[0 | (x * component3.scaleX)];\r\n                        R = clampTo8bit(Y + 1.402 * (Cr - 128));\r\n                        G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));\r\n                        B = clampTo8bit(Y + 1.772 * (Cb - 128));\r\n                    }\r\n                    data[offset++] = R;\r\n                    data[offset++] = G;\r\n                    data[offset++] = B;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 4: {\r\n            if (!decoded.adobe)\r\n                throw new Error('Unsupported color mode (4 components)');\r\n            // The default transform for four components is false\r\n            colorTransform = false;\r\n            // The adobe transform marker overrides any previous setting\r\n            if (decoded.adobe && decoded.adobe.transformCode)\r\n                colorTransform = true;\r\n            var component1 = decoded.components[0];\r\n            var component2 = decoded.components[1];\r\n            var component3 = decoded.components[2];\r\n            var component4 = decoded.components[3];\r\n            for (var y = 0; y < height; y++) {\r\n                var component1Line = component1.lines[0 | (y * component1.scaleY)];\r\n                var component2Line = component2.lines[0 | (y * component2.scaleY)];\r\n                var component3Line = component3.lines[0 | (y * component3.scaleY)];\r\n                var component4Line = component4.lines[0 | (y * component4.scaleY)];\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = void 0, Cb = void 0, Cr = void 0, K = void 0, C = void 0, M = void 0, Ye = void 0;\r\n                    if (!colorTransform) {\r\n                        C = component1Line[0 | (x * component1.scaleX)];\r\n                        M = component2Line[0 | (x * component2.scaleX)];\r\n                        Ye = component3Line[0 | (x * component3.scaleX)];\r\n                        K = component4Line[0 | (x * component4.scaleX)];\r\n                    }\r\n                    else {\r\n                        Y = component1Line[0 | (x * component1.scaleX)];\r\n                        Cb = component2Line[0 | (x * component2.scaleX)];\r\n                        Cr = component3Line[0 | (x * component3.scaleX)];\r\n                        K = component4Line[0 | (x * component4.scaleX)];\r\n                        C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));\r\n                        M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));\r\n                        Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));\r\n                    }\r\n                    data[offset++] = 255 - C;\r\n                    data[offset++] = 255 - M;\r\n                    data[offset++] = 255 - Ye;\r\n                    data[offset++] = 255 - K;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        default:\r\n            throw new Error('Unsupported color mode');\r\n    }\r\n    return data;\r\n}\r\nexport function decodeJpeg(encoded, createImageData) {\r\n    totalBytesAllocated = 0;\r\n    if (encoded.length === 0)\r\n        throw new Error('Empty jpeg buffer');\r\n    var decoded = parse(encoded);\r\n    requestMemoryAllocation(decoded.width * decoded.height * 4);\r\n    var data = getData(decoded);\r\n    var imageData = createImageData(decoded.width, decoded.height);\r\n    var width = imageData.width;\r\n    var height = imageData.height;\r\n    var imageDataArray = imageData.data;\r\n    var i = 0;\r\n    var j = 0;\r\n    switch (decoded.components.length) {\r\n        case 1:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var Y = data[i++];\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = Y;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        case 3:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var R = data[i++];\r\n                    var G = data[i++];\r\n                    var B = data[i++];\r\n                    imageDataArray[j++] = R;\r\n                    imageDataArray[j++] = G;\r\n                    imageDataArray[j++] = B;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        case 4:\r\n            for (var y = 0; y < height; y++) {\r\n                for (var x = 0; x < width; x++) {\r\n                    var C = data[i++];\r\n                    var M = data[i++];\r\n                    var Y = data[i++];\r\n                    var K = data[i++];\r\n                    var R = 255 - clampTo8bit(C * (1 - K / 255) + K);\r\n                    var G = 255 - clampTo8bit(M * (1 - K / 255) + K);\r\n                    var B = 255 - clampTo8bit(Y * (1 - K / 255) + K);\r\n                    imageDataArray[j++] = R;\r\n                    imageDataArray[j++] = G;\r\n                    imageDataArray[j++] = B;\r\n                    imageDataArray[j++] = 255;\r\n                }\r\n            }\r\n            break;\r\n        default:\r\n            throw new Error('Unsupported color mode');\r\n    }\r\n    return imageData;\r\n}\r\n//# sourceMappingURL=jpeg.js.map","import { deflate as deflateSync } from 'pako';\r\nimport { decodeJpeg } from './jpeg';\r\nexport var MOCK_HANDLERS = false;\r\nexport var RAW_IMAGE_DATA = false;\r\nexport var fromBlendMode = {};\r\nexport var toBlendMode = {\r\n    'pass': 'pass through',\r\n    'norm': 'normal',\r\n    'diss': 'dissolve',\r\n    'dark': 'darken',\r\n    'mul ': 'multiply',\r\n    'idiv': 'color burn',\r\n    'lbrn': 'linear burn',\r\n    'dkCl': 'darker color',\r\n    'lite': 'lighten',\r\n    'scrn': 'screen',\r\n    'div ': 'color dodge',\r\n    'lddg': 'linear dodge',\r\n    'lgCl': 'lighter color',\r\n    'over': 'overlay',\r\n    'sLit': 'soft light',\r\n    'hLit': 'hard light',\r\n    'vLit': 'vivid light',\r\n    'lLit': 'linear light',\r\n    'pLit': 'pin light',\r\n    'hMix': 'hard mix',\r\n    'diff': 'difference',\r\n    'smud': 'exclusion',\r\n    'fsub': 'subtract',\r\n    'fdiv': 'divide',\r\n    'hue ': 'hue',\r\n    'sat ': 'saturation',\r\n    'colr': 'color',\r\n    'lum ': 'luminosity',\r\n};\r\nObject.keys(toBlendMode).forEach(function (key) { return fromBlendMode[toBlendMode[key]] = key; });\r\nexport var layerColors = [\r\n    'none', 'red', 'orange', 'yellow', 'green', 'blue', 'violet', 'gray'\r\n];\r\nexport var largeAdditionalInfoKeys = [\r\n    // from documentation\r\n    'LMsk', 'Lr16', 'Lr32', 'Layr', 'Mt16', 'Mt32', 'Mtrn', 'Alph', 'FMsk', 'lnk2', 'FEid', 'FXid', 'PxSD',\r\n    // from guessing\r\n    'cinf',\r\n];\r\nexport function revMap(map) {\r\n    var result = {};\r\n    Object.keys(map).forEach(function (key) { return result[map[key]] = key; });\r\n    return result;\r\n}\r\nexport function createEnum(prefix, def, map) {\r\n    var rev = revMap(map);\r\n    var decode = function (val) {\r\n        var value = val.split('.')[1];\r\n        if (value && !rev[value])\r\n            throw new Error(\"Unrecognized value for enum: '\".concat(val, \"'\"));\r\n        return rev[value] || def;\r\n    };\r\n    var encode = function (val) {\r\n        if (val && !map[val])\r\n            throw new Error(\"Invalid value for enum: '\".concat(val, \"'\"));\r\n        return \"\".concat(prefix, \".\").concat(map[val] || map[def]);\r\n    };\r\n    return { decode: decode, encode: encode };\r\n}\r\nexport var ColorSpace;\r\n(function (ColorSpace) {\r\n    ColorSpace[ColorSpace[\"RGB\"] = 0] = \"RGB\";\r\n    ColorSpace[ColorSpace[\"HSB\"] = 1] = \"HSB\";\r\n    ColorSpace[ColorSpace[\"CMYK\"] = 2] = \"CMYK\";\r\n    ColorSpace[ColorSpace[\"Lab\"] = 7] = \"Lab\";\r\n    ColorSpace[ColorSpace[\"Grayscale\"] = 8] = \"Grayscale\";\r\n})(ColorSpace || (ColorSpace = {}));\r\nexport var LayerMaskFlags;\r\n(function (LayerMaskFlags) {\r\n    LayerMaskFlags[LayerMaskFlags[\"PositionRelativeToLayer\"] = 1] = \"PositionRelativeToLayer\";\r\n    LayerMaskFlags[LayerMaskFlags[\"LayerMaskDisabled\"] = 2] = \"LayerMaskDisabled\";\r\n    LayerMaskFlags[LayerMaskFlags[\"InvertLayerMaskWhenBlending\"] = 4] = \"InvertLayerMaskWhenBlending\";\r\n    LayerMaskFlags[LayerMaskFlags[\"LayerMaskFromRenderingOtherData\"] = 8] = \"LayerMaskFromRenderingOtherData\";\r\n    LayerMaskFlags[LayerMaskFlags[\"MaskHasParametersAppliedToIt\"] = 16] = \"MaskHasParametersAppliedToIt\";\r\n})(LayerMaskFlags || (LayerMaskFlags = {}));\r\nexport var MaskParams;\r\n(function (MaskParams) {\r\n    MaskParams[MaskParams[\"UserMaskDensity\"] = 1] = \"UserMaskDensity\";\r\n    MaskParams[MaskParams[\"UserMaskFeather\"] = 2] = \"UserMaskFeather\";\r\n    MaskParams[MaskParams[\"VectorMaskDensity\"] = 4] = \"VectorMaskDensity\";\r\n    MaskParams[MaskParams[\"VectorMaskFeather\"] = 8] = \"VectorMaskFeather\";\r\n})(MaskParams || (MaskParams = {}));\r\nexport function offsetForChannel(channelId, cmyk) {\r\n    switch (channelId) {\r\n        case 0 /* ChannelID.Color0 */: return 0;\r\n        case 1 /* ChannelID.Color1 */: return 1;\r\n        case 2 /* ChannelID.Color2 */: return 2;\r\n        case 3 /* ChannelID.Color3 */: return cmyk ? 3 : channelId + 1;\r\n        case -1 /* ChannelID.Transparency */: return cmyk ? 4 : 3;\r\n        default: return channelId + 1;\r\n    }\r\n}\r\nexport function clamp(value, min, max) {\r\n    return value < min ? min : (value > max ? max : value);\r\n}\r\nexport function hasAlpha(data) {\r\n    var size = data.width * data.height * 4;\r\n    for (var i = 3; i < size; i += 4) {\r\n        if (data.data[i] !== 255) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\nexport function resetImageData(_a) {\r\n    var data = _a.data;\r\n    var alpha = (data instanceof Float32Array) ? 1.0 : ((data instanceof Uint16Array) ? 0xffff : 0xff);\r\n    for (var p = 0, size = data.length | 0; p < size; p = (p + 4) | 0) {\r\n        data[p + 0] = 0;\r\n        data[p + 1] = 0;\r\n        data[p + 2] = 0;\r\n        data[p + 3] = alpha;\r\n    }\r\n}\r\nexport function imageDataToCanvas(pixelData) {\r\n    var canvas = createCanvas(pixelData.width, pixelData.height);\r\n    var imageData;\r\n    if (pixelData.data instanceof Uint8ClampedArray) {\r\n        imageData = pixelData;\r\n    }\r\n    else {\r\n        imageData = createImageData(pixelData.width, pixelData.height);\r\n        var src = pixelData.data;\r\n        var dst = imageData.data;\r\n        if (src instanceof Float32Array) {\r\n            for (var i = 0, size = src.length; i < size; i += 4) {\r\n                dst[i + 0] = Math.round(Math.pow(src[i + 0], 1.0 / 2.2) * 255);\r\n                dst[i + 1] = Math.round(Math.pow(src[i + 1], 1.0 / 2.2) * 255);\r\n                dst[i + 2] = Math.round(Math.pow(src[i + 2], 1.0 / 2.2) * 255);\r\n                dst[i + 3] = Math.round(src[i + 3] * 255);\r\n            }\r\n        }\r\n        else {\r\n            var shift = (src instanceof Uint16Array) ? 8 : 0;\r\n            for (var i = 0, size = src.length; i < size; i++) {\r\n                dst[i] = src[i] >>> shift;\r\n            }\r\n        }\r\n    }\r\n    canvas.getContext('2d').putImageData(imageData, 0, 0);\r\n    return canvas;\r\n}\r\nexport function decodeBitmap(input, output, width, height) {\r\n    if (!(input instanceof Uint8Array || input instanceof Uint8ClampedArray))\r\n        throw new Error('Invalid bit depth');\r\n    for (var y = 0, p = 0, o = 0; y < height; y++) {\r\n        for (var x = 0; x < width;) {\r\n            var b = input[o++];\r\n            for (var i = 0; i < 8 && x < width; i++, x++, p += 4) {\r\n                var v = b & 0x80 ? 0 : 255;\r\n                b = b << 1;\r\n                output[p + 0] = v;\r\n                output[p + 1] = v;\r\n                output[p + 2] = v;\r\n                output[p + 3] = 255;\r\n            }\r\n        }\r\n    }\r\n}\r\nexport function writeDataRaw(data, offset, width, height) {\r\n    if (!width || !height)\r\n        return undefined;\r\n    var array = new Uint8Array(width * height);\r\n    for (var i = 0; i < array.length; i++) {\r\n        array[i] = data.data[i * 4 + offset];\r\n    }\r\n    return array;\r\n}\r\nexport function writeDataRLE(buffer, _a, offsets, large) {\r\n    var data = _a.data, width = _a.width, height = _a.height;\r\n    if (!width || !height)\r\n        return undefined;\r\n    var stride = (4 * width) | 0;\r\n    var ol = 0;\r\n    var o = (offsets.length * (large ? 4 : 2) * height) | 0;\r\n    for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {\r\n        var offset = offsets_1[_i];\r\n        for (var y = 0, p = offset | 0; y < height; y++) {\r\n            var strideStart = (y * stride) | 0;\r\n            var strideEnd = (strideStart + stride) | 0;\r\n            var lastIndex = (strideEnd + offset - 4) | 0;\r\n            var lastIndex2 = (lastIndex - 4) | 0;\r\n            var startOffset = o;\r\n            for (p = (strideStart + offset) | 0; p < strideEnd; p = (p + 4) | 0) {\r\n                if (p < lastIndex2) {\r\n                    var value1 = data[p];\r\n                    p = (p + 4) | 0;\r\n                    var value2 = data[p];\r\n                    p = (p + 4) | 0;\r\n                    var value3 = data[p];\r\n                    if (value1 === value2 && value1 === value3) {\r\n                        var count = 3;\r\n                        while (count < 128 && p < lastIndex && data[(p + 4) | 0] === value1) {\r\n                            count = (count + 1) | 0;\r\n                            p = (p + 4) | 0;\r\n                        }\r\n                        buffer[o++] = 1 - count;\r\n                        buffer[o++] = value1;\r\n                    }\r\n                    else {\r\n                        var countIndex = o;\r\n                        var writeLast = true;\r\n                        var count = 1;\r\n                        buffer[o++] = 0;\r\n                        buffer[o++] = value1;\r\n                        while (p < lastIndex && count < 128) {\r\n                            p = (p + 4) | 0;\r\n                            value1 = value2;\r\n                            value2 = value3;\r\n                            value3 = data[p];\r\n                            if (value1 === value2 && value1 === value3) {\r\n                                p = (p - 12) | 0;\r\n                                writeLast = false;\r\n                                break;\r\n                            }\r\n                            else {\r\n                                count++;\r\n                                buffer[o++] = value1;\r\n                            }\r\n                        }\r\n                        if (writeLast) {\r\n                            if (count < 127) {\r\n                                buffer[o++] = value2;\r\n                                buffer[o++] = value3;\r\n                                count += 2;\r\n                            }\r\n                            else if (count < 128) {\r\n                                buffer[o++] = value2;\r\n                                count++;\r\n                                p = (p - 4) | 0;\r\n                            }\r\n                            else {\r\n                                p = (p - 8) | 0;\r\n                            }\r\n                        }\r\n                        buffer[countIndex] = count - 1;\r\n                    }\r\n                }\r\n                else if (p === lastIndex) {\r\n                    buffer[o++] = 0;\r\n                    buffer[o++] = data[p];\r\n                }\r\n                else { // p === lastIndex2\r\n                    buffer[o++] = 1;\r\n                    buffer[o++] = data[p];\r\n                    p = (p + 4) | 0;\r\n                    buffer[o++] = data[p];\r\n                }\r\n            }\r\n            var length_1 = o - startOffset;\r\n            if (large) {\r\n                buffer[ol++] = (length_1 >> 24) & 0xff;\r\n                buffer[ol++] = (length_1 >> 16) & 0xff;\r\n            }\r\n            buffer[ol++] = (length_1 >> 8) & 0xff;\r\n            buffer[ol++] = length_1 & 0xff;\r\n        }\r\n    }\r\n    return buffer.slice(0, o);\r\n}\r\nexport function writeDataZipWithoutPrediction(_a, offsets) {\r\n    var data = _a.data, width = _a.width, height = _a.height;\r\n    var size = width * height;\r\n    var channel = new Uint8Array(size);\r\n    var buffers = [];\r\n    var totalLength = 0;\r\n    for (var _i = 0, offsets_2 = offsets; _i < offsets_2.length; _i++) {\r\n        var offset = offsets_2[_i];\r\n        for (var i = 0, o = offset; i < size; i++, o += 4) {\r\n            channel[i] = data[o];\r\n        }\r\n        var buffer = deflateSync(channel);\r\n        buffers.push(buffer);\r\n        totalLength += buffer.byteLength;\r\n    }\r\n    if (buffers.length > 0) {\r\n        var buffer = new Uint8Array(totalLength);\r\n        var offset = 0;\r\n        for (var _b = 0, buffers_1 = buffers; _b < buffers_1.length; _b++) {\r\n            var b = buffers_1[_b];\r\n            buffer.set(b, offset);\r\n            offset += b.byteLength;\r\n        }\r\n        return buffer;\r\n    }\r\n    else {\r\n        return buffers[0];\r\n    }\r\n}\r\nexport function createCanvasFromData(data) {\r\n    var canvas = createCanvas(100, 100);\r\n    try {\r\n        var context_1 = canvas.getContext('2d');\r\n        var imageData = decodeJpeg(data, function (w, h) { return context_1.createImageData(w, h); });\r\n        canvas.width = imageData.width;\r\n        canvas.height = imageData.height;\r\n        context_1.putImageData(imageData, 0, 0);\r\n    }\r\n    catch (e) {\r\n        console.error('JPEG decompression error', e.message);\r\n    }\r\n    return canvas;\r\n}\r\nexport var createCanvas = function () {\r\n    throw new Error('Canvas not initialized, use initializeCanvas method to set up createCanvas method');\r\n};\r\nvar tempCanvas = undefined;\r\nexport var createImageData = function (width, height) {\r\n    if (!tempCanvas)\r\n        tempCanvas = createCanvas(1, 1);\r\n    return tempCanvas.getContext('2d').createImageData(width, height);\r\n};\r\nif (typeof document !== 'undefined') {\r\n    createCanvas = function (width, height) {\r\n        var canvas = document.createElement('canvas');\r\n        canvas.width = width;\r\n        canvas.height = height;\r\n        return canvas;\r\n    };\r\n}\r\nexport function initializeCanvas(createCanvasMethod, createImageDataMethod) {\r\n    createCanvas = createCanvasMethod;\r\n    createImageData = createImageDataMethod || createImageData;\r\n}\r\n//# sourceMappingURL=helpers.js.map","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","function charLengthInBytes(code) {\r\n    if ((code & 0xffffff80) === 0) {\r\n        return 1;\r\n    }\r\n    else if ((code & 0xfffff800) === 0) {\r\n        return 2;\r\n    }\r\n    else if ((code & 0xffff0000) === 0) {\r\n        return 3;\r\n    }\r\n    else {\r\n        return 4;\r\n    }\r\n}\r\nexport function stringLengthInBytes(value) {\r\n    var result = 0;\r\n    for (var i = 0; i < value.length; i++) {\r\n        var code = value.charCodeAt(i);\r\n        // high surrogate\r\n        if (code >= 0xd800 && code <= 0xdbff) {\r\n            if ((i + 1) < value.length) {\r\n                var extra = value.charCodeAt(i + 1);\r\n                // low surrogate\r\n                if ((extra & 0xfc00) === 0xdc00) {\r\n                    i++;\r\n                    result += charLengthInBytes(((code & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            result += charLengthInBytes(code);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction writeCharacter(buffer, offset, code) {\r\n    var length = charLengthInBytes(code);\r\n    switch (length) {\r\n        case 1:\r\n            buffer[offset] = code;\r\n            break;\r\n        case 2:\r\n            buffer[offset] = ((code >> 6) & 0x1f) | 0xc0;\r\n            buffer[offset + 1] = (code & 0x3f) | 0x80;\r\n            break;\r\n        case 3:\r\n            buffer[offset] = ((code >> 12) & 0x0f) | 0xe0;\r\n            buffer[offset + 1] = ((code >> 6) & 0x3f) | 0x80;\r\n            buffer[offset + 2] = (code & 0x3f) | 0x80;\r\n            break;\r\n        default:\r\n            buffer[offset] = ((code >> 18) & 0x07) | 0xf0;\r\n            buffer[offset + 1] = ((code >> 12) & 0x3f) | 0x80;\r\n            buffer[offset + 2] = ((code >> 6) & 0x3f) | 0x80;\r\n            buffer[offset + 3] = (code & 0x3f) | 0x80;\r\n            break;\r\n    }\r\n    return length;\r\n}\r\nexport function encodeStringTo(buffer, offset, value) {\r\n    for (var i = 0; i < value.length; i++) {\r\n        var code = value.charCodeAt(i);\r\n        // high surrogate\r\n        if (code >= 0xd800 && code <= 0xdbff) {\r\n            if ((i + 1) < value.length) {\r\n                var extra = value.charCodeAt(i + 1);\r\n                // low surrogate\r\n                if ((extra & 0xfc00) === 0xdc00) {\r\n                    i++;\r\n                    var fullCode = ((code & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\r\n                    offset += writeCharacter(buffer, offset, fullCode);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            offset += writeCharacter(buffer, offset, code);\r\n        }\r\n    }\r\n    return offset;\r\n}\r\nexport function encodeString(value) {\r\n    if (value.length > 1000 && typeof TextEncoder !== 'undefined') {\r\n        return (new TextEncoder()).encode(value);\r\n    }\r\n    var buffer = new Uint8Array(stringLengthInBytes(value));\r\n    encodeStringTo(buffer, 0, value);\r\n    return buffer;\r\n}\r\nfunction continuationByte(buffer, index) {\r\n    if (index >= buffer.length) {\r\n        throw Error('Invalid byte index');\r\n    }\r\n    var continuationByte = buffer[index];\r\n    if ((continuationByte & 0xC0) === 0x80) {\r\n        return continuationByte & 0x3F;\r\n    }\r\n    else {\r\n        throw Error('Invalid continuation byte');\r\n    }\r\n}\r\nexport function decodeString(value) {\r\n    if (value.byteLength > 1000 && typeof TextDecoder !== 'undefined') {\r\n        return (new TextDecoder()).decode(value);\r\n    }\r\n    var result = [];\r\n    for (var i = 0; i < value.length;) {\r\n        var byte1 = value[i++];\r\n        var code = void 0;\r\n        if ((byte1 & 0x80) === 0) {\r\n            code = byte1;\r\n        }\r\n        else if ((byte1 & 0xe0) === 0xc0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x1f) << 6) | byte2;\r\n            if (code < 0x80) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n        }\r\n        else if ((byte1 & 0xf0) === 0xe0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            var byte3 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x0f) << 12) | (byte2 << 6) | byte3;\r\n            if (code < 0x0800) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n            if (code >= 0xd800 && code <= 0xdfff) {\r\n                throw Error(\"Lone surrogate U+\".concat(code.toString(16).toUpperCase(), \" is not a scalar value\"));\r\n            }\r\n        }\r\n        else if ((byte1 & 0xf8) === 0xf0) {\r\n            var byte2 = continuationByte(value, i++);\r\n            var byte3 = continuationByte(value, i++);\r\n            var byte4 = continuationByte(value, i++);\r\n            code = ((byte1 & 0x0f) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\r\n            if (code < 0x010000 || code > 0x10ffff) {\r\n                throw Error('Invalid continuation byte');\r\n            }\r\n        }\r\n        else {\r\n            throw Error('Invalid UTF-8 detected');\r\n        }\r\n        if (code > 0xffff) {\r\n            code -= 0x10000;\r\n            result.push(String.fromCharCode(code >>> 10 & 0x3ff | 0xd800));\r\n            code = 0xdc00 | code & 0x3ff;\r\n        }\r\n        result.push(String.fromCharCode(code));\r\n    }\r\n    return result.join('');\r\n}\r\n//# sourceMappingURL=utf8.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nvar __rest = (this && this.__rest) || function (s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n};\r\nimport { createEnum } from './helpers';\r\nimport { readSignature, readUnicodeString, readUint32, readUint8, readFloat64, readBytes, readAsciiString, readInt32, readFloat32, readInt32LE, readUnicodeStringWithLengthLE } from './psdReader';\r\nimport { writeSignature, writeBytes, writeUint32, writeFloat64, writeUint8, writeUnicodeStringWithPadding, writeInt32, writeFloat32, writeUnicodeString, writeInt32LE, writeUnicodeStringWithoutLengthLE } from './psdWriter';\r\nfunction revMap(map) {\r\n    var result = {};\r\n    Object.keys(map).forEach(function (key) { return result[map[key]] = key; });\r\n    return result;\r\n}\r\nvar unitsMap = {\r\n    '#Ang': 'Angle',\r\n    '#Rsl': 'Density',\r\n    '#Rlt': 'Distance',\r\n    '#Nne': 'None',\r\n    '#Prc': 'Percent',\r\n    '#Pxl': 'Pixels',\r\n    '#Mlm': 'Millimeters',\r\n    '#Pnt': 'Points',\r\n    'RrPi': 'Picas',\r\n    'RrIn': 'Inches',\r\n    'RrCm': 'Centimeters',\r\n};\r\nvar unitsMapRev = revMap(unitsMap);\r\nvar logErrors = false;\r\nexport function setLogErrors(value) {\r\n    logErrors = value;\r\n}\r\nfunction makeType(name, classID) {\r\n    return { name: name, classID: classID };\r\n}\r\nvar nullType = makeType('', 'null');\r\nvar USE_CHINESE = false; // Testing\r\nvar fieldToExtType = {\r\n    strokeStyleContent: makeType('', 'solidColorLayer'),\r\n    printProofSetup: makeType(USE_CHINESE ? '校样设置' : 'Proof Setup', 'proofSetup'),\r\n    Grad: makeType(USE_CHINESE ? '渐变' : 'Gradient', 'Grdn'),\r\n    Trnf: makeType(USE_CHINESE ? '变换' : 'Transform', 'Trnf'),\r\n    patternFill: makeType('', 'patternFill'),\r\n    ebbl: makeType('', 'ebbl'),\r\n    SoFi: makeType('', 'SoFi'),\r\n    GrFl: makeType('', 'GrFl'),\r\n    sdwC: makeType('', 'RGBC'),\r\n    hglC: makeType('', 'RGBC'),\r\n    'Clr ': makeType('', 'RGBC'),\r\n    'tintColor': makeType('', 'RGBC'),\r\n    Ofst: makeType('', 'Pnt '),\r\n    ChFX: makeType('', 'ChFX'),\r\n    MpgS: makeType('', 'ShpC'),\r\n    DrSh: makeType('', 'DrSh'),\r\n    IrSh: makeType('', 'IrSh'),\r\n    OrGl: makeType('', 'OrGl'),\r\n    IrGl: makeType('', 'IrGl'),\r\n    TrnS: makeType('', 'ShpC'),\r\n    Ptrn: makeType('', 'Ptrn'),\r\n    FrFX: makeType('', 'FrFX'),\r\n    phase: makeType('', 'Pnt '),\r\n    frameStep: nullType,\r\n    duration: nullType,\r\n    workInTime: nullType,\r\n    workOutTime: nullType,\r\n    audioClipGroupList: nullType,\r\n    bounds: makeType('', 'Rctn'),\r\n    customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),\r\n    warp: makeType('', 'warp'),\r\n    'Sz  ': makeType('', 'Pnt '),\r\n    origin: makeType('', 'Pnt '),\r\n    autoExpandOffset: makeType('', 'Pnt '),\r\n    keyOriginShapeBBox: makeType('', 'unitRect'),\r\n    Vrsn: nullType,\r\n    psVersion: nullType,\r\n    docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),\r\n    artboardRect: makeType('', 'classFloatRect'),\r\n    keyOriginRRectRadii: makeType('', 'radii'),\r\n    keyOriginBoxCorners: nullType,\r\n    rectangleCornerA: makeType('', 'Pnt '),\r\n    rectangleCornerB: makeType('', 'Pnt '),\r\n    rectangleCornerC: makeType('', 'Pnt '),\r\n    rectangleCornerD: makeType('', 'Pnt '),\r\n    compInfo: nullType,\r\n    quiltWarp: makeType('', 'quiltWarp'),\r\n    generatorSettings: nullType,\r\n    crema: nullType,\r\n    FrIn: nullType,\r\n    blendOptions: nullType,\r\n    FXRf: nullType,\r\n    Lefx: nullType,\r\n    time: nullType,\r\n    animKey: nullType,\r\n    timeScope: nullType,\r\n    inTime: nullType,\r\n    outTime: nullType,\r\n    sheetStyle: nullType,\r\n    translation: nullType,\r\n    Skew: nullType,\r\n    boundingBox: makeType('', 'boundingBox'),\r\n    'Lnk ': makeType('', 'ExternalFileLink'),\r\n    frameReader: makeType('', 'FrameReader'),\r\n    effectParams: makeType('', 'motionTrackEffectParams'),\r\n    Impr: makeType('None', 'none'),\r\n    Anch: makeType('', 'Pnt '),\r\n    'Fwd ': makeType('', 'Pnt '),\r\n    'Bwd ': makeType('', 'Pnt '),\r\n    FlrC: makeType('', 'Pnt '),\r\n    meshBoundaryPath: makeType('', 'pathClass'),\r\n    filterFX: makeType('', 'filterFXStyle'),\r\n    Fltr: makeType('', 'rigidTransform'),\r\n    FrgC: makeType('', 'RGBC'),\r\n    BckC: makeType('', 'RGBC'),\r\n    sdwM: makeType('Parameters', 'adaptCorrectTones'),\r\n    hglM: makeType('Parameters', 'adaptCorrectTones'),\r\n    customShape: makeType('', 'customShape'),\r\n    origFXRefPoint: nullType,\r\n    FXRefPoint: nullType,\r\n    ClMg: makeType('', 'ClMg'),\r\n};\r\nvar fieldToArrayExtType = {\r\n    'Crv ': makeType('', 'CrPt'),\r\n    Clrs: makeType('', 'Clrt'),\r\n    Trns: makeType('', 'TrnS'),\r\n    keyDescriptorList: nullType,\r\n    solidFillMulti: makeType('', 'SoFi'),\r\n    gradientFillMulti: makeType('', 'GrFl'),\r\n    dropShadowMulti: makeType('', 'DrSh'),\r\n    innerShadowMulti: makeType('', 'IrSh'),\r\n    frameFXMulti: makeType('', 'FrFX'),\r\n    FrIn: nullType,\r\n    FSts: nullType,\r\n    LaSt: nullType,\r\n    sheetTimelineOptions: nullType,\r\n    trackList: makeType('', 'animationTrack'),\r\n    globalTrackList: makeType('', 'animationTrack'),\r\n    keyList: nullType,\r\n    audioClipGroupList: nullType,\r\n    audioClipList: nullType,\r\n    countObjectList: makeType('', 'countObject'),\r\n    countGroupList: makeType('', 'countGroup'),\r\n    slices: makeType('', 'slice'),\r\n    'Pts ': makeType('', 'Pthp'),\r\n    SbpL: makeType('', 'SbpL'),\r\n    pathComponents: makeType('', 'PaCm'),\r\n    filterFXList: makeType('', 'filterFX'),\r\n    puppetShapeList: makeType('', 'puppetShape'),\r\n    channelDenoise: makeType('', 'channelDenoiseParams'),\r\n    ShrP: makeType('', 'Pnt '),\r\n    layerSettings: nullType,\r\n    list: nullType,\r\n    Adjs: makeType('', 'CrvA'),\r\n};\r\nvar typeToField = {\r\n    'TEXT': [\r\n        'Txt ', 'printerName', 'Nm  ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',\r\n        'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',\r\n        'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',\r\n        'altTag', 'url', 'cellText', 'preset', 'KnNm', 'FPth', 'comment', 'originalPath',\r\n    ],\r\n    'tdta': [\r\n        'EngineData', 'LUT3DFileData', 'indexArray', 'originalVertexArray', 'deformedVertexArray',\r\n        'LqMe',\r\n    ],\r\n    'long': [\r\n        'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',\r\n        'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'comp', 'compID', 'originalCompID',\r\n        'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',\r\n        'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',\r\n        'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',\r\n        'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',\r\n        'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',\r\n        'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',\r\n        'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset', 'filterID', 'meshQuality',\r\n        'meshExpansion', 'meshRigidity', 'VrsM', 'VrsN', 'NmbG', 'WLMn', 'WLMx', 'AmMn', 'AmMx', 'SclH', 'SclV',\r\n        'Lvl ', 'TlNm', 'TlOf', 'FlRs', 'Thsh', 'ShrS', 'ShrE', 'FlRs', 'Vrnc', 'Strg', 'ExtS', 'ExtD',\r\n        'HrzS', 'VrtS', 'NmbR', 'EdgF', 'Ang1', 'Ang2', 'Ang3', 'Ang4', 'lastAppliedComp', 'capturedInfo',\r\n    ],\r\n    'enum': [\r\n        'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS', 'BlrQ',\r\n        'bvlT', 'bvlS', 'bvlD', 'Md  ', 'glwS', 'GrdF', 'GlwT', 'RplS', 'BlrM', 'SmBM',\r\n        'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',\r\n        'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',\r\n        'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',\r\n        'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',\r\n        'vertAlign', 'bgColorType', 'shapeOperation', 'UndA', 'Wvtp', 'Drct', 'WndM', 'Edg ', 'FlCl', 'IntE',\r\n        'IntC', 'Cnvr', 'Fl  ', 'Dstr', 'MztT', 'Lns ', 'ExtT', 'DspM', 'ExtR', 'ZZTy', 'SphM', 'SmBQ', 'placedLayerOCIOConversion', 'gradientsInterpolationMethod',\r\n    ],\r\n    'bool': [\r\n        'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',\r\n        'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape', 'Vsbl',\r\n        'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',\r\n        'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',\r\n        'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',\r\n        'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',\r\n        'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',\r\n        'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',\r\n        'cellTextIsHTML', 'Smoo', 'Clsp', 'validAtPosition', 'rigidType', 'hasoptions', 'filterMaskEnable',\r\n        'filterMaskLinked', 'filterMaskExtendWithWhite', 'removeJPEGArtifact', 'Mnch', 'ExtF', 'ExtM',\r\n        'moreAccurate', 'GpuY', 'LIWy', 'Cnty',\r\n    ],\r\n    'doub': [\r\n        'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',\r\n        'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',\r\n        'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',\r\n        'X   ', 'Y   ', 'redFloat', 'greenFloat', 'blueFloat', 'imageResolution',\r\n        'PuX0', 'PuX1', 'PuX2', 'PuX3', 'PuY0', 'PuY1', 'PuY2', 'PuY3'\r\n    ],\r\n    'UntF': [\r\n        'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',\r\n        'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',\r\n        'strokeStyleOpacity', 'H   ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',\r\n        'topRight', 'topLeft', 'bottomLeft', 'bottomRight', 'ClNs', 'Shrp',\r\n    ],\r\n    'VlLs': [\r\n        'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',\r\n        'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',\r\n        'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',\r\n        'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',\r\n        'warpValues', 'selectedPin', 'Pts ', 'SbpL', 'pathComponents', 'pinOffsets', 'posFinalPins',\r\n        'pinVertexIndices', 'PinP', 'PnRt', 'PnOv', 'PnDp', 'filterFXList', 'puppetShapeList', 'ShrP',\r\n        'channelDenoise', 'Mtrx', 'layerSettings', 'list', 'compList', 'Adjs',\r\n    ],\r\n    'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],\r\n    'obj ': ['null', 'Chnl'],\r\n    'Pth ': ['DspF'],\r\n};\r\nvar channels = [\r\n    'Rd  ', 'Grn ', 'Bl  ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A   ', 'B   ',\r\n];\r\nvar fieldToArrayType = {\r\n    'Mnm ': 'long',\r\n    'Mxm ': 'long',\r\n    FrLs: 'long',\r\n    strokeStyleLineDashSet: 'UntF',\r\n    Trnf: 'doub',\r\n    nonAffineTransform: 'doub',\r\n    keyDescriptorList: 'Objc',\r\n    gradientFillMulti: 'Objc',\r\n    solidFillMulti: 'Objc',\r\n    frameFXMulti: 'Objc',\r\n    innerShadowMulti: 'Objc',\r\n    dropShadowMulti: 'Objc',\r\n    LaSt: 'Objc',\r\n    FrIn: 'Objc',\r\n    FSts: 'Objc',\r\n    FsFr: 'long',\r\n    blendOptions: 'Objc',\r\n    sheetTimelineOptions: 'Objc',\r\n    keyList: 'Objc',\r\n    warpValues: 'doub',\r\n    selectedPin: 'long',\r\n    'Pts ': 'Objc',\r\n    SbpL: 'Objc',\r\n    pathComponents: 'Objc',\r\n    pinOffsets: 'doub',\r\n    posFinalPins: 'doub',\r\n    pinVertexIndices: 'long',\r\n    PinP: 'doub',\r\n    PnRt: 'long',\r\n    PnOv: 'bool',\r\n    PnDp: 'doub',\r\n    filterFXList: 'Objc',\r\n    puppetShapeList: 'Objc',\r\n    ShrP: 'Objc',\r\n    channelDenoise: 'Objc',\r\n    Mtrx: 'long',\r\n    compList: 'long',\r\n    Chnl: 'enum',\r\n};\r\nvar fieldToType = {};\r\nfor (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {\r\n    var type = _a[_i];\r\n    for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {\r\n        var field = _c[_b];\r\n        fieldToType[field] = type;\r\n    }\r\n}\r\nfor (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {\r\n    var field = _e[_d];\r\n    if (!fieldToType[field])\r\n        fieldToType[field] = 'Objc';\r\n}\r\nfor (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {\r\n    var field = _g[_f];\r\n    fieldToArrayType[field] = 'Objc';\r\n}\r\nfunction getTypeByKey(key, value, root, parent) {\r\n    if (key === 'presetKind') {\r\n        return typeof value === 'string' ? 'enum' : 'long';\r\n    }\r\n    if (key === 'null' && root === 'slices') {\r\n        return 'TEXT';\r\n    }\r\n    else if (key === 'groupID') {\r\n        return root === 'slices' ? 'long' : 'TEXT';\r\n    }\r\n    else if (key === 'Sz  ') {\r\n        return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');\r\n    }\r\n    else if (key === 'Type') {\r\n        return typeof value === 'string' ? 'enum' : 'long';\r\n    }\r\n    else if (key === 'AntA') {\r\n        return typeof value === 'string' ? 'enum' : 'bool';\r\n    }\r\n    else if ((key === 'Hrzn' || key === 'Vrtc') && (parent.Type === 'keyType.Pstn' || parent._classID === 'Ofst')) {\r\n        return 'long';\r\n    }\r\n    else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {\r\n        if (root === 'slices')\r\n            return 'long';\r\n        return typeof value === 'number' ? 'doub' : 'UntF';\r\n    }\r\n    else if (key === 'Vrsn') {\r\n        return typeof value === 'number' ? 'long' : 'Objc';\r\n    }\r\n    else if (key === 'Rd  ' || key === 'Grn ' || key === 'Bl  ') {\r\n        return root === 'artd' ? 'long' : 'doub';\r\n    }\r\n    else if (key === 'Trnf') {\r\n        return Array.isArray(value) ? 'VlLs' : 'Objc';\r\n    }\r\n    else {\r\n        return fieldToType[key];\r\n    }\r\n}\r\nexport function readAsciiStringOrClassId(reader) {\r\n    var length = readInt32(reader);\r\n    return readAsciiString(reader, length || 4);\r\n}\r\nfunction writeAsciiStringOrClassId(writer, value) {\r\n    if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold' && value !== 'list') {\r\n        // write classId\r\n        writeInt32(writer, 0);\r\n        writeSignature(writer, value);\r\n    }\r\n    else {\r\n        // write ascii string\r\n        writeInt32(writer, value.length);\r\n        for (var i = 0; i < value.length; i++) {\r\n            writeUint8(writer, value.charCodeAt(i));\r\n        }\r\n    }\r\n}\r\nexport function readDescriptorStructure(reader, includeClass) {\r\n    var struct = readClassStructure(reader);\r\n    var object = includeClass ? { _name: struct.name, _classID: struct.classID } : {};\r\n    // console.log('>> ', struct);\r\n    var itemsCount = readUint32(reader);\r\n    for (var i = 0; i < itemsCount; i++) {\r\n        var key = readAsciiStringOrClassId(reader);\r\n        var type = readSignature(reader);\r\n        // console.log(`> '${key}' '${type}'`);\r\n        var data = readOSType(reader, type, includeClass);\r\n        // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);\r\n        object[key] = data;\r\n    }\r\n    return object;\r\n}\r\nexport function writeDescriptorStructure(writer, name, classId, value, root) {\r\n    if (logErrors && !classId)\r\n        console.log('Missing classId for: ', name, classId, value);\r\n    // write class structure\r\n    writeUnicodeStringWithPadding(writer, name);\r\n    writeAsciiStringOrClassId(writer, classId);\r\n    var keys = Object.keys(value);\r\n    var keyCount = keys.length;\r\n    if ('_name' in value)\r\n        keyCount--;\r\n    if ('_classID' in value)\r\n        keyCount--;\r\n    writeUint32(writer, keyCount);\r\n    for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\r\n        var key = keys_1[_i];\r\n        if (key === '_name' || key === '_classID')\r\n            continue;\r\n        var type = getTypeByKey(key, value[key], root, value);\r\n        var extType = fieldToExtType[key];\r\n        if (key === 'bounds' && root === 'text') {\r\n            extType = makeType('', 'bounds');\r\n        }\r\n        else if (key === 'origin') {\r\n            type = root === 'slices' ? 'enum' : 'Objc';\r\n        }\r\n        else if ((key === 'Cyn ' || key === 'Mgnt' || key === 'Ylw ' || key === 'Blck') && value._classID === 'CMYC') {\r\n            type = 'doub';\r\n        }\r\n        else if (/^PN[a-z][a-z]$/.test(key)) {\r\n            type = 'TEXT';\r\n        }\r\n        else if (/^PT[a-z][a-z]$/.test(key)) {\r\n            type = 'long';\r\n        }\r\n        else if (/^PF[a-z][a-z]$/.test(key)) {\r\n            type = 'doub';\r\n        }\r\n        else if ((key === 'Rds ' || key === 'Thsh') && typeof value[key] === 'number' && value._classID === 'SmrB') {\r\n            type = 'doub';\r\n        }\r\n        else if (key === 'ClSz' || key === 'Rds ' || key === 'Amnt') {\r\n            type = typeof value[key] === 'number' ? 'long' : 'UntF';\r\n        }\r\n        else if ((key === 'sdwM' || key === 'hglM') && typeof value[key] === 'string') {\r\n            type = 'enum';\r\n        }\r\n        else if (key === 'blur' && typeof value[key] === 'string') {\r\n            type = 'enum';\r\n        }\r\n        else if (key === 'Hght' && typeof value[key] === 'number' && value._classID === 'Embs') {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Angl' && typeof value[key] === 'number' && (value._classID === 'Embs' || value._classID === 'smartSharpen' || value._classID === 'Twrl' || value._classID === 'MtnB')) {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Angl' && typeof value[key] === 'number') {\r\n            type = 'doub'; // ???\r\n        }\r\n        else if (key === 'bounds' && root === 'slices') {\r\n            type = 'Objc';\r\n            extType = makeType('', 'Rct1');\r\n        }\r\n        else if (key === 'Scl ') {\r\n            if (typeof value[key] === 'object' && 'Hrzn' in value[key]) {\r\n                type = 'Objc';\r\n                extType = nullType;\r\n            }\r\n            else if (typeof value[key] === 'number') {\r\n                type = 'long';\r\n            }\r\n            else {\r\n                type = 'UntF';\r\n            }\r\n        }\r\n        else if (key === 'audioClipGroupList' && keys.length === 1) {\r\n            type = 'VlLs';\r\n        }\r\n        else if ((key === 'Strt' || key === 'Brgh') && 'H   ' in value) {\r\n            type = 'doub';\r\n        }\r\n        else if (key === 'Wdth' && typeof value[key] === 'object') {\r\n            type = 'UntF';\r\n        }\r\n        else if (key === 'Ofst' && typeof value[key] === 'number') {\r\n            type = 'long';\r\n        }\r\n        else if (key === 'Strt' && typeof value[key] === 'object') {\r\n            type = 'Objc';\r\n            extType = nullType;\r\n        }\r\n        else if (channels.indexOf(key) !== -1) {\r\n            type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';\r\n        }\r\n        else if (key === 'profile') {\r\n            type = classId === 'printOutput' ? 'TEXT' : 'tdta';\r\n        }\r\n        else if (key === 'strokeStyleContent') {\r\n            if (value[key]['Clr ']) {\r\n                extType = makeType('', 'solidColorLayer');\r\n            }\r\n            else if (value[key].Grad) {\r\n                extType = makeType('', 'gradientLayer');\r\n            }\r\n            else if (value[key].Ptrn) {\r\n                extType = makeType('', 'patternLayer');\r\n            }\r\n            else {\r\n                logErrors && console.log('Invalid strokeStyleContent value', value[key]);\r\n            }\r\n        }\r\n        else if (key === 'bounds' && root === 'quiltWarp') {\r\n            extType = makeType('', 'classFloatRect');\r\n        }\r\n        if (extType && extType.classID === 'RGBC') {\r\n            if ('H   ' in value[key])\r\n                extType = { classID: 'HSBC', name: '' };\r\n            // TODO: other color spaces\r\n        }\r\n        writeAsciiStringOrClassId(writer, key);\r\n        writeSignature(writer, type || 'long');\r\n        writeOSType(writer, type || 'long', value[key], key, extType, root);\r\n        if (logErrors && !type)\r\n            console.log(\"Missing descriptor field type for: '\".concat(key, \"' in\"), value);\r\n    }\r\n}\r\nfunction readOSType(reader, type, includeClass) {\r\n    switch (type) {\r\n        case 'obj ': // Reference\r\n            return readReferenceStructure(reader);\r\n        case 'Objc': // Descriptor\r\n        case 'GlbO': // GlobalObject same as Descriptor\r\n            return readDescriptorStructure(reader, includeClass);\r\n        case 'VlLs': { // List\r\n            var length_1 = readInt32(reader);\r\n            var items = [];\r\n            for (var i = 0; i < length_1; i++) {\r\n                var itemType = readSignature(reader);\r\n                // console.log('  >', itemType);\r\n                items.push(readOSType(reader, itemType, includeClass));\r\n            }\r\n            return items;\r\n        }\r\n        case 'doub': // Double\r\n            return readFloat64(reader);\r\n        case 'UntF': { // Unit double\r\n            var units = readSignature(reader);\r\n            var value = readFloat64(reader);\r\n            if (!unitsMap[units])\r\n                throw new Error(\"Invalid units: \".concat(units));\r\n            return { units: unitsMap[units], value: value };\r\n        }\r\n        case 'UnFl': { // Unit float\r\n            var units = readSignature(reader);\r\n            var value = readFloat32(reader);\r\n            if (!unitsMap[units])\r\n                throw new Error(\"Invalid units: \".concat(units));\r\n            return { units: unitsMap[units], value: value };\r\n        }\r\n        case 'TEXT': // String\r\n            return readUnicodeString(reader);\r\n        case 'enum': { // Enumerated\r\n            var enumType = readAsciiStringOrClassId(reader);\r\n            var value = readAsciiStringOrClassId(reader);\r\n            return \"\".concat(enumType, \".\").concat(value);\r\n        }\r\n        case 'long': // Integer\r\n            return readInt32(reader);\r\n        case 'comp': { // Large Integer\r\n            var low = readUint32(reader);\r\n            var high = readUint32(reader);\r\n            return { low: low, high: high };\r\n        }\r\n        case 'bool': // Boolean\r\n            return !!readUint8(reader);\r\n        case 'type': // Class\r\n        case 'GlbC': // Class\r\n            return readClassStructure(reader);\r\n        case 'alis': { // Alias\r\n            var length_2 = readInt32(reader);\r\n            return readAsciiString(reader, length_2);\r\n        }\r\n        case 'tdta': { // Raw Data\r\n            var length_3 = readInt32(reader);\r\n            return readBytes(reader, length_3);\r\n        }\r\n        case 'ObAr': { // Object array\r\n            readInt32(reader); // version: 16\r\n            readUnicodeString(reader); // name: ''\r\n            readAsciiStringOrClassId(reader); // 'rationalPoint'\r\n            var length_4 = readInt32(reader);\r\n            var items = [];\r\n            for (var i = 0; i < length_4; i++) {\r\n                var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc\r\n                readSignature(reader); // UnFl\r\n                readSignature(reader); // units ? '#Pxl'\r\n                var valuesCount = readInt32(reader);\r\n                var values = [];\r\n                for (var j = 0; j < valuesCount; j++) {\r\n                    values.push(readFloat64(reader));\r\n                }\r\n                items.push({ type: type1, values: values });\r\n            }\r\n            return items;\r\n        }\r\n        case 'Pth ': { // File path\r\n            /*const length =*/ readInt32(reader); // total size of all fields below\r\n            var sig = readSignature(reader);\r\n            /*const pathSize =*/ readInt32LE(reader); // the same as length\r\n            var charsCount = readInt32LE(reader);\r\n            var path = readUnicodeStringWithLengthLE(reader, charsCount);\r\n            return { sig: sig, path: path };\r\n        }\r\n        default:\r\n            throw new Error(\"Invalid TySh descriptor OSType: \".concat(type, \" at \").concat(reader.offset.toString(16)));\r\n    }\r\n}\r\nvar ObArTypes = {\r\n    meshPoints: 'rationalPoint',\r\n    quiltSliceX: 'UntF',\r\n    quiltSliceY: 'UntF',\r\n};\r\nfunction writeOSType(writer, type, value, key, extType, root) {\r\n    switch (type) {\r\n        case 'obj ': // Reference\r\n            writeReferenceStructure(writer, key, value);\r\n            break;\r\n        case 'Objc': // Descriptor\r\n        case 'GlbO': { // GlobalObject same as Descriptor\r\n            if (typeof value !== 'object')\r\n                throw new Error(\"Invalid struct value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            if (!extType)\r\n                throw new Error(\"Missing ext type for: '\".concat(key, \"' (\").concat(JSON.stringify(value), \")\"));\r\n            var name_1 = value._name || extType.name;\r\n            var classID = value._classID || extType.classID;\r\n            writeDescriptorStructure(writer, name_1, classID, value, root);\r\n            break;\r\n        }\r\n        case 'VlLs': // List\r\n            if (!Array.isArray(value))\r\n                throw new Error(\"Invalid list value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeInt32(writer, value.length);\r\n            for (var i = 0; i < value.length; i++) {\r\n                var type_1 = fieldToArrayType[key];\r\n                writeSignature(writer, type_1 || 'long');\r\n                writeOSType(writer, type_1 || 'long', value[i], \"\".concat(key, \"[]\"), fieldToArrayExtType[key], root);\r\n                if (logErrors && !type_1)\r\n                    console.log(\"Missing descriptor array type for: '\".concat(key, \"' in\"), value);\r\n            }\r\n            break;\r\n        case 'doub': // Double\r\n            if (typeof value !== 'number')\r\n                throw new Error(\"Invalid number value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeFloat64(writer, value);\r\n            break;\r\n        case 'UntF': // Unit double\r\n            if (!unitsMapRev[value.units])\r\n                throw new Error(\"Invalid units: \".concat(value.units, \" in \").concat(key));\r\n            writeSignature(writer, unitsMapRev[value.units]);\r\n            writeFloat64(writer, value.value);\r\n            break;\r\n        case 'UnFl': // Unit float\r\n            if (!unitsMapRev[value.units])\r\n                throw new Error(\"Invalid units: \".concat(value.units, \" in \").concat(key));\r\n            writeSignature(writer, unitsMapRev[value.units]);\r\n            writeFloat32(writer, value.value);\r\n            break;\r\n        case 'TEXT': // String\r\n            writeUnicodeStringWithPadding(writer, value);\r\n            break;\r\n        case 'enum': { // Enumerated\r\n            if (typeof value !== 'string')\r\n                throw new Error(\"Invalid enum value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            var _a = value.split('.'), _type = _a[0], val = _a[1];\r\n            writeAsciiStringOrClassId(writer, _type);\r\n            writeAsciiStringOrClassId(writer, val);\r\n            break;\r\n        }\r\n        case 'long': // Integer\r\n            if (typeof value !== 'number')\r\n                throw new Error(\"Invalid integer value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeInt32(writer, value);\r\n            break;\r\n        // case 'comp': // Large Integer\r\n        // \twriteLargeInteger(reader);\r\n        case 'bool': // Boolean\r\n            if (typeof value !== 'boolean')\r\n                throw new Error(\"Invalid boolean value: \".concat(JSON.stringify(value), \", key: \").concat(key));\r\n            writeUint8(writer, value ? 1 : 0);\r\n            break;\r\n        // case 'type': // Class\r\n        // case 'GlbC': // Class\r\n        // \twriteClassStructure(reader);\r\n        // case 'alis': // Alias\r\n        // \twriteAliasStructure(reader);\r\n        case 'tdta': // Raw Data\r\n            writeInt32(writer, value.byteLength);\r\n            writeBytes(writer, value);\r\n            break;\r\n        case 'ObAr': { // Object array\r\n            writeInt32(writer, 16); // version\r\n            writeUnicodeStringWithPadding(writer, ''); // name\r\n            var type_2 = ObArTypes[key];\r\n            if (!type_2)\r\n                throw new Error(\"Not implemented ObArType for: \".concat(key));\r\n            writeAsciiStringOrClassId(writer, type_2);\r\n            writeInt32(writer, value.length);\r\n            for (var i = 0; i < value.length; i++) {\r\n                writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc\r\n                writeSignature(writer, 'UnFl');\r\n                writeSignature(writer, '#Pxl');\r\n                writeInt32(writer, value[i].values.length);\r\n                for (var j = 0; j < value[i].values.length; j++) {\r\n                    writeFloat64(writer, value[i].values[j]);\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case 'Pth ': { // File path\r\n            var length_5 = 4 + 4 + 4 + value.path.length * 2;\r\n            writeInt32(writer, length_5);\r\n            writeSignature(writer, value.sig);\r\n            writeInt32LE(writer, length_5);\r\n            writeInt32LE(writer, value.path.length);\r\n            writeUnicodeStringWithoutLengthLE(writer, value.path);\r\n            break;\r\n        }\r\n        default:\r\n            throw new Error(\"Not implemented descriptor OSType: \".concat(type));\r\n    }\r\n}\r\nfunction readReferenceStructure(reader) {\r\n    var itemsCount = readInt32(reader);\r\n    var items = [];\r\n    for (var i = 0; i < itemsCount; i++) {\r\n        var type = readSignature(reader);\r\n        switch (type) {\r\n            case 'prop': { // Property\r\n                readClassStructure(reader);\r\n                var keyID = readAsciiStringOrClassId(reader);\r\n                items.push(keyID);\r\n                break;\r\n            }\r\n            case 'Clss': // Class\r\n                items.push(readClassStructure(reader));\r\n                break;\r\n            case 'Enmr': { // Enumerated Reference\r\n                readClassStructure(reader);\r\n                var typeID = readAsciiStringOrClassId(reader);\r\n                var value = readAsciiStringOrClassId(reader);\r\n                items.push(\"\".concat(typeID, \".\").concat(value));\r\n                break;\r\n            }\r\n            case 'rele': { // Offset\r\n                // const { name, classID } =\r\n                readClassStructure(reader);\r\n                items.push(readUint32(reader));\r\n                break;\r\n            }\r\n            case 'Idnt': // Identifier\r\n                items.push(readInt32(reader));\r\n                break;\r\n            case 'indx': // Index\r\n                items.push(readInt32(reader));\r\n                break;\r\n            case 'name': { // Name\r\n                readClassStructure(reader);\r\n                items.push(readUnicodeString(reader));\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid descriptor reference type: \".concat(type));\r\n        }\r\n    }\r\n    return items;\r\n}\r\nfunction writeReferenceStructure(writer, _key, items) {\r\n    writeInt32(writer, items.length);\r\n    for (var i = 0; i < items.length; i++) {\r\n        var value = items[i];\r\n        var type = 'unknown';\r\n        if (typeof value === 'string') {\r\n            if (/^[a-z ]+\\.[a-z ]+$/i.test(value)) {\r\n                type = 'Enmr';\r\n            }\r\n            else {\r\n                type = 'name';\r\n            }\r\n        }\r\n        writeSignature(writer, type);\r\n        switch (type) {\r\n            // case 'prop': // Property\r\n            // case 'Clss': // Class\r\n            case 'Enmr': { // Enumerated Reference\r\n                var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];\r\n                writeClassStructure(writer, '\\0', typeID);\r\n                writeAsciiStringOrClassId(writer, typeID);\r\n                writeAsciiStringOrClassId(writer, enumValue);\r\n                break;\r\n            }\r\n            // case 'rele': // Offset\r\n            // case 'Idnt': // Identifier\r\n            // case 'indx': // Index\r\n            case 'name': { // Name\r\n                writeClassStructure(writer, '\\0', 'Lyr ');\r\n                writeUnicodeString(writer, value + '\\0');\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid descriptor reference type: \".concat(type));\r\n        }\r\n    }\r\n    return items;\r\n}\r\nfunction readClassStructure(reader) {\r\n    var name = readUnicodeString(reader);\r\n    var classID = readAsciiStringOrClassId(reader);\r\n    return { name: name, classID: classID };\r\n}\r\nfunction writeClassStructure(writer, name, classID) {\r\n    writeUnicodeString(writer, name);\r\n    writeAsciiStringOrClassId(writer, classID);\r\n}\r\nexport function readVersionAndDescriptor(reader, includeClass) {\r\n    if (includeClass === void 0) { includeClass = false; }\r\n    var version = readUint32(reader);\r\n    if (version !== 16)\r\n        throw new Error(\"Invalid descriptor version: \".concat(version));\r\n    var desc = readDescriptorStructure(reader, includeClass);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    return desc;\r\n}\r\nexport function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {\r\n    if (root === void 0) { root = ''; }\r\n    writeUint32(writer, 16); // version\r\n    writeDescriptorStructure(writer, name, classID, descriptor, root);\r\n}\r\nexport function horzVrtcToXY(hv) {\r\n    return { x: hv.Hrzn, y: hv.Vrtc };\r\n}\r\nexport function xyToHorzVrtc(xy) {\r\n    return { Hrzn: xy.x, Vrtc: xy.y };\r\n}\r\nexport function descBoundsToBounds(desc) {\r\n    return {\r\n        top: parseUnits(desc['Top ']),\r\n        left: parseUnits(desc.Left),\r\n        right: parseUnits(desc.Rght),\r\n        bottom: parseUnits(desc.Btom),\r\n    };\r\n}\r\nexport function boundsToDescBounds(bounds) {\r\n    var _a;\r\n    return _a = {\r\n            Left: unitsValue(bounds.left, 'bounds.left')\r\n        },\r\n        _a['Top '] = unitsValue(bounds.top, 'bounds.top'),\r\n        _a.Rght = unitsValue(bounds.right, 'bounds.right'),\r\n        _a.Btom = unitsValue(bounds.bottom, 'bounds.bottom'),\r\n        _a;\r\n}\r\nfunction parseFxObject(fx) {\r\n    var stroke = {\r\n        enabled: !!fx.enab,\r\n        position: FStl.decode(fx.Styl),\r\n        fillType: FrFl.decode(fx.PntT),\r\n        blendMode: BlnM.decode(fx['Md  ']),\r\n        opacity: parsePercent(fx.Opct),\r\n        size: parseUnits(fx['Sz  ']),\r\n    };\r\n    if (fx.present !== undefined)\r\n        stroke.present = fx.present;\r\n    if (fx.showInDialog !== undefined)\r\n        stroke.showInDialog = fx.showInDialog;\r\n    if (fx.overprint !== undefined)\r\n        stroke.overprint = fx.overprint;\r\n    if (fx['Clr '])\r\n        stroke.color = parseColor(fx['Clr ']);\r\n    if (fx.Grad)\r\n        stroke.gradient = parseGradientContent(fx);\r\n    if (fx.Ptrn)\r\n        stroke.pattern = parsePatternContent(fx);\r\n    return stroke;\r\n}\r\nfunction serializeFxObject(stroke) {\r\n    var FrFX = {};\r\n    FrFX.enab = !!stroke.enabled;\r\n    if (stroke.present !== undefined)\r\n        FrFX.present = !!stroke.present;\r\n    if (stroke.showInDialog !== undefined)\r\n        FrFX.showInDialog = !!stroke.showInDialog;\r\n    FrFX.Styl = FStl.encode(stroke.position);\r\n    FrFX.PntT = FrFl.encode(stroke.fillType);\r\n    FrFX['Md  '] = BlnM.encode(stroke.blendMode);\r\n    FrFX.Opct = unitsPercent(stroke.opacity);\r\n    FrFX['Sz  '] = unitsValue(stroke.size, 'size');\r\n    if (stroke.color)\r\n        FrFX['Clr '] = serializeColor(stroke.color);\r\n    if (stroke.gradient)\r\n        FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));\r\n    if (stroke.pattern)\r\n        FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));\r\n    if (stroke.overprint !== undefined)\r\n        FrFX.overprint = !!stroke.overprint;\r\n    return FrFX;\r\n}\r\nexport function serializeEffects(e, log, multi) {\r\n    var _a, _b, _c;\r\n    var info = multi ? {\r\n        'Scl ': unitsPercentF((_a = e.scale) !== null && _a !== void 0 ? _a : 1),\r\n        masterFXSwitch: !e.disabled,\r\n    } : {\r\n        masterFXSwitch: !e.disabled,\r\n        'Scl ': unitsPercentF((_b = e.scale) !== null && _b !== void 0 ? _b : 1),\r\n    };\r\n    var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];\r\n    for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {\r\n        var key = arrayKeys_1[_i];\r\n        if (e[key] && !Array.isArray(e[key]))\r\n            throw new Error(\"\".concat(key, \" should be an array\"));\r\n    }\r\n    var useMulti = function (arr) { return !!arr && arr.length > 1 && multi; };\r\n    var useSingle = function (arr) { return !!arr && arr.length >= 1 && (!multi || arr.length === 1); };\r\n    if (useSingle(e.dropShadow))\r\n        info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);\r\n    if (useMulti(e.dropShadow))\r\n        info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });\r\n    if (useSingle(e.innerShadow))\r\n        info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);\r\n    if (useMulti(e.innerShadow))\r\n        info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });\r\n    if (e.outerGlow)\r\n        info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);\r\n    if (useMulti(e.solidFill))\r\n        info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });\r\n    if (useMulti(e.gradientOverlay))\r\n        info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });\r\n    if (useMulti(e.stroke))\r\n        info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });\r\n    if (e.innerGlow)\r\n        info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);\r\n    if (e.bevel)\r\n        info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);\r\n    if (useSingle(e.solidFill))\r\n        info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);\r\n    if (e.patternOverlay)\r\n        info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);\r\n    if (useSingle(e.gradientOverlay))\r\n        info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);\r\n    if (e.satin)\r\n        info.ChFX = serializeEffectObject(e.satin, 'satin', log);\r\n    if (useSingle(e.stroke))\r\n        info.FrFX = serializeFxObject((_c = e.stroke) === null || _c === void 0 ? void 0 : _c[0]);\r\n    if (multi) {\r\n        info.numModifyingFX = 0;\r\n        for (var _d = 0, _e = Object.keys(e); _d < _e.length; _d++) {\r\n            var key = _e[_d];\r\n            var value = e[key];\r\n            if (Array.isArray(value)) {\r\n                for (var _f = 0, value_1 = value; _f < value_1.length; _f++) {\r\n                    var effect = value_1[_f];\r\n                    if (effect.enabled)\r\n                        info.numModifyingFX++;\r\n                }\r\n            }\r\n            else if (value.enabled) {\r\n                info.numModifyingFX++;\r\n            }\r\n        }\r\n    }\r\n    return info;\r\n}\r\nexport function parseEffects(info, log) {\r\n    var effects = {};\r\n    var masterFXSwitch = info.masterFXSwitch, DrSh = info.DrSh, dropShadowMulti = info.dropShadowMulti, IrSh = info.IrSh, innerShadowMulti = info.innerShadowMulti, OrGl = info.OrGl, IrGl = info.IrGl, ebbl = info.ebbl, SoFi = info.SoFi, solidFillMulti = info.solidFillMulti, patternFill = info.patternFill, GrFl = info.GrFl, gradientFillMulti = info.gradientFillMulti, ChFX = info.ChFX, FrFX = info.FrFX, frameFXMulti = info.frameFXMulti, numModifyingFX = info.numModifyingFX, rest = __rest(info, [\"masterFXSwitch\", \"DrSh\", \"dropShadowMulti\", \"IrSh\", \"innerShadowMulti\", \"OrGl\", \"IrGl\", \"ebbl\", \"SoFi\", \"solidFillMulti\", \"patternFill\", \"GrFl\", \"gradientFillMulti\", \"ChFX\", \"FrFX\", \"frameFXMulti\", \"numModifyingFX\"]);\r\n    if (!masterFXSwitch)\r\n        effects.disabled = true;\r\n    if (info['Scl '])\r\n        effects.scale = parsePercent(info['Scl ']);\r\n    if (DrSh)\r\n        effects.dropShadow = [parseEffectObject(DrSh, log)];\r\n    if (dropShadowMulti)\r\n        effects.dropShadow = dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (IrSh)\r\n        effects.innerShadow = [parseEffectObject(IrSh, log)];\r\n    if (innerShadowMulti)\r\n        effects.innerShadow = innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (OrGl)\r\n        effects.outerGlow = parseEffectObject(OrGl, log);\r\n    if (IrGl)\r\n        effects.innerGlow = parseEffectObject(IrGl, log);\r\n    if (ebbl)\r\n        effects.bevel = parseEffectObject(ebbl, log);\r\n    if (SoFi)\r\n        effects.solidFill = [parseEffectObject(SoFi, log)];\r\n    if (solidFillMulti)\r\n        effects.solidFill = solidFillMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (patternFill)\r\n        effects.patternOverlay = parseEffectObject(patternFill, log);\r\n    if (GrFl)\r\n        effects.gradientOverlay = [parseEffectObject(GrFl, log)];\r\n    if (gradientFillMulti)\r\n        effects.gradientOverlay = gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });\r\n    if (ChFX)\r\n        effects.satin = parseEffectObject(ChFX, log);\r\n    if (FrFX)\r\n        effects.stroke = [parseFxObject(FrFX)];\r\n    if (frameFXMulti)\r\n        effects.stroke = frameFXMulti.map(function (i) { return parseFxObject(i); });\r\n    if (log && Object.keys(rest).length > 1)\r\n        console.log('Unhandled effect keys:', rest);\r\n    return effects;\r\n}\r\nfunction parseKeyList(keyList, logMissingFeatures) {\r\n    var keys = [];\r\n    for (var j = 0; j < keyList.length; j++) {\r\n        var key = keyList[j];\r\n        var _a = key.time, denominator = _a.denominator, numerator = _a.numerator, selected = key.selected, animKey = key.animKey;\r\n        var time = { numerator: numerator, denominator: denominator };\r\n        var interpolation = animInterpStyleEnum.decode(key.animInterpStyle);\r\n        switch (animKey.Type) {\r\n            case 'keyType.Opct':\r\n                keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });\r\n                break;\r\n            case 'keyType.Pstn':\r\n                keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });\r\n                break;\r\n            case 'keyType.Trnf':\r\n                keys.push({\r\n                    interpolation: interpolation,\r\n                    time: time,\r\n                    selected: selected,\r\n                    type: 'transform',\r\n                    scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)\r\n                });\r\n                break;\r\n            case 'keyType.sheetStyle': {\r\n                var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };\r\n                if (animKey.sheetStyle.Lefx)\r\n                    key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);\r\n                keys.push(key_1);\r\n                break;\r\n            }\r\n            case 'keyType.globalLighting': {\r\n                keys.push({\r\n                    interpolation: interpolation,\r\n                    time: time,\r\n                    selected: selected,\r\n                    type: 'globalLighting',\r\n                    globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude\r\n                });\r\n                break;\r\n            }\r\n            default: throw new Error(\"Unsupported keyType value\");\r\n        }\r\n    }\r\n    return keys;\r\n}\r\nfunction serializeKeyList(keys) {\r\n    var keyList = [];\r\n    for (var j = 0; j < keys.length; j++) {\r\n        var key = keys[j];\r\n        var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;\r\n        var animInterpStyle = animInterpStyleEnum.encode(interpolation);\r\n        var animKey = void 0;\r\n        switch (key.type) {\r\n            case 'opacity':\r\n                animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };\r\n                break;\r\n            case 'position':\r\n                animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };\r\n                break;\r\n            case 'transform':\r\n                animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };\r\n                break;\r\n            case 'style':\r\n                animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };\r\n                if (key.style)\r\n                    animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };\r\n                break;\r\n            case 'globalLighting': {\r\n                animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };\r\n                break;\r\n            }\r\n            default: throw new Error(\"Unsupported keyType value\");\r\n        }\r\n        keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });\r\n    }\r\n    return keyList;\r\n}\r\nexport function parseTrackList(trackList, logMissingFeatures) {\r\n    var tracks = [];\r\n    for (var i = 0; i < trackList.length; i++) {\r\n        var tr = trackList[i];\r\n        var track = {\r\n            type: stdTrackID.decode(tr.trackID),\r\n            enabled: tr.enab,\r\n            keys: parseKeyList(tr.keyList, logMissingFeatures),\r\n        };\r\n        if (tr.effectParams) {\r\n            track.effectParams = {\r\n                fillCanvas: tr.effectParams.fillCanvas,\r\n                zoomOrigin: tr.effectParams.zoomOrigin,\r\n                keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),\r\n            };\r\n        }\r\n        tracks.push(track);\r\n    }\r\n    return tracks;\r\n}\r\nexport function serializeTrackList(tracks) {\r\n    var trackList = [];\r\n    for (var i = 0; i < tracks.length; i++) {\r\n        var t = tracks[i];\r\n        trackList.push(__assign(__assign({ trackID: stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {\r\n            effectParams: {\r\n                keyList: serializeKeyList(t.keys),\r\n                fillCanvas: t.effectParams.fillCanvas,\r\n                zoomOrigin: t.effectParams.zoomOrigin,\r\n            }\r\n        } : {})), { keyList: serializeKeyList(t.keys) }));\r\n    }\r\n    return trackList;\r\n}\r\nfunction parseEffectObject(obj, reportErrors) {\r\n    var result = {};\r\n    for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        var val = obj[key];\r\n        switch (key) {\r\n            case 'enab':\r\n                result.enabled = !!val;\r\n                break;\r\n            case 'uglg':\r\n                result.useGlobalLight = !!val;\r\n                break;\r\n            case 'AntA':\r\n                result.antialiased = !!val;\r\n                break;\r\n            case 'Algn':\r\n                result.align = !!val;\r\n                break;\r\n            case 'Dthr':\r\n                result.dither = !!val;\r\n                break;\r\n            case 'Invr':\r\n                result.invert = !!val;\r\n                break;\r\n            case 'Rvrs':\r\n                result.reverse = !!val;\r\n                break;\r\n            case 'Clr ':\r\n                result.color = parseColor(val);\r\n                break;\r\n            case 'hglC':\r\n                result.highlightColor = parseColor(val);\r\n                break;\r\n            case 'sdwC':\r\n                result.shadowColor = parseColor(val);\r\n                break;\r\n            case 'Styl':\r\n                result.position = FStl.decode(val);\r\n                break;\r\n            case 'Md  ':\r\n                result.blendMode = BlnM.decode(val);\r\n                break;\r\n            case 'hglM':\r\n                result.highlightBlendMode = BlnM.decode(val);\r\n                break;\r\n            case 'sdwM':\r\n                result.shadowBlendMode = BlnM.decode(val);\r\n                break;\r\n            case 'bvlS':\r\n                result.style = BESl.decode(val);\r\n                break;\r\n            case 'bvlD':\r\n                result.direction = BESs.decode(val);\r\n                break;\r\n            case 'bvlT':\r\n                result.technique = bvlT.decode(val);\r\n                break;\r\n            case 'GlwT':\r\n                result.technique = BETE.decode(val);\r\n                break;\r\n            case 'glwS':\r\n                result.source = IGSr.decode(val);\r\n                break;\r\n            case 'Type':\r\n                result.type = GrdT.decode(val);\r\n                break;\r\n            case 'gs99':\r\n                result.interpolationMethod = gradientInterpolationMethodType.decode(val);\r\n                break;\r\n            case 'Opct':\r\n                result.opacity = parsePercent(val);\r\n                break;\r\n            case 'hglO':\r\n                result.highlightOpacity = parsePercent(val);\r\n                break;\r\n            case 'sdwO':\r\n                result.shadowOpacity = parsePercent(val);\r\n                break;\r\n            case 'lagl':\r\n                result.angle = parseAngle(val);\r\n                break;\r\n            case 'Angl':\r\n                result.angle = parseAngle(val);\r\n                break;\r\n            case 'Lald':\r\n                result.altitude = parseAngle(val);\r\n                break;\r\n            case 'Sftn':\r\n                result.soften = parseUnits(val);\r\n                break;\r\n            case 'srgR':\r\n                result.strength = parsePercent(val);\r\n                break;\r\n            case 'blur':\r\n                result.size = parseUnits(val);\r\n                break;\r\n            case 'Nose':\r\n                result.noise = parsePercent(val);\r\n                break;\r\n            case 'Inpr':\r\n                result.range = parsePercent(val);\r\n                break;\r\n            case 'Ckmt':\r\n                result.choke = parseUnits(val);\r\n                break;\r\n            case 'ShdN':\r\n                result.jitter = parsePercent(val);\r\n                break;\r\n            case 'Dstn':\r\n                result.distance = parseUnits(val);\r\n                break;\r\n            case 'Scl ':\r\n                result.scale = parsePercent(val);\r\n                break;\r\n            case 'Ptrn':\r\n                result.pattern = { name: val['Nm  '], id: val.Idnt };\r\n                break;\r\n            case 'phase':\r\n                result.phase = { x: val.Hrzn, y: val.Vrtc };\r\n                break;\r\n            case 'Ofst':\r\n                result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };\r\n                break;\r\n            case 'MpgS':\r\n            case 'TrnS':\r\n                result.contour = {\r\n                    name: val['Nm  '],\r\n                    curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),\r\n                };\r\n                break;\r\n            case 'Grad':\r\n                result.gradient = parseGradient(val);\r\n                break;\r\n            case 'useTexture':\r\n            case 'useShape':\r\n            case 'layerConceals':\r\n            case 'present':\r\n            case 'showInDialog':\r\n            case 'antialiasGloss':\r\n                result[key] = val;\r\n                break;\r\n            case '_name':\r\n            case '_classID':\r\n                break;\r\n            default:\r\n                reportErrors && console.log(\"Invalid effect key: '\".concat(key, \"', value:\"), val);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction serializeEffectObject(obj, objName, reportErrors) {\r\n    var result = {\r\n        enab: false,\r\n    };\r\n    if (objName === 'dropShadow') {\r\n        result.TrnS = { 'Nm  ': '', 'Crv ': [] };\r\n    }\r\n    for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n        var objKey = _a[_i];\r\n        var key = objKey;\r\n        var val = obj[key];\r\n        switch (key) {\r\n            case 'enabled':\r\n                result.enab = !!val;\r\n                break;\r\n            case 'useGlobalLight':\r\n                result.uglg = !!val;\r\n                break;\r\n            case 'antialiased':\r\n                result.AntA = !!val;\r\n                break;\r\n            case 'align':\r\n                result.Algn = !!val;\r\n                break;\r\n            case 'dither':\r\n                result.Dthr = !!val;\r\n                break;\r\n            case 'invert':\r\n                result.Invr = !!val;\r\n                break;\r\n            case 'reverse':\r\n                result.Rvrs = !!val;\r\n                break;\r\n            case 'color':\r\n                result['Clr '] = serializeColor(val);\r\n                break;\r\n            case 'highlightColor':\r\n                result.hglC = serializeColor(val);\r\n                break;\r\n            case 'shadowColor':\r\n                result.sdwC = serializeColor(val);\r\n                break;\r\n            case 'position':\r\n                result.Styl = FStl.encode(val);\r\n                break;\r\n            case 'blendMode':\r\n                result['Md  '] = BlnM.encode(val);\r\n                break;\r\n            case 'highlightBlendMode':\r\n                result.hglM = BlnM.encode(val);\r\n                break;\r\n            case 'shadowBlendMode':\r\n                result.sdwM = BlnM.encode(val);\r\n                break;\r\n            case 'style':\r\n                result.bvlS = BESl.encode(val);\r\n                break;\r\n            case 'direction':\r\n                result.bvlD = BESs.encode(val);\r\n                break;\r\n            case 'technique':\r\n                if (objName === 'bevel') {\r\n                    result.bvlT = bvlT.encode(val);\r\n                }\r\n                else {\r\n                    result.GlwT = BETE.encode(val);\r\n                }\r\n                break;\r\n            case 'source':\r\n                result.glwS = IGSr.encode(val);\r\n                break;\r\n            case 'type':\r\n                result.Type = GrdT.encode(val);\r\n                break;\r\n            case 'interpolationMethod':\r\n                result.gs99 = gradientInterpolationMethodType.encode(val);\r\n                break;\r\n            case 'opacity':\r\n                result.Opct = unitsPercent(val);\r\n                break;\r\n            case 'highlightOpacity':\r\n                result.hglO = unitsPercent(val);\r\n                break;\r\n            case 'shadowOpacity':\r\n                result.sdwO = unitsPercent(val);\r\n                break;\r\n            case 'angle':\r\n                if (objName === 'gradientOverlay' || objName === 'patternFill') {\r\n                    result.Angl = unitsAngle(val);\r\n                }\r\n                else {\r\n                    result.lagl = unitsAngle(val);\r\n                }\r\n                break;\r\n            case 'altitude':\r\n                result.Lald = unitsAngle(val);\r\n                break;\r\n            case 'soften':\r\n                result.Sftn = unitsValue(val, key);\r\n                break;\r\n            case 'strength':\r\n                result.srgR = unitsPercent(val);\r\n                break;\r\n            case 'size':\r\n                result.blur = unitsValue(val, key);\r\n                break;\r\n            case 'noise':\r\n                result.Nose = unitsPercent(val);\r\n                break;\r\n            case 'range':\r\n                result.Inpr = unitsPercent(val);\r\n                break;\r\n            case 'choke':\r\n                result.Ckmt = unitsValue(val, key);\r\n                break;\r\n            case 'jitter':\r\n                result.ShdN = unitsPercent(val);\r\n                break;\r\n            case 'distance':\r\n                result.Dstn = unitsValue(val, key);\r\n                break;\r\n            case 'scale':\r\n                result['Scl '] = unitsPercent(val);\r\n                break;\r\n            case 'pattern':\r\n                result.Ptrn = { 'Nm  ': val.name, Idnt: val.id };\r\n                break;\r\n            case 'phase':\r\n                result.phase = { Hrzn: val.x, Vrtc: val.y };\r\n                break;\r\n            case 'offset':\r\n                result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };\r\n                break;\r\n            case 'contour': {\r\n                result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {\r\n                    'Nm  ': val.name,\r\n                    'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),\r\n                };\r\n                break;\r\n            }\r\n            case 'gradient':\r\n                result.Grad = serializeGradient(val);\r\n                break;\r\n            case 'useTexture':\r\n            case 'useShape':\r\n            case 'layerConceals':\r\n            case 'present':\r\n            case 'showInDialog':\r\n            case 'antialiasGloss':\r\n                result[key] = val;\r\n                break;\r\n            default:\r\n                reportErrors && console.log(\"Invalid effect key: '\".concat(key, \"', value:\"), val);\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction parseGradient(grad) {\r\n    if (grad.GrdF === 'GrdF.CstS') {\r\n        var samples_1 = grad.Intr || 4096;\r\n        return {\r\n            type: 'solid',\r\n            name: grad['Nm  '],\r\n            smoothness: grad.Intr / 4096,\r\n            colorStops: grad.Clrs.map(function (s) { return ({\r\n                color: parseColor(s['Clr ']),\r\n                location: s.Lctn / samples_1,\r\n                midpoint: s.Mdpn / 100,\r\n            }); }),\r\n            opacityStops: grad.Trns.map(function (s) { return ({\r\n                opacity: parsePercent(s.Opct),\r\n                location: s.Lctn / samples_1,\r\n                midpoint: s.Mdpn / 100,\r\n            }); }),\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            type: 'noise',\r\n            name: grad['Nm  '],\r\n            roughness: grad.Smth / 4096,\r\n            colorModel: ClrS.decode(grad.ClrS),\r\n            randomSeed: grad.RndS,\r\n            restrictColors: !!grad.VctC,\r\n            addTransparency: !!grad.ShTr,\r\n            min: grad['Mnm '].map(function (x) { return x / 100; }),\r\n            max: grad['Mxm '].map(function (x) { return x / 100; }),\r\n        };\r\n    }\r\n}\r\nfunction serializeGradient(grad) {\r\n    var _a, _b;\r\n    if (grad.type === 'solid') {\r\n        var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);\r\n        return {\r\n            'Nm  ': grad.name || '',\r\n            GrdF: 'GrdF.CstS',\r\n            Intr: samples_2,\r\n            Clrs: grad.colorStops.map(function (s) {\r\n                var _a;\r\n                return ({\r\n                    'Clr ': serializeColor(s.color),\r\n                    Type: 'Clry.UsrS',\r\n                    Lctn: Math.round(s.location * samples_2),\r\n                    Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),\r\n                });\r\n            }),\r\n            Trns: grad.opacityStops.map(function (s) {\r\n                var _a;\r\n                return ({\r\n                    Opct: unitsPercent(s.opacity),\r\n                    Lctn: Math.round(s.location * samples_2),\r\n                    Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),\r\n                });\r\n            }),\r\n        };\r\n    }\r\n    else {\r\n        return {\r\n            GrdF: 'GrdF.ClNs',\r\n            'Nm  ': grad.name || '',\r\n            ShTr: !!grad.addTransparency,\r\n            VctC: !!grad.restrictColors,\r\n            ClrS: ClrS.encode(grad.colorModel),\r\n            RndS: grad.randomSeed || 0,\r\n            Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),\r\n            'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),\r\n            'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),\r\n        };\r\n    }\r\n}\r\nfunction parseGradientContent(descriptor) {\r\n    var result = parseGradient(descriptor.Grad);\r\n    result.style = GrdT.decode(descriptor.Type);\r\n    if (descriptor.Dthr !== undefined)\r\n        result.dither = descriptor.Dthr;\r\n    if (descriptor.gradientsInterpolationMethod !== undefined)\r\n        result.interpolationMethod = gradientInterpolationMethodType.decode(descriptor.gradientsInterpolationMethod);\r\n    if (descriptor.Rvrs !== undefined)\r\n        result.reverse = descriptor.Rvrs;\r\n    if (descriptor.Angl !== undefined)\r\n        result.angle = parseAngle(descriptor.Angl);\r\n    if (descriptor['Scl '] !== undefined)\r\n        result.scale = parsePercent(descriptor['Scl ']);\r\n    if (descriptor.Algn !== undefined)\r\n        result.align = descriptor.Algn;\r\n    if (descriptor.Ofst !== undefined) {\r\n        result.offset = {\r\n            x: parsePercent(descriptor.Ofst.Hrzn),\r\n            y: parsePercent(descriptor.Ofst.Vrtc)\r\n        };\r\n    }\r\n    return result;\r\n}\r\nfunction parsePatternContent(descriptor) {\r\n    var result = {\r\n        name: descriptor.Ptrn['Nm  '],\r\n        id: descriptor.Ptrn.Idnt,\r\n    };\r\n    if (descriptor.Lnkd !== undefined)\r\n        result.linked = descriptor.Lnkd;\r\n    if (descriptor.phase !== undefined)\r\n        result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };\r\n    return result;\r\n}\r\nexport function parseVectorContent(descriptor) {\r\n    if ('Grad' in descriptor) {\r\n        return parseGradientContent(descriptor);\r\n    }\r\n    else if ('Ptrn' in descriptor) {\r\n        return __assign({ type: 'pattern' }, parsePatternContent(descriptor));\r\n    }\r\n    else if ('Clr ' in descriptor) {\r\n        return { type: 'color', color: parseColor(descriptor['Clr ']) };\r\n    }\r\n    else {\r\n        throw new Error('Invalid vector content');\r\n    }\r\n}\r\nfunction serializeGradientContent(content) {\r\n    var result = {};\r\n    if (content.dither !== undefined)\r\n        result.Dthr = content.dither;\r\n    if (content.interpolationMethod !== undefined)\r\n        result.gradientsInterpolationMethod = gradientInterpolationMethodType.encode(content.interpolationMethod);\r\n    if (content.reverse !== undefined)\r\n        result.Rvrs = content.reverse;\r\n    if (content.angle !== undefined)\r\n        result.Angl = unitsAngle(content.angle);\r\n    result.Type = GrdT.encode(content.style);\r\n    if (content.align !== undefined)\r\n        result.Algn = content.align;\r\n    if (content.scale !== undefined)\r\n        result['Scl '] = unitsPercent(content.scale);\r\n    if (content.offset) {\r\n        result.Ofst = {\r\n            Hrzn: unitsPercent(content.offset.x),\r\n            Vrtc: unitsPercent(content.offset.y),\r\n        };\r\n    }\r\n    result.Grad = serializeGradient(content);\r\n    return result;\r\n}\r\nfunction serializePatternContent(content) {\r\n    var result = {\r\n        Ptrn: {\r\n            'Nm  ': content.name || '',\r\n            Idnt: content.id || '',\r\n        }\r\n    };\r\n    if (content.linked !== undefined)\r\n        result.Lnkd = !!content.linked;\r\n    if (content.phase !== undefined)\r\n        result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };\r\n    return result;\r\n}\r\nexport function serializeVectorContent(content) {\r\n    if (content.type === 'color') {\r\n        return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };\r\n    }\r\n    else if (content.type === 'pattern') {\r\n        return { key: 'PtFl', descriptor: serializePatternContent(content) };\r\n    }\r\n    else {\r\n        return { key: 'GdFl', descriptor: serializeGradientContent(content) };\r\n    }\r\n}\r\nexport function parseColor(color) {\r\n    if ('H   ' in color) {\r\n        return { h: parsePercentOrAngle(color['H   ']), s: color.Strt, b: color.Brgh };\r\n    }\r\n    else if ('Rd  ' in color) {\r\n        return { r: color['Rd  '], g: color['Grn '], b: color['Bl  '] };\r\n    }\r\n    else if ('Cyn ' in color) {\r\n        return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };\r\n    }\r\n    else if ('Gry ' in color) {\r\n        return { k: color['Gry '] };\r\n    }\r\n    else if ('Lmnc' in color) {\r\n        return { l: color.Lmnc, a: color['A   '], b: color['B   '] };\r\n    }\r\n    else if ('redFloat' in color) {\r\n        return { fr: color.redFloat, fg: color.greenFloat, fb: color.blueFloat };\r\n    }\r\n    else {\r\n        throw new Error('Unsupported color descriptor');\r\n    }\r\n}\r\nexport function serializeColor(color) {\r\n    if (!color) {\r\n        return { _name: '', _classID: 'RGBC', 'Rd  ': 0, 'Grn ': 0, 'Bl  ': 0 };\r\n    }\r\n    else if ('r' in color) {\r\n        return { _name: '', _classID: 'RGBC', 'Rd  ': color.r || 0, 'Grn ': color.g || 0, 'Bl  ': color.b || 0 };\r\n    }\r\n    else if ('fr' in color) {\r\n        return { _name: '', _classID: 'RGBC', redFloat: color.fr, greenFloat: color.fg, blueFloat: color.fb };\r\n    }\r\n    else if ('h' in color) {\r\n        return { _name: '', _classID: 'HSBC', 'H   ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };\r\n    }\r\n    else if ('c' in color) {\r\n        return { _name: '', _classID: 'CMYC', 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };\r\n    }\r\n    else if ('l' in color) {\r\n        return { _name: '', _classID: 'LABC', Lmnc: color.l || 0, 'A   ': color.a || 0, 'B   ': color.b || 0 };\r\n    }\r\n    else if ('k' in color) {\r\n        return { _name: '', _classID: 'GRYC', 'Gry ': color.k };\r\n    }\r\n    else {\r\n        throw new Error('Invalid color value');\r\n    }\r\n}\r\nexport function parseAngle(x) {\r\n    if (x === undefined)\r\n        return 0;\r\n    if (x.units !== 'Angle')\r\n        throw new Error(\"Invalid units: \".concat(x.units));\r\n    return x.value;\r\n}\r\nexport function parsePercent(x) {\r\n    if (x === undefined)\r\n        return 1;\r\n    if (x.units !== 'Percent')\r\n        throw new Error(\"Invalid units: \".concat(x.units));\r\n    return x.value / 100;\r\n}\r\nexport function parsePercentOrAngle(x) {\r\n    if (x === undefined)\r\n        return 1;\r\n    if (x.units === 'Percent')\r\n        return x.value / 100;\r\n    if (x.units === 'Angle')\r\n        return x.value / 360;\r\n    throw new Error(\"Invalid units: \".concat(x.units));\r\n}\r\nexport function parseUnits(_a) {\r\n    var units = _a.units, value = _a.value;\r\n    if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&\r\n        units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {\r\n        throw new Error(\"Invalid units: \".concat(JSON.stringify({ units: units, value: value })));\r\n    }\r\n    return { value: value, units: units };\r\n}\r\nexport function parseUnitsOrNumber(value, units) {\r\n    if (units === void 0) { units = 'Pixels'; }\r\n    if (typeof value === 'number')\r\n        return { value: value, units: units };\r\n    return parseUnits(value);\r\n}\r\nexport function parseUnitsToNumber(_a, expectedUnits) {\r\n    var units = _a.units, value = _a.value;\r\n    if (units !== expectedUnits)\r\n        throw new Error(\"Invalid units: \".concat(JSON.stringify({ units: units, value: value })));\r\n    return value;\r\n}\r\nexport function unitsAngle(value) {\r\n    return { units: 'Angle', value: value || 0 };\r\n}\r\nexport function unitsPercent(value) {\r\n    return { units: 'Percent', value: Math.round((value || 0) * 100) };\r\n}\r\nexport function unitsPercentF(value) {\r\n    return { units: 'Percent', value: (value || 0) * 100 };\r\n}\r\nexport function unitsValue(x, key) {\r\n    if (x == null)\r\n        return { units: 'Pixels', value: 0 };\r\n    if (typeof x !== 'object')\r\n        throw new Error(\"Invalid value: \".concat(JSON.stringify(x), \" (key: \").concat(key, \") (should have value and units)\"));\r\n    var units = x.units, value = x.value;\r\n    if (typeof value !== 'number')\r\n        throw new Error(\"Invalid value in \".concat(JSON.stringify(x), \" (key: \").concat(key, \")\"));\r\n    if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&\r\n        units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {\r\n        throw new Error(\"Invalid units in \".concat(JSON.stringify(x), \" (key: \").concat(key, \")\"));\r\n    }\r\n    return { units: units, value: value };\r\n}\r\nexport function frac(_a) {\r\n    var numerator = _a.numerator, denominator = _a.denominator;\r\n    return { numerator: numerator, denominator: denominator };\r\n}\r\nexport var textGridding = createEnum('textGridding', 'none', {\r\n    none: 'None',\r\n    round: 'Rnd ',\r\n});\r\nexport var Ornt = createEnum('Ornt', 'horizontal', {\r\n    horizontal: 'Hrzn',\r\n    vertical: 'Vrtc',\r\n});\r\nexport var Annt = createEnum('Annt', 'sharp', {\r\n    none: 'Anno',\r\n    sharp: 'antiAliasSharp',\r\n    crisp: 'AnCr',\r\n    strong: 'AnSt',\r\n    smooth: 'AnSm',\r\n    platform: 'antiAliasPlatformGray',\r\n    platformLCD: 'antiAliasPlatformLCD',\r\n});\r\nexport var warpStyle = createEnum('warpStyle', 'none', {\r\n    none: 'warpNone',\r\n    arc: 'warpArc',\r\n    arcLower: 'warpArcLower',\r\n    arcUpper: 'warpArcUpper',\r\n    arch: 'warpArch',\r\n    bulge: 'warpBulge',\r\n    shellLower: 'warpShellLower',\r\n    shellUpper: 'warpShellUpper',\r\n    flag: 'warpFlag',\r\n    wave: 'warpWave',\r\n    fish: 'warpFish',\r\n    rise: 'warpRise',\r\n    fisheye: 'warpFisheye',\r\n    inflate: 'warpInflate',\r\n    squeeze: 'warpSqueeze',\r\n    twist: 'warpTwist',\r\n    cylinder: 'warpCylinder',\r\n    custom: 'warpCustom',\r\n});\r\nexport var BlnM = createEnum('BlnM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'dissolve': 'Dslv',\r\n    'darken': 'Drkn',\r\n    'multiply': 'Mltp',\r\n    'color burn': 'CBrn',\r\n    'linear burn': 'linearBurn',\r\n    'darker color': 'darkerColor',\r\n    'lighten': 'Lghn',\r\n    'screen': 'Scrn',\r\n    'color dodge': 'CDdg',\r\n    'linear dodge': 'linearDodge',\r\n    'lighter color': 'lighterColor',\r\n    'overlay': 'Ovrl',\r\n    'soft light': 'SftL',\r\n    'hard light': 'HrdL',\r\n    'vivid light': 'vividLight',\r\n    'linear light': 'linearLight',\r\n    'pin light': 'pinLight',\r\n    'hard mix': 'hardMix',\r\n    'difference': 'Dfrn',\r\n    'exclusion': 'Xclu',\r\n    'subtract': 'blendSubtraction',\r\n    'divide': 'blendDivide',\r\n    'hue': 'H   ',\r\n    'saturation': 'Strt',\r\n    'color': 'Clr ',\r\n    'luminosity': 'Lmns',\r\n    // used in ABR\r\n    'linear height': 'linearHeight',\r\n    'height': 'Hght',\r\n    'subtraction': 'Sbtr', // 2nd version of subtract ?\r\n});\r\nexport var BESl = createEnum('BESl', 'inner bevel', {\r\n    'inner bevel': 'InrB',\r\n    'outer bevel': 'OtrB',\r\n    'emboss': 'Embs',\r\n    'pillow emboss': 'PlEb',\r\n    'stroke emboss': 'strokeEmboss',\r\n});\r\nexport var bvlT = createEnum('bvlT', 'smooth', {\r\n    'smooth': 'SfBL',\r\n    'chisel hard': 'PrBL',\r\n    'chisel soft': 'Slmt',\r\n});\r\nexport var BESs = createEnum('BESs', 'up', {\r\n    up: 'In  ',\r\n    down: 'Out ',\r\n});\r\nexport var BETE = createEnum('BETE', 'softer', {\r\n    softer: 'SfBL',\r\n    precise: 'PrBL',\r\n});\r\nexport var IGSr = createEnum('IGSr', 'edge', {\r\n    edge: 'SrcE',\r\n    center: 'SrcC',\r\n});\r\nexport var GrdT = createEnum('GrdT', 'linear', {\r\n    linear: 'Lnr ',\r\n    radial: 'Rdl ',\r\n    angle: 'Angl',\r\n    reflected: 'Rflc',\r\n    diamond: 'Dmnd',\r\n});\r\nexport var animInterpStyleEnum = createEnum('animInterpStyle', 'linear', {\r\n    linear: 'Lnr ',\r\n    hold: 'hold',\r\n});\r\nexport var stdTrackID = createEnum('stdTrackID', 'opacity', {\r\n    opacity: 'opacityTrack',\r\n    style: 'styleTrack',\r\n    sheetTransform: 'sheetTransformTrack',\r\n    sheetPosition: 'sheetPositionTrack',\r\n    globalLighting: 'globalLightingTrack',\r\n});\r\nexport var gradientInterpolationMethodType = createEnum('gradientInterpolationMethodType', 'perceptual', {\r\n    perceptual: 'Perc',\r\n    linear: 'Lnr ',\r\n    classic: 'Gcls',\r\n    smooth: 'Smoo',\r\n    // TODO: stripes\r\n});\r\nexport var ClrS = createEnum('ClrS', 'rgb', {\r\n    rgb: 'RGBC',\r\n    hsb: 'HSBl',\r\n    lab: 'LbCl',\r\n    hsl: 'HSLC',\r\n});\r\nexport var FStl = createEnum('FStl', 'outside', {\r\n    outside: 'OutF',\r\n    center: 'CtrF',\r\n    inside: 'InsF'\r\n});\r\nexport var FrFl = createEnum('FrFl', 'color', {\r\n    color: 'SClr',\r\n    gradient: 'GrFl',\r\n    pattern: 'Ptrn',\r\n});\r\nexport var ESliceType = createEnum('ESliceType', 'image', {\r\n    image: 'Img ',\r\n    noImage: 'noImage',\r\n});\r\nexport var ESliceHorzAlign = createEnum('ESliceHorzAlign', 'default', {\r\n    default: 'default',\r\n});\r\nexport var ESliceVertAlign = createEnum('ESliceVertAlign', 'default', {\r\n    default: 'default',\r\n});\r\nexport var ESliceOrigin = createEnum('ESliceOrigin', 'userGenerated', {\r\n    userGenerated: 'userGenerated',\r\n    autoGenerated: 'autoGenerated',\r\n    layer: 'layer',\r\n});\r\nexport var ESliceBGColorType = createEnum('ESliceBGColorType', 'none', {\r\n    none: 'None',\r\n    matte: 'matte',\r\n    color: 'Clr ',\r\n});\r\nexport var strokeStyleLineCapType = createEnum('strokeStyleLineCapType', 'butt', {\r\n    butt: 'strokeStyleButtCap',\r\n    round: 'strokeStyleRoundCap',\r\n    square: 'strokeStyleSquareCap',\r\n});\r\nexport var strokeStyleLineJoinType = createEnum('strokeStyleLineJoinType', 'miter', {\r\n    miter: 'strokeStyleMiterJoin',\r\n    round: 'strokeStyleRoundJoin',\r\n    bevel: 'strokeStyleBevelJoin',\r\n});\r\nexport var strokeStyleLineAlignment = createEnum('strokeStyleLineAlignment', 'inside', {\r\n    inside: 'strokeStyleAlignInside',\r\n    center: 'strokeStyleAlignCenter',\r\n    outside: 'strokeStyleAlignOutside',\r\n});\r\nexport var BlrM = createEnum('BlrM', 'ispinmage', {\r\n    spin: 'Spn ',\r\n    zoom: 'Zm  ',\r\n});\r\nexport var BlrQ = createEnum('BlrQ', 'good', {\r\n    draft: 'Drft',\r\n    good: 'Gd  ',\r\n    best: 'Bst ',\r\n});\r\nexport var SmBM = createEnum('SmBM', 'normal', {\r\n    normal: 'SBMN',\r\n    'edge only': 'SBME',\r\n    'overlay edge': 'SBMO',\r\n});\r\nexport var SmBQ = createEnum('SmBQ', 'medium', {\r\n    low: 'SBQL',\r\n    medium: 'SBQM',\r\n    high: 'SBQH',\r\n});\r\nexport var DspM = createEnum('DspM', 'stretch to fit', {\r\n    'stretch to fit': 'StrF',\r\n    'tile': 'Tile',\r\n});\r\nexport var UndA = createEnum('UndA', 'repeat edge pixels', {\r\n    'wrap around': 'WrpA',\r\n    'repeat edge pixels': 'RptE',\r\n});\r\nexport var Cnvr = createEnum('Cnvr', 'rectangular to polar', {\r\n    'rectangular to polar': 'RctP',\r\n    'polar to rectangular': 'PlrR',\r\n});\r\nexport var RplS = createEnum('RplS', 'medium', {\r\n    small: 'Sml ',\r\n    medium: 'Mdm ',\r\n    large: 'Lrg ',\r\n});\r\nexport var SphM = createEnum('SphM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'horizontal only': 'HrzO',\r\n    'vertical only': 'VrtO',\r\n});\r\nexport var Wvtp = createEnum('Wvtp', 'sine', {\r\n    sine: 'WvSn',\r\n    triangle: 'WvTr',\r\n    square: 'WvSq',\r\n});\r\nexport var ZZTy = createEnum('ZZTy', 'pond ripples', {\r\n    'around center': 'ArnC',\r\n    'out from center': 'OtFr',\r\n    'pond ripples': 'PndR',\r\n});\r\nexport var Dstr = createEnum('Dstr', 'uniform', {\r\n    uniform: 'Unfr',\r\n    gaussian: 'Gsn ',\r\n});\r\nexport var Chnl = createEnum('Chnl', 'composite', {\r\n    red: 'Rd  ',\r\n    green: 'Grn ',\r\n    blue: 'Bl  ',\r\n    composite: 'Cmps',\r\n});\r\nexport var MztT = createEnum('MztT', 'fine dots', {\r\n    'fine dots': 'FnDt',\r\n    'medium dots': 'MdmD',\r\n    'grainy dots': 'GrnD',\r\n    'coarse dots': 'CrsD',\r\n    'short lines': 'ShrL',\r\n    'medium lines': 'MdmL',\r\n    'long lines': 'LngL',\r\n    'short strokes': 'ShSt',\r\n    'medium strokes': 'MdmS',\r\n    'long strokes': 'LngS',\r\n});\r\nexport var Lns = createEnum('Lns ', '50-300mm zoom', {\r\n    '50-300mm zoom': 'Zm  ',\r\n    '32mm prime': 'Nkn ',\r\n    '105mm prime': 'Nkn1',\r\n    'movie prime': 'PnVs',\r\n});\r\nexport var blurType = createEnum('blurType', 'gaussian blur', {\r\n    'gaussian blur': 'GsnB',\r\n    'lens blur': 'lensBlur',\r\n    'motion blur': 'MtnB',\r\n});\r\nexport var DfsM = createEnum('DfsM', 'normal', {\r\n    'normal': 'Nrml',\r\n    'darken only': 'DrkO',\r\n    'lighten only': 'LghO',\r\n    'anisotropic': 'anisotropic',\r\n});\r\nexport var ExtT = createEnum('ExtT', 'blocks', {\r\n    blocks: 'Blks',\r\n    pyramids: 'Pyrm',\r\n});\r\nexport var ExtR = createEnum('ExtR', 'random', {\r\n    random: 'Rndm',\r\n    'level-based': 'LvlB',\r\n});\r\nexport var FlCl = createEnum('FlCl', 'background color', {\r\n    'background color': 'FlBc',\r\n    'foreground color': 'FlFr',\r\n    'inverse image': 'FlIn',\r\n    'unaltered image': 'FlSm',\r\n});\r\nexport var CntE = createEnum('CntE', 'upper', {\r\n    lower: 'Lwr ',\r\n    upper: 'Upr ',\r\n});\r\nexport var WndM = createEnum('WndM', 'wind', {\r\n    wind: 'Wnd ',\r\n    blast: 'Blst',\r\n    stagger: 'Stgr',\r\n});\r\nexport var Drct = createEnum('Drct', 'from the right', {\r\n    left: 'Left',\r\n    right: 'Rght',\r\n});\r\nexport var IntE = createEnum('IntE', 'odd lines', {\r\n    'odd lines': 'ElmO',\r\n    'even lines': 'ElmE',\r\n});\r\nexport var IntC = createEnum('IntC', 'interpolation', {\r\n    duplication: 'CrtD',\r\n    interpolation: 'CrtI',\r\n});\r\nexport var FlMd = createEnum('FlMd', 'wrap around', {\r\n    'set to transparent': 'Bckg',\r\n    'repeat edge pixels': 'Rpt ',\r\n    'wrap around': 'Wrp ',\r\n});\r\nexport var prjM = createEnum('prjM', 'fisheye', {\r\n    'fisheye': 'fisP',\r\n    'perspective': 'perP',\r\n    'auto': 'auto',\r\n    'full spherical': 'fusP',\r\n});\r\nexport var presetKindType = createEnum('presetKindType', 'presetKindCustom', {\r\n    custom: 'presetKindCustom',\r\n    default: 'presetKindDefault',\r\n});\r\n//# sourceMappingURL=descriptor.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { toByteArray } from 'base64-js';\r\nimport { readUnicodeString, readUint32, readUint16, readUint8, readFloat64, readBytes, skipBytes, readFloat32, readInt16, readFixedPoint32, readSignature, checkSignature, readSection, readColor, readInt32, readAsciiString } from './psdReader';\r\nimport { writeUnicodeString, writeUint32, writeUint8, writeFloat64, writeUint16, writeBytes, writeInt16, writeFloat32, writeFixedPoint32, writeUnicodeStringWithPadding, writeColor, writeSignature, writeSection, writeInt32, writeAsciiString, } from './psdWriter';\r\nimport { createCanvasFromData, createEnum, MOCK_HANDLERS } from './helpers';\r\nimport { decodeString, encodeString } from './utf8';\r\nimport { ESliceBGColorType, ESliceHorzAlign, ESliceOrigin, ESliceType, ESliceVertAlign, frac, parseTrackList, readVersionAndDescriptor, serializeTrackList, writeVersionAndDescriptor } from './descriptor';\r\nexport var resourceHandlers = [];\r\nexport var resourceHandlersMap = {};\r\nfunction addHandler(key, has, read, write) {\r\n    var handler = { key: key, has: has, read: read, write: write };\r\n    resourceHandlers.push(handler);\r\n    resourceHandlersMap[handler.key] = handler;\r\n}\r\nvar LOG_MOCK_HANDLERS = false;\r\nvar RESOLUTION_UNITS = [undefined, 'PPI', 'PPCM'];\r\nvar MEASUREMENT_UNITS = [undefined, 'Inches', 'Centimeters', 'Points', 'Picas', 'Columns'];\r\nvar hex = '0123456789abcdef';\r\nfunction charToNibble(code) {\r\n    return code <= 57 ? code - 48 : code - 87;\r\n}\r\nfunction byteAt(value, index) {\r\n    return (charToNibble(value.charCodeAt(index)) << 4) | charToNibble(value.charCodeAt(index + 1));\r\n}\r\nfunction readUtf8String(reader, length) {\r\n    var buffer = readBytes(reader, length);\r\n    return decodeString(buffer);\r\n}\r\nfunction writeUtf8String(writer, value) {\r\n    var buffer = encodeString(value);\r\n    writeBytes(writer, buffer);\r\n}\r\nfunction readEncodedString(reader) {\r\n    var length = readUint8(reader);\r\n    var buffer = readBytes(reader, length);\r\n    var notAscii = false;\r\n    for (var i = 0; i < buffer.byteLength; i++) {\r\n        if (buffer[i] & 0x80) {\r\n            notAscii = true;\r\n            break;\r\n        }\r\n    }\r\n    if (notAscii) {\r\n        var decoder = new TextDecoder('gbk');\r\n        return decoder.decode(buffer);\r\n    }\r\n    else {\r\n        return decodeString(buffer);\r\n    }\r\n}\r\nfunction writeEncodedString(writer, value) {\r\n    var ascii = '';\r\n    for (var i = 0, code = value.codePointAt(i++); code !== undefined; code = value.codePointAt(i++)) {\r\n        ascii += code > 0x7f ? '?' : String.fromCodePoint(code);\r\n    }\r\n    var buffer = encodeString(ascii);\r\n    writeUint8(writer, buffer.byteLength);\r\n    writeBytes(writer, buffer);\r\n}\r\nMOCK_HANDLERS && addHandler(1028, // IPTC-NAA record\r\nfunction (// IPTC-NAA record\r\ntarget) { return target._ir1028 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1028', left());\r\n    target._ir1028 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1028);\r\n});\r\naddHandler(1061, function (target) { return target.captionDigest !== undefined; }, function (reader, target) {\r\n    var captionDigest = '';\r\n    for (var i = 0; i < 16; i++) {\r\n        var byte = readUint8(reader);\r\n        captionDigest += hex[byte >> 4];\r\n        captionDigest += hex[byte & 0xf];\r\n    }\r\n    target.captionDigest = captionDigest;\r\n}, function (writer, target) {\r\n    for (var i = 0; i < 16; i++) {\r\n        writeUint8(writer, byteAt(target.captionDigest, i * 2));\r\n    }\r\n});\r\naddHandler(1060, function (target) { return target.xmpMetadata !== undefined; }, function (reader, target, left) {\r\n    target.xmpMetadata = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.xmpMetadata);\r\n});\r\nvar Inte = createEnum('Inte', 'perceptual', {\r\n    'perceptual': 'Img ',\r\n    'saturation': 'Grp ',\r\n    'relative colorimetric': 'Clrm',\r\n    'absolute colorimetric': 'AClr',\r\n});\r\nMOCK_HANDLERS && addHandler(1085, // Windows DEVMODE. Variable OS specific info for Windows.\r\nfunction (// Windows DEVMODE. Variable OS specific info for Windows.\r\ntarget) { return target._ir1085 !== undefined; }, function (reader, target, left) {\r\n    target._ir1085 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1085);\r\n});\r\naddHandler(1082, function (target) { return target.printInformation !== undefined; }, function (reader, target) {\r\n    var _a, _b;\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.printInformation = {\r\n        printerName: desc.printerName || '',\r\n        renderingIntent: Inte.decode((_a = desc.Inte) !== null && _a !== void 0 ? _a : 'Inte.Img '),\r\n    };\r\n    var info = target.printInformation;\r\n    if (desc.PstS !== undefined)\r\n        info.printerManagesColors = desc.PstS;\r\n    if (desc['Nm  '] !== undefined)\r\n        info.printerProfile = desc['Nm  '];\r\n    if (desc.MpBl !== undefined)\r\n        info.blackPointCompensation = desc.MpBl;\r\n    if (desc.printSixteenBit !== undefined)\r\n        info.printSixteenBit = desc.printSixteenBit;\r\n    if (desc.hardProof !== undefined)\r\n        info.hardProof = desc.hardProof;\r\n    if (desc.printProofSetup) {\r\n        if ('Bltn' in desc.printProofSetup) {\r\n            info.proofSetup = { builtin: desc.printProofSetup.Bltn.split('.')[1] };\r\n        }\r\n        else {\r\n            info.proofSetup = {\r\n                profile: desc.printProofSetup.profile,\r\n                renderingIntent: Inte.decode((_b = desc.printProofSetup.Inte) !== null && _b !== void 0 ? _b : 'Inte.Img '),\r\n                blackPointCompensation: !!desc.printProofSetup.MpBl,\r\n                paperWhite: !!desc.printProofSetup.paperWhite,\r\n            };\r\n        }\r\n    }\r\n}, function (writer, target) {\r\n    var _a, _b;\r\n    var info = target.printInformation;\r\n    var desc = {};\r\n    if (info.printerManagesColors) {\r\n        desc.PstS = true;\r\n    }\r\n    else {\r\n        if (info.hardProof !== undefined)\r\n            desc.hardProof = !!info.hardProof;\r\n        desc.ClrS = 'ClrS.RGBC'; // TODO: ???\r\n        desc['Nm  '] = (_a = info.printerProfile) !== null && _a !== void 0 ? _a : 'CIE RGB';\r\n    }\r\n    desc.Inte = Inte.encode(info.renderingIntent);\r\n    if (!info.printerManagesColors)\r\n        desc.MpBl = !!info.blackPointCompensation;\r\n    desc.printSixteenBit = !!info.printSixteenBit;\r\n    desc.printerName = info.printerName || '';\r\n    if (info.proofSetup && 'profile' in info.proofSetup) {\r\n        desc.printProofSetup = {\r\n            profile: info.proofSetup.profile || '',\r\n            Inte: Inte.encode(info.proofSetup.renderingIntent),\r\n            MpBl: !!info.proofSetup.blackPointCompensation,\r\n            paperWhite: !!info.proofSetup.paperWhite,\r\n        };\r\n    }\r\n    else {\r\n        desc.printProofSetup = {\r\n            Bltn: ((_b = info.proofSetup) === null || _b === void 0 ? void 0 : _b.builtin) ? \"builtinProof.\".concat(info.proofSetup.builtin) : 'builtinProof.proofCMYK',\r\n        };\r\n    }\r\n    writeVersionAndDescriptor(writer, '', 'printOutput', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1083, // Print style\r\nfunction (// Print style\r\ntarget) { return target._ir1083 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1083', left());\r\n    target._ir1083 = readBytes(reader, left());\r\n    // TODO:\r\n    // const desc = readVersionAndDescriptor(reader);\r\n    // console.log('1083', require('util').inspect(desc, false, 99, true));\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1083);\r\n});\r\naddHandler(1005, function (target) { return target.resolutionInfo !== undefined; }, function (reader, target) {\r\n    var horizontalResolution = readFixedPoint32(reader);\r\n    var horizontalResolutionUnit = readUint16(reader);\r\n    var widthUnit = readUint16(reader);\r\n    var verticalResolution = readFixedPoint32(reader);\r\n    var verticalResolutionUnit = readUint16(reader);\r\n    var heightUnit = readUint16(reader);\r\n    target.resolutionInfo = {\r\n        horizontalResolution: horizontalResolution,\r\n        horizontalResolutionUnit: RESOLUTION_UNITS[horizontalResolutionUnit] || 'PPI',\r\n        widthUnit: MEASUREMENT_UNITS[widthUnit] || 'Inches',\r\n        verticalResolution: verticalResolution,\r\n        verticalResolutionUnit: RESOLUTION_UNITS[verticalResolutionUnit] || 'PPI',\r\n        heightUnit: MEASUREMENT_UNITS[heightUnit] || 'Inches',\r\n    };\r\n}, function (writer, target) {\r\n    var info = target.resolutionInfo;\r\n    writeFixedPoint32(writer, info.horizontalResolution || 0);\r\n    writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.horizontalResolutionUnit)));\r\n    writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.widthUnit)));\r\n    writeFixedPoint32(writer, info.verticalResolution || 0);\r\n    writeUint16(writer, Math.max(1, RESOLUTION_UNITS.indexOf(info.verticalResolutionUnit)));\r\n    writeUint16(writer, Math.max(1, MEASUREMENT_UNITS.indexOf(info.heightUnit)));\r\n});\r\nvar printScaleStyles = ['centered', 'size to fit', 'user defined'];\r\naddHandler(1062, function (target) { return target.printScale !== undefined; }, function (reader, target) {\r\n    target.printScale = {\r\n        style: printScaleStyles[readInt16(reader)],\r\n        x: readFloat32(reader),\r\n        y: readFloat32(reader),\r\n        scale: readFloat32(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var _a = target.printScale, style = _a.style, x = _a.x, y = _a.y, scale = _a.scale;\r\n    writeInt16(writer, Math.max(0, printScaleStyles.indexOf(style)));\r\n    writeFloat32(writer, x || 0);\r\n    writeFloat32(writer, y || 0);\r\n    writeFloat32(writer, scale || 0);\r\n});\r\naddHandler(1006, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {\r\n    if (!target.alphaChannelNames) { // skip if the unicode versions are already read\r\n        target.alphaChannelNames = [];\r\n        while (left() > 0) {\r\n            var value = readEncodedString(reader);\r\n            // const value = readPascalString(reader, 1);\r\n            target.alphaChannelNames.push(value);\r\n        }\r\n    }\r\n    else {\r\n        skipBytes(reader, left());\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {\r\n        var name_1 = _a[_i];\r\n        writeEncodedString(writer, name_1);\r\n        // writePascalString(writer, name, 1);\r\n    }\r\n});\r\naddHandler(1045, function (target) { return target.alphaChannelNames !== undefined; }, function (reader, target, left) {\r\n    target.alphaChannelNames = [];\r\n    while (left() > 0) {\r\n        target.alphaChannelNames.push(readUnicodeString(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaChannelNames; _i < _a.length; _i++) {\r\n        var name_2 = _a[_i];\r\n        writeUnicodeStringWithPadding(writer, name_2);\r\n    }\r\n});\r\nMOCK_HANDLERS && addHandler(1077, function (target) { return target._ir1077 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1077', left());\r\n    target._ir1077 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1077);\r\n});\r\naddHandler(1053, function (target) { return target.alphaIdentifiers !== undefined; }, function (reader, target, left) {\r\n    target.alphaIdentifiers = [];\r\n    while (left() >= 4) {\r\n        target.alphaIdentifiers.push(readUint32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.alphaIdentifiers; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint32(writer, id);\r\n    }\r\n});\r\naddHandler(1010, function (target) { return target.backgroundColor !== undefined; }, function (reader, target) { return target.backgroundColor = readColor(reader); }, function (writer, target) { return writeColor(writer, target.backgroundColor); });\r\naddHandler(1037, function (target) { return target.globalAngle !== undefined; }, function (reader, target) { return target.globalAngle = readInt32(reader); }, function (writer, target) { return writeInt32(writer, target.globalAngle); });\r\naddHandler(1049, function (target) { return target.globalAltitude !== undefined; }, function (reader, target) { return target.globalAltitude = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.globalAltitude); });\r\naddHandler(1011, function (target) { return target.printFlags !== undefined; }, function (reader, target) {\r\n    target.printFlags = {\r\n        labels: !!readUint8(reader),\r\n        cropMarks: !!readUint8(reader),\r\n        colorBars: !!readUint8(reader),\r\n        registrationMarks: !!readUint8(reader),\r\n        negative: !!readUint8(reader),\r\n        flip: !!readUint8(reader),\r\n        interpolate: !!readUint8(reader),\r\n        caption: !!readUint8(reader),\r\n        printFlags: !!readUint8(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var flags = target.printFlags;\r\n    writeUint8(writer, flags.labels ? 1 : 0);\r\n    writeUint8(writer, flags.cropMarks ? 1 : 0);\r\n    writeUint8(writer, flags.colorBars ? 1 : 0);\r\n    writeUint8(writer, flags.registrationMarks ? 1 : 0);\r\n    writeUint8(writer, flags.negative ? 1 : 0);\r\n    writeUint8(writer, flags.flip ? 1 : 0);\r\n    writeUint8(writer, flags.interpolate ? 1 : 0);\r\n    writeUint8(writer, flags.caption ? 1 : 0);\r\n    writeUint8(writer, flags.printFlags ? 1 : 0);\r\n});\r\naddHandler(1034, // Copyright flag\r\nfunction (// Copyright flag\r\ntarget) { return target.copyrighted !== undefined; }, function (reader, target) {\r\n    target.copyrighted = !!readUint8(reader);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.copyrighted ? 1 : 0);\r\n});\r\naddHandler(1035, // URL\r\nfunction (// URL\r\ntarget) { return target.url !== undefined; }, function (reader, target, left) {\r\n    target.url = readAsciiString(reader, left());\r\n}, function (writer, target) {\r\n    writeAsciiString(writer, target.url);\r\n});\r\nMOCK_HANDLERS && addHandler(10000, // Print flags\r\nfunction (// Print flags\r\ntarget) { return target._ir10000 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 10000', left());\r\n    target._ir10000 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir10000);\r\n});\r\nMOCK_HANDLERS && addHandler(1013, // Color halftoning\r\nfunction (// Color halftoning\r\ntarget) { return target._ir1013 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1013', left());\r\n    target._ir1013 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1013);\r\n});\r\nMOCK_HANDLERS && addHandler(1016, // Color transfer functions\r\nfunction (// Color transfer functions\r\ntarget) { return target._ir1016 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1016', left());\r\n    target._ir1016 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1016);\r\n});\r\naddHandler(1080, // Count Information\r\nfunction (// Count Information\r\ntarget) { return target.countInformation !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.countInformation = desc.countGroupList.map(function (g) { return ({\r\n        color: { r: g['Rd  '], g: g['Grn '], b: g['Bl  '] },\r\n        name: g['Nm  '],\r\n        size: g['Rds '],\r\n        fontSize: g.fontSize,\r\n        visible: g.Vsbl,\r\n        points: g.countObjectList.map(function (p) { return ({ x: p['X   '], y: p['Y   '] }); }),\r\n    }); });\r\n}, function (writer, target) {\r\n    var desc = {\r\n        Vrsn: 1,\r\n        countGroupList: target.countInformation.map(function (g) { return ({\r\n            'Rd  ': g.color.r,\r\n            'Grn ': g.color.g,\r\n            'Bl  ': g.color.b,\r\n            'Nm  ': g.name,\r\n            'Rds ': g.size,\r\n            fontSize: g.fontSize,\r\n            Vsbl: g.visible,\r\n            countObjectList: g.points.map(function (p) { return ({ 'X   ': p.x, 'Y   ': p.y }); }),\r\n        }); }),\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'Cnt ', desc);\r\n});\r\naddHandler(1024, function (target) { return target.layerState !== undefined; }, function (reader, target) { return target.layerState = readUint16(reader); }, function (writer, target) { return writeUint16(writer, target.layerState); });\r\naddHandler(1026, function (target) { return target.layersGroup !== undefined; }, function (reader, target, left) {\r\n    target.layersGroup = [];\r\n    while (left() > 0) {\r\n        target.layersGroup.push(readUint16(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.layersGroup; _i < _a.length; _i++) {\r\n        var g = _a[_i];\r\n        writeUint16(writer, g);\r\n    }\r\n});\r\naddHandler(1072, function (target) { return target.layerGroupsEnabledId !== undefined; }, function (reader, target, left) {\r\n    target.layerGroupsEnabledId = [];\r\n    while (left() > 0) {\r\n        target.layerGroupsEnabledId.push(readUint8(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.layerGroupsEnabledId; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint8(writer, id);\r\n    }\r\n});\r\naddHandler(1069, function (target) { return target.layerSelectionIds !== undefined; }, function (reader, target) {\r\n    var count = readUint16(reader);\r\n    target.layerSelectionIds = [];\r\n    while (count--) {\r\n        target.layerSelectionIds.push(readUint32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    writeUint16(writer, target.layerSelectionIds.length);\r\n    for (var _i = 0, _a = target.layerSelectionIds; _i < _a.length; _i++) {\r\n        var id = _a[_i];\r\n        writeUint32(writer, id);\r\n    }\r\n});\r\naddHandler(1032, function (target) { return target.gridAndGuidesInformation !== undefined; }, function (reader, target) {\r\n    var version = readUint32(reader);\r\n    var horizontal = readUint32(reader);\r\n    var vertical = readUint32(reader);\r\n    var count = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error(\"Invalid 1032 resource version: \".concat(version));\r\n    target.gridAndGuidesInformation = {\r\n        grid: { horizontal: horizontal, vertical: vertical },\r\n        guides: [],\r\n    };\r\n    for (var i = 0; i < count; i++) {\r\n        target.gridAndGuidesInformation.guides.push({\r\n            location: readUint32(reader) / 32,\r\n            direction: readUint8(reader) ? 'horizontal' : 'vertical'\r\n        });\r\n    }\r\n}, function (writer, target) {\r\n    var info = target.gridAndGuidesInformation;\r\n    var grid = info.grid || { horizontal: 18 * 32, vertical: 18 * 32 };\r\n    var guides = info.guides || [];\r\n    writeUint32(writer, 1);\r\n    writeUint32(writer, grid.horizontal);\r\n    writeUint32(writer, grid.vertical);\r\n    writeUint32(writer, guides.length);\r\n    for (var _i = 0, guides_1 = guides; _i < guides_1.length; _i++) {\r\n        var g = guides_1[_i];\r\n        writeUint32(writer, g.location * 32);\r\n        writeUint8(writer, g.direction === 'horizontal' ? 1 : 0);\r\n    }\r\n});\r\naddHandler(1065, // Layer Comps\r\nfunction (// Layer Comps\r\ntarget) { return target.layerComps !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('CompList', require('util').inspect(desc, false, 99, true));\r\n    target.layerComps = { list: [] };\r\n    for (var _i = 0, _a = desc.list; _i < _a.length; _i++) {\r\n        var item = _a[_i];\r\n        target.layerComps.list.push({\r\n            id: item.compID,\r\n            name: item['Nm  '],\r\n            capturedInfo: item.capturedInfo,\r\n        });\r\n        if ('comment' in item)\r\n            target.layerComps.list[target.layerComps.list.length - 1].comment = item.comment;\r\n    }\r\n    if ('lastAppliedComp' in desc)\r\n        target.layerComps.lastApplied = desc.lastAppliedComp;\r\n}, function (writer, target) {\r\n    var layerComps = target.layerComps;\r\n    var desc = { list: [] };\r\n    for (var _i = 0, _a = layerComps.list; _i < _a.length; _i++) {\r\n        var item = _a[_i];\r\n        var t = {};\r\n        t._classID = 'Comp';\r\n        t['Nm  '] = item.name;\r\n        if ('comment' in item)\r\n            t.comment = item.comment;\r\n        t.compID = item.id;\r\n        t.capturedInfo = item.capturedInfo;\r\n        desc.list.push(t);\r\n    }\r\n    if ('lastApplied' in layerComps)\r\n        desc.lastAppliedComp = layerComps.lastApplied;\r\n    // console.log('CompList', require('util').inspect(desc, false, 99, true));\r\n    writeVersionAndDescriptor(writer, '', 'CompList', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1092, // ???\r\nfunction (// ???\r\ntarget) { return target._ir1092 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1092', left());\r\n    // 16 bytes, seems to be 4 integers\r\n    target._ir1092 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1092);\r\n});\r\n// 0 - normal, 7 - multiply, 8 - screen, 23 - difference\r\nvar onionSkinsBlendModes = [\r\n    'normal', undefined, undefined, undefined, undefined, undefined, undefined, 'multiply',\r\n    'screen', undefined, undefined, undefined, undefined, undefined, undefined, undefined,\r\n    undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'difference',\r\n];\r\naddHandler(1078, // Onion Skins\r\nfunction (// Onion Skins\r\ntarget) { return target.onionSkins !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('1078', require('util').inspect(desc, false, 99, true));\r\n    target.onionSkins = {\r\n        enabled: desc.enab,\r\n        framesBefore: desc.numBefore,\r\n        framesAfter: desc.numAfter,\r\n        frameSpacing: desc.Spcn,\r\n        minOpacity: desc.minOpacity / 100,\r\n        maxOpacity: desc.maxOpacity / 100,\r\n        blendMode: onionSkinsBlendModes[desc.BlnM] || 'normal',\r\n    };\r\n}, function (writer, target) {\r\n    var onionSkins = target.onionSkins;\r\n    var desc = {\r\n        Vrsn: 1,\r\n        enab: onionSkins.enabled,\r\n        numBefore: onionSkins.framesBefore,\r\n        numAfter: onionSkins.framesAfter,\r\n        Spcn: onionSkins.frameSpacing,\r\n        minOpacity: (onionSkins.minOpacity * 100) | 0,\r\n        maxOpacity: (onionSkins.maxOpacity * 100) | 0,\r\n        BlnM: Math.max(0, onionSkinsBlendModes.indexOf(onionSkins.blendMode)),\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler(1075, // Timeline Information\r\nfunction (// Timeline Information\r\ntarget) { return target.timelineInformation !== undefined; }, function (reader, target) {\r\n    var _a, _b;\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.timelineInformation = {\r\n        enabled: desc.enab,\r\n        frameStep: frac(desc.frameStep),\r\n        frameRate: desc.frameRate,\r\n        time: frac(desc.time),\r\n        duration: frac(desc.duration),\r\n        workInTime: frac(desc.workInTime),\r\n        workOutTime: frac(desc.workOutTime),\r\n        repeats: desc.LCnt,\r\n        hasMotion: desc.hasMotion,\r\n        globalTracks: parseTrackList(desc.globalTrackList, !!reader.logMissingFeatures),\r\n    };\r\n    if ((_b = (_a = desc.audioClipGroupList) === null || _a === void 0 ? void 0 : _a.audioClipGroupList) === null || _b === void 0 ? void 0 : _b.length) {\r\n        target.timelineInformation.audioClipGroups = desc.audioClipGroupList.audioClipGroupList.map(function (g) { return ({\r\n            id: g.groupID,\r\n            muted: g.muted,\r\n            audioClips: g.audioClipList.map(function (_a) {\r\n                var clipID = _a.clipID, timeScope = _a.timeScope, muted = _a.muted, audioLevel = _a.audioLevel, frameReader = _a.frameReader;\r\n                return ({\r\n                    id: clipID,\r\n                    start: frac(timeScope.Strt),\r\n                    duration: frac(timeScope.duration),\r\n                    inTime: frac(timeScope.inTime),\r\n                    outTime: frac(timeScope.outTime),\r\n                    muted: muted,\r\n                    audioLevel: audioLevel,\r\n                    frameReader: {\r\n                        type: frameReader.frameReaderType,\r\n                        mediaDescriptor: frameReader.mediaDescriptor,\r\n                        link: {\r\n                            name: frameReader['Lnk ']['Nm  '],\r\n                            fullPath: frameReader['Lnk '].fullPath,\r\n                            relativePath: frameReader['Lnk '].relPath,\r\n                        },\r\n                    },\r\n                });\r\n            }),\r\n        }); });\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    var timeline = target.timelineInformation;\r\n    var desc = {\r\n        Vrsn: 1,\r\n        enab: timeline.enabled,\r\n        frameStep: timeline.frameStep,\r\n        frameRate: timeline.frameRate,\r\n        time: timeline.time,\r\n        duration: timeline.duration,\r\n        workInTime: timeline.workInTime,\r\n        workOutTime: timeline.workOutTime,\r\n        LCnt: timeline.repeats,\r\n        globalTrackList: serializeTrackList(timeline.globalTracks),\r\n        audioClipGroupList: {\r\n            audioClipGroupList: (_a = timeline.audioClipGroups) === null || _a === void 0 ? void 0 : _a.map(function (a) { return ({\r\n                groupID: a.id,\r\n                muted: a.muted,\r\n                audioClipList: a.audioClips.map(function (c) { return ({\r\n                    clipID: c.id,\r\n                    timeScope: {\r\n                        Vrsn: 1,\r\n                        Strt: c.start,\r\n                        duration: c.duration,\r\n                        inTime: c.inTime,\r\n                        outTime: c.outTime,\r\n                    },\r\n                    frameReader: {\r\n                        frameReaderType: c.frameReader.type,\r\n                        descVersion: 1,\r\n                        'Lnk ': {\r\n                            descVersion: 1,\r\n                            'Nm  ': c.frameReader.link.name,\r\n                            fullPath: c.frameReader.link.fullPath,\r\n                            relPath: c.frameReader.link.relativePath,\r\n                        },\r\n                        mediaDescriptor: c.frameReader.mediaDescriptor,\r\n                    },\r\n                    muted: c.muted,\r\n                    audioLevel: c.audioLevel,\r\n                }); }),\r\n            }); }),\r\n        },\r\n        hasMotion: timeline.hasMotion,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');\r\n});\r\naddHandler(1076, // Sheet Disclosure\r\nfunction (// Sheet Disclosure\r\ntarget) { return target.sheetDisclosure !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.sheetDisclosure = {};\r\n    if (desc.sheetTimelineOptions) {\r\n        target.sheetDisclosure.sheetTimelineOptions = desc.sheetTimelineOptions.map(function (o) { return ({\r\n            sheetID: o.sheetID,\r\n            sheetDisclosed: o.sheetDisclosed,\r\n            lightsDisclosed: o.lightsDisclosed,\r\n            meshesDisclosed: o.meshesDisclosed,\r\n            materialsDisclosed: o.materialsDisclosed,\r\n        }); });\r\n    }\r\n}, function (writer, target) {\r\n    var disclosure = target.sheetDisclosure;\r\n    var desc = { Vrsn: 1 };\r\n    if (disclosure.sheetTimelineOptions) {\r\n        desc.sheetTimelineOptions = disclosure.sheetTimelineOptions.map(function (d) { return ({\r\n            Vrsn: 2,\r\n            sheetID: d.sheetID,\r\n            sheetDisclosed: d.sheetDisclosed,\r\n            lightsDisclosed: d.lightsDisclosed,\r\n            meshesDisclosed: d.meshesDisclosed,\r\n            materialsDisclosed: d.materialsDisclosed,\r\n        }); });\r\n    }\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler(1054, // URL List\r\nfunction (// URL List\r\ntarget) { return target.urlsList !== undefined; }, function (reader, target) {\r\n    var count = readUint32(reader);\r\n    target.urlsList = [];\r\n    for (var i = 0; i < count; i++) {\r\n        var long = readSignature(reader);\r\n        if (long !== 'slic' && reader.throwForMissingFeatures)\r\n            throw new Error('Unknown long');\r\n        var id = readUint32(reader);\r\n        var url = readUnicodeString(reader);\r\n        target.urlsList.push({ id: id, url: url, ref: 'slice' });\r\n    }\r\n}, function (writer, target) {\r\n    var list = target.urlsList;\r\n    writeUint32(writer, list.length);\r\n    for (var i = 0; i < list.length; i++) {\r\n        writeSignature(writer, 'slic');\r\n        writeUint32(writer, list[i].id);\r\n        writeUnicodeString(writer, list[i].url);\r\n    }\r\n});\r\nfunction boundsToBounds(bounds) {\r\n    return { 'Top ': bounds.top, Left: bounds.left, Btom: bounds.bottom, Rght: bounds.right };\r\n}\r\nfunction boundsFromBounds(bounds) {\r\n    return { top: bounds['Top '], left: bounds.Left, bottom: bounds.Btom, right: bounds.Rght };\r\n}\r\nfunction clamped(array, index) {\r\n    return array[Math.max(0, Math.min(array.length - 1, index))];\r\n}\r\nvar sliceOrigins = ['autoGenerated', 'layer', 'userGenerated'];\r\nvar sliceTypes = ['noImage', 'image'];\r\nvar sliceAlignments = ['default'];\r\naddHandler(1050, // Slices\r\nfunction (// Slices\r\ntarget) { return target.slices ? target.slices.length : 0; }, function (reader, target) {\r\n    var version = readUint32(reader);\r\n    if (version === 6) {\r\n        if (!target.slices)\r\n            target.slices = [];\r\n        var top_1 = readInt32(reader);\r\n        var left = readInt32(reader);\r\n        var bottom = readInt32(reader);\r\n        var right = readInt32(reader);\r\n        var groupName = readUnicodeString(reader);\r\n        var count = readUint32(reader);\r\n        target.slices.push({ bounds: { top: top_1, left: left, bottom: bottom, right: right }, groupName: groupName, slices: [] });\r\n        var slices_1 = target.slices[target.slices.length - 1].slices;\r\n        for (var i = 0; i < count; i++) {\r\n            var id = readUint32(reader);\r\n            var groupId = readUint32(reader);\r\n            var origin_1 = clamped(sliceOrigins, readUint32(reader));\r\n            var associatedLayerId = origin_1 == 'layer' ? readUint32(reader) : 0;\r\n            var name_3 = readUnicodeString(reader);\r\n            var type = clamped(sliceTypes, readUint32(reader));\r\n            var left_1 = readInt32(reader);\r\n            var top_2 = readInt32(reader);\r\n            var right_1 = readInt32(reader);\r\n            var bottom_1 = readInt32(reader);\r\n            var url = readUnicodeString(reader);\r\n            var target_1 = readUnicodeString(reader);\r\n            var message = readUnicodeString(reader);\r\n            var altTag = readUnicodeString(reader);\r\n            var cellTextIsHTML = !!readUint8(reader);\r\n            var cellText = readUnicodeString(reader);\r\n            var horizontalAlignment = clamped(sliceAlignments, readUint32(reader));\r\n            var verticalAlignment = clamped(sliceAlignments, readUint32(reader));\r\n            var a = readUint8(reader);\r\n            var r = readUint8(reader);\r\n            var g = readUint8(reader);\r\n            var b = readUint8(reader);\r\n            var backgroundColorType = ((a + r + g + b) === 0) ? 'none' : (a === 0 ? 'matte' : 'color');\r\n            slices_1.push({\r\n                id: id,\r\n                groupId: groupId,\r\n                origin: origin_1,\r\n                associatedLayerId: associatedLayerId,\r\n                name: name_3,\r\n                target: target_1,\r\n                message: message,\r\n                altTag: altTag,\r\n                cellTextIsHTML: cellTextIsHTML,\r\n                cellText: cellText,\r\n                horizontalAlignment: horizontalAlignment,\r\n                verticalAlignment: verticalAlignment,\r\n                type: type,\r\n                url: url,\r\n                bounds: { top: top_2, left: left_1, bottom: bottom_1, right: right_1 },\r\n                backgroundColorType: backgroundColorType,\r\n                backgroundColor: { r: r, g: g, b: b, a: a },\r\n            });\r\n        }\r\n        var desc = readVersionAndDescriptor(reader);\r\n        desc.slices.forEach(function (d) {\r\n            var slice = slices_1.find(function (s) { return d.sliceID == s.id; });\r\n            if (slice) {\r\n                slice.topOutset = d.topOutset;\r\n                slice.leftOutset = d.leftOutset;\r\n                slice.bottomOutset = d.bottomOutset;\r\n                slice.rightOutset = d.rightOutset;\r\n            }\r\n        });\r\n    }\r\n    else if (version === 7 || version === 8) {\r\n        var desc = readVersionAndDescriptor(reader);\r\n        if (!target.slices)\r\n            target.slices = [];\r\n        target.slices.push({\r\n            groupName: desc.baseName,\r\n            bounds: boundsFromBounds(desc.bounds),\r\n            slices: desc.slices.map(function (s) { return (__assign(__assign({}, (s['Nm  '] ? { name: s['Nm  '] } : {})), { id: s.sliceID, groupId: s.groupID, associatedLayerId: 0, origin: ESliceOrigin.decode(s.origin), type: ESliceType.decode(s.Type), bounds: boundsFromBounds(s.bounds), url: s.url, target: s.null, message: s.Msge, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horizontalAlignment: ESliceHorzAlign.decode(s.horzAlign), verticalAlignment: ESliceVertAlign.decode(s.vertAlign), backgroundColorType: ESliceBGColorType.decode(s.bgColorType), backgroundColor: s.bgColor ? { r: s.bgColor['Rd  '], g: s.bgColor['Grn '], b: s.bgColor['Bl  '], a: s.bgColor.alpha } : { r: 0, g: 0, b: 0, a: 0 }, topOutset: s.topOutset || 0, leftOutset: s.leftOutset || 0, bottomOutset: s.bottomOutset || 0, rightOutset: s.rightOutset || 0 })); }),\r\n        });\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid slices version (\".concat(version, \")\"));\r\n    }\r\n}, function (writer, target, index) {\r\n    var _a = target.slices[index], bounds = _a.bounds, groupName = _a.groupName, slices = _a.slices;\r\n    writeUint32(writer, 6); // version\r\n    writeInt32(writer, bounds.top);\r\n    writeInt32(writer, bounds.left);\r\n    writeInt32(writer, bounds.bottom);\r\n    writeInt32(writer, bounds.right);\r\n    writeUnicodeString(writer, groupName);\r\n    writeUint32(writer, slices.length);\r\n    for (var i = 0; i < slices.length; i++) {\r\n        var slice = slices[i];\r\n        var _b = slice.backgroundColor, a = _b.a, r = _b.r, g = _b.g, b = _b.b;\r\n        if (slice.backgroundColorType === 'none') {\r\n            a = r = g = b = 0;\r\n        }\r\n        else if (slice.backgroundColorType === 'matte') {\r\n            a = 0;\r\n            r = g = b = 255;\r\n        }\r\n        writeUint32(writer, slice.id);\r\n        writeUint32(writer, slice.groupId);\r\n        writeUint32(writer, sliceOrigins.indexOf(slice.origin));\r\n        if (slice.origin === 'layer')\r\n            writeUint32(writer, slice.associatedLayerId);\r\n        writeUnicodeString(writer, slice.name || '');\r\n        writeUint32(writer, sliceTypes.indexOf(slice.type));\r\n        writeInt32(writer, slice.bounds.left);\r\n        writeInt32(writer, slice.bounds.top);\r\n        writeInt32(writer, slice.bounds.right);\r\n        writeInt32(writer, slice.bounds.bottom);\r\n        writeUnicodeString(writer, slice.url);\r\n        writeUnicodeString(writer, slice.target);\r\n        writeUnicodeString(writer, slice.message);\r\n        writeUnicodeString(writer, slice.altTag);\r\n        writeUint8(writer, slice.cellTextIsHTML ? 1 : 0);\r\n        writeUnicodeString(writer, slice.cellText);\r\n        writeUint32(writer, sliceAlignments.indexOf(slice.horizontalAlignment));\r\n        writeUint32(writer, sliceAlignments.indexOf(slice.verticalAlignment));\r\n        writeUint8(writer, a);\r\n        writeUint8(writer, r);\r\n        writeUint8(writer, g);\r\n        writeUint8(writer, b);\r\n    }\r\n    var desc = {\r\n        bounds: boundsToBounds(bounds),\r\n        slices: [],\r\n    };\r\n    slices.forEach(function (s) {\r\n        var slice = __assign(__assign({ sliceID: s.id, groupID: s.groupId, origin: ESliceOrigin.encode(s.origin), Type: ESliceType.encode(s.type), bounds: boundsToBounds(s.bounds) }, (s.name ? { 'Nm  ': s.name } : {})), { url: s.url, null: s.target, Msge: s.message, altTag: s.altTag, cellTextIsHTML: s.cellTextIsHTML, cellText: s.cellText, horzAlign: ESliceHorzAlign.encode(s.horizontalAlignment), vertAlign: ESliceVertAlign.encode(s.verticalAlignment), bgColorType: ESliceBGColorType.encode(s.backgroundColorType) });\r\n        if (s.backgroundColorType === 'color') {\r\n            var _a = s.backgroundColor, r = _a.r, g = _a.g, b = _a.b, a = _a.a;\r\n            slice.bgColor = { 'Rd  ': r, 'Grn ': g, 'Bl  ': b, alpha: a };\r\n        }\r\n        slice.topOutset = s.topOutset || 0;\r\n        slice.leftOutset = s.leftOutset || 0;\r\n        slice.bottomOutset = s.bottomOutset || 0;\r\n        slice.rightOutset = s.rightOutset || 0;\r\n        desc.slices.push(slice);\r\n    });\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'slices');\r\n});\r\naddHandler(1064, function (target) { return target.pixelAspectRatio !== undefined; }, function (reader, target) {\r\n    if (readUint32(reader) > 2)\r\n        throw new Error('Invalid pixelAspectRatio version');\r\n    target.pixelAspectRatio = { aspect: readFloat64(reader) };\r\n}, function (writer, target) {\r\n    writeUint32(writer, 2); // version\r\n    writeFloat64(writer, target.pixelAspectRatio.aspect);\r\n});\r\naddHandler(1041, function (target) { return target.iccUntaggedProfile !== undefined; }, function (reader, target) {\r\n    target.iccUntaggedProfile = !!readUint8(reader);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.iccUntaggedProfile ? 1 : 0);\r\n});\r\nMOCK_HANDLERS && addHandler(1039, // ICC Profile\r\nfunction (// ICC Profile\r\ntarget) { return target._ir1039 !== undefined; }, function (reader, target, left) {\r\n    // TODO: this is raw bytes, just return as a byte array\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1039', left());\r\n    target._ir1039 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1039);\r\n});\r\naddHandler(1044, function (target) { return target.idsSeedNumber !== undefined; }, function (reader, target) { return target.idsSeedNumber = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.idsSeedNumber); });\r\naddHandler(1036, function (target) { return target.thumbnail !== undefined || target.thumbnailRaw !== undefined; }, function (reader, target, left) {\r\n    var format = readUint32(reader); // 1 = kJpegRGB, 0 = kRawRGB\r\n    var width = readUint32(reader);\r\n    var height = readUint32(reader);\r\n    readUint32(reader); // widthBytes = (width * bits_per_pixel + 31) / 32 * 4.\r\n    readUint32(reader); // totalSize = widthBytes * height * planes\r\n    readUint32(reader); // sizeAfterCompression\r\n    var bitsPerPixel = readUint16(reader); // 24\r\n    var planes = readUint16(reader); // 1\r\n    if (format !== 1 || bitsPerPixel !== 24 || planes !== 1) {\r\n        reader.logMissingFeatures && reader.log(\"Invalid thumbnail data (format: \".concat(format, \", bitsPerPixel: \").concat(bitsPerPixel, \", planes: \").concat(planes, \")\"));\r\n        skipBytes(reader, left());\r\n        return;\r\n    }\r\n    var size = left();\r\n    var data = readBytes(reader, size);\r\n    if (reader.useRawThumbnail) {\r\n        target.thumbnailRaw = { width: width, height: height, data: data };\r\n    }\r\n    else if (data.byteLength) {\r\n        target.thumbnail = createCanvasFromData(data);\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    var width = 0;\r\n    var height = 0;\r\n    var data = new Uint8Array(0);\r\n    if (target.thumbnailRaw) {\r\n        width = target.thumbnailRaw.width;\r\n        height = target.thumbnailRaw.height;\r\n        data = target.thumbnailRaw.data;\r\n    }\r\n    else {\r\n        try {\r\n            var dataUrl = (_a = target.thumbnail.toDataURL('image/jpeg', 1)) === null || _a === void 0 ? void 0 : _a.substring('data:image/jpeg;base64,'.length);\r\n            if (dataUrl) {\r\n                data = toByteArray(dataUrl); // this sometimes fails for some reason, maybe some browser bugs\r\n                width = target.thumbnail.width;\r\n                height = target.thumbnail.height;\r\n            }\r\n        }\r\n        catch (_b) { }\r\n    }\r\n    var bitsPerPixel = 24;\r\n    var widthBytes = Math.floor((width * bitsPerPixel + 31) / 32) * 4;\r\n    var planes = 1;\r\n    var totalSize = widthBytes * height * planes;\r\n    var sizeAfterCompression = data.length;\r\n    writeUint32(writer, 1); // 1 = kJpegRGB\r\n    writeUint32(writer, width);\r\n    writeUint32(writer, height);\r\n    writeUint32(writer, widthBytes);\r\n    writeUint32(writer, totalSize);\r\n    writeUint32(writer, sizeAfterCompression);\r\n    writeUint16(writer, bitsPerPixel);\r\n    writeUint16(writer, planes);\r\n    writeBytes(writer, data);\r\n});\r\naddHandler(1057, function (target) { return target.versionInfo !== undefined; }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error('Invalid versionInfo version');\r\n    target.versionInfo = {\r\n        hasRealMergedData: !!readUint8(reader),\r\n        writerName: readUnicodeString(reader),\r\n        readerName: readUnicodeString(reader),\r\n        fileVersion: readUint32(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var versionInfo = target.versionInfo;\r\n    writeUint32(writer, 1); // version\r\n    writeUint8(writer, versionInfo.hasRealMergedData ? 1 : 0);\r\n    writeUnicodeString(writer, versionInfo.writerName);\r\n    writeUnicodeString(writer, versionInfo.readerName);\r\n    writeUint32(writer, versionInfo.fileVersion);\r\n});\r\nMOCK_HANDLERS && addHandler(1058, // EXIF data 1.\r\nfunction (// EXIF data 1.\r\ntarget) { return target._ir1058 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1058', left());\r\n    target._ir1058 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1058);\r\n});\r\naddHandler(7000, function (target) { return target.imageReadyVariables !== undefined; }, function (reader, target, left) {\r\n    target.imageReadyVariables = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.imageReadyVariables);\r\n});\r\naddHandler(7001, function (target) { return target.imageReadyDataSets !== undefined; }, function (reader, target, left) {\r\n    target.imageReadyDataSets = readUtf8String(reader, left());\r\n}, function (writer, target) {\r\n    writeUtf8String(writer, target.imageReadyDataSets);\r\n});\r\naddHandler(1088, function (target) { return target.pathSelectionState !== undefined; }, function (reader, target, _left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.pathSelectionState = desc['null'];\r\n}, function (writer, target) {\r\n    var desc = { 'null': target.pathSelectionState };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nMOCK_HANDLERS && addHandler(1025, function (target) { return target._ir1025 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 1025', left());\r\n    target._ir1025 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir1025);\r\n});\r\nvar FrmD = createEnum('FrmD', '', {\r\n    auto: 'Auto',\r\n    none: 'None',\r\n    dispose: 'Disp',\r\n});\r\naddHandler(4000, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target.animations !== undefined; }, function (reader, target, left) {\r\n    var key = readSignature(reader);\r\n    if (key === 'mani') {\r\n        checkSignature(reader, 'IRFR');\r\n        readSection(reader, 1, function (left) {\r\n            var _loop_1 = function () {\r\n                checkSignature(reader, '8BIM');\r\n                var key_1 = readSignature(reader);\r\n                readSection(reader, 1, function (left) {\r\n                    if (key_1 === 'AnDs') {\r\n                        var desc = readVersionAndDescriptor(reader);\r\n                        target.animations = {\r\n                            // desc.AFSt ???\r\n                            frames: desc.FrIn.map(function (x) { return ({\r\n                                id: x.FrID,\r\n                                delay: (x.FrDl || 0) / 100,\r\n                                dispose: x.FrDs ? FrmD.decode(x.FrDs) : 'auto', // missing == auto\r\n                                // x.FrGA ???\r\n                            }); }),\r\n                            animations: desc.FSts.map(function (x) { return ({\r\n                                id: x.FsID,\r\n                                frames: x.FsFr,\r\n                                repeats: x.LCnt,\r\n                                activeFrame: x.AFrm || 0,\r\n                            }); }),\r\n                        };\r\n                        // console.log('#4000 AnDs', require('util').inspect(desc, false, 99, true));\r\n                        // console.log('#4000 AnDs:result', require('util').inspect(target.animations, false, 99, true));\r\n                    }\r\n                    else if (key_1 === 'Roll') {\r\n                        var bytes = readBytes(reader, left());\r\n                        reader.logDevFeatures && reader.log('#4000 Roll', bytes);\r\n                    }\r\n                    else {\r\n                        reader.logMissingFeatures && reader.log('Unhandled subsection in #4000', key_1);\r\n                    }\r\n                });\r\n            };\r\n            while (left() > 0) {\r\n                _loop_1();\r\n            }\r\n        });\r\n    }\r\n    else if (key === 'mopt') {\r\n        var bytes = readBytes(reader, left());\r\n        reader.logDevFeatures && reader.log('#4000 mopt', bytes);\r\n    }\r\n    else {\r\n        reader.logMissingFeatures && reader.log('Unhandled key in #4000:', key);\r\n    }\r\n}, function (writer, target) {\r\n    if (target.animations) {\r\n        writeSignature(writer, 'mani');\r\n        writeSignature(writer, 'IRFR');\r\n        writeSection(writer, 1, function () {\r\n            writeSignature(writer, '8BIM');\r\n            writeSignature(writer, 'AnDs');\r\n            writeSection(writer, 1, function () {\r\n                var desc = {\r\n                    // AFSt: 0, // ???\r\n                    FrIn: [],\r\n                    FSts: [],\r\n                };\r\n                for (var i = 0; i < target.animations.frames.length; i++) {\r\n                    var f = target.animations.frames[i];\r\n                    var frame = {\r\n                        FrID: f.id,\r\n                    };\r\n                    if (f.delay)\r\n                        frame.FrDl = (f.delay * 100) | 0;\r\n                    frame.FrDs = FrmD.encode(f.dispose);\r\n                    // if (i === 0) frame.FrGA = 30; // ???\r\n                    desc.FrIn.push(frame);\r\n                }\r\n                for (var i = 0; i < target.animations.animations.length; i++) {\r\n                    var a = target.animations.animations[i];\r\n                    var anim = {\r\n                        FsID: a.id,\r\n                        AFrm: a.activeFrame | 0,\r\n                        FsFr: a.frames,\r\n                        LCnt: a.repeats | 0,\r\n                    };\r\n                    desc.FSts.push(anim);\r\n                }\r\n                writeVersionAndDescriptor(writer, '', 'null', desc);\r\n            });\r\n            // writeSignature(writer, '8BIM');\r\n            // writeSignature(writer, 'Roll');\r\n            // writeSection(writer, 1, () => {\r\n            // \twriteZeros(writer, 8);\r\n            // });\r\n        });\r\n    }\r\n});\r\n// TODO: Unfinished\r\nMOCK_HANDLERS && addHandler(4001, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target._ir4001 !== undefined; }, function (reader, target, left) {\r\n    if (MOCK_HANDLERS) {\r\n        LOG_MOCK_HANDLERS && console.log('image resource 4001', left());\r\n        target._ir4001 = readBytes(reader, left());\r\n        return;\r\n    }\r\n    var key = readSignature(reader);\r\n    if (key === 'mfri') {\r\n        var version = readUint32(reader);\r\n        if (version !== 2)\r\n            throw new Error('Invalid mfri version');\r\n        var length_1 = readUint32(reader);\r\n        var bytes = readBytes(reader, length_1);\r\n        reader.logDevFeatures && reader.log('mfri', bytes);\r\n    }\r\n    else if (key === 'mset') {\r\n        var desc = readVersionAndDescriptor(reader);\r\n        reader.logDevFeatures && reader.log('mset', desc);\r\n    }\r\n    else {\r\n        reader.logMissingFeatures && reader.log('Unhandled key in #4001', key);\r\n    }\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir4001);\r\n});\r\n// TODO: Unfinished\r\nMOCK_HANDLERS && addHandler(4002, // Plug-In resource(s)\r\nfunction (// Plug-In resource(s)\r\ntarget) { return target._ir4002 !== undefined; }, function (reader, target, left) {\r\n    LOG_MOCK_HANDLERS && console.log('image resource 4002', left());\r\n    target._ir4002 = readBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeBytes(writer, target._ir4002);\r\n});\r\n//# sourceMappingURL=imageResources.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n};\r\nimport { inflate as inflateSync } from 'pako';\r\nimport { resetImageData, offsetForChannel, decodeBitmap, createImageData, toBlendMode, RAW_IMAGE_DATA, largeAdditionalInfoKeys, imageDataToCanvas } from './helpers';\r\nimport { infoHandlersMap } from './additionalInfo';\r\nimport { resourceHandlersMap } from './imageResources';\r\nexport var supportedColorModes = [0 /* ColorMode.Bitmap */, 1 /* ColorMode.Grayscale */, 3 /* ColorMode.RGB */, 2 /* ColorMode.Indexed */];\r\nvar colorModes = ['bitmap', 'grayscale', 'indexed', 'RGB', 'CMYK', 'multichannel', 'duotone', 'lab'];\r\nfunction setupGrayscale(data) {\r\n    var size = data.width * data.height * 4;\r\n    for (var i = 0; i < size; i += 4) {\r\n        var c = data.data[i];\r\n        data.data[i + 1] = c;\r\n        data.data[i + 2] = c;\r\n    }\r\n}\r\nexport function createReader(buffer, offset, length) {\r\n    var view = new DataView(buffer, offset, length);\r\n    return { view: view, offset: 0, strict: false, debug: false, large: false, globalAlpha: false, log: console.log };\r\n}\r\nexport function warnOrThrow(reader, message) {\r\n    if (reader.strict)\r\n        throw new Error(message);\r\n    if (reader.debug)\r\n        reader.log(message);\r\n}\r\nexport function readUint8(reader) {\r\n    reader.offset += 1;\r\n    return reader.view.getUint8(reader.offset - 1);\r\n}\r\nexport function peekUint8(reader) {\r\n    return reader.view.getUint8(reader.offset);\r\n}\r\nexport function readInt16(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getInt16(reader.offset - 2, false);\r\n}\r\nexport function readUint16(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getUint16(reader.offset - 2, false);\r\n}\r\nexport function readUint16LE(reader) {\r\n    reader.offset += 2;\r\n    return reader.view.getUint16(reader.offset - 2, true);\r\n}\r\nexport function readInt32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getInt32(reader.offset - 4, false);\r\n}\r\nexport function readInt32LE(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getInt32(reader.offset - 4, true);\r\n}\r\nexport function readUint32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getUint32(reader.offset - 4, false);\r\n}\r\nexport function readFloat32(reader) {\r\n    reader.offset += 4;\r\n    return reader.view.getFloat32(reader.offset - 4, false);\r\n}\r\nexport function readFloat64(reader) {\r\n    reader.offset += 8;\r\n    return reader.view.getFloat64(reader.offset - 8, false);\r\n}\r\n// 32-bit fixed-point number 16.16\r\nexport function readFixedPoint32(reader) {\r\n    return readInt32(reader) / (1 << 16);\r\n}\r\n// 32-bit fixed-point number 8.24\r\nexport function readFixedPointPath32(reader) {\r\n    return readInt32(reader) / (1 << 24);\r\n}\r\nexport function readBytes(reader, length) {\r\n    var start = reader.view.byteOffset + reader.offset;\r\n    reader.offset += length;\r\n    if ((start + length) > reader.view.buffer.byteLength) {\r\n        // fix for broken PSD files that are missing part of file at the end\r\n        warnOrThrow(reader, 'Reading bytes exceeding buffer length');\r\n        if (length > (100 * 1024 * 1024))\r\n            throw new Error('Reading past end of file'); // limit to 100MB\r\n        var result = new Uint8Array(length);\r\n        var len = Math.min(length, reader.view.byteLength - start);\r\n        if (len > 0)\r\n            result.set(new Uint8Array(reader.view.buffer, start, len));\r\n        return result;\r\n    }\r\n    else {\r\n        return new Uint8Array(reader.view.buffer, start, length);\r\n    }\r\n}\r\nexport function readSignature(reader) {\r\n    return readShortString(reader, 4);\r\n}\r\nexport function validSignatureAt(reader, offset) {\r\n    var sig = String.fromCharCode(reader.view.getUint8(offset))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 1))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 2))\r\n        + String.fromCharCode(reader.view.getUint8(offset + 3));\r\n    return sig == '8BIM' || sig == '8B64';\r\n}\r\nexport function readPascalString(reader, padTo) {\r\n    var length = readUint8(reader);\r\n    var text = length ? readShortString(reader, length) : '';\r\n    while (++length % padTo) { // starts with length + 1 so we count the size byte too\r\n        reader.offset++;\r\n    }\r\n    return text;\r\n}\r\nexport function readUnicodeString(reader) {\r\n    var length = readUint32(reader);\r\n    return readUnicodeStringWithLength(reader, length);\r\n}\r\nexport function readUnicodeStringWithLength(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        var value = readUint16(reader);\r\n        if (value || length > 0) { // remove trailing \\0\r\n            text += String.fromCharCode(value);\r\n        }\r\n    }\r\n    return text;\r\n}\r\nexport function readUnicodeStringWithLengthLE(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        var value = readUint16LE(reader);\r\n        if (value || length > 0) { // remove trailing \\0\r\n            text += String.fromCharCode(value);\r\n        }\r\n    }\r\n    return text;\r\n}\r\nexport function readAsciiString(reader, length) {\r\n    var text = '';\r\n    while (length--) {\r\n        text += String.fromCharCode(readUint8(reader));\r\n    }\r\n    return text;\r\n}\r\nexport function skipBytes(reader, count) {\r\n    reader.offset += count;\r\n}\r\nexport function checkSignature(reader, a, b) {\r\n    var offset = reader.offset;\r\n    var signature = readSignature(reader);\r\n    if (signature !== a && signature !== b) {\r\n        throw new Error(\"Invalid signature: '\".concat(signature, \"' at 0x\").concat(offset.toString(16)));\r\n    }\r\n}\r\nfunction readShortString(reader, length) {\r\n    var buffer = readBytes(reader, length);\r\n    var result = '';\r\n    for (var i = 0; i < buffer.length; i++) {\r\n        result += String.fromCharCode(buffer[i]);\r\n    }\r\n    return result;\r\n}\r\nfunction isValidSignature(sig) {\r\n    return sig === '8BIM' || sig === 'MeSa' || sig === 'AgHg' || sig === 'PHUT' || sig === 'DCSR';\r\n}\r\nexport function readPsd(reader, readOptions) {\r\n    var _a;\r\n    if (readOptions === void 0) { readOptions = {}; }\r\n    // header\r\n    checkSignature(reader, '8BPS');\r\n    var version = readUint16(reader);\r\n    if (version !== 1 && version !== 2)\r\n        throw new Error(\"Invalid PSD file version: \".concat(version));\r\n    skipBytes(reader, 6);\r\n    var channels = readUint16(reader);\r\n    var height = readUint32(reader);\r\n    var width = readUint32(reader);\r\n    var bitsPerChannel = readUint16(reader);\r\n    var colorMode = readUint16(reader);\r\n    var maxSize = version === 1 ? 30000 : 300000;\r\n    if (width > maxSize || height > maxSize)\r\n        throw new Error(\"Invalid size: \".concat(width, \"x\").concat(height));\r\n    if (channels > 16)\r\n        throw new Error(\"Invalid channel count: \".concat(channels));\r\n    if (![1, 8, 16, 32].includes(bitsPerChannel))\r\n        throw new Error(\"Invalid bitsPerChannel: \".concat(bitsPerChannel));\r\n    if (supportedColorModes.indexOf(colorMode) === -1)\r\n        throw new Error(\"Color mode not supported: \".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));\r\n    var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };\r\n    Object.assign(reader, readOptions);\r\n    reader.large = version === 2;\r\n    reader.globalAlpha = false;\r\n    // color mode data\r\n    readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return;\r\n        if (colorMode === 2 /* ColorMode.Indexed */) {\r\n            // should have 256 colors here saved as 8bit channels RGB\r\n            if (left() != 768)\r\n                throw new Error('Invalid color palette size');\r\n            psd.palette = [];\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette.push({ r: readUint8(reader), g: 0, b: 0 });\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette[i].g = readUint8(reader);\r\n            for (var i = 0; i < 256; i++)\r\n                psd.palette[i].b = readUint8(reader);\r\n        }\r\n        else {\r\n            // TODO: unknown format for duotone, also seems to have some data here for 32bit colors\r\n            // if (options.throwForMissingFeatures) throw new Error('Color mode data not supported');\r\n        }\r\n        skipBytes(reader, left());\r\n    });\r\n    // image resources\r\n    var imageResources = {};\r\n    readSection(reader, 1, function (left) {\r\n        var _loop_1 = function () {\r\n            realignWithSignature(reader, isValidSignature);\r\n            var id = readUint16(reader);\r\n            readPascalString(reader, 2); // name\r\n            readSection(reader, 2, function (left) {\r\n                var handler = resourceHandlersMap[id];\r\n                var skip = id === 1036 && !!reader.skipThumbnail;\r\n                if (handler && !skip) {\r\n                    try {\r\n                        handler.read(reader, imageResources, left);\r\n                    }\r\n                    catch (e) {\r\n                        if (reader.throwForMissingFeatures)\r\n                            throw e;\r\n                        skipBytes(reader, left());\r\n                    }\r\n                }\r\n                else {\r\n                    // options.logMissingFeatures && console.log(`Unhandled image resource: ${id} (${left()})`);\r\n                    skipBytes(reader, left());\r\n                }\r\n            });\r\n        };\r\n        while (left() > 0) {\r\n            _loop_1();\r\n        }\r\n    });\r\n    var layersGroup = imageResources.layersGroup, layerGroupsEnabledId = imageResources.layerGroupsEnabledId, rest = __rest(imageResources, [\"layersGroup\", \"layerGroupsEnabledId\"]);\r\n    if (Object.keys(rest)) {\r\n        psd.imageResources = rest;\r\n    }\r\n    // layer and mask info\r\n    readSection(reader, 1, function (left) {\r\n        readSection(reader, 2, function (left) {\r\n            readLayerInfo(reader, psd, imageResources);\r\n            skipBytes(reader, left());\r\n        }, undefined, reader.large);\r\n        // SAI does not include this section\r\n        if (left() > 0) {\r\n            var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);\r\n            if (globalLayerMaskInfo)\r\n                psd.globalLayerMaskInfo = globalLayerMaskInfo;\r\n        }\r\n        else {\r\n            // revert back to end of section if exceeded section limits\r\n            // opt.logMissingFeatures && console.log('reverting to end of section');\r\n            skipBytes(reader, left());\r\n        }\r\n        while (left() > 0) {\r\n            // sometimes there are empty bytes here\r\n            while (left() && peekUint8(reader) === 0) {\r\n                // opt.logMissingFeatures && console.log('skipping 0 byte');\r\n                skipBytes(reader, 1);\r\n            }\r\n            if (left() >= 12) {\r\n                readAdditionalLayerInfo(reader, psd, psd, imageResources);\r\n            }\r\n            else {\r\n                // opt.logMissingFeatures && console.log('skipping leftover bytes', left());\r\n                skipBytes(reader, left());\r\n            }\r\n        }\r\n    }, undefined, reader.large);\r\n    var hasChildren = psd.children && psd.children.length;\r\n    var skipComposite = reader.skipCompositeImageData && (reader.skipLayerImageData || hasChildren);\r\n    if (!skipComposite) {\r\n        readImageData(reader, psd);\r\n    }\r\n    // TODO: show converted color mode instead of original PSD file color mode\r\n    //       but add option to preserve file color mode (need to return image data instead of canvas in that case)\r\n    // psd.colorMode = ColorMode.RGB; // we convert all color modes to RGB\r\n    return psd;\r\n}\r\nexport function readLayerInfo(reader, psd, imageResources) {\r\n    var _a, _b;\r\n    var _c = imageResources.layersGroup, layersGroup = _c === void 0 ? [] : _c, _d = imageResources.layerGroupsEnabledId, layerGroupsEnabledId = _d === void 0 ? [] : _d;\r\n    var layerCount = readInt16(reader);\r\n    if (layerCount < 0) {\r\n        reader.globalAlpha = true;\r\n        layerCount = -layerCount;\r\n    }\r\n    var layers = [];\r\n    var layerChannels = [];\r\n    for (var i = 0; i < layerCount; i++) {\r\n        var _e = readLayerRecord(reader, psd, imageResources), layer = _e.layer, channels = _e.channels;\r\n        if (layersGroup[i] !== undefined)\r\n            layer.linkGroup = layersGroup[i];\r\n        if (layerGroupsEnabledId[i] !== undefined)\r\n            layer.linkGroupEnabled = !!layerGroupsEnabledId[i];\r\n        layers.push(layer);\r\n        layerChannels.push(channels);\r\n    }\r\n    for (var i = 0; i < layerCount; i++) {\r\n        readLayerChannelImageData(reader, psd, layers[i], layerChannels[i]);\r\n    }\r\n    if (!psd.children)\r\n        psd.children = [];\r\n    var stack = [psd];\r\n    for (var i = layers.length - 1; i >= 0; i--) {\r\n        var l = layers[i];\r\n        var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;\r\n        if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {\r\n            l.opened = type === 1 /* SectionDividerType.OpenFolder */;\r\n            l.children = [];\r\n            if ((_a = l.sectionDivider) === null || _a === void 0 ? void 0 : _a.key) {\r\n                l.blendMode = (_b = toBlendMode[l.sectionDivider.key]) !== null && _b !== void 0 ? _b : l.blendMode;\r\n            }\r\n            stack[stack.length - 1].children.unshift(l);\r\n            stack.push(l);\r\n        }\r\n        else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {\r\n            stack.pop();\r\n            // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore\r\n            // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {\r\n            // \t// sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)\r\n            // \tstack.pop();\r\n        }\r\n        else {\r\n            stack[stack.length - 1].children.unshift(l);\r\n        }\r\n    }\r\n}\r\nfunction readLayerRecord(reader, psd, imageResources) {\r\n    var layer = {};\r\n    layer.top = readInt32(reader);\r\n    layer.left = readInt32(reader);\r\n    layer.bottom = readInt32(reader);\r\n    layer.right = readInt32(reader);\r\n    var channelCount = readUint16(reader);\r\n    var channels = [];\r\n    for (var i = 0; i < channelCount; i++) {\r\n        var id = readInt16(reader);\r\n        var length_1 = readUint32(reader);\r\n        if (reader.large) {\r\n            if (length_1 !== 0)\r\n                throw new Error('Sizes larger than 4GB are not supported');\r\n            length_1 = readUint32(reader);\r\n        }\r\n        channels.push({ id: id, length: length_1 });\r\n    }\r\n    checkSignature(reader, '8BIM');\r\n    var blendMode = readSignature(reader);\r\n    if (!toBlendMode[blendMode])\r\n        throw new Error(\"Invalid blend mode: '\".concat(blendMode, \"'\"));\r\n    layer.blendMode = toBlendMode[blendMode];\r\n    layer.opacity = readUint8(reader) / 0xff;\r\n    layer.clipping = readUint8(reader) === 1;\r\n    var flags = readUint8(reader);\r\n    layer.transparencyProtected = (flags & 0x01) !== 0;\r\n    layer.hidden = (flags & 0x02) !== 0;\r\n    if (flags & 0x20)\r\n        layer.effectsOpen = true;\r\n    // 0x04 - obsolete\r\n    // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information\r\n    // 0x10 - pixel data irrelevant to appearance of document\r\n    // 0x20 - effects/filters panel is expanded\r\n    skipBytes(reader, 1);\r\n    readSection(reader, 1, function (left) {\r\n        readLayerMaskData(reader, layer);\r\n        var blendingRanges = readLayerBlendingRanges(reader);\r\n        if (blendingRanges)\r\n            layer.blendingRanges = blendingRanges;\r\n        layer.name = readPascalString(reader, 1); // should be padded to 4, but is not sometimes\r\n        // HACK: fix for sometimes layer.name string not being padded correctly, just skip until we get valid signature\r\n        while (left() > 4 && !validSignatureAt(reader, reader.offset))\r\n            reader.offset++;\r\n        while (left() >= 12)\r\n            readAdditionalLayerInfo(reader, layer, psd, imageResources);\r\n        skipBytes(reader, left());\r\n    });\r\n    return { layer: layer, channels: channels };\r\n}\r\nfunction readLayerMaskData(reader, layer) {\r\n    return readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return undefined;\r\n        var mask = {};\r\n        layer.mask = mask;\r\n        mask.top = readInt32(reader);\r\n        mask.left = readInt32(reader);\r\n        mask.bottom = readInt32(reader);\r\n        mask.right = readInt32(reader);\r\n        mask.defaultColor = readUint8(reader);\r\n        var flags = readUint8(reader);\r\n        mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;\r\n        mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;\r\n        mask.fromVectorData = (flags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;\r\n        if (left() >= 18) {\r\n            var realMask = {};\r\n            layer.realMask = realMask;\r\n            var realFlags = readUint8(reader);\r\n            realMask.positionRelativeToLayer = (realFlags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;\r\n            realMask.disabled = (realFlags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;\r\n            realMask.fromVectorData = (realFlags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;\r\n            realMask.defaultColor = readUint8(reader); // Real user mask background. 0 or 255.\r\n            realMask.top = readInt32(reader);\r\n            realMask.left = readInt32(reader);\r\n            realMask.bottom = readInt32(reader);\r\n            realMask.right = readInt32(reader);\r\n        }\r\n        if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {\r\n            var params = readUint8(reader);\r\n            if (params & 1 /* MaskParams.UserMaskDensity */)\r\n                mask.userMaskDensity = readUint8(reader) / 0xff;\r\n            if (params & 2 /* MaskParams.UserMaskFeather */)\r\n                mask.userMaskFeather = readFloat64(reader);\r\n            if (params & 4 /* MaskParams.VectorMaskDensity */)\r\n                mask.vectorMaskDensity = readUint8(reader) / 0xff;\r\n            if (params & 8 /* MaskParams.VectorMaskFeather */)\r\n                mask.vectorMaskFeather = readFloat64(reader);\r\n        }\r\n        skipBytes(reader, left());\r\n    });\r\n}\r\nfunction readBlendingRange(reader) {\r\n    return [readUint8(reader), readUint8(reader), readUint8(reader), readUint8(reader)];\r\n}\r\nfunction readLayerBlendingRanges(reader) {\r\n    return readSection(reader, 1, function (left) {\r\n        var compositeGrayBlendSource = readBlendingRange(reader);\r\n        var compositeGraphBlendDestinationRange = readBlendingRange(reader);\r\n        var ranges = [];\r\n        while (left() > 0) {\r\n            var sourceRange = readBlendingRange(reader);\r\n            var destRange = readBlendingRange(reader);\r\n            ranges.push({ sourceRange: sourceRange, destRange: destRange });\r\n        }\r\n        return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };\r\n    });\r\n}\r\nfunction readLayerChannelImageData(reader, psd, layer, channels) {\r\n    if (reader.skipLayerImageData)\r\n        return;\r\n    var _a = psd.colorMode, colorMode = _a === void 0 ? 3 /* ColorMode.RGB */ : _a, _b = psd.bitsPerChannel, bitsPerChannel = _b === void 0 ? 8 : _b;\r\n    layer.rawData = { colorMode: colorMode, bitsPerChannel: bitsPerChannel, channels: [], large: reader.large };\r\n    for (var _i = 0, channels_1 = channels; _i < channels_1.length; _i++) {\r\n        var channel = channels_1[_i];\r\n        var start = reader.offset;\r\n        var compression = 0 /* Compression.RawData */;\r\n        var data = undefined;\r\n        if (channel.length === 1)\r\n            throw new Error('Invalid channel length');\r\n        if (channel.length) {\r\n            compression = readUint16(reader);\r\n            // try to fix broken files where there's 1 byte shift of channel\r\n            if (compression > 3) {\r\n                reader.offset -= 1;\r\n                compression = readUint16(reader);\r\n            }\r\n            // try to fix broken files where there's 1 byte shift of channel\r\n            if (compression > 3) {\r\n                reader.offset -= 3;\r\n                compression = readUint16(reader);\r\n            }\r\n            if (compression > 3)\r\n                throw new Error(\"Invalid compression: \".concat(compression));\r\n            if (channel.length > 2) {\r\n                data = readBytes(reader, channel.length - 2);\r\n            }\r\n        }\r\n        reader.offset = start + channel.length;\r\n        layer.rawData.channels.push({ id: channel.id, compression: compression, data: data });\r\n    }\r\n    if (!reader.useRawData) {\r\n        decodeLayerImageData(layer, !!reader.useImageData, !!reader.throwForMissingFeatures);\r\n    }\r\n}\r\nfunction resetAlpha(_a, cmyk) {\r\n    var data = _a.data;\r\n    var alpha = (data instanceof Float32Array) ? 1.0 : ((data instanceof Uint16Array) ? 0xffff : 0xff);\r\n    var offset = (cmyk ? 4 : 3) | 0;\r\n    var length = data.length | 0;\r\n    var step = (cmyk ? 5 : 4) | 0;\r\n    for (var p = offset; p < length; p = (p + step) | 0) {\r\n        data[p] = alpha;\r\n    }\r\n}\r\nexport function decodeLayerImageData(layer, useImageData, throwForMissingFeatures) {\r\n    if (!layer.rawData)\r\n        return;\r\n    var _a = layer.rawData, colorMode = _a.colorMode, bitsPerChannel = _a.bitsPerChannel, channels = _a.channels, large = _a.large;\r\n    var layerWidth = (layer.right || 0) - (layer.left || 0);\r\n    var layerHeight = (layer.bottom || 0) - (layer.top || 0);\r\n    var cmyk = colorMode === 4 /* ColorMode.CMYK */;\r\n    var imageData;\r\n    var initializedAlpha = false;\r\n    if (layerWidth && layerHeight) {\r\n        if (cmyk) {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            imageData = { width: layerWidth, height: layerHeight, data: new Uint8ClampedArray(layerWidth * layerHeight * 5) };\r\n        }\r\n        else {\r\n            imageData = createImageDataBitDepth(layerWidth, layerHeight, bitsPerChannel);\r\n        }\r\n    }\r\n    if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n        layer.imageDataRaw = [];\r\n        layer.imageDataRawCompression = [];\r\n    }\r\n    for (var _i = 0, channels_2 = channels; _i < channels_2.length; _i++) {\r\n        var _b = channels_2[_i], id = _b.id, compression = _b.compression, data = _b.data;\r\n        if (!data)\r\n            continue;\r\n        var dataReader = createReader(data.buffer, data.byteOffset, data.byteLength);\r\n        if (id === -2 /* ChannelID.UserMask */ || id === -3 /* ChannelID.RealUserMask */) {\r\n            var mask = id === -2 /* ChannelID.UserMask */ ? layer.mask : layer.realMask;\r\n            if (!mask)\r\n                throw new Error(\"Missing layer \".concat(id === -2 /* ChannelID.UserMask */ ? 'mask' : 'real mask', \" data\"));\r\n            var maskWidth = (mask.right || 0) - (mask.left || 0);\r\n            var maskHeight = (mask.bottom || 0) - (mask.top || 0);\r\n            if (maskWidth < 0 || maskHeight < 0 || maskWidth > 30000 || maskHeight > 30000)\r\n                throw new Error('Invalid mask size');\r\n            if (maskWidth && maskHeight) {\r\n                var maskData = createImageDataBitDepth(maskWidth, maskHeight, bitsPerChannel);\r\n                readData(dataReader, data.byteLength, maskData, compression, maskWidth, maskHeight, bitsPerChannel, 0, large, 4);\r\n                if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n                    if (id === -2 /* ChannelID.UserMask */) {\r\n                        layer.maskDataRawCompression = compression;\r\n                        layer.maskDataRaw = data;\r\n                    }\r\n                    else {\r\n                        layer.realMaskDataRawCompression = compression;\r\n                        layer.realMaskDataRaw = data;\r\n                    }\r\n                }\r\n                setupGrayscale(maskData);\r\n                resetAlpha(maskData, false);\r\n                if (useImageData) {\r\n                    mask.imageData = maskData;\r\n                }\r\n                else {\r\n                    mask.canvas = imageDataToCanvas(maskData);\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            var offset = offsetForChannel(id, cmyk);\r\n            var targetData = imageData;\r\n            if (offset < 0) {\r\n                targetData = undefined;\r\n                if (throwForMissingFeatures) {\r\n                    throw new Error(\"Channel not supported: \".concat(id));\r\n                }\r\n            }\r\n            readData(dataReader, data.byteLength, targetData, compression, layerWidth, layerHeight, bitsPerChannel, offset, large, cmyk ? 5 : 4);\r\n            if (RAW_IMAGE_DATA) { // TODO: use layer.rawData instead\r\n                layer.imageDataRawCompression[id] = compression;\r\n                layer.imageDataRaw[id] = data;\r\n            }\r\n            if (targetData && colorMode === 1 /* ColorMode.Grayscale */) {\r\n                setupGrayscale(targetData);\r\n            }\r\n        }\r\n        if (id === -1 /* ChannelID.Transparency */) {\r\n            initializedAlpha = true;\r\n        }\r\n    }\r\n    if (imageData) {\r\n        if (!initializedAlpha)\r\n            resetAlpha(imageData, cmyk);\r\n        if (cmyk) {\r\n            var cmykData = imageData;\r\n            imageData = createImageData(cmykData.width, cmykData.height);\r\n            cmykToRgb(cmykData, imageData, false);\r\n        }\r\n        if (useImageData) {\r\n            layer.imageData = imageData;\r\n        }\r\n        else {\r\n            layer.canvas = imageDataToCanvas(imageData);\r\n        }\r\n    }\r\n    delete layer.rawData;\r\n}\r\nfunction readData(reader, length, pixels, compression, width, height, bitDepth, offset, large, step) {\r\n    if (!length)\r\n        return;\r\n    if (compression === 0 /* Compression.RawData */) {\r\n        if (length !== (width * height * Math.floor(bitDepth / 8))) {\r\n            reader.log(\"Invalid length (\".concat(length, \", \").concat(width * height * Math.floor(bitDepth / 8), \")\"));\r\n        }\r\n        var data = readBytes(reader, length);\r\n        readDataRaw(data, pixels, bitDepth, step, offset);\r\n    }\r\n    else if (compression === 1 /* Compression.RleCompressed */) {\r\n        // const reader = createReader(data.buffer, data.byteOffset, data.byteLength);\r\n        readDataRLE(reader, pixels, width, height, bitDepth, step, [offset], large);\r\n    }\r\n    else if (compression === 2 /* Compression.ZipWithoutPrediction */) {\r\n        var data = readBytes(reader, length);\r\n        readDataZip(data, pixels, width, height, bitDepth, step, offset, false);\r\n    }\r\n    else if (compression === 3 /* Compression.ZipWithPrediction */) {\r\n        var data = readBytes(reader, length);\r\n        readDataZip(data, pixels, width, height, bitDepth, step, offset, true);\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid Compression type: \".concat(compression));\r\n    }\r\n}\r\nexport function readGlobalLayerMaskInfo(reader) {\r\n    return readSection(reader, 1, function (left) {\r\n        if (!left())\r\n            return undefined;\r\n        var overlayColorSpace = readUint16(reader);\r\n        var colorSpace1 = readUint16(reader);\r\n        var colorSpace2 = readUint16(reader);\r\n        var colorSpace3 = readUint16(reader);\r\n        var colorSpace4 = readUint16(reader);\r\n        var opacity = readUint16(reader) / 0xff;\r\n        var kind = readUint8(reader);\r\n        skipBytes(reader, left()); // 3 bytes of padding ?\r\n        return { overlayColorSpace: overlayColorSpace, colorSpace1: colorSpace1, colorSpace2: colorSpace2, colorSpace3: colorSpace3, colorSpace4: colorSpace4, opacity: opacity, kind: kind };\r\n    });\r\n}\r\nvar fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];\r\nfunction realignWithSignature(reader, isValid) {\r\n    var sigOffset = reader.offset;\r\n    var sig = '';\r\n    // attempt to fix broken document by realigning with the signature\r\n    for (var _i = 0, fixOffsets_1 = fixOffsets; _i < fixOffsets_1.length; _i++) {\r\n        var offset = fixOffsets_1[_i];\r\n        try {\r\n            reader.offset = sigOffset + offset;\r\n            sig = readSignature(reader);\r\n        }\r\n        catch (_a) { }\r\n        if (isValid(sig))\r\n            break;\r\n    }\r\n    if (!isValid(sig)) {\r\n        throw new Error(\"Invalid signature: '\".concat(sig, \"' at 0x\").concat((sigOffset).toString(16)));\r\n    }\r\n    return sig;\r\n}\r\nfunction isValidAdditionalInfoSignature(sig) {\r\n    return sig === '8BIM' || sig === '8B64';\r\n}\r\nexport function readAdditionalLayerInfo(reader, target, psd, imageResources) {\r\n    var sig = realignWithSignature(reader, isValidAdditionalInfoSignature);\r\n    var key = readSignature(reader);\r\n    // `largeAdditionalInfoKeys` fallback, because some keys don't have 8B64 signature even when they are 64bit\r\n    var u64 = sig === '8B64' || (reader.large && largeAdditionalInfoKeys.indexOf(key) !== -1);\r\n    readSection(reader, 2, function (left) {\r\n        var handler = infoHandlersMap[key];\r\n        if (handler) {\r\n            try {\r\n                handler.read(reader, target, left, psd, imageResources);\r\n            }\r\n            catch (e) {\r\n                if (reader.throwForMissingFeatures)\r\n                    throw e;\r\n            }\r\n        }\r\n        else {\r\n            reader.logMissingFeatures && reader.log(\"Unhandled additional info: \".concat(key));\r\n            skipBytes(reader, left());\r\n        }\r\n        if (left()) {\r\n            reader.logMissingFeatures && reader.log(\"Unread \".concat(left(), \" bytes left for additional info: \").concat(key));\r\n            skipBytes(reader, left());\r\n        }\r\n    }, false, u64);\r\n}\r\nexport function createImageDataBitDepth(width, height, bitDepth, channels) {\r\n    if (channels === void 0) { channels = 4; }\r\n    if (bitDepth === 1 || bitDepth === 8) {\r\n        if (channels === 4) {\r\n            return createImageData(width, height);\r\n        }\r\n        else {\r\n            return { width: width, height: height, data: new Uint8ClampedArray(width * height * channels) };\r\n        }\r\n    }\r\n    else if (bitDepth === 16) {\r\n        return { width: width, height: height, data: new Uint16Array(width * height * channels) };\r\n    }\r\n    else if (bitDepth === 32) {\r\n        return { width: width, height: height, data: new Float32Array(width * height * channels) };\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid bitDepth (\".concat(bitDepth, \")\"));\r\n    }\r\n}\r\nfunction readImageData(reader, psd) {\r\n    var _a;\r\n    var compression = readUint16(reader);\r\n    var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;\r\n    if (supportedColorModes.indexOf(psd.colorMode) === -1)\r\n        throw new Error(\"Color mode not supported: \".concat(psd.colorMode));\r\n    if (compression !== 0 /* Compression.RawData */ && compression !== 1 /* Compression.RleCompressed */)\r\n        throw new Error(\"Compression type not supported: \".concat(compression));\r\n    var imageData = createImageDataBitDepth(psd.width, psd.height, bitsPerChannel);\r\n    resetImageData(imageData);\r\n    switch (psd.colorMode) {\r\n        case 0 /* ColorMode.Bitmap */: {\r\n            if (bitsPerChannel !== 1)\r\n                throw new Error('Invalid bitsPerChannel for bitmap color mode');\r\n            var bytes = void 0;\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                bytes = readBytes(reader, Math.ceil(psd.width / 8) * psd.height);\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                bytes = new Uint8Array(psd.width * psd.height);\r\n                readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 8, 1, [0], reader.large);\r\n            }\r\n            else {\r\n                throw new Error(\"Bitmap compression not supported: \".concat(compression));\r\n            }\r\n            decodeBitmap(bytes, imageData.data, psd.width, psd.height);\r\n            break;\r\n        }\r\n        case 3 /* ColorMode.RGB */:\r\n        case 1 /* ColorMode.Grayscale */: {\r\n            var channels = psd.colorMode === 1 /* ColorMode.Grayscale */ ? [0] : [0, 1, 2];\r\n            if (psd.channels && psd.channels > 3) {\r\n                for (var i = 3; i < psd.channels; i++) {\r\n                    // TODO: store these channels in additional image data\r\n                    channels.push(i);\r\n                }\r\n            }\r\n            else if (reader.globalAlpha) {\r\n                channels.push(3);\r\n            }\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                for (var i = 0; i < channels.length; i++) {\r\n                    var data = readBytes(reader, psd.width * psd.height * Math.floor(bitsPerChannel / 8));\r\n                    readDataRaw(data, imageData, bitsPerChannel, 4, channels[i]);\r\n                }\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var start = reader.offset;\r\n                readDataRLE(reader, imageData, psd.width, psd.height, bitsPerChannel, 4, channels, reader.large);\r\n                if (RAW_IMAGE_DATA)\r\n                    psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);\r\n            }\r\n            if (psd.colorMode === 1 /* ColorMode.Grayscale */) {\r\n                setupGrayscale(imageData);\r\n            }\r\n            break;\r\n        }\r\n        case 2 /* ColorMode.Indexed */: {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            if (psd.channels !== 1)\r\n                throw new Error('Invalid channel count');\r\n            if (!psd.palette)\r\n                throw new Error('Missing color palette');\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var indexedImageData = {\r\n                    width: imageData.width,\r\n                    height: imageData.height,\r\n                    data: new Uint8Array(imageData.width * imageData.height),\r\n                };\r\n                readDataRLE(reader, indexedImageData, psd.width, psd.height, bitsPerChannel, 1, [0], reader.large);\r\n                indexedToRgb(indexedImageData, imageData, psd.palette);\r\n            }\r\n            else {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            break;\r\n        }\r\n        case 4 /* ColorMode.CMYK */: {\r\n            if (bitsPerChannel !== 8)\r\n                throw new Error('bitsPerChannel Not supproted');\r\n            if (psd.channels !== 4)\r\n                throw new Error(\"Invalid channel count\");\r\n            var channels = [0, 1, 2, 3];\r\n            if (reader.globalAlpha)\r\n                channels.push(4);\r\n            if (compression === 0 /* Compression.RawData */) {\r\n                throw new Error(\"Not implemented\");\r\n                // TODO: ...\r\n                // for (let i = 0; i < channels.length; i++) {\r\n                // \treadDataRaw(reader, imageData, channels[i], psd.width, psd.height);\r\n                // }\r\n            }\r\n            else if (compression === 1 /* Compression.RleCompressed */) {\r\n                var cmykImageData = {\r\n                    width: imageData.width,\r\n                    height: imageData.height,\r\n                    data: new Uint8Array(imageData.width * imageData.height * 5),\r\n                };\r\n                var start = reader.offset;\r\n                readDataRLE(reader, cmykImageData, psd.width, psd.height, bitsPerChannel, 5, channels, reader.large);\r\n                cmykToRgb(cmykImageData, imageData, true);\r\n                if (RAW_IMAGE_DATA)\r\n                    psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);\r\n            }\r\n            else {\r\n                throw new Error(\"Not implemented\");\r\n            }\r\n            break;\r\n        }\r\n        default: throw new Error(\"Color mode not supported: \".concat(psd.colorMode));\r\n    }\r\n    // remove weird white matte\r\n    if (reader.globalAlpha) {\r\n        if (psd.bitsPerChannel !== 8)\r\n            throw new Error('bitsPerChannel Not supproted');\r\n        var p = imageData.data;\r\n        var size = imageData.width * imageData.height * 4;\r\n        for (var i = 0; i < size; i += 4) {\r\n            var pa = p[i + 3];\r\n            if (pa != 0 && pa != 255) {\r\n                var a = pa / 255;\r\n                var ra = 1 / a;\r\n                var invA = 255 * (1 - ra);\r\n                p[i + 0] = p[i + 0] * ra + invA;\r\n                p[i + 1] = p[i + 1] * ra + invA;\r\n                p[i + 2] = p[i + 2] * ra + invA;\r\n            }\r\n        }\r\n    }\r\n    if (reader.useImageData) {\r\n        psd.imageData = imageData;\r\n    }\r\n    else {\r\n        psd.canvas = imageDataToCanvas(imageData);\r\n    }\r\n}\r\nfunction cmykToRgb(cmyk, rgb, reverseAlpha) {\r\n    var size = rgb.width * rgb.height * 4;\r\n    var srcData = cmyk.data;\r\n    var dstData = rgb.data;\r\n    for (var src = 0, dst = 0; dst < size; src += 5, dst += 4) {\r\n        var c = srcData[src];\r\n        var m = srcData[src + 1];\r\n        var y = srcData[src + 2];\r\n        var k = srcData[src + 3];\r\n        dstData[dst] = ((((c * k) | 0) / 255) | 0);\r\n        dstData[dst + 1] = ((((m * k) | 0) / 255) | 0);\r\n        dstData[dst + 2] = ((((y * k) | 0) / 255) | 0);\r\n        dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];\r\n    }\r\n    // for (let src = 0, dst = 0; dst < size; src += 5, dst += 4) {\r\n    // \tconst c = 1 - (srcData[src + 0] / 255);\r\n    // \tconst m = 1 - (srcData[src + 1] / 255);\r\n    // \tconst y = 1 - (srcData[src + 2] / 255);\r\n    // \t// const k = srcData[src + 3] / 255;\r\n    // \tdstData[dst + 0] = ((1 - c * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 1] = ((1 - m * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 2] = ((1 - y * 0.8) * 255) | 0;\r\n    // \tdstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];\r\n    // }\r\n}\r\nfunction indexedToRgb(indexed, rgb, palette) {\r\n    var size = indexed.width * indexed.height;\r\n    var srcData = indexed.data;\r\n    var dstData = rgb.data;\r\n    for (var src = 0, dst = 0; src < size; src++, dst += 4) {\r\n        var c = palette[srcData[src]];\r\n        dstData[dst + 0] = c.r;\r\n        dstData[dst + 1] = c.g;\r\n        dstData[dst + 2] = c.b;\r\n        dstData[dst + 3] = 255;\r\n    }\r\n}\r\nfunction verifyCompatible(a, b) {\r\n    if ((a.byteLength / a.length) !== (b.byteLength / b.length)) {\r\n        throw new Error('Invalid array types');\r\n    }\r\n}\r\nfunction bytesToArray(bytes, bitDepth) {\r\n    if (bitDepth === 8) {\r\n        return bytes;\r\n    }\r\n    else if (bitDepth === 16) {\r\n        // PSD files store 16-bit channel data in big-endian byte order.\r\n        // Swap each pair of bytes so that Uint16Array (native-endian) reads the correct values.\r\n        for (var i = 0; i < bytes.byteLength; i += 2) {\r\n            var tmp = bytes[i];\r\n            bytes[i] = bytes[i + 1];\r\n            bytes[i + 1] = tmp;\r\n        }\r\n        if (bytes.byteOffset % 2) {\r\n            var result = new Uint16Array(bytes.byteLength / 2);\r\n            new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);\r\n            return result;\r\n        }\r\n        else {\r\n            return new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\r\n        }\r\n    }\r\n    else if (bitDepth === 32) {\r\n        if (bytes.byteOffset % 4) {\r\n            var result = new Float32Array(bytes.byteLength / 4);\r\n            new Uint8Array(result.buffer, result.byteOffset, result.byteLength).set(bytes);\r\n            return result;\r\n        }\r\n        else {\r\n            return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n        }\r\n    }\r\n    else {\r\n        throw new Error(\"Invalid bitDepth (\".concat(bitDepth, \")\"));\r\n    }\r\n}\r\nfunction copyChannelToPixelData(pixelData, channel, offset, step) {\r\n    verifyCompatible(pixelData.data, channel);\r\n    var size = pixelData.width * pixelData.height;\r\n    var data = pixelData.data;\r\n    for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {\r\n        data[p] = channel[i];\r\n    }\r\n}\r\nfunction readDataRaw(buffer, pixelData, bitDepth, step, offset) {\r\n    if (bitDepth == 32) {\r\n        for (var i = 0; i < buffer.byteLength; i += 4) {\r\n            var a = buffer[i + 0];\r\n            var b = buffer[i + 1];\r\n            var c = buffer[i + 2];\r\n            var d = buffer[i + 3];\r\n            buffer[i + 0] = d;\r\n            buffer[i + 1] = c;\r\n            buffer[i + 2] = b;\r\n            buffer[i + 3] = a;\r\n        }\r\n    }\r\n    var array = bytesToArray(buffer, bitDepth);\r\n    if (pixelData && offset < step) {\r\n        copyChannelToPixelData(pixelData, array, offset, step);\r\n    }\r\n}\r\nfunction decodePredicted(data, width, height, mod) {\r\n    for (var y = 0; y < height; y++) {\r\n        var offset = y * width;\r\n        for (var x = 1, o = offset + 1; x < width; x++, o++) {\r\n            data[o] = (data[o - 1] + data[o]) % mod;\r\n        }\r\n    }\r\n}\r\nexport function readDataZip(compressed, pixelData, width, height, bitDepth, step, offset, prediction) {\r\n    var decompressed = inflateSync(compressed);\r\n    if (pixelData && offset < step) {\r\n        var array = bytesToArray(decompressed, bitDepth);\r\n        if (bitDepth === 8) {\r\n            if (prediction)\r\n                decodePredicted(decompressed, width, height, 0x100);\r\n            copyChannelToPixelData(pixelData, decompressed, offset, step);\r\n        }\r\n        else if (bitDepth === 16) {\r\n            if (prediction)\r\n                decodePredicted(array, width, height, 0x10000);\r\n            copyChannelToPixelData(pixelData, array, offset, step);\r\n        }\r\n        else if (bitDepth === 32) {\r\n            if (prediction)\r\n                decodePredicted(decompressed, width * 4, height, 0x100);\r\n            var di = offset;\r\n            var dst = new Uint32Array(pixelData.data.buffer, pixelData.data.byteOffset, pixelData.data.length);\r\n            for (var y = 0; y < height; y++) {\r\n                var a = width * 4 * y;\r\n                for (var x = 0; x < width; x++, a++, di += step) {\r\n                    var b = a + width;\r\n                    var c = b + width;\r\n                    var d = c + width;\r\n                    dst[di] = ((decompressed[a] << 24) | (decompressed[b] << 16) | (decompressed[c] << 8) | decompressed[d]) >>> 0;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            throw new Error('Invalid bitDepth');\r\n        }\r\n    }\r\n}\r\nexport function readDataRLE(reader, pixelData, width, height, _bitDepth, step, offsets, large) {\r\n    var data = pixelData && pixelData.data;\r\n    var lengths;\r\n    if (large) {\r\n        lengths = new Uint32Array(offsets.length * height);\r\n        for (var o = 0, li = 0; o < offsets.length; o++) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                lengths[li] = readUint32(reader);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        lengths = new Uint16Array(offsets.length * height);\r\n        for (var o = 0, li = 0; o < offsets.length; o++) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                lengths[li] = readUint16(reader);\r\n            }\r\n        }\r\n    }\r\n    // if (bitDepth !== 1 && bitDepth !== 8) throw new Error(`Invalid bit depth (${bitDepth})`);\r\n    var extraLimit = (step - 1) | 0; // 3 for rgb, 4 for cmyk\r\n    for (var c = 0, li = 0; c < offsets.length; c++) {\r\n        var offset = offsets[c] | 0;\r\n        var extra = c > extraLimit || offset > extraLimit;\r\n        if (!data || extra) {\r\n            for (var y = 0; y < height; y++, li++) {\r\n                skipBytes(reader, lengths[li]);\r\n            }\r\n        }\r\n        else {\r\n            for (var y = 0, p = offset | 0; y < height; y++, li++) {\r\n                var length_2 = lengths[li];\r\n                var buffer = readBytes(reader, length_2);\r\n                for (var i = 0, x = 0; i < length_2; i++) {\r\n                    var header = buffer[i];\r\n                    if (header > 128) {\r\n                        var value = buffer[++i];\r\n                        header = (256 - header) | 0;\r\n                        for (var j = 0; j <= header && x < width; j = (j + 1) | 0, x = (x + 1) | 0) {\r\n                            data[p] = value;\r\n                            p = (p + step) | 0;\r\n                        }\r\n                    }\r\n                    else if (header < 128) {\r\n                        for (var j = 0; j <= header && x < width; j = (j + 1) | 0, x = (x + 1) | 0) {\r\n                            data[p] = buffer[++i];\r\n                            p = (p + step) | 0;\r\n                        }\r\n                    }\r\n                    else {\r\n                        // ignore 128\r\n                    }\r\n                    // This showed up on some images from non-photoshop programs, ignoring it seems to work just fine.\r\n                    // if (i >= length) throw new Error(`Invalid RLE data: exceeded buffer size ${i}/${length}`);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\nexport function readSection(reader, round, func, skipEmpty, eightBytes) {\r\n    if (skipEmpty === void 0) { skipEmpty = true; }\r\n    if (eightBytes === void 0) { eightBytes = false; }\r\n    var length = readUint32(reader);\r\n    if (eightBytes) {\r\n        if (length !== 0)\r\n            throw new Error('Sizes larger than 4GB are not supported');\r\n        length = readUint32(reader);\r\n    }\r\n    if (length <= 0 && skipEmpty)\r\n        return undefined;\r\n    var end = reader.offset + length;\r\n    if (end > reader.view.byteLength)\r\n        throw new Error('Section exceeds file size');\r\n    var result = func(function () { return end - reader.offset; });\r\n    if (reader.offset !== end) {\r\n        if (reader.offset > end) {\r\n            warnOrThrow(reader, 'Exceeded section limits');\r\n        }\r\n        else {\r\n            warnOrThrow(reader, \"Unread section data\"); // : ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);\r\n        }\r\n    }\r\n    while (length % round) {\r\n        length++;\r\n        end++;\r\n    }\r\n    // while (end % round) end++;\r\n    reader.offset = end;\r\n    return result;\r\n}\r\nexport function readColor(reader) {\r\n    var colorSpace = readUint16(reader);\r\n    switch (colorSpace) {\r\n        case 0 /* ColorSpace.RGB */: {\r\n            var r = readUint16(reader) / 257;\r\n            var g = readUint16(reader) / 257;\r\n            var b = readUint16(reader) / 257;\r\n            skipBytes(reader, 2);\r\n            return { r: r, g: g, b: b };\r\n        }\r\n        case 1 /* ColorSpace.HSB */: {\r\n            var h = readUint16(reader) / 0xffff;\r\n            var s = readUint16(reader) / 0xffff;\r\n            var b = readUint16(reader) / 0xffff;\r\n            skipBytes(reader, 2);\r\n            return { h: h, s: s, b: b };\r\n        }\r\n        case 2 /* ColorSpace.CMYK */: {\r\n            var c = readUint16(reader) / 257;\r\n            var m = readUint16(reader) / 257;\r\n            var y = readUint16(reader) / 257;\r\n            var k = readUint16(reader) / 257;\r\n            return { c: c, m: m, y: y, k: k };\r\n        }\r\n        case 7 /* ColorSpace.Lab */: {\r\n            var l = readInt16(reader) / 10000;\r\n            var ta = readInt16(reader);\r\n            var tb = readInt16(reader);\r\n            var a = ta < 0 ? (ta / 12800) : (ta / 12700);\r\n            var b = tb < 0 ? (tb / 12800) : (tb / 12700);\r\n            skipBytes(reader, 2);\r\n            return { l: l, a: a, b: b };\r\n        }\r\n        case 8 /* ColorSpace.Grayscale */: {\r\n            var k = readUint16(reader) * 255 / 10000;\r\n            skipBytes(reader, 6);\r\n            return { k: k };\r\n        }\r\n        default:\r\n            throw new Error('Invalid color space');\r\n    }\r\n}\r\nexport function readPattern(reader) {\r\n    var length = readUint32(reader);\r\n    while (length % 4)\r\n        length++;\r\n    var end = reader.offset + length;\r\n    var version = readUint32(reader);\r\n    if (version !== 1)\r\n        throw new Error(\"Invalid pattern version: \".concat(version));\r\n    var colorMode = readUint32(reader);\r\n    var x = readInt16(reader);\r\n    var y = readInt16(reader);\r\n    // we only support RGB and grayscale for now\r\n    if (colorMode !== 3 /* ColorMode.RGB */ && colorMode !== 1 /* ColorMode.Grayscale */ && colorMode !== 2 /* ColorMode.Indexed */) {\r\n        throw new Error(\"Unsupported pattern color mode: \".concat(colorMode));\r\n    }\r\n    var name = readUnicodeString(reader);\r\n    var id = readPascalString(reader, 1);\r\n    var palette = [];\r\n    if (colorMode === 2 /* ColorMode.Indexed */) {\r\n        for (var i = 0; i < 256; i++) {\r\n            palette.push({\r\n                r: readUint8(reader),\r\n                g: readUint8(reader),\r\n                b: readUint8(reader),\r\n            });\r\n        }\r\n        skipBytes(reader, 4); // no idea what this is\r\n    }\r\n    // virtual memory array list\r\n    var version2 = readUint32(reader);\r\n    if (version2 !== 3)\r\n        throw new Error(\"Invalid pattern VMAL version: \".concat(version2));\r\n    readUint32(reader); // length\r\n    var top = readUint32(reader);\r\n    var left = readUint32(reader);\r\n    var bottom = readUint32(reader);\r\n    var right = readUint32(reader);\r\n    var channelsCount = readUint32(reader);\r\n    var width = right - left;\r\n    var height = bottom - top;\r\n    var data = new Uint8Array(width * height * 4);\r\n    for (var i = 3; i < data.byteLength; i += 4) {\r\n        data[i] = 255;\r\n    }\r\n    for (var i = 0, ch = 0; i < (channelsCount + 2); i++) {\r\n        var has = readUint32(reader);\r\n        if (!has)\r\n            continue;\r\n        var length_3 = readUint32(reader);\r\n        var pixelDepth = readUint32(reader);\r\n        var ctop = readUint32(reader);\r\n        var cleft = readUint32(reader);\r\n        var cbottom = readUint32(reader);\r\n        var cright = readUint32(reader);\r\n        var pixelDepth2 = readUint16(reader);\r\n        var compressionMode = readUint8(reader); // 0 - raw, 1 - rle\r\n        var dataLength = length_3 - (4 + 16 + 2 + 1);\r\n        var cdata = readBytes(reader, dataLength);\r\n        if (pixelDepth !== 8 || pixelDepth2 !== 8) {\r\n            throw new Error('16bit pixel depth not supported for patterns');\r\n        }\r\n        var w = cright - cleft;\r\n        var h = cbottom - ctop;\r\n        var ox = cleft - left;\r\n        var oy = ctop - top;\r\n        if (compressionMode === 0) {\r\n            if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {\r\n                for (var y_1 = 0; y_1 < h; y_1++) {\r\n                    for (var x_1 = 0; x_1 < w; x_1++) {\r\n                        var src = x_1 + y_1 * w;\r\n                        var dst = (ox + x_1 + (y_1 + oy) * width) * 4;\r\n                        data[dst + ch] = cdata[src];\r\n                    }\r\n                }\r\n            }\r\n            if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {\r\n                for (var y_2 = 0; y_2 < h; y_2++) {\r\n                    for (var x_2 = 0; x_2 < w; x_2++) {\r\n                        var src = x_2 + y_2 * w;\r\n                        var dst = (ox + x_2 + (y_2 + oy) * width) * 4;\r\n                        var value = cdata[src];\r\n                        data[dst + 0] = value;\r\n                        data[dst + 1] = value;\r\n                        data[dst + 2] = value;\r\n                    }\r\n                }\r\n            }\r\n            if (colorMode === 2 /* ColorMode.Indexed */) {\r\n                // TODO:\r\n                throw new Error('Indexed pattern color mode not implemented');\r\n            }\r\n        }\r\n        else if (compressionMode === 1) {\r\n            var pixelData = { data: data, width: width, height: height };\r\n            var tempData = { data: new Uint8Array(w * h), width: w, height: h };\r\n            var cdataReader = createReader(cdata.buffer, cdata.byteOffset, cdata.byteLength);\r\n            if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {\r\n                readDataRLE(cdataReader, tempData, w, h, 8, 1, [0], false);\r\n                copyChannelToRGBA(tempData, pixelData, ox, oy, ch);\r\n            }\r\n            if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {\r\n                readDataRLE(cdataReader, tempData, w, h, 8, 1, [0], false);\r\n                copyChannelToRGBA(tempData, pixelData, ox, oy, 0);\r\n                setupGrayscale(pixelData);\r\n            }\r\n            if (colorMode === 2 /* ColorMode.Indexed */) {\r\n                // TODO:\r\n                throw new Error('Indexed pattern color mode not implemented');\r\n            }\r\n        }\r\n        else {\r\n            throw new Error('Invalid pattern compression mode');\r\n        }\r\n        ch++;\r\n    }\r\n    reader.offset = end;\r\n    return { id: id, name: name, x: x, y: y, bounds: { x: left, y: top, w: width, h: height }, data: data };\r\n}\r\nfunction copyChannelToRGBA(srcData, dstData, ox, oy, offset) {\r\n    var w = srcData.width;\r\n    var h = srcData.height;\r\n    var width = dstData.width;\r\n    for (var y = 0; y < h; y++) {\r\n        for (var x = 0; x < w; x++) {\r\n            var src = x + y * w;\r\n            var dst = (ox + x + (y + oy) * width) * 4;\r\n            var value = srcData.data[src];\r\n            dstData.data[dst + offset] = value;\r\n        }\r\n    }\r\n}\r\n//# sourceMappingURL=psdReader.js.map","import { toBlendMode, fromBlendMode } from './helpers';\r\nimport { checkSignature, readSignature, skipBytes, readUint16, readUint8, readUint32, readFixedPoint32, readColor } from './psdReader';\r\nimport { writeSignature, writeUint16, writeZeros, writeFixedPoint32, writeUint8, writeUint32, writeColor } from './psdWriter';\r\nvar bevelStyles = [\r\n    undefined, 'outer bevel', 'inner bevel', 'emboss', 'pillow emboss', 'stroke emboss'\r\n];\r\nfunction readBlendMode(reader) {\r\n    checkSignature(reader, '8BIM');\r\n    return toBlendMode[readSignature(reader)] || 'normal';\r\n}\r\nfunction writeBlendMode(writer, mode) {\r\n    writeSignature(writer, '8BIM');\r\n    writeSignature(writer, fromBlendMode[mode] || 'norm');\r\n}\r\nfunction readFixedPoint8(reader) {\r\n    return readUint8(reader) / 0xff;\r\n}\r\nfunction writeFixedPoint8(writer, value) {\r\n    writeUint8(writer, Math.round(value * 0xff) | 0);\r\n}\r\nexport function readEffects(reader) {\r\n    var version = readUint16(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid effects layer version: \".concat(version));\r\n    var effectsCount = readUint16(reader);\r\n    var effects = {};\r\n    for (var i = 0; i < effectsCount; i++) {\r\n        checkSignature(reader, '8BIM');\r\n        var type = readSignature(reader);\r\n        switch (type) {\r\n            case 'cmnS': { // common state (see See Effects layer, common state info)\r\n                var size = readUint32(reader);\r\n                var version_1 = readUint32(reader);\r\n                var visible = !!readUint8(reader);\r\n                skipBytes(reader, 2);\r\n                if (size !== 7 || version_1 !== 0 || !visible)\r\n                    throw new Error(\"Invalid effects common state\");\r\n                break;\r\n            }\r\n            case 'dsdw': // drop shadow (see See Effects layer, drop shadow and inner shadow info)\r\n            case 'isdw': { // inner shadow (see See Effects layer, drop shadow and inner shadow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_2 = readUint32(reader);\r\n                if (blockSize !== 41 && blockSize !== 51)\r\n                    throw new Error(\"Invalid shadow size: \".concat(blockSize));\r\n                if (version_2 !== 0 && version_2 !== 2)\r\n                    throw new Error(\"Invalid shadow version: \".concat(version_2));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var angle = readFixedPoint32(reader);\r\n                var distance = readFixedPoint32(reader);\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var useGlobalLight = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 51)\r\n                    readColor(reader); // native color\r\n                var shadowInfo = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    distance: { units: 'Pixels', value: distance },\r\n                    angle: angle,\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    useGlobalLight: useGlobalLight,\r\n                    opacity: opacity\r\n                };\r\n                if (type === 'dsdw') {\r\n                    effects.dropShadow = [shadowInfo];\r\n                }\r\n                else {\r\n                    effects.innerShadow = [shadowInfo];\r\n                }\r\n                break;\r\n            }\r\n            case 'oglw': { // outer glow (see See Effects layer, outer glow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_3 = readUint32(reader);\r\n                if (blockSize !== 32 && blockSize !== 42)\r\n                    throw new Error(\"Invalid outer glow size: \".concat(blockSize));\r\n                if (version_3 !== 0 && version_3 !== 2)\r\n                    throw new Error(\"Invalid outer glow version: \".concat(version_3));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 42)\r\n                    readColor(reader); // native color\r\n                effects.outerGlow = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    opacity: opacity\r\n                };\r\n                break;\r\n            }\r\n            case 'iglw': { // inner glow (see See Effects layer, inner glow info)\r\n                var blockSize = readUint32(reader);\r\n                var version_4 = readUint32(reader);\r\n                if (blockSize !== 32 && blockSize !== 43)\r\n                    throw new Error(\"Invalid inner glow size: \".concat(blockSize));\r\n                if (version_4 !== 0 && version_4 !== 2)\r\n                    throw new Error(\"Invalid inner glow version: \".concat(version_4));\r\n                var size = readFixedPoint32(reader);\r\n                readFixedPoint32(reader); // intensity\r\n                var color = readColor(reader);\r\n                var blendMode = readBlendMode(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                if (blockSize >= 43) {\r\n                    readUint8(reader); // inverted\r\n                    readColor(reader); // native color\r\n                }\r\n                effects.innerGlow = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    color: color,\r\n                    blendMode: blendMode,\r\n                    enabled: enabled,\r\n                    opacity: opacity\r\n                };\r\n                break;\r\n            }\r\n            case 'bevl': { // bevel (see See Effects layer, bevel info)\r\n                var blockSize = readUint32(reader);\r\n                var version_5 = readUint32(reader);\r\n                if (blockSize !== 58 && blockSize !== 78)\r\n                    throw new Error(\"Invalid bevel size: \".concat(blockSize));\r\n                if (version_5 !== 0 && version_5 !== 2)\r\n                    throw new Error(\"Invalid bevel version: \".concat(version_5));\r\n                var angle = readFixedPoint32(reader);\r\n                var strength = readFixedPoint32(reader);\r\n                var size = readFixedPoint32(reader);\r\n                var highlightBlendMode = readBlendMode(reader);\r\n                var shadowBlendMode = readBlendMode(reader);\r\n                var highlightColor = readColor(reader);\r\n                var shadowColor = readColor(reader);\r\n                var style = bevelStyles[readUint8(reader)] || 'inner bevel';\r\n                var highlightOpacity = readFixedPoint8(reader);\r\n                var shadowOpacity = readFixedPoint8(reader);\r\n                var enabled = !!readUint8(reader);\r\n                var useGlobalLight = !!readUint8(reader);\r\n                var direction = readUint8(reader) ? 'down' : 'up';\r\n                if (blockSize >= 78) {\r\n                    readColor(reader); // real highlight color\r\n                    readColor(reader); // real shadow color\r\n                }\r\n                effects.bevel = {\r\n                    size: { units: 'Pixels', value: size },\r\n                    angle: angle,\r\n                    strength: strength,\r\n                    highlightBlendMode: highlightBlendMode,\r\n                    shadowBlendMode: shadowBlendMode,\r\n                    highlightColor: highlightColor,\r\n                    shadowColor: shadowColor,\r\n                    style: style,\r\n                    highlightOpacity: highlightOpacity,\r\n                    shadowOpacity: shadowOpacity,\r\n                    enabled: enabled,\r\n                    useGlobalLight: useGlobalLight,\r\n                    direction: direction,\r\n                };\r\n                break;\r\n            }\r\n            case 'sofi': { // solid fill (Photoshop 7.0) (see See Effects layer, solid fill (added in Photoshop 7.0))\r\n                var size = readUint32(reader);\r\n                var version_6 = readUint32(reader);\r\n                if (size !== 34)\r\n                    throw new Error(\"Invalid effects solid fill info size: \".concat(size));\r\n                if (version_6 !== 2)\r\n                    throw new Error(\"Invalid effects solid fill info version: \".concat(version_6));\r\n                var blendMode = readBlendMode(reader);\r\n                var color = readColor(reader);\r\n                var opacity = readFixedPoint8(reader);\r\n                var enabled = !!readUint8(reader);\r\n                readColor(reader); // native color\r\n                effects.solidFill = [{ blendMode: blendMode, color: color, opacity: opacity, enabled: enabled }];\r\n                break;\r\n            }\r\n            default:\r\n                throw new Error(\"Invalid effect type: '\".concat(type, \"'\"));\r\n        }\r\n    }\r\n    return effects;\r\n}\r\nfunction writeShadowInfo(writer, shadow) {\r\n    var _a;\r\n    writeUint32(writer, 51);\r\n    writeUint32(writer, 2);\r\n    writeFixedPoint32(writer, shadow.size && shadow.size.value || 0);\r\n    writeFixedPoint32(writer, 0); // intensity\r\n    writeFixedPoint32(writer, shadow.angle || 0);\r\n    writeFixedPoint32(writer, shadow.distance && shadow.distance.value || 0);\r\n    writeColor(writer, shadow.color);\r\n    writeBlendMode(writer, shadow.blendMode);\r\n    writeUint8(writer, shadow.enabled ? 1 : 0);\r\n    writeUint8(writer, shadow.useGlobalLight ? 1 : 0);\r\n    writeFixedPoint8(writer, (_a = shadow.opacity) !== null && _a !== void 0 ? _a : 1);\r\n    writeColor(writer, shadow.color); // native color\r\n}\r\nexport function writeEffects(writer, effects) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    var dropShadow = (_a = effects.dropShadow) === null || _a === void 0 ? void 0 : _a[0];\r\n    var innerShadow = (_b = effects.innerShadow) === null || _b === void 0 ? void 0 : _b[0];\r\n    var outerGlow = effects.outerGlow;\r\n    var innerGlow = effects.innerGlow;\r\n    var bevel = effects.bevel;\r\n    var solidFill = (_c = effects.solidFill) === null || _c === void 0 ? void 0 : _c[0];\r\n    var count = 1;\r\n    if (dropShadow)\r\n        count++;\r\n    if (innerShadow)\r\n        count++;\r\n    if (outerGlow)\r\n        count++;\r\n    if (innerGlow)\r\n        count++;\r\n    if (bevel)\r\n        count++;\r\n    if (solidFill)\r\n        count++;\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, count);\r\n    writeSignature(writer, '8BIM');\r\n    writeSignature(writer, 'cmnS');\r\n    writeUint32(writer, 7); // size\r\n    writeUint32(writer, 0); // version\r\n    writeUint8(writer, 1); // visible\r\n    writeZeros(writer, 2);\r\n    if (dropShadow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'dsdw');\r\n        writeShadowInfo(writer, dropShadow);\r\n    }\r\n    if (innerShadow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'isdw');\r\n        writeShadowInfo(writer, innerShadow);\r\n    }\r\n    if (outerGlow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'oglw');\r\n        writeUint32(writer, 42);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, ((_d = outerGlow.size) === null || _d === void 0 ? void 0 : _d.value) || 0);\r\n        writeFixedPoint32(writer, 0); // intensity\r\n        writeColor(writer, outerGlow.color);\r\n        writeBlendMode(writer, outerGlow.blendMode);\r\n        writeUint8(writer, outerGlow.enabled ? 1 : 0);\r\n        writeFixedPoint8(writer, outerGlow.opacity || 0);\r\n        writeColor(writer, outerGlow.color);\r\n    }\r\n    if (innerGlow) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'iglw');\r\n        writeUint32(writer, 43);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, ((_e = innerGlow.size) === null || _e === void 0 ? void 0 : _e.value) || 0);\r\n        writeFixedPoint32(writer, 0); // intensity\r\n        writeColor(writer, innerGlow.color);\r\n        writeBlendMode(writer, innerGlow.blendMode);\r\n        writeUint8(writer, innerGlow.enabled ? 1 : 0);\r\n        writeFixedPoint8(writer, innerGlow.opacity || 0);\r\n        writeUint8(writer, 0); // inverted\r\n        writeColor(writer, innerGlow.color);\r\n    }\r\n    if (bevel) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'bevl');\r\n        writeUint32(writer, 78);\r\n        writeUint32(writer, 2);\r\n        writeFixedPoint32(writer, bevel.angle || 0);\r\n        writeFixedPoint32(writer, bevel.strength || 0);\r\n        writeFixedPoint32(writer, ((_f = bevel.size) === null || _f === void 0 ? void 0 : _f.value) || 0);\r\n        writeBlendMode(writer, bevel.highlightBlendMode);\r\n        writeBlendMode(writer, bevel.shadowBlendMode);\r\n        writeColor(writer, bevel.highlightColor);\r\n        writeColor(writer, bevel.shadowColor);\r\n        var style = bevelStyles.indexOf(bevel.style);\r\n        writeUint8(writer, style <= 0 ? 1 : style);\r\n        writeFixedPoint8(writer, bevel.highlightOpacity || 0);\r\n        writeFixedPoint8(writer, bevel.shadowOpacity || 0);\r\n        writeUint8(writer, bevel.enabled ? 1 : 0);\r\n        writeUint8(writer, bevel.useGlobalLight ? 1 : 0);\r\n        writeUint8(writer, bevel.direction === 'down' ? 1 : 0);\r\n        writeColor(writer, bevel.highlightColor);\r\n        writeColor(writer, bevel.shadowColor);\r\n    }\r\n    if (solidFill) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'sofi');\r\n        writeUint32(writer, 34);\r\n        writeUint32(writer, 2);\r\n        writeBlendMode(writer, solidFill.blendMode);\r\n        writeColor(writer, solidFill.color);\r\n        writeFixedPoint8(writer, solidFill.opacity || 0);\r\n        writeUint8(writer, solidFill.enabled ? 1 : 0);\r\n        writeColor(writer, solidFill.color);\r\n    }\r\n}\r\n//# sourceMappingURL=effectsHelpers.js.map","function isWhitespace(char) {\r\n    // ' ', '\\n', '\\r', '\\t'\r\n    return char === 32 || char === 10 || char === 13 || char === 9;\r\n}\r\nfunction isNumber(char) {\r\n    // 0123456789.-\r\n    return (char >= 48 && char <= 57) || char === 46 || char === 45;\r\n}\r\nexport function parseEngineData(data) {\r\n    var index = 0;\r\n    function skipWhitespace() {\r\n        while (index < data.length && isWhitespace(data[index])) {\r\n            index++;\r\n        }\r\n    }\r\n    function getTextByte() {\r\n        var byte = data[index];\r\n        index++;\r\n        if (byte === 92) { // \\\r\n            byte = data[index];\r\n            index++;\r\n        }\r\n        return byte;\r\n    }\r\n    function getText() {\r\n        var result = '';\r\n        if (data[index] === 41) { // )\r\n            index++;\r\n            return result;\r\n        }\r\n        // Strings start with utf-16 BOM\r\n        if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {\r\n            throw new Error('Invalid utf-16 BOM');\r\n        }\r\n        index += 2;\r\n        // ), ( and \\ characters are escaped in ascii manner, remove the escapes before interpreting\r\n        // the bytes as utf-16\r\n        while (index < data.length && data[index] !== 41) { // )\r\n            var high = getTextByte();\r\n            var low = getTextByte();\r\n            var char = (high << 8) | low;\r\n            result += String.fromCharCode(char);\r\n        }\r\n        index++;\r\n        return result;\r\n    }\r\n    var root = null;\r\n    var stack = [];\r\n    function pushContainer(value) {\r\n        if (!stack.length) {\r\n            stack.push(value);\r\n            root = value;\r\n        }\r\n        else {\r\n            pushValue(value);\r\n            stack.push(value);\r\n        }\r\n    }\r\n    function pushValue(value) {\r\n        if (!stack.length)\r\n            throw new Error('Invalid data');\r\n        var top = stack[stack.length - 1];\r\n        if (typeof top === 'string') {\r\n            stack[stack.length - 2][top] = value;\r\n            pop();\r\n        }\r\n        else if (Array.isArray(top)) {\r\n            top.push(value);\r\n        }\r\n        else {\r\n            throw new Error('Invalid data');\r\n        }\r\n    }\r\n    function pushProperty(name) {\r\n        if (!stack.length)\r\n            pushContainer({});\r\n        var top = stack[stack.length - 1];\r\n        if (top && typeof top === 'string') {\r\n            if (name === 'nil') {\r\n                pushValue(null);\r\n            }\r\n            else {\r\n                pushValue(\"/\".concat(name));\r\n            }\r\n        }\r\n        else if (top && typeof top === 'object') {\r\n            stack.push(name);\r\n        }\r\n        else {\r\n            throw new Error('Invalid data');\r\n        }\r\n    }\r\n    function pop() {\r\n        if (!stack.length)\r\n            throw new Error('Invalid data');\r\n        stack.pop();\r\n    }\r\n    skipWhitespace();\r\n    var dataLength = data.length;\r\n    while (dataLength > 0 && data[dataLength - 1] === 0)\r\n        dataLength--; // trim 0 bytes from end\r\n    while (index < dataLength) {\r\n        var i = index;\r\n        var char = data[i];\r\n        if (char === 60 && data[i + 1] === 60) { // <<\r\n            index += 2;\r\n            pushContainer({});\r\n        }\r\n        else if (char === 62 && data[i + 1] === 62) { // >>\r\n            index += 2;\r\n            pop();\r\n        }\r\n        else if (char === 47) { // /\r\n            index += 1;\r\n            var start = index;\r\n            while (index < data.length && !isWhitespace(data[index])) {\r\n                index++;\r\n            }\r\n            var name_1 = '';\r\n            for (var i_1 = start; i_1 < index; i_1++) {\r\n                name_1 += String.fromCharCode(data[i_1]);\r\n            }\r\n            pushProperty(name_1);\r\n        }\r\n        else if (char === 40) { // (\r\n            index += 1;\r\n            pushValue(getText());\r\n        }\r\n        else if (char === 91) { // [\r\n            index += 1;\r\n            pushContainer([]);\r\n        }\r\n        else if (char === 93) { // ]\r\n            index += 1;\r\n            pop();\r\n        }\r\n        else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null\r\n            index += 4;\r\n            pushValue(null);\r\n        }\r\n        else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true\r\n            index += 4;\r\n            pushValue(true);\r\n        }\r\n        else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false\r\n            index += 5;\r\n            pushValue(false);\r\n        }\r\n        else if (isNumber(char)) {\r\n            var value = '';\r\n            while (index < data.length && isNumber(data[index])) {\r\n                value += String.fromCharCode(data[index]);\r\n                index++;\r\n            }\r\n            pushValue(parseFloat(value));\r\n        }\r\n        else {\r\n            index += 1;\r\n            console.log(\"Invalid token '\".concat(String.fromCharCode(char), \"' (\").concat(char, \") at \").concat(index)\r\n            // + ` near '${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}'`\r\n            // + ` data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`\r\n            );\r\n            // throw new Error(`Invalid token ${String.fromCharCode(char)} at ${index}`);\r\n        }\r\n        skipWhitespace();\r\n    }\r\n    return root;\r\n}\r\nvar floatKeys = [\r\n    'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',\r\n    'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',\r\n    'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',\r\n    'OutlineWidth', 'AutoLeading',\r\n];\r\nvar intArrays = ['RunLengthArray'];\r\n// TODO: handle /nil\r\nexport function serializeEngineData(data, condensed) {\r\n    if (condensed === void 0) { condensed = false; }\r\n    var buffer = new Uint8Array(1024);\r\n    var offset = 0;\r\n    var indent = 0;\r\n    function write(value) {\r\n        if (offset >= buffer.length) {\r\n            var newBuffer = new Uint8Array(buffer.length * 2);\r\n            newBuffer.set(buffer);\r\n            buffer = newBuffer;\r\n        }\r\n        buffer[offset] = value;\r\n        offset++;\r\n    }\r\n    function writeString(value) {\r\n        for (var i = 0; i < value.length; i++) {\r\n            write(value.charCodeAt(i));\r\n        }\r\n    }\r\n    function writeIndent() {\r\n        if (condensed) {\r\n            writeString(' ');\r\n        }\r\n        else {\r\n            for (var i = 0; i < indent; i++) {\r\n                writeString('\\t');\r\n            }\r\n        }\r\n    }\r\n    function writeProperty(key, value) {\r\n        writeIndent();\r\n        writeString(\"/\".concat(key));\r\n        writeValue(value, key, true);\r\n        if (!condensed)\r\n            writeString('\\n');\r\n    }\r\n    function serializeInt(value) {\r\n        return value.toString();\r\n    }\r\n    function serializeFloat(value) {\r\n        return value.toFixed(5)\r\n            .replace(/(\\d)0+$/g, '$1')\r\n            .replace(/^0+\\.([1-9])/g, '.$1')\r\n            .replace(/^-0+\\.0(\\d)/g, '-.0$1');\r\n    }\r\n    function serializeNumber(value, key) {\r\n        var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;\r\n        return isFloat ? serializeFloat(value) : serializeInt(value);\r\n    }\r\n    function getKeys(value) {\r\n        var keys = Object.keys(value);\r\n        if (keys.indexOf('98') !== -1)\r\n            keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));\r\n        if (keys.indexOf('99') !== -1)\r\n            keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));\r\n        return keys;\r\n    }\r\n    function writeStringByte(value) {\r\n        if (value === 40 || value === 41 || value === 92) { // ( ) \\\r\n            write(92); // \\\r\n        }\r\n        write(value);\r\n    }\r\n    function writeValue(value, key, inProperty) {\r\n        if (inProperty === void 0) { inProperty = false; }\r\n        function writePrefix() {\r\n            if (inProperty) {\r\n                writeString(' ');\r\n            }\r\n            else {\r\n                writeIndent();\r\n            }\r\n        }\r\n        if (value === null) {\r\n            writePrefix();\r\n            writeString(condensed ? '/nil' : 'null');\r\n        }\r\n        else if (typeof value === 'number') {\r\n            writePrefix();\r\n            writeString(serializeNumber(value, key));\r\n        }\r\n        else if (typeof value === 'boolean') {\r\n            writePrefix();\r\n            writeString(value ? 'true' : 'false');\r\n        }\r\n        else if (typeof value === 'string') {\r\n            writePrefix();\r\n            if ((key === '99' || key === '98') && value.charAt(0) === '/') {\r\n                writeString(value);\r\n            }\r\n            else {\r\n                writeString('(');\r\n                write(0xfe);\r\n                write(0xff);\r\n                for (var i = 0; i < value.length; i++) {\r\n                    var code = value.charCodeAt(i);\r\n                    writeStringByte((code >> 8) & 0xff);\r\n                    writeStringByte(code & 0xff);\r\n                }\r\n                writeString(')');\r\n            }\r\n        }\r\n        else if (Array.isArray(value)) {\r\n            writePrefix();\r\n            if (value.every(function (x) { return typeof x === 'number'; })) {\r\n                writeString('[');\r\n                var intArray = intArrays.indexOf(key) !== -1;\r\n                for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {\r\n                    var x = value_1[_i];\r\n                    writeString(' ');\r\n                    writeString(intArray ? serializeNumber(x) : serializeFloat(x));\r\n                }\r\n                writeString(' ]');\r\n            }\r\n            else {\r\n                writeString('[');\r\n                if (!condensed)\r\n                    writeString('\\n');\r\n                for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {\r\n                    var x = value_2[_a];\r\n                    writeValue(x, key);\r\n                    if (!condensed)\r\n                        writeString('\\n');\r\n                }\r\n                writeIndent();\r\n                writeString(']');\r\n            }\r\n        }\r\n        else if (typeof value === 'object') {\r\n            if (inProperty && !condensed)\r\n                writeString('\\n');\r\n            writeIndent();\r\n            writeString('<<');\r\n            if (!condensed)\r\n                writeString('\\n');\r\n            indent++;\r\n            for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {\r\n                var key_1 = _c[_b];\r\n                writeProperty(key_1, value[key_1]);\r\n            }\r\n            indent--;\r\n            writeIndent();\r\n            writeString('>>');\r\n        }\r\n        return undefined;\r\n    }\r\n    if (condensed) {\r\n        if (typeof data === 'object') {\r\n            for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {\r\n                var key = _a[_i];\r\n                writeProperty(key, data[key]);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        writeString('\\n\\n');\r\n        writeValue(data);\r\n    }\r\n    return buffer.slice(0, offset);\r\n}\r\n//# sourceMappingURL=engineData.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nvar defaultFont = {\r\n    name: 'MyriadPro-Regular',\r\n    script: 0,\r\n    type: 0,\r\n    synthetic: 0,\r\n};\r\nvar defaultParagraphStyle = {\r\n    justification: 'left',\r\n    firstLineIndent: 0,\r\n    startIndent: 0,\r\n    endIndent: 0,\r\n    spaceBefore: 0,\r\n    spaceAfter: 0,\r\n    autoHyphenate: true,\r\n    hyphenatedWordSize: 6,\r\n    preHyphen: 2,\r\n    postHyphen: 2,\r\n    consecutiveHyphens: 8,\r\n    zone: 36,\r\n    wordSpacing: [0.8, 1, 1.33],\r\n    letterSpacing: [0, 0, 0],\r\n    glyphSpacing: [1, 1, 1],\r\n    autoLeading: 1.2,\r\n    leadingType: 0,\r\n    hanging: false,\r\n    burasagari: false,\r\n    kinsokuOrder: 0,\r\n    everyLineComposer: false,\r\n};\r\nvar defaultStyle = {\r\n    font: defaultFont,\r\n    fontSize: 12,\r\n    fauxBold: false,\r\n    fauxItalic: false,\r\n    autoLeading: true,\r\n    leading: 0,\r\n    horizontalScale: 1,\r\n    verticalScale: 1,\r\n    tracking: 0,\r\n    autoKerning: true,\r\n    kerning: 0,\r\n    baselineShift: 0,\r\n    fontCaps: 0,\r\n    fontBaseline: 0,\r\n    underline: false,\r\n    strikethrough: false,\r\n    ligatures: true,\r\n    dLigatures: false,\r\n    baselineDirection: 2,\r\n    tsume: 0,\r\n    styleRunAlignment: 2,\r\n    language: 0,\r\n    noBreak: false,\r\n    fillColor: { r: 0, g: 0, b: 0 },\r\n    strokeColor: { r: 0, g: 0, b: 0 },\r\n    fillFlag: true,\r\n    strokeFlag: false,\r\n    fillFirst: true,\r\n    yUnderline: 1,\r\n    outlineWidth: 1,\r\n    characterDirection: 0,\r\n    hindiNumbers: false,\r\n    kashida: 1,\r\n    diacriticPos: 2,\r\n};\r\nvar defaultGridInfo = {\r\n    isOn: false,\r\n    show: false,\r\n    size: 18,\r\n    leading: 22,\r\n    color: { r: 0, g: 0, b: 255 },\r\n    leadingFillColor: { r: 0, g: 0, b: 255 },\r\n    alignLineHeightToGridFlags: false,\r\n};\r\nvar paragraphStyleKeys = [\r\n    'justification', 'firstLineIndent', 'startIndent', 'endIndent', 'spaceBefore', 'spaceAfter',\r\n    'autoHyphenate', 'hyphenatedWordSize', 'preHyphen', 'postHyphen', 'consecutiveHyphens',\r\n    'zone', 'wordSpacing', 'letterSpacing', 'glyphSpacing', 'autoLeading', 'leadingType',\r\n    'hanging', 'burasagari', 'kinsokuOrder', 'everyLineComposer',\r\n];\r\nvar styleKeys = [\r\n    'font', 'fontSize', 'fauxBold', 'fauxItalic', 'autoLeading', 'leading', 'horizontalScale',\r\n    'verticalScale', 'tracking', 'autoKerning', 'kerning', 'baselineShift', 'fontCaps', 'fontBaseline',\r\n    'underline', 'strikethrough', 'ligatures', 'dLigatures', 'baselineDirection', 'tsume',\r\n    'styleRunAlignment', 'language', 'noBreak', 'fillColor', 'strokeColor', 'fillFlag',\r\n    'strokeFlag', 'fillFirst', 'yUnderline', 'outlineWidth', 'characterDirection', 'hindiNumbers',\r\n    'kashida', 'diacriticPos',\r\n];\r\nvar antialias = ['none', 'crisp', 'strong', 'smooth', 'sharp'];\r\nvar justification = [\r\n    'left',\r\n    'right',\r\n    'center',\r\n    'justify-left',\r\n    'justify-right',\r\n    'justify-center',\r\n    'justify-all', // 6\r\n];\r\nfunction upperFirst(value) {\r\n    return value.substring(0, 1).toUpperCase() + value.substring(1);\r\n}\r\nfunction decodeColor(color) {\r\n    var c = color.Values;\r\n    switch (color.Type) {\r\n        case 0: return { k: c[1] * 255 }; // grayscale (alpha?)\r\n        case 1: return c[0] === 1 ?\r\n            { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255 } : // rgb\r\n            { r: c[1] * 255, g: c[2] * 255, b: c[3] * 255, a: c[0] * 255 }; // rgba\r\n        case 2: return { c: c[1] * 255, m: c[2] * 255, y: c[3] * 255, k: c[4] * 255 }; // cmyk (alpha?)\r\n        default: throw new Error('Unknown color type in text layer');\r\n    }\r\n}\r\nfunction encodeColor(color) {\r\n    if (!color) {\r\n        return { Type: 1, Values: [0, 0, 0, 0] };\r\n    }\r\n    else if ('r' in color) {\r\n        return { Type: 1, Values: ['a' in color ? color.a / 255 : 1, color.r / 255, color.g / 255, color.b / 255] };\r\n    }\r\n    else if ('c' in color) {\r\n        return { Type: 2, Values: [1, color.c / 255, color.m / 255, color.y / 255, color.k / 255] };\r\n    }\r\n    else if ('k' in color) {\r\n        return { Type: 0, Values: [1, color.k / 255] };\r\n    }\r\n    else {\r\n        throw new Error('Invalid color type in text layer');\r\n    }\r\n}\r\nfunction arraysEqual(a, b) {\r\n    if (!a || !b)\r\n        return false;\r\n    if (a.length !== b.length)\r\n        return false;\r\n    for (var i = 0; i < a.length; i++)\r\n        if (a[i] !== b[i])\r\n            return false;\r\n    return true;\r\n}\r\nfunction objectsEqual(a, b) {\r\n    if (!a || !b)\r\n        return false;\r\n    for (var _i = 0, _a = Object.keys(a); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        if (a[key] !== b[key])\r\n            return false;\r\n    }\r\n    for (var _b = 0, _c = Object.keys(b); _b < _c.length; _b++) {\r\n        var key = _c[_b];\r\n        if (a[key] !== b[key])\r\n            return false;\r\n    }\r\n    return true;\r\n}\r\nfunction findOrAddFont(fonts, font) {\r\n    for (var i = 0; i < fonts.length; i++) {\r\n        if (fonts[i].name === font.name)\r\n            return i;\r\n    }\r\n    fonts.push(font);\r\n    return fonts.length - 1;\r\n}\r\nfunction decodeObject(obj, keys, fonts) {\r\n    var result = {};\r\n    for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\r\n        var key = keys_1[_i];\r\n        var Key = upperFirst(key);\r\n        if (obj[Key] === undefined)\r\n            continue;\r\n        if (key === 'justification') {\r\n            result[key] = justification[obj[Key]];\r\n        }\r\n        else if (key === 'font') {\r\n            result[key] = fonts[obj[Key]];\r\n        }\r\n        else if (key === 'fillColor' || key === 'strokeColor') {\r\n            result[key] = decodeColor(obj[Key]);\r\n        }\r\n        else {\r\n            result[key] = obj[Key];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction encodeObject(obj, keys, fonts) {\r\n    var _a;\r\n    var result = {};\r\n    for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {\r\n        var key = keys_2[_i];\r\n        var Key = upperFirst(key);\r\n        if (obj[key] === undefined)\r\n            continue;\r\n        if (key === 'justification') {\r\n            result[Key] = justification.indexOf((_a = obj[key]) !== null && _a !== void 0 ? _a : 'left');\r\n        }\r\n        else if (key === 'font') {\r\n            result[Key] = findOrAddFont(fonts, obj[key]);\r\n        }\r\n        else if (key === 'fillColor' || key === 'strokeColor') {\r\n            result[Key] = encodeColor(obj[key]);\r\n        }\r\n        else {\r\n            result[Key] = obj[key];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction decodeParagraphStyle(obj, fonts) {\r\n    return decodeObject(obj, paragraphStyleKeys, fonts);\r\n}\r\nfunction decodeStyle(obj, fonts) {\r\n    return decodeObject(obj, styleKeys, fonts);\r\n}\r\nfunction encodeParagraphStyle(obj, fonts) {\r\n    return encodeObject(obj, paragraphStyleKeys, fonts);\r\n}\r\nfunction encodeStyle(obj, fonts) {\r\n    return encodeObject(obj, styleKeys, fonts);\r\n}\r\nfunction deduplicateValues(base, runs, keys) {\r\n    if (!runs.length)\r\n        return;\r\n    var _loop_1 = function (key) {\r\n        var value = runs[0].style[key];\r\n        if (value !== undefined) {\r\n            var identical = false;\r\n            if (Array.isArray(value)) {\r\n                identical = runs.every(function (r) { return arraysEqual(r.style[key], value); });\r\n            }\r\n            else if (typeof value === 'object') {\r\n                identical = runs.every(function (r) { return objectsEqual(r.style[key], value); });\r\n            }\r\n            else {\r\n                identical = runs.every(function (r) { return r.style[key] === value; });\r\n            }\r\n            if (identical) {\r\n                base[key] = value;\r\n            }\r\n        }\r\n        var styleValue = base[key];\r\n        if (styleValue !== undefined) {\r\n            for (var _a = 0, runs_1 = runs; _a < runs_1.length; _a++) {\r\n                var r = runs_1[_a];\r\n                var same = false;\r\n                if (Array.isArray(value)) {\r\n                    same = arraysEqual(r.style[key], value);\r\n                }\r\n                else if (typeof value === 'object') {\r\n                    same = objectsEqual(r.style[key], value);\r\n                }\r\n                else {\r\n                    same = r.style[key] === value;\r\n                }\r\n                if (same)\r\n                    delete r.style[key];\r\n            }\r\n        }\r\n    };\r\n    for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {\r\n        var key = keys_3[_i];\r\n        _loop_1(key);\r\n    }\r\n    if (runs.every(function (x) { return Object.keys(x.style).length === 0; })) {\r\n        runs.length = 0;\r\n    }\r\n}\r\nexport function decodeEngineData(engineData) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    // console.log('engineData', require('util').inspect(engineData, false, 99, true));\r\n    var engineDict = engineData.EngineDict;\r\n    var resourceDict = engineData.ResourceDict;\r\n    var fonts = resourceDict.FontSet.map(function (f) { return ({\r\n        name: f.Name,\r\n        script: f.Script,\r\n        type: f.FontType,\r\n        synthetic: f.Synthetic,\r\n    }); });\r\n    var text = engineDict.Editor.Text.replace(/\\r/g, '\\n');\r\n    var removedCharacters = 0;\r\n    while (/\\n$/.test(text)) {\r\n        text = text.substring(0, text.length - 1);\r\n        removedCharacters++;\r\n    }\r\n    var result = {\r\n        text: text,\r\n        antiAlias: (_a = antialias[engineDict.AntiAlias]) !== null && _a !== void 0 ? _a : 'smooth',\r\n        useFractionalGlyphWidths: !!engineDict.UseFractionalGlyphWidths,\r\n        superscriptSize: resourceDict.SuperscriptSize,\r\n        superscriptPosition: resourceDict.SuperscriptPosition,\r\n        subscriptSize: resourceDict.SubscriptSize,\r\n        subscriptPosition: resourceDict.SubscriptPosition,\r\n        smallCapSize: resourceDict.SmallCapSize,\r\n    };\r\n    // shape\r\n    var photoshop = (_f = (_e = (_d = (_c = (_b = engineDict.Rendered) === null || _b === void 0 ? void 0 : _b.Shapes) === null || _c === void 0 ? void 0 : _c.Children) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.Cookie) === null || _f === void 0 ? void 0 : _f.Photoshop;\r\n    if (photoshop) {\r\n        result.shapeType = photoshop.ShapeType === 1 ? 'box' : 'point';\r\n        if (photoshop.PointBase)\r\n            result.pointBase = photoshop.PointBase;\r\n        if (photoshop.BoxBounds)\r\n            result.boxBounds = photoshop.BoxBounds;\r\n    }\r\n    // paragraph style\r\n    // const theNormalParagraphSheet = resourceDict.TheNormalParagraphSheet;\r\n    // const paragraphSheetSet = resourceDict.ParagraphSheetSet;\r\n    // const paragraphProperties = paragraphSheetSet[theNormalParagraphSheet].Properties;\r\n    var paragraphRun = engineDict.ParagraphRun;\r\n    result.paragraphStyle = {}; // decodeParagraphStyle(paragraphProperties, fonts);\r\n    result.paragraphStyleRuns = [];\r\n    for (var i = 0; i < paragraphRun.RunArray.length; i++) {\r\n        var run_1 = paragraphRun.RunArray[i];\r\n        var length_1 = paragraphRun.RunLengthArray[i];\r\n        var style = decodeParagraphStyle(run_1.ParagraphSheet.Properties, fonts);\r\n        // const adjustments = {\r\n        //   axis: run.Adjustments.Axis,\r\n        //   xy: run.Adjustments.XY,\r\n        // };\r\n        result.paragraphStyleRuns.push({ length: length_1, style: style /*, adjustments*/ });\r\n    }\r\n    for (var counter = removedCharacters; result.paragraphStyleRuns.length && counter > 0; counter--) {\r\n        if (--result.paragraphStyleRuns[result.paragraphStyleRuns.length - 1].length === 0) {\r\n            result.paragraphStyleRuns.pop();\r\n        }\r\n    }\r\n    deduplicateValues(result.paragraphStyle, result.paragraphStyleRuns, paragraphStyleKeys);\r\n    if (!result.paragraphStyleRuns.length)\r\n        delete result.paragraphStyleRuns;\r\n    // style\r\n    // const theNormalStyleSheet = resourceDict.TheNormalStyleSheet;\r\n    // const styleSheetSet = resourceDict.StyleSheetSet;\r\n    // const styleSheetData = styleSheetSet[theNormalStyleSheet].StyleSheetData;\r\n    var styleRun = engineDict.StyleRun;\r\n    result.style = {}; // decodeStyle(styleSheetData, fonts);\r\n    result.styleRuns = [];\r\n    for (var i = 0; i < styleRun.RunArray.length; i++) {\r\n        var length_2 = styleRun.RunLengthArray[i];\r\n        var style = decodeStyle(styleRun.RunArray[i].StyleSheet.StyleSheetData, fonts);\r\n        if (!style.font)\r\n            style.font = fonts[0];\r\n        result.styleRuns.push({ length: length_2, style: style });\r\n    }\r\n    for (var counter = removedCharacters; result.styleRuns.length && counter > 0; counter--) {\r\n        if (--result.styleRuns[result.styleRuns.length - 1].length === 0) {\r\n            result.styleRuns.pop();\r\n        }\r\n    }\r\n    deduplicateValues(result.style, result.styleRuns, styleKeys);\r\n    if (!result.styleRuns.length)\r\n        delete result.styleRuns;\r\n    return result;\r\n}\r\nexport function encodeEngineData(data) {\r\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\r\n    var text = \"\".concat((data.text || '').replace(/\\r?\\n/g, '\\r'), \"\\r\");\r\n    var fonts = [\r\n        { name: 'AdobeInvisFont', script: 0, type: 0, synthetic: 0 },\r\n    ];\r\n    var defFont = ((_a = data.style) === null || _a === void 0 ? void 0 : _a.font) || ((_c = (_b = data.styleRuns) === null || _b === void 0 ? void 0 : _b.find(function (s) { return s.style.font; })) === null || _c === void 0 ? void 0 : _c.style.font) || defaultFont;\r\n    var paragraphRunArray = [];\r\n    var paragraphRunLengthArray = [];\r\n    var paragraphRuns = data.paragraphStyleRuns;\r\n    if (paragraphRuns && paragraphRuns.length) {\r\n        var leftLength_1 = text.length;\r\n        for (var _i = 0, paragraphRuns_1 = paragraphRuns; _i < paragraphRuns_1.length; _i++) {\r\n            var run_2 = paragraphRuns_1[_i];\r\n            var runLength = Math.min(run_2.length, leftLength_1);\r\n            leftLength_1 -= runLength;\r\n            if (!runLength)\r\n                continue; // ignore 0 size runs\r\n            // extend last run if it's only for trailing \\r\r\n            if (leftLength_1 === 1 && run_2 === paragraphRuns[paragraphRuns.length - 1]) {\r\n                runLength++;\r\n                leftLength_1--;\r\n            }\r\n            paragraphRunLengthArray.push(runLength);\r\n            paragraphRunArray.push({\r\n                ParagraphSheet: {\r\n                    DefaultStyleSheet: 0,\r\n                    Properties: encodeParagraphStyle(__assign(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), run_2.style), fonts),\r\n                },\r\n                Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n            });\r\n        }\r\n        if (leftLength_1) {\r\n            paragraphRunLengthArray.push(leftLength_1);\r\n            paragraphRunArray.push({\r\n                ParagraphSheet: {\r\n                    DefaultStyleSheet: 0,\r\n                    Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n                },\r\n                Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n            });\r\n        }\r\n    }\r\n    else {\r\n        for (var i = 0, last = 0; i < text.length; i++) {\r\n            if (text.charCodeAt(i) === 13) { // \\r\r\n                paragraphRunLengthArray.push(i - last + 1);\r\n                paragraphRunArray.push({\r\n                    ParagraphSheet: {\r\n                        DefaultStyleSheet: 0,\r\n                        Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n                    },\r\n                    Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n                });\r\n                last = i + 1;\r\n            }\r\n        }\r\n    }\r\n    var styleSheetData = encodeStyle(__assign(__assign({}, defaultStyle), { font: defFont }), fonts);\r\n    var styleRuns = data.styleRuns || [{ length: text.length, style: data.style || {} }];\r\n    var styleRunArray = [];\r\n    var styleRunLengthArray = [];\r\n    var leftLength = text.length;\r\n    for (var _o = 0, styleRuns_1 = styleRuns; _o < styleRuns_1.length; _o++) {\r\n        var run_3 = styleRuns_1[_o];\r\n        var runLength = Math.min(run_3.length, leftLength);\r\n        leftLength -= runLength;\r\n        if (!runLength)\r\n            continue; // ignore 0 size runs\r\n        // extend last run if it's only for trailing \\r\r\n        if (leftLength === 1 && run_3 === styleRuns[styleRuns.length - 1]) {\r\n            runLength++;\r\n            leftLength--;\r\n        }\r\n        styleRunLengthArray.push(runLength);\r\n        styleRunArray.push({\r\n            StyleSheet: {\r\n                StyleSheetData: encodeStyle(__assign(__assign({ kerning: 0, autoKerning: true, fillColor: { r: 0, g: 0, b: 0 } }, data.style), run_3.style), fonts),\r\n            },\r\n        });\r\n    }\r\n    // add extra run to the end if existing ones didn't fill it up\r\n    if (leftLength && styleRuns.length) {\r\n        styleRunLengthArray.push(leftLength);\r\n        styleRunArray.push({\r\n            StyleSheet: {\r\n                StyleSheetData: encodeStyle(__assign({ kerning: 0, autoKerning: true, fillColor: { r: 0, g: 0, b: 0 } }, data.style), fonts),\r\n            },\r\n        });\r\n    }\r\n    var gridInfo = __assign(__assign({}, defaultGridInfo), data.gridInfo);\r\n    var WritingDirection = data.orientation === 'vertical' ? 2 : 0;\r\n    var Procession = data.orientation === 'vertical' ? 1 : 0;\r\n    var ShapeType = data.shapeType === 'box' ? 1 : 0;\r\n    var Photoshop = {\r\n        ShapeType: ShapeType,\r\n    };\r\n    if (ShapeType === 0) {\r\n        Photoshop.PointBase = data.pointBase || [0, 0];\r\n    }\r\n    else {\r\n        Photoshop.BoxBounds = data.boxBounds || [0, 0, 0, 0];\r\n    }\r\n    // needed for correct order of properties\r\n    Photoshop.Base = {\r\n        ShapeType: ShapeType,\r\n        TransformPoint0: [1, 0],\r\n        TransformPoint1: [0, 1],\r\n        TransformPoint2: [0, 0],\r\n    };\r\n    var defaultResources = {\r\n        KinsokuSet: [\r\n            {\r\n                Name: 'PhotoshopKinsokuHard',\r\n                NoStart: '、。，．・：；？！ー―’”）〕］｝〉》」』】ヽヾゝゞ々ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮヵヶ゛゜?!)]},.:;℃℉¢％‰',\r\n                NoEnd: '‘“（〔［｛〈《「『【([{￥＄£＠§〒＃',\r\n                Keep: '―‥',\r\n                Hanging: '、。.,',\r\n            },\r\n            {\r\n                Name: 'PhotoshopKinsokuSoft',\r\n                NoStart: '、。，．・：；？！’”）〕］｝〉》」』】ヽヾゝゞ々',\r\n                NoEnd: '‘“（〔［｛〈《「『【',\r\n                Keep: '―‥',\r\n                Hanging: '、。.,',\r\n            },\r\n        ],\r\n        MojiKumiSet: [\r\n            { InternalName: 'Photoshop6MojiKumiSet1' },\r\n            { InternalName: 'Photoshop6MojiKumiSet2' },\r\n            { InternalName: 'Photoshop6MojiKumiSet3' },\r\n            { InternalName: 'Photoshop6MojiKumiSet4' },\r\n        ],\r\n        TheNormalStyleSheet: 0,\r\n        TheNormalParagraphSheet: 0,\r\n        ParagraphSheetSet: [\r\n            {\r\n                Name: 'Normal RGB',\r\n                DefaultStyleSheet: 0,\r\n                Properties: encodeParagraphStyle(__assign(__assign({}, defaultParagraphStyle), data.paragraphStyle), fonts),\r\n            },\r\n        ],\r\n        StyleSheetSet: [\r\n            {\r\n                Name: 'Normal RGB',\r\n                StyleSheetData: styleSheetData,\r\n            },\r\n        ],\r\n        FontSet: fonts.map(function (f) { return ({\r\n            Name: f.name,\r\n            Script: f.script || 0,\r\n            FontType: f.type || 0,\r\n            Synthetic: f.synthetic || 0,\r\n        }); }),\r\n        SuperscriptSize: (_d = data.superscriptSize) !== null && _d !== void 0 ? _d : 0.583,\r\n        SuperscriptPosition: (_e = data.superscriptPosition) !== null && _e !== void 0 ? _e : 0.333,\r\n        SubscriptSize: (_f = data.subscriptSize) !== null && _f !== void 0 ? _f : 0.583,\r\n        SubscriptPosition: (_g = data.subscriptPosition) !== null && _g !== void 0 ? _g : 0.333,\r\n        SmallCapSize: (_h = data.smallCapSize) !== null && _h !== void 0 ? _h : 0.7,\r\n    };\r\n    var engineData = {\r\n        EngineDict: {\r\n            Editor: { Text: text },\r\n            ParagraphRun: {\r\n                DefaultRunData: {\r\n                    ParagraphSheet: { DefaultStyleSheet: 0, Properties: {} },\r\n                    Adjustments: { Axis: [1, 0, 1], XY: [0, 0] },\r\n                },\r\n                RunArray: paragraphRunArray,\r\n                RunLengthArray: paragraphRunLengthArray,\r\n                IsJoinable: 1,\r\n            },\r\n            StyleRun: {\r\n                DefaultRunData: { StyleSheet: { StyleSheetData: {} } },\r\n                RunArray: styleRunArray,\r\n                RunLengthArray: styleRunLengthArray,\r\n                IsJoinable: 2,\r\n            },\r\n            GridInfo: {\r\n                GridIsOn: !!gridInfo.isOn,\r\n                ShowGrid: !!gridInfo.show,\r\n                GridSize: (_j = gridInfo.size) !== null && _j !== void 0 ? _j : 18,\r\n                GridLeading: (_k = gridInfo.leading) !== null && _k !== void 0 ? _k : 22,\r\n                GridColor: encodeColor(gridInfo.color),\r\n                GridLeadingFillColor: encodeColor(gridInfo.color),\r\n                AlignLineHeightToGridFlags: !!gridInfo.alignLineHeightToGridFlags,\r\n            },\r\n            AntiAlias: antialias.indexOf((_l = data.antiAlias) !== null && _l !== void 0 ? _l : 'sharp'),\r\n            UseFractionalGlyphWidths: (_m = data.useFractionalGlyphWidths) !== null && _m !== void 0 ? _m : true,\r\n            Rendered: {\r\n                Version: 1,\r\n                Shapes: {\r\n                    WritingDirection: WritingDirection,\r\n                    Children: [\r\n                        {\r\n                            ShapeType: ShapeType,\r\n                            Procession: Procession,\r\n                            Lines: { WritingDirection: WritingDirection, Children: [] },\r\n                            Cookie: { Photoshop: Photoshop },\r\n                        },\r\n                    ],\r\n                },\r\n            },\r\n        },\r\n        ResourceDict: __assign({}, defaultResources),\r\n        DocumentResources: __assign({}, defaultResources),\r\n    };\r\n    // console.log('encodeEngineData', require('util').inspect(engineData, false, 99, true));\r\n    return engineData;\r\n}\r\n//# sourceMappingURL=text.js.map","/// Engine data 2 experiments\r\n// /test/engineData2.json:1109 is character codes\r\nvar keysColor = {\r\n    '0': {\r\n        uproot: true,\r\n        children: {\r\n            '0': { name: 'Type' },\r\n            '1': { name: 'Values' },\r\n        },\r\n    },\r\n};\r\nvar keysStyleSheet = {\r\n    '0': { name: 'Font' },\r\n    '1': { name: 'FontSize' },\r\n    '2': { name: 'FauxBold' },\r\n    '3': { name: 'FauxItalic' },\r\n    '4': { name: 'AutoLeading' },\r\n    '5': { name: 'Leading' },\r\n    '6': { name: 'HorizontalScale' },\r\n    '7': { name: 'VerticalScale' },\r\n    '8': { name: 'Tracking' },\r\n    '9': { name: 'BaselineShift' },\r\n    // '10': ???\r\n    '11': { name: 'Kerning?' },\r\n    '12': { name: 'FontCaps' },\r\n    '13': { name: 'FontBaseline' },\r\n    '15': { name: 'Strikethrough?' },\r\n    '16': { name: 'Underline?' },\r\n    '18': { name: 'Ligatures' },\r\n    '19': { name: 'DLigatures' },\r\n    // '20': ???\r\n    // '21': ???\r\n    // '22': ???\r\n    '23': { name: 'Fractions' },\r\n    '24': { name: 'Ordinals' },\r\n    // '25': ???\r\n    // '26': ???\r\n    // '27': ???\r\n    '28': { name: 'StylisticAlternates' },\r\n    // '29': ???\r\n    '30': { name: 'OldStyle?' },\r\n    '35': { name: 'BaselineDirection' },\r\n    '38': { name: 'Language' },\r\n    '52': { name: 'NoBreak' },\r\n    '53': { name: 'FillColor', children: keysColor },\r\n    '54': { name: 'StrokeColor', children: keysColor },\r\n    '55': { children: { '99': { uproot: true } } },\r\n    // '68': ???\r\n    // '70': ???\r\n    // '71': ???\r\n    // '72': ???\r\n    // '73': ???\r\n    '79': { children: keysColor },\r\n    // '85': ???\r\n    // '87': ???\r\n    // '88': ???\r\n};\r\nvar keysParagraph = {\r\n    '0': { name: 'Justification' },\r\n    '1': { name: 'FirstLineIndent' },\r\n    '2': { name: 'StartIndent' },\r\n    '3': { name: 'EndIndent' },\r\n    '4': { name: 'SpaceBefore' },\r\n    '5': { name: 'SpaceAfter' },\r\n    '7': { name: 'AutoLeading' },\r\n    '9': { name: 'AutoHyphenate' },\r\n    '10': { name: 'HyphenatedWordSize' },\r\n    '11': { name: 'PreHyphen' },\r\n    '12': { name: 'PostHyphen' },\r\n    '13': { name: 'ConsecutiveHyphens?' },\r\n    '14': { name: 'Zone' },\r\n    '15': { name: 'HypenateCapitalizedWords' },\r\n    '17': { name: 'WordSpacing' },\r\n    '18': { name: 'LetterSpacing' },\r\n    '19': { name: 'GlyphSpacing' },\r\n    '32': { name: 'StyleSheet', children: keysStyleSheet },\r\n};\r\nvar keysStyleSheetData = {\r\n    name: 'StyleSheetData',\r\n    children: keysStyleSheet,\r\n};\r\nvar keysRoot = {\r\n    '0': {\r\n        name: 'ResourceDict',\r\n        children: {\r\n            '1': {\r\n                name: 'FontSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': {\r\n                                        uproot: true,\r\n                                        children: {\r\n                                            '0': { name: 'Name' },\r\n                                            '2': { name: 'FontType' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '2': {\r\n                name: '2',\r\n                children: {},\r\n            },\r\n            '3': {\r\n                name: 'MojiKumiSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'InternalName' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '4': {\r\n                name: 'KinsokuSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '5': {\r\n                                        uproot: true,\r\n                                        children: {\r\n                                            '0': { name: 'NoStart' },\r\n                                            '1': { name: 'NoEnd' },\r\n                                            '2': { name: 'Keep' },\r\n                                            '3': { name: 'Hanging' },\r\n                                            '4': { name: 'Name' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '5': {\r\n                name: 'StyleSheetSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '6': keysStyleSheetData,\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '6': {\r\n                name: 'ParagraphSheetSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                uproot: true,\r\n                                children: {\r\n                                    '0': { name: 'Name' },\r\n                                    '5': {\r\n                                        name: 'Properties',\r\n                                        children: keysParagraph,\r\n                                    },\r\n                                    '6': { name: 'DefaultStyleSheet' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '8': {\r\n                name: 'TextFrameSet',\r\n                children: {\r\n                    '0': {\r\n                        uproot: true,\r\n                        children: {\r\n                            '0': {\r\n                                name: 'path',\r\n                                children: {\r\n                                    '0': { name: 'name' },\r\n                                    '1': {\r\n                                        name: 'bezierCurve',\r\n                                        children: {\r\n                                            '0': { name: 'controlPoints' },\r\n                                        },\r\n                                    },\r\n                                    '2': {\r\n                                        name: 'data',\r\n                                        children: {\r\n                                            '0': { name: 'type' },\r\n                                            '1': { name: 'orientation' },\r\n                                            '2': { name: 'frameMatrix' },\r\n                                            '4': { name: '4' },\r\n                                            '6': { name: 'textRange' },\r\n                                            '7': { name: 'rowGutter' },\r\n                                            '8': { name: 'columnGutter' },\r\n                                            '9': { name: '9' },\r\n                                            '10': {\r\n                                                name: 'baselineAlignment',\r\n                                                children: {\r\n                                                    '0': { name: 'flag' },\r\n                                                    '1': { name: 'min' },\r\n                                                },\r\n                                            },\r\n                                            '11': {\r\n                                                name: 'pathData',\r\n                                                children: {\r\n                                                    '1': { name: '1' },\r\n                                                    '0': { name: 'reversed' },\r\n                                                    '2': { name: '2' },\r\n                                                    '3': { name: '3' },\r\n                                                    '4': { name: 'spacing' },\r\n                                                    '5': { name: '5' },\r\n                                                    '6': { name: '6' },\r\n                                                    '7': { name: '7' },\r\n                                                    '18': { name: '18' },\r\n                                                },\r\n                                            },\r\n                                            '12': { name: '12' },\r\n                                            '13': { name: '13' },\r\n                                        },\r\n                                    },\r\n                                    '3': { name: '3' },\r\n                                    '97': { name: 'uuid' },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            '9': {\r\n                name: 'Predefined',\r\n                children: {\r\n                    '0': {\r\n                        children: { '0': { uproot: true } },\r\n                    },\r\n                    '1': {\r\n                        children: { '0': { uproot: true } },\r\n                    },\r\n                },\r\n            },\r\n        },\r\n    },\r\n    '1': {\r\n        name: 'EngineDict',\r\n        children: {\r\n            '0': {\r\n                name: '0',\r\n                children: {\r\n                    // 0: ???\r\n                    // 1: ???\r\n                    // 2: ???\r\n                    '3': { name: 'SuperscriptSize' },\r\n                    '4': { name: 'SuperscriptPosition' },\r\n                    '5': { name: 'SubscriptSize' },\r\n                    '6': { name: 'SubscriptPosition' },\r\n                    '7': { name: 'SmallCapSize' },\r\n                    '8': { name: 'UseFractionalGlyphWidths' },\r\n                    '15': { children: { '0': { uproot: true } } },\r\n                    // 16: ???\r\n                    // 17: ???\r\n                },\r\n            },\r\n            '1': {\r\n                name: 'Editors?',\r\n                children: {\r\n                    '0': {\r\n                        name: 'Editor',\r\n                        children: {\r\n                            '0': { name: 'Text' },\r\n                            '5': {\r\n                                name: 'ParagraphRun',\r\n                                children: {\r\n                                    '0': {\r\n                                        name: 'RunArray',\r\n                                        children: {\r\n                                            '0': {\r\n                                                name: 'ParagraphSheet',\r\n                                                children: {\r\n                                                    '0': {\r\n                                                        uproot: true,\r\n                                                        children: {\r\n                                                            '0': { name: '0' },\r\n                                                            '5': {\r\n                                                                name: '5',\r\n                                                                children: keysParagraph,\r\n                                                            },\r\n                                                            '6': { name: '6' },\r\n                                                        },\r\n                                                    },\r\n                                                },\r\n                                            },\r\n                                            '1': { name: 'RunLength' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                            '6': {\r\n                                name: 'StyleRun',\r\n                                children: {\r\n                                    '0': {\r\n                                        name: 'RunArray',\r\n                                        children: {\r\n                                            '0': {\r\n                                                name: 'StyleSheet',\r\n                                                children: {\r\n                                                    '0': {\r\n                                                        uproot: true,\r\n                                                        children: {\r\n                                                            '6': keysStyleSheetData,\r\n                                                        },\r\n                                                    },\r\n                                                },\r\n                                            },\r\n                                            '1': { name: 'RunLength' },\r\n                                        },\r\n                                    },\r\n                                },\r\n                            },\r\n                        },\r\n                    },\r\n                    '1': {\r\n                        name: 'FontVectorData ???',\r\n                        // children: {\r\n                        // \t'0': {},\r\n                        // \t'2': {\r\n                        // \t\t// '5'\r\n                        // \t\t// '6'\r\n                        // \t},\r\n                        // }\r\n                        //     \"1\": [ // this is probably bounding box? there seem to be many of them nested\r\n                        //       0,\r\n                        //       0,\r\n                        //       999,\r\n                        //       176.30014\r\n                        //     ],\r\n                        // various types: /PC, /F, /R, /L, /S, /G\r\n                    },\r\n                },\r\n            },\r\n            '2': {\r\n                name: 'StyleSheet',\r\n                children: keysStyleSheet,\r\n            },\r\n            '3': {\r\n                name: 'ParagraphSheet',\r\n                children: keysParagraph,\r\n            },\r\n        },\r\n    },\r\n};\r\nfunction decodeObj(obj, keys) {\r\n    var _a, _b;\r\n    if (obj === null)\r\n        return obj;\r\n    if (Array.isArray(obj))\r\n        return obj.map(function (x) { return decodeObj(x, keys); });\r\n    if (typeof obj !== 'object')\r\n        return obj;\r\n    var result = {};\r\n    for (var _i = 0, _c = Object.keys(obj); _i < _c.length; _i++) {\r\n        var key = _c[_i];\r\n        if (keys[key]) {\r\n            if (keys[key].uproot) {\r\n                if (key !== '99')\r\n                    result = decodeObj(obj[key], (_a = keys[key].children) !== null && _a !== void 0 ? _a : {});\r\n                if (obj['99'])\r\n                    result._type = obj['99'];\r\n                break;\r\n            }\r\n            else {\r\n                result[keys[key].name || key] = decodeObj(obj[key], (_b = keys[key].children) !== null && _b !== void 0 ? _b : {});\r\n            }\r\n        }\r\n        else if (key === '99') {\r\n            result._type = obj[key];\r\n        }\r\n        else {\r\n            result[key] = decodeObj(obj[key], {});\r\n        }\r\n    }\r\n    return result;\r\n}\r\nexport function decodeEngineData2(data) {\r\n    return decodeObj(data, keysRoot);\r\n}\r\n//# sourceMappingURL=engineData2.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { fromByteArray, toByteArray } from 'base64-js';\r\nimport { readEffects, writeEffects } from './effectsHelpers';\r\nimport { clamp, createEnum, layerColors, MOCK_HANDLERS } from './helpers';\r\nimport { readSignature, readUnicodeString, skipBytes, readUint32, readUint8, readFloat64, readUint16, readBytes, readInt16, checkSignature, readFloat32, readFixedPointPath32, readSection, readColor, readInt32, readPascalString, readUnicodeStringWithLength, readAsciiString, readPattern, readLayerInfo } from './psdReader';\r\nimport { writeZeros, writeSignature, writeBytes, writeUint32, writeUint16, writeFloat64, writeUint8, writeInt16, writeFloat32, writeFixedPointPath32, writeUnicodeString, writeSection, writeUnicodeStringWithPadding, writeColor, writePascalString, writeInt32 } from './psdWriter';\r\nimport { Annt, BlnM, parsePercent, parseUnits, parseUnitsOrNumber, strokeStyleLineAlignment, strokeStyleLineCapType, strokeStyleLineJoinType, textGridding, unitsPercent, unitsValue, warpStyle, writeVersionAndDescriptor, readVersionAndDescriptor, Ornt, horzVrtcToXY, xyToHorzVrtc, serializeEffects, parseEffects, parseColor, serializeColor, serializeVectorContent, parseVectorContent, parseTrackList, serializeTrackList, BlrM, BlrQ, SmBQ, SmBM, DspM, UndA, Cnvr, RplS, SphM, Wvtp, ZZTy, Dstr, Chnl, MztT, Lns, blurType, DfsM, ExtT, ExtR, FlCl, CntE, WndM, Drct, IntE, IntC, FlMd, unitsPercentF, frac, ClrS, descBoundsToBounds, boundsToDescBounds, presetKindType, gradientInterpolationMethodType } from './descriptor';\r\nimport { serializeEngineData, parseEngineData } from './engineData';\r\nimport { encodeEngineData, decodeEngineData } from './text';\r\nimport { decodeEngineData2 } from './engineData2';\r\nvar fromAtoZ = 'abcdefghijklmnopqrstuvwxyz';\r\nexport var infoHandlers = [];\r\nexport var infoHandlersMap = {};\r\nfunction addHandler(key, has, read, write) {\r\n    var handler = { key: key, has: has, read: read, write: write };\r\n    infoHandlers.push(handler);\r\n    infoHandlersMap[handler.key] = handler;\r\n}\r\nfunction addHandlerAlias(key, target) {\r\n    infoHandlersMap[key] = infoHandlersMap[target];\r\n}\r\nfunction hasKey(key) {\r\n    return function (target) { return target[key] !== undefined; };\r\n}\r\nfunction readLength64(reader) {\r\n    if (readUint32(reader))\r\n        throw new Error(\"Resource size above 4 GB limit at \".concat(reader.offset.toString(16)));\r\n    return readUint32(reader);\r\n}\r\nfunction writeLength64(writer, length) {\r\n    writeUint32(writer, 0);\r\n    writeUint32(writer, length);\r\n}\r\naddHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {\r\n    if (readInt16(reader) !== 1)\r\n        throw new Error(\"Invalid TySh version\");\r\n    var transform = [];\r\n    for (var i = 0; i < 6; i++)\r\n        transform.push(readFloat64(reader));\r\n    if (readInt16(reader) !== 50)\r\n        throw new Error(\"Invalid TySh text version\");\r\n    var text = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(text, false, 99, false), 'utf8');\r\n    if (readInt16(reader) !== 1)\r\n        throw new Error(\"Invalid TySh warp version\");\r\n    var warp = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(warp, false, 99, false), 'utf8');\r\n    target.text = {\r\n        transform: transform,\r\n        left: readFloat32(reader),\r\n        top: readFloat32(reader),\r\n        right: readFloat32(reader),\r\n        bottom: readFloat32(reader),\r\n        text: text['Txt '].replace(/\\r/g, '\\n'),\r\n        index: text.TextIndex || 0,\r\n        gridding: textGridding.decode(text.textGridding),\r\n        antiAlias: Annt.decode(text.AntA),\r\n        orientation: Ornt.decode(text.Ornt),\r\n        warp: {\r\n            style: warpStyle.decode(warp.warpStyle),\r\n            value: warp.warpValue || 0,\r\n            perspective: warp.warpPerspective || 0,\r\n            perspectiveOther: warp.warpPerspectiveOther || 0,\r\n            rotate: Ornt.decode(warp.warpRotate),\r\n        },\r\n    };\r\n    if (text.bounds)\r\n        target.text.bounds = descBoundsToBounds(text.bounds);\r\n    if (text.boundingBox)\r\n        target.text.boundingBox = descBoundsToBounds(text.boundingBox);\r\n    if (text.EngineData) {\r\n        var engineData = parseEngineData(text.EngineData);\r\n        var textData = decodeEngineData(engineData);\r\n        // console.log(require('util').inspect(engineData, false, 99, false), 'utf8');\r\n        // require('fs').writeFileSync(`layer-${target.name}.txt`, require('util').inspect(engineData, false, 99, false), 'utf8');\r\n        // const before = parseEngineData(text.EngineData);\r\n        // const after = encodeEngineData(engineData);\r\n        // require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');\r\n        // require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');\r\n        // console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));\r\n        target.text = __assign(__assign({}, target.text), textData);\r\n        // console.log(require('util').inspect(target.text, false, 99, true));\r\n    }\r\n    skipBytes(reader, leftBytes());\r\n}, function (writer, target) {\r\n    var text = target.text;\r\n    var warp = text.warp || {};\r\n    var transform = text.transform || [1, 0, 0, 1, 0, 0];\r\n    var textDescriptor = __assign(__assign(__assign({ 'Txt ': (text.text || '').replace(/\\r?\\n/g, '\\r'), textGridding: textGridding.encode(text.gridding), Ornt: Ornt.encode(text.orientation), AntA: Annt.encode(text.antiAlias) }, (text.bounds ? { bounds: boundsToDescBounds(text.bounds) } : {})), (text.boundingBox ? { boundingBox: boundsToDescBounds(text.boundingBox) } : {})), { TextIndex: text.index || 0, EngineData: serializeEngineData(encodeEngineData(text)) });\r\n    writeInt16(writer, 1); // version\r\n    for (var i = 0; i < 6; i++) {\r\n        writeFloat64(writer, transform[i]);\r\n    }\r\n    writeInt16(writer, 50); // text version\r\n    writeVersionAndDescriptor(writer, '', 'TxLr', textDescriptor, 'text');\r\n    writeInt16(writer, 1); // warp version\r\n    writeVersionAndDescriptor(writer, '', 'warp', encodeWarp(warp));\r\n    writeFloat32(writer, text.left);\r\n    writeFloat32(writer, text.top);\r\n    writeFloat32(writer, text.right);\r\n    writeFloat32(writer, text.bottom);\r\n    // writeZeros(writer, 2);\r\n});\r\n// vector fills\r\naddHandler('SoCo', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    target.vectorFill.type === 'color'; }, function (reader, target) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('GdFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    (target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'); }, function (reader, target, left) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('PtFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&\r\n    target.vectorFill.type === 'pattern'; }, function (reader, target) {\r\n    var descriptor = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(descriptor);\r\n}, function (writer, target) {\r\n    var descriptor = serializeVectorContent(target.vectorFill).descriptor;\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\naddHandler('vscg', function (target) { return target.vectorFill !== undefined && target.vectorStroke !== undefined; }, function (reader, target, left) {\r\n    readSignature(reader); // key\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.vectorFill = parseVectorContent(desc);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a = serializeVectorContent(target.vectorFill), descriptor = _a.descriptor, key = _a.key;\r\n    writeSignature(writer, key);\r\n    writeVersionAndDescriptor(writer, '', 'null', descriptor);\r\n});\r\nexport function readBezierKnot(reader, width, height) {\r\n    var y0 = readFixedPointPath32(reader) * height;\r\n    var x0 = readFixedPointPath32(reader) * width;\r\n    var y1 = readFixedPointPath32(reader) * height;\r\n    var x1 = readFixedPointPath32(reader) * width;\r\n    var y2 = readFixedPointPath32(reader) * height;\r\n    var x2 = readFixedPointPath32(reader) * width;\r\n    return [x0, y0, x1, y1, x2, y2];\r\n}\r\nfunction writeBezierKnot(writer, points, width, height) {\r\n    writeFixedPointPath32(writer, points[1] / height); // y0\r\n    writeFixedPointPath32(writer, points[0] / width); // x0\r\n    writeFixedPointPath32(writer, points[3] / height); // y1\r\n    writeFixedPointPath32(writer, points[2] / width); // x1\r\n    writeFixedPointPath32(writer, points[5] / height); // y2\r\n    writeFixedPointPath32(writer, points[4] / width); // x2\r\n}\r\nexport var booleanOperations = ['exclude', 'combine', 'subtract', 'intersect'];\r\nexport function readVectorMask(reader, vectorMask, width, height, size) {\r\n    var end = reader.offset + size;\r\n    var paths = vectorMask.paths;\r\n    var path = undefined;\r\n    while ((end - reader.offset) >= 26) {\r\n        var selector = readUint16(reader);\r\n        switch (selector) {\r\n            case 0: // Closed subpath length record\r\n            case 3: { // Open subpath length record\r\n                readUint16(reader); // count\r\n                var boolOp = readInt16(reader);\r\n                var flags = readUint16(reader); // bit 1 always 1 ?\r\n                skipBytes(reader, 18);\r\n                path = {\r\n                    open: selector === 3,\r\n                    knots: [],\r\n                    fillRule: flags === 2 ? 'non-zero' : 'even-odd',\r\n                };\r\n                if (boolOp !== -1)\r\n                    path.operation = booleanOperations[boolOp];\r\n                paths.push(path);\r\n                break;\r\n            }\r\n            case 1: // Closed subpath Bezier knot, linked\r\n            case 2: // Closed subpath Bezier knot, unlinked\r\n            case 4: // Open subpath Bezier knot, linked\r\n            case 5: // Open subpath Bezier knot, unlinked\r\n                path.knots.push({ linked: (selector === 1 || selector === 4), points: readBezierKnot(reader, width, height) });\r\n                break;\r\n            case 6: // Path fill rule record\r\n                skipBytes(reader, 24);\r\n                break;\r\n            case 7: { // Clipboard record\r\n                // TODO: check if these need to be multiplied by document size\r\n                var top_1 = readFixedPointPath32(reader);\r\n                var left = readFixedPointPath32(reader);\r\n                var bottom = readFixedPointPath32(reader);\r\n                var right = readFixedPointPath32(reader);\r\n                var resolution = readFixedPointPath32(reader);\r\n                skipBytes(reader, 4);\r\n                vectorMask.clipboard = { top: top_1, left: left, bottom: bottom, right: right, resolution: resolution };\r\n                break;\r\n            }\r\n            case 8: // Initial fill rule record\r\n                vectorMask.fillStartsWithAllPixels = !!readUint16(reader);\r\n                skipBytes(reader, 22);\r\n                break;\r\n            default: throw new Error('Invalid vmsk section');\r\n        }\r\n    }\r\n    return paths;\r\n}\r\naddHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {\r\n    var width = _a.width, height = _a.height;\r\n    if (readUint32(reader) !== 3)\r\n        throw new Error('Invalid vmsk version');\r\n    target.vectorMask = { paths: [] };\r\n    var vectorMask = target.vectorMask;\r\n    var flags = readUint32(reader);\r\n    vectorMask.invert = (flags & 1) !== 0;\r\n    vectorMask.notLink = (flags & 2) !== 0;\r\n    vectorMask.disable = (flags & 4) !== 0;\r\n    readVectorMask(reader, vectorMask, width, height, left());\r\n    // drawBezierPaths(vectorMask.paths, width, height, 'out.png');\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _a) {\r\n    var width = _a.width, height = _a.height;\r\n    var vectorMask = target.vectorMask;\r\n    var flags = (vectorMask.invert ? 1 : 0) |\r\n        (vectorMask.notLink ? 2 : 0) |\r\n        (vectorMask.disable ? 4 : 0);\r\n    writeUint32(writer, 3); // version\r\n    writeUint32(writer, flags);\r\n    // initial entry\r\n    writeUint16(writer, 6);\r\n    writeZeros(writer, 24);\r\n    var clipboard = vectorMask.clipboard;\r\n    if (clipboard) {\r\n        writeUint16(writer, 7);\r\n        writeFixedPointPath32(writer, clipboard.top);\r\n        writeFixedPointPath32(writer, clipboard.left);\r\n        writeFixedPointPath32(writer, clipboard.bottom);\r\n        writeFixedPointPath32(writer, clipboard.right);\r\n        writeFixedPointPath32(writer, clipboard.resolution);\r\n        writeZeros(writer, 4);\r\n    }\r\n    writeUint16(writer, 8);\r\n    writeUint16(writer, vectorMask.fillStartsWithAllPixels ? 1 : 0);\r\n    writeZeros(writer, 22);\r\n    for (var _i = 0, _b = vectorMask.paths; _i < _b.length; _i++) {\r\n        var path = _b[_i];\r\n        writeUint16(writer, path.open ? 3 : 0);\r\n        writeUint16(writer, path.knots.length);\r\n        writeUint16(writer, path.operation ? booleanOperations.indexOf(path.operation) : -1); // -1 for undefined\r\n        writeUint16(writer, path.fillRule === 'non-zero' ? 2 : 1);\r\n        writeZeros(writer, 18); // TODO: these are sometimes non-zero\r\n        var linkedKnot = path.open ? 4 : 1;\r\n        var unlinkedKnot = path.open ? 5 : 2;\r\n        for (var _c = 0, _d = path.knots; _c < _d.length; _c++) {\r\n            var _e = _d[_c], linked = _e.linked, points = _e.points;\r\n            writeUint16(writer, linked ? linkedKnot : unlinkedKnot);\r\n            writeBezierKnot(writer, points, width, height);\r\n        }\r\n    }\r\n});\r\n// TODO: need to write vmsk if has outline ?\r\naddHandlerAlias('vsms', 'vmsk');\r\n// addHandlerAlias('vmsk', 'vsms');\r\naddHandler('vowv', // something with vectors?\r\nhasKey('vowv'), function (reader, target) {\r\n    target.vowv = readUint32(reader); // always 2 ????\r\n}, function (writer, target) {\r\n    writeUint32(writer, target.vowv);\r\n});\r\naddHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {\r\n    if (readInt32(reader) !== 1)\r\n        throw new Error(\"Invalid vogk version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    target.vectorOrigination = { keyDescriptorList: [] };\r\n    for (var _i = 0, _a = desc.keyDescriptorList; _i < _a.length; _i++) {\r\n        var i = _a[_i];\r\n        var item = {};\r\n        if (i.keyShapeInvalidated != null)\r\n            item.keyShapeInvalidated = i.keyShapeInvalidated;\r\n        if (i.keyOriginType != null)\r\n            item.keyOriginType = i.keyOriginType;\r\n        if (i.keyOriginResolution != null)\r\n            item.keyOriginResolution = i.keyOriginResolution;\r\n        if (i.keyOriginShapeBBox) {\r\n            item.keyOriginShapeBoundingBox = {\r\n                top: parseUnitsOrNumber(i.keyOriginShapeBBox['Top ']),\r\n                left: parseUnitsOrNumber(i.keyOriginShapeBBox.Left),\r\n                bottom: parseUnitsOrNumber(i.keyOriginShapeBBox.Btom),\r\n                right: parseUnitsOrNumber(i.keyOriginShapeBBox.Rght),\r\n            };\r\n        }\r\n        var rectRadii = i.keyOriginRRectRadii;\r\n        if (rectRadii) {\r\n            item.keyOriginRRectRadii = {\r\n                topRight: parseUnits(rectRadii.topRight),\r\n                topLeft: parseUnits(rectRadii.topLeft),\r\n                bottomLeft: parseUnits(rectRadii.bottomLeft),\r\n                bottomRight: parseUnits(rectRadii.bottomRight),\r\n            };\r\n        }\r\n        var corners = i.keyOriginBoxCorners;\r\n        if (corners) {\r\n            item.keyOriginBoxCorners = [\r\n                { x: corners.rectangleCornerA.Hrzn, y: corners.rectangleCornerA.Vrtc },\r\n                { x: corners.rectangleCornerB.Hrzn, y: corners.rectangleCornerB.Vrtc },\r\n                { x: corners.rectangleCornerC.Hrzn, y: corners.rectangleCornerC.Vrtc },\r\n                { x: corners.rectangleCornerD.Hrzn, y: corners.rectangleCornerD.Vrtc },\r\n            ];\r\n        }\r\n        var trnf = i.Trnf;\r\n        if (trnf) {\r\n            item.transform = [trnf.xx, trnf.xy, trnf.yx, trnf.yy, trnf.tx, trnf.ty];\r\n        }\r\n        target.vectorOrigination.keyDescriptorList.push(item);\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    target;\r\n    var orig = target.vectorOrigination;\r\n    var desc = { keyDescriptorList: [] };\r\n    for (var i = 0; i < orig.keyDescriptorList.length; i++) {\r\n        var item = orig.keyDescriptorList[i];\r\n        desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end\r\n        var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];\r\n        if (item.keyOriginType != null)\r\n            out.keyOriginType = item.keyOriginType;\r\n        if (item.keyOriginResolution != null)\r\n            out.keyOriginResolution = item.keyOriginResolution;\r\n        var radii = item.keyOriginRRectRadii;\r\n        if (radii) {\r\n            out.keyOriginRRectRadii = {\r\n                unitValueQuadVersion: 1,\r\n                topRight: unitsValue(radii.topRight, 'topRight'),\r\n                topLeft: unitsValue(radii.topLeft, 'topLeft'),\r\n                bottomLeft: unitsValue(radii.bottomLeft, 'bottomLeft'),\r\n                bottomRight: unitsValue(radii.bottomRight, 'bottomRight'),\r\n            };\r\n        }\r\n        var box = item.keyOriginShapeBoundingBox;\r\n        if (box) {\r\n            out.keyOriginShapeBBox = {\r\n                unitValueQuadVersion: 1,\r\n                'Top ': unitsValue(box.top, 'top'),\r\n                Left: unitsValue(box.left, 'left'),\r\n                Btom: unitsValue(box.bottom, 'bottom'),\r\n                Rght: unitsValue(box.right, 'right'),\r\n            };\r\n        }\r\n        var corners = item.keyOriginBoxCorners;\r\n        if (corners && corners.length === 4) {\r\n            out.keyOriginBoxCorners = {\r\n                rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },\r\n                rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },\r\n                rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },\r\n                rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },\r\n            };\r\n        }\r\n        var transform = item.transform;\r\n        if (transform && transform.length === 6) {\r\n            out.Trnf = {\r\n                xx: transform[0],\r\n                xy: transform[1],\r\n                yx: transform[2],\r\n                yy: transform[3],\r\n                tx: transform[4],\r\n                ty: transform[5],\r\n            };\r\n        }\r\n        if (item.keyShapeInvalidated != null)\r\n            out.keyShapeInvalidated = item.keyShapeInvalidated;\r\n        out.keyOriginIndex = i;\r\n    }\r\n    writeInt32(writer, 1); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error('Invalid lmfx version');\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('READ', require('util').inspect(desc, false, 99, true));\r\n    // discard if read in 'lrFX' or 'lfx2' section\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    // console.log('WRITE', require('util').inspect(desc, false, 99, true));\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('lrFX', hasKey('effects'), function (reader, target, left) {\r\n    if (!target.effects)\r\n        target.effects = readEffects(reader);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeEffects(writer, target.effects);\r\n});\r\naddHandler('luni', hasKey('name'), function (reader, target, left) {\r\n    if (left() > 4) {\r\n        var length_1 = readUint32(reader);\r\n        if (left() >= (length_1 * 2)) {\r\n            target.name = readUnicodeStringWithLength(reader, length_1);\r\n        }\r\n        else {\r\n            if (reader.logDevFeatures)\r\n                reader.log('name in luni section is too long');\r\n        }\r\n    }\r\n    else {\r\n        if (reader.logDevFeatures)\r\n            reader.log('empty luni section');\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    writeUnicodeString(writer, target.name);\r\n    // writeUint16(writer, 0); // padding (but not extending string length)\r\n});\r\naddHandler('lnsr', hasKey('nameSource'), function (reader, target) { return target.nameSource = readSignature(reader); }, function (writer, target) { return writeSignature(writer, target.nameSource); });\r\naddHandler('lyid', hasKey('id'), function (reader, target) {\r\n    target.id = readUint32(reader);\r\n}, function (writer, target, _psd, options) {\r\n    var id = target.id;\r\n    while (options.layerIds.has(id))\r\n        id += 100; // make sure we don't have duplicate layer ids\r\n    writeUint32(writer, id);\r\n    options.layerIds.add(id);\r\n    options.layerToId.set(target, id);\r\n});\r\naddHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {\r\n    target.sectionDivider = { type: readUint32(reader) };\r\n    if (left()) {\r\n        checkSignature(reader, '8BIM');\r\n        target.sectionDivider.key = readSignature(reader);\r\n    }\r\n    if (left()) {\r\n        target.sectionDivider.subType = readUint32(reader);\r\n    }\r\n}, function (writer, target) {\r\n    writeUint32(writer, target.sectionDivider.type);\r\n    if (target.sectionDivider.key) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, target.sectionDivider.key);\r\n        if (target.sectionDivider.subType !== undefined) {\r\n            writeUint32(writer, target.sectionDivider.subType);\r\n        }\r\n    }\r\n});\r\n// it seems lsdk is used when there's a layer is nested more than 6 levels, but I don't know why?\r\n// maybe some limitation of old version of PS?\r\naddHandlerAlias('lsdk', 'lsct');\r\naddHandler('clbl', hasKey('blendClippendElements'), function (reader, target) {\r\n    target.blendClippendElements = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.blendClippendElements ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('infx', hasKey('blendInteriorElements'), function (reader, target) {\r\n    target.blendInteriorElements = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.blendInteriorElements ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('knko', hasKey('knockout'), function (reader, target) {\r\n    target.knockout = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.knockout ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('lmgm', hasKey('layerMaskAsGlobalMask'), function (reader, target) {\r\n    target.layerMaskAsGlobalMask = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.layerMaskAsGlobalMask ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('lspf', hasKey('protected'), function (reader, target) {\r\n    var flags = readUint32(reader);\r\n    target.protected = {\r\n        transparency: (flags & 0x01) !== 0,\r\n        composite: (flags & 0x02) !== 0,\r\n        position: (flags & 0x04) !== 0,\r\n    };\r\n    if (flags & 0x08)\r\n        target.protected.artboards = true;\r\n}, function (writer, target) {\r\n    var flags = (target.protected.transparency ? 0x01 : 0) |\r\n        (target.protected.composite ? 0x02 : 0) |\r\n        (target.protected.position ? 0x04 : 0) |\r\n        (target.protected.artboards ? 0x08 : 0);\r\n    writeUint32(writer, flags);\r\n});\r\naddHandler('lclr', hasKey('layerColor'), function (reader, target) {\r\n    var color = readUint16(reader);\r\n    skipBytes(reader, 6);\r\n    target.layerColor = layerColors[color];\r\n}, function (writer, target) {\r\n    var index = layerColors.indexOf(target.layerColor);\r\n    writeUint16(writer, index === -1 ? 0 : index);\r\n    writeZeros(writer, 6);\r\n});\r\naddHandler('shmd', // Metadata setting\r\nfunction (// Metadata setting\r\ntarget) { return target.timestamp !== undefined || target.animationFrames !== undefined || target.animationFrameFlags !== undefined || target.timeline !== undefined || target.comps !== undefined; }, function (reader, target, left) {\r\n    var count = readUint32(reader);\r\n    var _loop_1 = function (i) {\r\n        checkSignature(reader, '8BIM');\r\n        var key = readSignature(reader);\r\n        readUint8(reader); // copy\r\n        skipBytes(reader, 3);\r\n        readSection(reader, 1, function (left) {\r\n            if (key === 'cust') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('cust', target.name, require('util').inspect(desc, false, 99, true));\r\n                if (desc.layerTime !== undefined)\r\n                    target.timestamp = desc.layerTime;\r\n            }\r\n            else if (key === 'mlst') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));\r\n                target.animationFrames = [];\r\n                for (var i_1 = 0; i_1 < desc.LaSt.length; i_1++) {\r\n                    var f = desc.LaSt[i_1];\r\n                    var frame = { frames: f.FrLs };\r\n                    if (f.enab !== undefined)\r\n                        frame.enable = f.enab;\r\n                    if (f.Ofst)\r\n                        frame.offset = horzVrtcToXY(f.Ofst);\r\n                    if (f.FXRf)\r\n                        frame.referencePoint = horzVrtcToXY(f.FXRf);\r\n                    if (f.Lefx)\r\n                        frame.effects = parseEffects(f.Lefx, !!reader.logMissingFeatures);\r\n                    if (f.blendOptions && f.blendOptions.Opct)\r\n                        frame.opacity = parsePercent(f.blendOptions.Opct);\r\n                    target.animationFrames.push(frame);\r\n                }\r\n            }\r\n            else if (key === 'mdyn') {\r\n                // frame flags\r\n                readUint16(reader); // unknown\r\n                var propagate = readUint8(reader);\r\n                var flags = readUint8(reader);\r\n                target.animationFrameFlags = {\r\n                    propagateFrameOne: !propagate,\r\n                    unifyLayerPosition: (flags & 1) !== 0,\r\n                    unifyLayerStyle: (flags & 2) !== 0,\r\n                    unifyLayerVisibility: (flags & 4) !== 0,\r\n                };\r\n            }\r\n            else if (key === 'tmln') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                var timeScope = desc.timeScope;\r\n                // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));\r\n                var timeline = {\r\n                    start: frac(timeScope.Strt),\r\n                    duration: frac(timeScope.duration),\r\n                    inTime: frac(timeScope.inTime),\r\n                    outTime: frac(timeScope.outTime),\r\n                    autoScope: desc.autoScope,\r\n                    audioLevel: desc.audioLevel,\r\n                };\r\n                if (desc.trackList) {\r\n                    timeline.tracks = parseTrackList(desc.trackList, !!reader.logMissingFeatures);\r\n                }\r\n                target.timeline = timeline;\r\n                // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));\r\n            }\r\n            else if (key === 'cmls') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log('cmls', require('util').inspect(desc, false, 99, true));\r\n                target.comps = {\r\n                    settings: [],\r\n                };\r\n                if (desc.origFXRefPoint)\r\n                    target.comps.originalEffectsReferencePoint = { x: desc.origFXRefPoint.Hrzn, y: desc.origFXRefPoint.Vrtc };\r\n                for (var _i = 0, _a = desc.layerSettings; _i < _a.length; _i++) {\r\n                    var item = _a[_i];\r\n                    target.comps.settings.push({ compList: item.compList });\r\n                    var t = target.comps.settings[target.comps.settings.length - 1];\r\n                    if ('enab' in item)\r\n                        t.enabled = item.enab;\r\n                    if (item.Ofst)\r\n                        t.offset = { x: item.Ofst.Hrzn, y: item.Ofst.Vrtc };\r\n                    if (item.FXRefPoint)\r\n                        t.effectsReferencePoint = { x: item.FXRefPoint.Hrzn, y: item.FXRefPoint.Vrtc };\r\n                }\r\n            }\r\n            else if (key === 'extn') {\r\n                var desc = readVersionAndDescriptor(reader);\r\n                // console.log(require('util').inspect(desc, false, 99, true));\r\n                desc; // TODO: save this\r\n                reader.logMissingFeatures && reader.log('Unhandled \"shmd\" section key', key);\r\n            }\r\n            else {\r\n                reader.logMissingFeatures && reader.log('Unhandled \"shmd\" section key', key);\r\n            }\r\n            skipBytes(reader, left());\r\n        });\r\n    };\r\n    for (var i = 0; i < count; i++) {\r\n        _loop_1(i);\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline, comps = target.comps;\r\n    var count = 0;\r\n    if (animationFrames)\r\n        count++;\r\n    if (animationFrameFlags)\r\n        count++;\r\n    if (timeline)\r\n        count++;\r\n    if (timestamp !== undefined)\r\n        count++;\r\n    if (comps)\r\n        count++;\r\n    writeUint32(writer, count);\r\n    if (animationFrames) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'mlst');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var _a;\r\n            var desc = {\r\n                LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,\r\n                LaSt: [],\r\n            };\r\n            for (var i = 0; i < animationFrames.length; i++) {\r\n                var f = animationFrames[i];\r\n                var frame = {};\r\n                if (f.enable !== undefined)\r\n                    frame.enab = f.enable;\r\n                frame.FrLs = f.frames;\r\n                if (f.offset)\r\n                    frame.Ofst = xyToHorzVrtc(f.offset);\r\n                if (f.referencePoint)\r\n                    frame.FXRf = xyToHorzVrtc(f.referencePoint);\r\n                if (f.effects)\r\n                    frame.Lefx = serializeEffects(f.effects, false, false);\r\n                if (f.opacity !== undefined)\r\n                    frame.blendOptions = { Opct: unitsPercent(f.opacity) };\r\n                desc.LaSt.push(frame);\r\n            }\r\n            writeVersionAndDescriptor(writer, '', 'null', desc);\r\n        }, true);\r\n    }\r\n    if (animationFrameFlags) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'mdyn');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            writeUint16(writer, 0); // unknown\r\n            writeUint8(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);\r\n            writeUint8(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |\r\n                (animationFrameFlags.unifyLayerStyle ? 2 : 0) |\r\n                (animationFrameFlags.unifyLayerVisibility ? 4 : 0));\r\n        });\r\n    }\r\n    if (timeline) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'tmln');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var desc = {\r\n                Vrsn: 1,\r\n                timeScope: {\r\n                    Vrsn: 1,\r\n                    Strt: timeline.start,\r\n                    duration: timeline.duration,\r\n                    inTime: timeline.inTime,\r\n                    outTime: timeline.outTime,\r\n                },\r\n                autoScope: timeline.autoScope,\r\n                audioLevel: timeline.audioLevel,\r\n            };\r\n            if (timeline.tracks) {\r\n                desc.trackList = serializeTrackList(timeline.tracks);\r\n            }\r\n            var id = options.layerToId.get(target) || target.id;\r\n            if (!id)\r\n                throw new Error('You need to provide layer.id value whan writing document with animations');\r\n            desc.LyrI = id;\r\n            // console.log('WRITE:tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));\r\n            writeVersionAndDescriptor(writer, '', 'null', desc, 'anim');\r\n        }, true);\r\n    }\r\n    if (timestamp !== undefined) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'cust');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var desc = {\r\n                layerTime: timestamp,\r\n            };\r\n            writeVersionAndDescriptor(writer, '', 'metadata', desc);\r\n        }, true);\r\n    }\r\n    if (comps) {\r\n        writeSignature(writer, '8BIM');\r\n        writeSignature(writer, 'cmls');\r\n        writeUint8(writer, 0); // copy (always false)\r\n        writeZeros(writer, 3);\r\n        writeSection(writer, 2, function () {\r\n            var id = options.layerToId.get(target) || target.id;\r\n            if (!id)\r\n                throw new Error('You need to provide layer.id value whan writing document with layer comps');\r\n            var desc = {};\r\n            if (comps.originalEffectsReferencePoint) {\r\n                desc.origFXRefPoint = { Hrzn: comps.originalEffectsReferencePoint.x, Vrtc: comps.originalEffectsReferencePoint.y };\r\n            }\r\n            desc.LyrI = id;\r\n            desc.layerSettings = [];\r\n            for (var _i = 0, _a = comps.settings; _i < _a.length; _i++) {\r\n                var item = _a[_i];\r\n                var t = {};\r\n                if (item.enabled !== undefined)\r\n                    t.enab = item.enabled;\r\n                if (item.offset)\r\n                    t.Ofst = { Hrzn: item.offset.x, Vrtc: item.offset.y };\r\n                if (item.effectsReferencePoint)\r\n                    t.FXRefPoint = { Hrzn: item.effectsReferencePoint.x, Vrtc: item.effectsReferencePoint.y };\r\n                t.compList = item.compList;\r\n                desc.layerSettings.push(t);\r\n            }\r\n            // console.log('cmls', require('util').inspect(desc, false, 99, true));\r\n            writeVersionAndDescriptor(writer, '', 'null', desc);\r\n        }, true);\r\n    }\r\n});\r\naddHandler('PxSc', function () { return false; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('PxSc', require('util').inspect(desc, false, 99, true));\r\n    if (desc.pixelSourceType === 1986285651) {\r\n        target.pixelSource = {\r\n            type: 'vdPS',\r\n            origin: { x: desc.origin.Hrzn, y: desc.origin.Vrtc },\r\n            interpretation: {\r\n                interpretAlpha: desc.interpretation.interpretAlpha.split('.')[1],\r\n                profile: desc.interpretation.profile,\r\n            },\r\n            frameReader: {\r\n                type: 'QTFR',\r\n                link: {\r\n                    name: desc.frameReader['Lnk ']['Nm  '],\r\n                    fullPath: desc.frameReader['Lnk '].fullPath,\r\n                    originalPath: desc.frameReader['Lnk '].originalPath,\r\n                    relativePath: desc.frameReader['Lnk '].relPath,\r\n                    alias: desc.frameReader['Lnk '].alis,\r\n                },\r\n                mediaDescriptor: desc.frameReader.mediaDescriptor,\r\n            },\r\n            showAlteredVideo: desc.showAlteredVideo,\r\n        };\r\n    }\r\n    else {\r\n        reader.log(\"Unknown pixelSourceType\");\r\n    }\r\n}, function (writer, target) {\r\n    var source = target.pixelSource;\r\n    var desc = {\r\n        _name: '',\r\n        _classID: 'PixelSource',\r\n        pixelSourceType: 1986285651,\r\n        descVersion: 1,\r\n        origin: { Hrzn: source.origin.x, Vrtc: source.origin.y },\r\n        interpretation: {\r\n            _name: '',\r\n            _classID: 'footageInterpretation',\r\n            Vrsn: 1,\r\n            interpretAlpha: \"alphaInterpretation.\".concat(source.interpretation.interpretAlpha),\r\n            profile: source.interpretation.profile,\r\n        },\r\n        frameReader: {\r\n            _name: '',\r\n            _classID: 'FrameReader',\r\n            frameReaderType: 1364477522,\r\n            descVersion: 1,\r\n            'Lnk ': {\r\n                _name: '',\r\n                _classID: 'ExternalFileLink',\r\n                descVersion: 2,\r\n                'Nm  ': source.frameReader.link.name,\r\n                fullPath: source.frameReader.link.fullPath,\r\n                originalPath: source.frameReader.link.originalPath,\r\n                alis: source.frameReader.link.alias,\r\n                relPath: source.frameReader.link.relativePath,\r\n            },\r\n            mediaDescriptor: source.frameReader.mediaDescriptor,\r\n        },\r\n        showAlteredVideo: source.showAlteredVideo,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'PixelSource', desc);\r\n});\r\naddHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    target.vectorStroke = {\r\n        strokeEnabled: desc.strokeEnabled,\r\n        fillEnabled: desc.fillEnabled,\r\n        lineWidth: parseUnits(desc.strokeStyleLineWidth),\r\n        lineDashOffset: parseUnits(desc.strokeStyleLineDashOffset),\r\n        miterLimit: desc.strokeStyleMiterLimit,\r\n        lineCapType: strokeStyleLineCapType.decode(desc.strokeStyleLineCapType),\r\n        lineJoinType: strokeStyleLineJoinType.decode(desc.strokeStyleLineJoinType),\r\n        lineAlignment: strokeStyleLineAlignment.decode(desc.strokeStyleLineAlignment),\r\n        scaleLock: desc.strokeStyleScaleLock,\r\n        strokeAdjust: desc.strokeStyleStrokeAdjust,\r\n        lineDashSet: desc.strokeStyleLineDashSet.map(parseUnits),\r\n        blendMode: BlnM.decode(desc.strokeStyleBlendMode),\r\n        opacity: parsePercent(desc.strokeStyleOpacity),\r\n        content: parseVectorContent(desc.strokeStyleContent),\r\n        resolution: desc.strokeStyleResolution,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c;\r\n    var stroke = target.vectorStroke;\r\n    var desc = {\r\n        strokeStyleVersion: 2,\r\n        strokeEnabled: !!stroke.strokeEnabled,\r\n        fillEnabled: !!stroke.fillEnabled,\r\n        strokeStyleLineWidth: stroke.lineWidth || { value: 3, units: 'Points' },\r\n        strokeStyleLineDashOffset: stroke.lineDashOffset || { value: 0, units: 'Points' },\r\n        strokeStyleMiterLimit: (_a = stroke.miterLimit) !== null && _a !== void 0 ? _a : 100,\r\n        strokeStyleLineCapType: strokeStyleLineCapType.encode(stroke.lineCapType),\r\n        strokeStyleLineJoinType: strokeStyleLineJoinType.encode(stroke.lineJoinType),\r\n        strokeStyleLineAlignment: strokeStyleLineAlignment.encode(stroke.lineAlignment),\r\n        strokeStyleScaleLock: !!stroke.scaleLock,\r\n        strokeStyleStrokeAdjust: !!stroke.strokeAdjust,\r\n        strokeStyleLineDashSet: stroke.lineDashSet || [],\r\n        strokeStyleBlendMode: BlnM.encode(stroke.blendMode),\r\n        strokeStyleOpacity: unitsPercent((_b = stroke.opacity) !== null && _b !== void 0 ? _b : 1),\r\n        strokeStyleContent: serializeVectorContent(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,\r\n        strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'strokeStyle', desc);\r\n});\r\naddHandler('artb', // per-layer arboard info\r\nhasKey('artboard'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    var rect = desc.artboardRect;\r\n    target.artboard = {\r\n        rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },\r\n        guideIndices: desc.guideIndeces,\r\n        presetName: desc.artboardPresetName,\r\n        color: parseColor(desc['Clr ']),\r\n        backgroundType: desc.artboardBackgroundType,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var artboard = target.artboard;\r\n    var rect = artboard.rect;\r\n    var desc = {\r\n        artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },\r\n        guideIndeces: artboard.guideIndices || [],\r\n        artboardPresetName: artboard.presetName || '',\r\n        'Clr ': serializeColor(artboard.color),\r\n        artboardBackgroundType: (_a = artboard.backgroundType) !== null && _a !== void 0 ? _a : 1,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'artboard', desc);\r\n});\r\naddHandler('sn2P', hasKey('usingAlignedRendering'), function (reader, target) { return target.usingAlignedRendering = !!readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.usingAlignedRendering ? 1 : 0); });\r\nvar placedLayerTypes = ['unknown', 'vector', 'raster', 'image stack'];\r\nfunction parseWarp(warp) {\r\n    var _a, _b, _c, _d, _e, _f;\r\n    var result = __assign(__assign({ style: warpStyle.decode(warp.warpStyle) }, (warp.warpValues ? { values: warp.warpValues } : { value: warp.warpValue || 0 })), { perspective: warp.warpPerspective || 0, perspectiveOther: warp.warpPerspectiveOther || 0, rotate: Ornt.decode(warp.warpRotate), bounds: warp.bounds && {\r\n            top: parseUnitsOrNumber(warp.bounds['Top ']),\r\n            left: parseUnitsOrNumber(warp.bounds.Left),\r\n            bottom: parseUnitsOrNumber(warp.bounds.Btom),\r\n            right: parseUnitsOrNumber(warp.bounds.Rght),\r\n        }, uOrder: warp.uOrder, vOrder: warp.vOrder });\r\n    if (warp.deformNumRows != null || warp.deformNumCols != null) {\r\n        result.deformNumRows = warp.deformNumRows;\r\n        result.deformNumCols = warp.deformNumCols;\r\n    }\r\n    var envelopeWarp = warp.customEnvelopeWarp;\r\n    if (envelopeWarp) {\r\n        result.customEnvelopeWarp = {\r\n            meshPoints: [],\r\n        };\r\n        var xs = ((_a = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Hrzn'; })) === null || _a === void 0 ? void 0 : _a.values) || [];\r\n        var ys = ((_b = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Vrtc'; })) === null || _b === void 0 ? void 0 : _b.values) || [];\r\n        for (var i = 0; i < xs.length; i++) {\r\n            result.customEnvelopeWarp.meshPoints.push({ x: xs[i], y: ys[i] });\r\n        }\r\n        if (envelopeWarp.quiltSliceX || envelopeWarp.quiltSliceY) {\r\n            result.customEnvelopeWarp.quiltSliceX = ((_d = (_c = envelopeWarp.quiltSliceX) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.values) || [];\r\n            result.customEnvelopeWarp.quiltSliceY = ((_f = (_e = envelopeWarp.quiltSliceY) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.values) || [];\r\n        }\r\n    }\r\n    return result;\r\n}\r\nfunction isQuiltWarp(warp) {\r\n    var _a, _b;\r\n    return warp.deformNumCols != null || warp.deformNumRows != null ||\r\n        ((_a = warp.customEnvelopeWarp) === null || _a === void 0 ? void 0 : _a.quiltSliceX) || ((_b = warp.customEnvelopeWarp) === null || _b === void 0 ? void 0 : _b.quiltSliceY);\r\n}\r\nfunction encodeWarp(warp) {\r\n    var bounds = warp.bounds;\r\n    var desc = __assign(__assign({ warpStyle: warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value || 0 })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: Ornt.encode(warp.rotate), bounds: /*1 ? { // testing\r\n            _classID: 'classFloatRect',\r\n            'Top ': bounds && bounds.top && bounds.top.value || 0,\r\n            Left: bounds && bounds.left && bounds.left.value || 0,\r\n            Btom: bounds && bounds.bottom && bounds.bottom.value || 0,\r\n            Rght: bounds && bounds.right && bounds.right.value || 0,\r\n        } :*/ {\r\n            'Top ': unitsValue(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),\r\n            Left: unitsValue(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),\r\n            Btom: unitsValue(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),\r\n            Rght: unitsValue(bounds && bounds.right || { units: 'Pixels', value: 0 }, 'bounds.right'),\r\n        }, uOrder: warp.uOrder || 0, vOrder: warp.vOrder || 0 });\r\n    var isQuilt = isQuiltWarp(warp);\r\n    if (isQuilt) {\r\n        var desc2 = desc;\r\n        desc2.deformNumRows = warp.deformNumRows || 0;\r\n        desc2.deformNumCols = warp.deformNumCols || 0;\r\n    }\r\n    var customEnvelopeWarp = warp.customEnvelopeWarp;\r\n    if (customEnvelopeWarp) {\r\n        var meshPoints = customEnvelopeWarp.meshPoints || [];\r\n        if (isQuilt) {\r\n            var desc2 = desc;\r\n            desc2.customEnvelopeWarp = {\r\n                _name: '',\r\n                _classID: 'customEnvelopeWarp',\r\n                quiltSliceX: [{\r\n                        type: 'quiltSliceX',\r\n                        values: customEnvelopeWarp.quiltSliceX || [],\r\n                    }],\r\n                quiltSliceY: [{\r\n                        type: 'quiltSliceY',\r\n                        values: customEnvelopeWarp.quiltSliceY || [],\r\n                    }],\r\n                meshPoints: [\r\n                    { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },\r\n                    { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },\r\n                ],\r\n            };\r\n        }\r\n        else {\r\n            desc.customEnvelopeWarp = {\r\n                _name: '',\r\n                _classID: 'customEnvelopeWarp',\r\n                meshPoints: [\r\n                    { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },\r\n                    { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },\r\n                ],\r\n            };\r\n        }\r\n    }\r\n    return desc;\r\n}\r\naddHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {\r\n    if (readSignature(reader) !== 'plcL')\r\n        throw new Error(\"Invalid PlLd signature\");\r\n    if (readInt32(reader) !== 3)\r\n        throw new Error(\"Invalid PlLd version\");\r\n    var id = readPascalString(reader, 1);\r\n    var pageNumber = readInt32(reader);\r\n    var totalPages = readInt32(reader); // TODO: check how this works ?\r\n    readInt32(reader); // anitAliasPolicy 16\r\n    var placedLayerType = readInt32(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack\r\n    if (!placedLayerTypes[placedLayerType])\r\n        throw new Error('Invalid PlLd type');\r\n    var transform = [];\r\n    for (var i = 0; i < 8; i++)\r\n        transform.push(readFloat64(reader)); // x, y of 4 corners of the transform\r\n    var warpVersion = readInt32(reader);\r\n    if (warpVersion !== 0)\r\n        throw new Error(\"Invalid Warp version \".concat(warpVersion));\r\n    var warp = readVersionAndDescriptor(reader);\r\n    target.placedLayer = target.placedLayer || {\r\n        id: id,\r\n        type: placedLayerTypes[placedLayerType],\r\n        pageNumber: pageNumber,\r\n        totalPages: totalPages,\r\n        transform: transform,\r\n        warp: parseWarp(warp),\r\n    };\r\n    // console.log('PlLd warp', require('util').inspect(warp, false, 99, true));\r\n    // console.log('PlLd', require('util').inspect(target.placedLayer, false, 99, true));\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var placed = target.placedLayer;\r\n    writeSignature(writer, 'plcL');\r\n    writeInt32(writer, 3); // version\r\n    if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {\r\n        throw new Error('Placed layer ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n    }\r\n    writePascalString(writer, placed.id, 1);\r\n    writeInt32(writer, 1); // pageNumber\r\n    writeInt32(writer, 1); // totalPages\r\n    writeInt32(writer, 16); // anitAliasPolicy\r\n    if (placedLayerTypes.indexOf(placed.type) === -1)\r\n        throw new Error('Invalid placedLayer type');\r\n    writeInt32(writer, placedLayerTypes.indexOf(placed.type));\r\n    for (var i = 0; i < 8; i++)\r\n        writeFloat64(writer, placed.transform[i]);\r\n    writeInt32(writer, 0); // warp version\r\n    var warp = getWarpFromPlacedLayer(placed);\r\n    var isQuilt = isQuiltWarp(warp);\r\n    var type = isQuilt ? 'quiltWarp' : 'warp';\r\n    writeVersionAndDescriptor(writer, '', type, encodeWarp(warp), type);\r\n});\r\nfunction uint8ToFloat32(array) {\r\n    return new Float32Array(array.buffer.slice(array.byteOffset), 0, array.byteLength / 4);\r\n}\r\nfunction uint8ToUint32(array) {\r\n    return new Uint32Array(array.buffer.slice(array.byteOffset), 0, array.byteLength / 4);\r\n}\r\nfunction toUint8(array) {\r\n    return new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\r\n}\r\nfunction arrayToPoints(array) {\r\n    var points = [];\r\n    for (var i = 0; i < array.length; i += 2) {\r\n        points.push({ x: array[i], y: array[i + 1] });\r\n    }\r\n    return points;\r\n}\r\nfunction pointsToArray(points) {\r\n    var array = [];\r\n    for (var i = 0; i < points.length; i++) {\r\n        array.push(points[i].x, points[i].y);\r\n    }\r\n    return array;\r\n}\r\nfunction uint8ToPoints(array) {\r\n    return arrayToPoints(uint8ToFloat32(array));\r\n}\r\nfunction hrznVrtcToPoint(desc) {\r\n    return {\r\n        x: parseUnits(desc.Hrzn),\r\n        y: parseUnits(desc.Vrtc),\r\n    };\r\n}\r\nfunction pointToHrznVrtc(point) {\r\n    return {\r\n        _name: '',\r\n        _classID: 'Pnt ',\r\n        Hrzn: unitsValue(point.x, 'x'),\r\n        Vrtc: unitsValue(point.y, 'y'),\r\n    };\r\n}\r\nfunction parseFilterFXItem(f, options) {\r\n    var base = {\r\n        name: f['Nm  '],\r\n        opacity: parsePercent(f.blendOptions.Opct),\r\n        blendMode: BlnM.decode(f.blendOptions['Md  ']),\r\n        enabled: f.enab,\r\n        hasOptions: f.hasoptions,\r\n        foregroundColor: parseColor(f.FrgC),\r\n        backgroundColor: parseColor(f.BckC),\r\n    };\r\n    if ('Fltr' in f) {\r\n        switch (f.Fltr._classID) {\r\n            case 'boxblur': return __assign(__assign({}, base), { type: 'box blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'GsnB': return __assign(__assign({}, base), { type: 'gaussian blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'MtnB': return __assign(__assign({}, base), { type: 'motion blur', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                    distance: parseUnits(f.Fltr.Dstn),\r\n                } });\r\n            case 'RdlB': return __assign(__assign({}, base), { type: 'radial blur', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    method: BlrM.decode(f.Fltr.BlrM),\r\n                    quality: BlrQ.decode(f.Fltr.BlrQ),\r\n                } });\r\n            case 'shapeBlur': return __assign(__assign({}, base), { type: 'shape blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    customShape: { name: f.Fltr.customShape['Nm  '], id: f.Fltr.customShape.Idnt },\r\n                } });\r\n            case 'SmrB': return __assign(__assign({}, base), { type: 'smart blur', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    threshold: f.Fltr.Thsh,\r\n                    quality: SmBQ.decode(f.Fltr.SmBQ),\r\n                    mode: SmBM.decode(f.Fltr.SmBM),\r\n                } });\r\n            case 'surfaceBlur': return __assign(__assign({}, base), { type: 'surface blur', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Dspl': return __assign(__assign({}, base), { type: 'displace', filter: {\r\n                    horizontalScale: f.Fltr.HrzS,\r\n                    verticalScale: f.Fltr.VrtS,\r\n                    displacementMap: DspM.decode(f.Fltr.DspM),\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                    displacementFile: {\r\n                        signature: f.Fltr.DspF.sig,\r\n                        path: f.Fltr.DspF.path, // TODO: this is decoded incorrectly ???\r\n                    },\r\n                } });\r\n            case 'Pnch': return __assign(__assign({}, base), { type: 'pinch', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                } });\r\n            case 'Plr ': return __assign(__assign({}, base), { type: 'polar coordinates', filter: {\r\n                    conversion: Cnvr.decode(f.Fltr.Cnvr),\r\n                } });\r\n            case 'Rple': return __assign(__assign({}, base), { type: 'ripple', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    size: RplS.decode(f.Fltr.RplS),\r\n                } });\r\n            case 'Shr ': return __assign(__assign({}, base), { type: 'shear', filter: {\r\n                    shearPoints: f.Fltr.ShrP.map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),\r\n                    shearStart: f.Fltr.ShrS,\r\n                    shearEnd: f.Fltr.ShrE,\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                } });\r\n            case 'Sphr': return __assign(__assign({}, base), { type: 'spherize', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    mode: SphM.decode(f.Fltr.SphM),\r\n                } });\r\n            case 'Twrl': return __assign(__assign({}, base), { type: 'twirl', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                } });\r\n            case 'Wave': return __assign(__assign({}, base), { type: 'wave', filter: {\r\n                    numberOfGenerators: f.Fltr.NmbG,\r\n                    type: Wvtp.decode(f.Fltr.Wvtp),\r\n                    wavelength: { min: f.Fltr.WLMn, max: f.Fltr.WLMx },\r\n                    amplitude: { min: f.Fltr.AmMn, max: f.Fltr.AmMx },\r\n                    scale: { x: f.Fltr.SclH, y: f.Fltr.SclV },\r\n                    randomSeed: f.Fltr.RndS,\r\n                    undefinedAreas: UndA.decode(f.Fltr.UndA),\r\n                } });\r\n            case 'ZgZg': return __assign(__assign({}, base), { type: 'zigzag', filter: {\r\n                    amount: f.Fltr.Amnt,\r\n                    ridges: f.Fltr.NmbR,\r\n                    style: ZZTy.decode(f.Fltr.ZZTy),\r\n                } });\r\n            case 'AdNs': return __assign(__assign({}, base), { type: 'add noise', filter: {\r\n                    amount: parsePercent(f.Fltr.Nose),\r\n                    distribution: Dstr.decode(f.Fltr.Dstr),\r\n                    monochromatic: f.Fltr.Mnch,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'DstS': return __assign(__assign({}, base), { type: 'dust and scratches', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Mdn ': return __assign(__assign({}, base), { type: 'median', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'denoise': return __assign(__assign({}, base), { type: 'reduce noise', filter: {\r\n                    preset: f.Fltr.preset,\r\n                    removeJpegArtifact: f.Fltr.removeJPEGArtifact,\r\n                    reduceColorNoise: parsePercent(f.Fltr.ClNs),\r\n                    sharpenDetails: parsePercent(f.Fltr.Shrp),\r\n                    channelDenoise: f.Fltr.channelDenoise.map(function (c) { return (__assign({ channels: c.Chnl.map(Chnl.decode), amount: c.Amnt }, (c.EdgF ? { preserveDetails: c.EdgF } : {}))); }),\r\n                } });\r\n            case 'ClrH': return __assign(__assign({}, base), { type: 'color halftone', filter: {\r\n                    radius: f.Fltr['Rds '],\r\n                    angle1: f.Fltr.Ang1,\r\n                    angle2: f.Fltr.Ang2,\r\n                    angle3: f.Fltr.Ang3,\r\n                    angle4: f.Fltr.Ang4,\r\n                } });\r\n            case 'Crst': return __assign(__assign({}, base), { type: 'crystallize', filter: {\r\n                    cellSize: f.Fltr.ClSz,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Mztn': return __assign(__assign({}, base), { type: 'mezzotint', filter: {\r\n                    type: MztT.decode(f.Fltr.MztT),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Msc ': return __assign(__assign({}, base), { type: 'mosaic', filter: {\r\n                    cellSize: parseUnits(f.Fltr.ClSz),\r\n                } });\r\n            case 'Pntl': return __assign(__assign({}, base), { type: 'pointillize', filter: {\r\n                    cellSize: f.Fltr.ClSz,\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Clds': return __assign(__assign({}, base), { type: 'clouds', filter: {\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'DfrC': return __assign(__assign({}, base), { type: 'difference clouds', filter: {\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Fbrs': return __assign(__assign({}, base), { type: 'fibers', filter: {\r\n                    variance: f.Fltr.Vrnc,\r\n                    strength: f.Fltr.Strg,\r\n                    randomSeed: f.Fltr.RndS,\r\n                } });\r\n            case 'LnsF': return __assign(__assign({}, base), { type: 'lens flare', filter: {\r\n                    brightness: f.Fltr.Brgh,\r\n                    position: { x: f.Fltr.FlrC.Hrzn, y: f.Fltr.FlrC.Vrtc },\r\n                    lensType: Lns.decode(f.Fltr['Lns ']),\r\n                } });\r\n            case 'smartSharpen': return __assign(__assign({}, base), { type: 'smart sharpen', filter: {\r\n                    amount: parsePercent(f.Fltr.Amnt),\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                    angle: f.Fltr.Angl,\r\n                    moreAccurate: f.Fltr.moreAccurate,\r\n                    blur: blurType.decode(f.Fltr.blur),\r\n                    preset: f.Fltr.preset,\r\n                    shadow: {\r\n                        fadeAmount: parsePercent(f.Fltr.sdwM.Amnt),\r\n                        tonalWidth: parsePercent(f.Fltr.sdwM.Wdth),\r\n                        radius: f.Fltr.sdwM['Rds '],\r\n                    },\r\n                    highlight: {\r\n                        fadeAmount: parsePercent(f.Fltr.hglM.Amnt),\r\n                        tonalWidth: parsePercent(f.Fltr.hglM.Wdth),\r\n                        radius: f.Fltr.hglM['Rds '],\r\n                    },\r\n                } });\r\n            case 'UnsM': return __assign(__assign({}, base), { type: 'unsharp mask', filter: {\r\n                    amount: parsePercent(f.Fltr.Amnt),\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                    threshold: f.Fltr.Thsh,\r\n                } });\r\n            case 'Dfs ': return __assign(__assign({}, base), { type: 'diffuse', filter: {\r\n                    mode: DfsM.decode(f.Fltr['Md  ']),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'Embs': return __assign(__assign({}, base), { type: 'emboss', filter: {\r\n                    angle: f.Fltr.Angl,\r\n                    height: f.Fltr.Hght,\r\n                    amount: f.Fltr.Amnt,\r\n                } });\r\n            case 'Extr': return __assign(__assign({}, base), { type: 'extrude', filter: {\r\n                    type: ExtT.decode(f.Fltr.ExtT),\r\n                    size: f.Fltr.ExtS,\r\n                    depth: f.Fltr.ExtD,\r\n                    depthMode: ExtR.decode(f.Fltr.ExtR),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                    solidFrontFaces: f.Fltr.ExtF,\r\n                    maskIncompleteBlocks: f.Fltr.ExtM,\r\n                } });\r\n            case 'Tls ': return __assign(__assign({}, base), { type: 'tiles', filter: {\r\n                    numberOfTiles: f.Fltr.TlNm,\r\n                    maximumOffset: f.Fltr.TlOf,\r\n                    fillEmptyAreaWith: FlCl.decode(f.Fltr.FlCl),\r\n                    randomSeed: f.Fltr.FlRs,\r\n                } });\r\n            case 'TrcC': return __assign(__assign({}, base), { type: 'trace contour', filter: {\r\n                    level: f.Fltr['Lvl '],\r\n                    edge: CntE.decode(f.Fltr['Edg ']),\r\n                } });\r\n            case 'Wnd ': return __assign(__assign({}, base), { type: 'wind', filter: {\r\n                    method: WndM.decode(f.Fltr.WndM),\r\n                    direction: Drct.decode(f.Fltr.Drct),\r\n                } });\r\n            case 'Dntr': return __assign(__assign({}, base), { type: 'de-interlace', filter: {\r\n                    eliminate: IntE.decode(f.Fltr.IntE),\r\n                    newFieldsBy: IntC.decode(f.Fltr.IntC),\r\n                } });\r\n            case 'Cstm': return __assign(__assign({}, base), { type: 'custom', filter: {\r\n                    scale: f.Fltr['Scl '],\r\n                    offset: f.Fltr.Ofst,\r\n                    matrix: f.Fltr.Mtrx,\r\n                } });\r\n            case 'HghP': return __assign(__assign({}, base), { type: 'high pass', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Mxm ': return __assign(__assign({}, base), { type: 'maximum', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Mnm ': return __assign(__assign({}, base), { type: 'minimum', filter: {\r\n                    radius: parseUnits(f.Fltr['Rds ']),\r\n                } });\r\n            case 'Ofst': return __assign(__assign({}, base), { type: 'offset', filter: {\r\n                    horizontal: f.Fltr.Hrzn,\r\n                    vertical: f.Fltr.Vrtc,\r\n                    undefinedAreas: FlMd.decode(f.Fltr['Fl  ']),\r\n                } });\r\n            case 'rigidTransform': return __assign(__assign({}, base), { type: 'puppet', filter: {\r\n                    rigidType: f.Fltr.rigidType,\r\n                    bounds: [\r\n                        { x: f.Fltr.PuX0, y: f.Fltr.PuY0, },\r\n                        { x: f.Fltr.PuX1, y: f.Fltr.PuY1, },\r\n                        { x: f.Fltr.PuX2, y: f.Fltr.PuY2, },\r\n                        { x: f.Fltr.PuX3, y: f.Fltr.PuY3, },\r\n                    ],\r\n                    puppetShapeList: f.Fltr.puppetShapeList.map(function (p) { return ({\r\n                        rigidType: p.rigidType,\r\n                        // TODO: VrsM\r\n                        // TODO: VrsN\r\n                        originalVertexArray: uint8ToPoints(p.originalVertexArray),\r\n                        deformedVertexArray: uint8ToPoints(p.deformedVertexArray),\r\n                        indexArray: Array.from(uint8ToUint32(p.indexArray)),\r\n                        pinOffsets: arrayToPoints(p.pinOffsets),\r\n                        posFinalPins: arrayToPoints(p.posFinalPins),\r\n                        pinVertexIndices: p.pinVertexIndices,\r\n                        selectedPin: p.selectedPin,\r\n                        pinPosition: arrayToPoints(p.PinP),\r\n                        pinRotation: p.PnRt,\r\n                        pinOverlay: p.PnOv,\r\n                        pinDepth: p.PnDp,\r\n                        meshQuality: p.meshQuality,\r\n                        meshExpansion: p.meshExpansion,\r\n                        meshRigidity: p.meshRigidity,\r\n                        imageResolution: p.imageResolution,\r\n                        meshBoundaryPath: {\r\n                            pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({\r\n                                shapeOperation: c.shapeOperation.split('.')[1],\r\n                                paths: c.SbpL.map(function (t) { return ({\r\n                                    closed: t.Clsp,\r\n                                    points: t['Pts '].map(function (pt) { return ({\r\n                                        anchor: hrznVrtcToPoint(pt.Anch),\r\n                                        forward: hrznVrtcToPoint(pt['Fwd ']),\r\n                                        backward: hrznVrtcToPoint(pt['Bwd ']),\r\n                                        smooth: pt.Smoo,\r\n                                    }); }),\r\n                                }); }),\r\n                            }); }),\r\n                        },\r\n                    }); }),\r\n                } });\r\n            case 'PbPl': {\r\n                var parameters = [];\r\n                var Flrt = f.Fltr;\r\n                for (var i = 0; i < fromAtoZ.length; i++) {\r\n                    if (!Flrt[\"PN\".concat(fromAtoZ[i], \"a\")])\r\n                        break;\r\n                    for (var j = 0; j < fromAtoZ.length; j++) {\r\n                        if (!Flrt[\"PN\".concat(fromAtoZ[i]).concat(fromAtoZ[j])])\r\n                            break;\r\n                        parameters.push({\r\n                            name: Flrt[\"PN\".concat(fromAtoZ[i]).concat(fromAtoZ[j])],\r\n                            value: Flrt[\"PF\".concat(fromAtoZ[i]).concat(fromAtoZ[j])]\r\n                        });\r\n                    }\r\n                }\r\n                return __assign(__assign({}, base), { type: 'oil paint plugin', filter: {\r\n                        name: f.Fltr.KnNm,\r\n                        gpu: f.Fltr.GpuY,\r\n                        lighting: f.Fltr.LIWy,\r\n                        parameters: parameters,\r\n                    } });\r\n            }\r\n            // case 2089: return {\r\n            // \t...base,\r\n            // \ttype: 'adaptive wide angle',\r\n            // \tparams: {\r\n            // \t\tcorrection: prjM.decode(f.Fltr.prjM),\r\n            // \t\tfocalLength: f.Fltr.focL,\r\n            // \t\tcropFactor: f.Fltr.CrpF,\r\n            // \t\timageScale: f.Fltr.imgS,\r\n            // \t\timageX: f.Fltr.imgX,\r\n            // \t\timageY: f.Fltr.imgY,\r\n            // \t},\r\n            // };\r\n            case 'HsbP': return __assign(__assign({}, base), { type: 'hsb/hsl', filter: {\r\n                    inputMode: ClrS.decode(f.Fltr.Inpt),\r\n                    rowOrder: ClrS.decode(f.Fltr.Otpt),\r\n                } });\r\n            case 'oilPaint': return __assign(__assign({}, base), { type: 'oil paint', filter: {\r\n                    lightingOn: f.Fltr.lightingOn,\r\n                    stylization: f.Fltr.stylization,\r\n                    cleanliness: f.Fltr.cleanliness,\r\n                    brushScale: f.Fltr.brushScale,\r\n                    microBrush: f.Fltr.microBrush,\r\n                    lightDirection: f.Fltr.LghD,\r\n                    specularity: f.Fltr.specularity,\r\n                } });\r\n            case 'LqFy':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'liquify', filter: {\r\n                            liquifyMesh: f.Fltr.LqMe,\r\n                        } });\r\n                }\r\n                ;\r\n            case 'perspectiveWarpTransform':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'perspective warp', filter: {\r\n                            vertices: f.Fltr.vertices.map(hrznVrtcToPoint),\r\n                            warpedVertices: f.Fltr.warpedVertices.map(hrznVrtcToPoint),\r\n                            quads: f.Fltr.quads.map(function (q) { return q.indices; }),\r\n                        } });\r\n                }\r\n                ;\r\n            case 'Crvs':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'curves', filter: __assign({ presetKind: presetKindType.decode(f.Fltr.presetKind) }, (f.Fltr.Adjs ? {\r\n                            adjustments: f.Fltr.Adjs.map(function (a) {\r\n                                var channels = a.Chnl.map(Chnl.decode);\r\n                                if (a['Crv ']) {\r\n                                    return {\r\n                                        channels: channels,\r\n                                        curve: a['Crv '].map(function (c) {\r\n                                            var point = { x: c.Hrzn, y: c.Vrtc };\r\n                                            if (c.Cnty)\r\n                                                point.curved = true;\r\n                                            return point;\r\n                                        }),\r\n                                    };\r\n                                }\r\n                                else if (a.Mpng) {\r\n                                    return { channels: channels, values: a.Mpng };\r\n                                }\r\n                                else {\r\n                                    throw new Error(\"Unknown curve adjustment\");\r\n                                }\r\n                            })\r\n                        } : {})) });\r\n                }\r\n                ;\r\n            case 'BrgC':\r\n                {\r\n                    return __assign(__assign({}, base), { type: 'brightness/contrast', filter: {\r\n                            brightness: f.Fltr.Brgh,\r\n                            contrast: f.Fltr.Cntr,\r\n                            useLegacy: !!f.Fltr.useLegacy,\r\n                        } });\r\n                }\r\n                ;\r\n            default:\r\n                if (options.throwForMissingFeatures) {\r\n                    // console.log('FILTER', require('util').inspect(f, false, 99, true));\r\n                    throw new Error(\"Unknown filter classId: \".concat(f.Fltr._classID));\r\n                }\r\n                return undefined;\r\n        }\r\n    }\r\n    else {\r\n        switch (f.filterID) {\r\n            case 1098281575: return __assign(__assign({}, base), { type: 'average' });\r\n            case 1114403360: return __assign(__assign({}, base), { type: 'blur' });\r\n            case 1114403405: return __assign(__assign({}, base), { type: 'blur more' });\r\n            case 1148416099: return __assign(__assign({}, base), { type: 'despeckle' });\r\n            case 1180922912: return __assign(__assign({}, base), { type: 'facet' });\r\n            case 1181902701: return __assign(__assign({}, base), { type: 'fragment' });\r\n            case 1399353968: return __assign(__assign({}, base), { type: 'sharpen' });\r\n            case 1399353925: return __assign(__assign({}, base), { type: 'sharpen edges' });\r\n            case 1399353933: return __assign(__assign({}, base), { type: 'sharpen more' });\r\n            case 1181639749: return __assign(__assign({}, base), { type: 'find edges' });\r\n            case 1399616122: return __assign(__assign({}, base), { type: 'solarize' });\r\n            case 1314149187: return __assign(__assign({}, base), { type: 'ntsc colors' });\r\n            case 1231976050: return __assign(__assign({}, base), { type: 'invert' });\r\n            default:\r\n                if (options.throwForMissingFeatures) {\r\n                    // console.log('FILTER', require('util').inspect(f, false, 99, true));\r\n                    throw new Error(\"Unknown filterID: \".concat(f.filterID));\r\n                }\r\n        }\r\n    }\r\n}\r\nfunction parseFilterFX(desc, options) {\r\n    return {\r\n        enabled: desc.enab,\r\n        validAtPosition: desc.validAtPosition,\r\n        maskEnabled: desc.filterMaskEnable,\r\n        maskLinked: desc.filterMaskLinked,\r\n        maskExtendWithWhite: desc.filterMaskExtendWithWhite,\r\n        list: desc.filterFXList.map(function (x) { return parseFilterFXItem(x, options); }).filter(function (x) { return !!x; }),\r\n    };\r\n}\r\nfunction uvRadius(t) {\r\n    return unitsValue(t.radius, 'radius');\r\n}\r\nfunction serializeFilterFXItem(f) {\r\n    var base = {\r\n        _name: '',\r\n        _classID: 'filterFX',\r\n        'Nm  ': f.name,\r\n        blendOptions: {\r\n            _name: '',\r\n            _classID: 'blendOptions',\r\n            Opct: unitsPercentF(f.opacity),\r\n            'Md  ': BlnM.encode(f.blendMode),\r\n        },\r\n        enab: f.enabled,\r\n        hasoptions: f.hasOptions,\r\n        FrgC: serializeColor(f.foregroundColor),\r\n        BckC: serializeColor(f.backgroundColor),\r\n    };\r\n    switch (f.type) {\r\n        case 'average': return __assign(__assign({}, base), { filterID: 1098281575 });\r\n        case 'blur': return __assign(__assign({}, base), { filterID: 1114403360 });\r\n        case 'blur more': return __assign(__assign({}, base), { filterID: 1114403405 });\r\n        case 'box blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Box Blur',\r\n                _classID: 'boxblur',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 697 });\r\n        case 'gaussian blur': return __assign(__assign({}, base), { Fltr: {\r\n                // _name: '高斯模糊', // Testing\r\n                _name: 'Gaussian Blur',\r\n                _classID: 'GsnB',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1198747202 });\r\n        case 'motion blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Motion Blur',\r\n                _classID: 'MtnB',\r\n                Angl: f.filter.angle,\r\n                Dstn: unitsValue(f.filter.distance, 'distance'),\r\n            }, filterID: 1299476034 });\r\n        case 'radial blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Radial Blur',\r\n                _classID: 'RdlB',\r\n                Amnt: f.filter.amount,\r\n                BlrM: BlrM.encode(f.filter.method),\r\n                BlrQ: BlrQ.encode(f.filter.quality),\r\n            }, filterID: 1382313026 });\r\n        case 'shape blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Shape Blur',\r\n                _classID: 'shapeBlur',\r\n                'Rds ': uvRadius(f.filter),\r\n                customShape: {\r\n                    _name: '',\r\n                    _classID: 'customShape',\r\n                    'Nm  ': f.filter.customShape.name,\r\n                    Idnt: f.filter.customShape.id,\r\n                }\r\n            }, filterID: 702 });\r\n        case 'smart blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Smart Blur',\r\n                _classID: 'SmrB',\r\n                'Rds ': f.filter.radius,\r\n                Thsh: f.filter.threshold,\r\n                SmBQ: SmBQ.encode(f.filter.quality),\r\n                SmBM: SmBM.encode(f.filter.mode),\r\n            }, filterID: 1399681602 });\r\n        case 'surface blur': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Surface Blur',\r\n                _classID: 'surfaceBlur',\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 701 });\r\n        case 'displace': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Displace',\r\n                _classID: 'Dspl',\r\n                HrzS: f.filter.horizontalScale,\r\n                VrtS: f.filter.verticalScale,\r\n                DspM: DspM.encode(f.filter.displacementMap),\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                DspF: {\r\n                    sig: f.filter.displacementFile.signature,\r\n                    path: f.filter.displacementFile.path,\r\n                },\r\n            }, filterID: 1148416108 });\r\n        case 'pinch': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Pinch',\r\n                _classID: 'Pnch',\r\n                Amnt: f.filter.amount,\r\n            }, filterID: 1349411688 });\r\n        case 'polar coordinates': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Polar Coordinates',\r\n                _classID: 'Plr ',\r\n                Cnvr: Cnvr.encode(f.filter.conversion),\r\n            }, filterID: 1349284384 });\r\n        case 'ripple': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Ripple',\r\n                _classID: 'Rple',\r\n                Amnt: f.filter.amount,\r\n                RplS: RplS.encode(f.filter.size),\r\n            }, filterID: 1383099493 });\r\n        case 'shear': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Shear',\r\n                _classID: 'Shr ',\r\n                ShrP: f.filter.shearPoints.map(function (p) { return ({ _name: '', _classID: 'Pnt ', Hrzn: p.x, Vrtc: p.y }); }),\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                ShrS: f.filter.shearStart,\r\n                ShrE: f.filter.shearEnd,\r\n            }, filterID: 1399353888 });\r\n        case 'spherize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Spherize',\r\n                _classID: 'Sphr',\r\n                Amnt: f.filter.amount,\r\n                SphM: SphM.encode(f.filter.mode),\r\n            }, filterID: 1399875698 });\r\n        case 'twirl': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Twirl',\r\n                _classID: 'Twrl',\r\n                Angl: f.filter.angle,\r\n            }, filterID: 1417114220 });\r\n        case 'wave': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Wave',\r\n                _classID: 'Wave',\r\n                Wvtp: Wvtp.encode(f.filter.type),\r\n                NmbG: f.filter.numberOfGenerators,\r\n                WLMn: f.filter.wavelength.min,\r\n                WLMx: f.filter.wavelength.max,\r\n                AmMn: f.filter.amplitude.min,\r\n                AmMx: f.filter.amplitude.max,\r\n                SclH: f.filter.scale.x,\r\n                SclV: f.filter.scale.y,\r\n                UndA: UndA.encode(f.filter.undefinedAreas),\r\n                RndS: f.filter.randomSeed,\r\n            }, filterID: 1466005093 });\r\n        case 'zigzag': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'ZigZag',\r\n                _classID: 'ZgZg',\r\n                Amnt: f.filter.amount,\r\n                NmbR: f.filter.ridges,\r\n                ZZTy: ZZTy.encode(f.filter.style),\r\n            }, filterID: 1516722791 });\r\n        case 'add noise': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Add Noise',\r\n                _classID: 'AdNs',\r\n                Dstr: Dstr.encode(f.filter.distribution),\r\n                Nose: unitsPercentF(f.filter.amount),\r\n                Mnch: f.filter.monochromatic,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1097092723 });\r\n        case 'despeckle': return __assign(__assign({}, base), { filterID: 1148416099 });\r\n        case 'dust and scratches': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Dust & Scratches',\r\n                _classID: 'DstS',\r\n                'Rds ': f.filter.radius,\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 1148417107 });\r\n        case 'median': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Median',\r\n                _classID: 'Mdn ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1298427424 });\r\n        case 'reduce noise': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Reduce Noise',\r\n                _classID: 'denoise',\r\n                ClNs: unitsPercentF(f.filter.reduceColorNoise),\r\n                Shrp: unitsPercentF(f.filter.sharpenDetails),\r\n                removeJPEGArtifact: f.filter.removeJpegArtifact,\r\n                channelDenoise: f.filter.channelDenoise.map(function (c) { return (__assign({ _name: '', _classID: 'channelDenoiseParams', Chnl: c.channels.map(function (i) { return Chnl.encode(i); }), Amnt: c.amount }, (c.preserveDetails ? { EdgF: c.preserveDetails } : {}))); }),\r\n                preset: f.filter.preset,\r\n            }, filterID: 633 });\r\n        case 'color halftone': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Color Halftone',\r\n                _classID: 'ClrH',\r\n                'Rds ': f.filter.radius,\r\n                Ang1: f.filter.angle1,\r\n                Ang2: f.filter.angle2,\r\n                Ang3: f.filter.angle3,\r\n                Ang4: f.filter.angle4,\r\n            }, filterID: 1131180616 });\r\n        case 'crystallize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Crystallize',\r\n                _classID: 'Crst',\r\n                ClSz: f.filter.cellSize,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1131574132 });\r\n        case 'facet': return __assign(__assign({}, base), { filterID: 1180922912 });\r\n        case 'fragment': return __assign(__assign({}, base), { filterID: 1181902701 });\r\n        case 'mezzotint': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Mezzotint',\r\n                _classID: 'Mztn',\r\n                MztT: MztT.encode(f.filter.type),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1299870830 });\r\n        case 'mosaic': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Mosaic',\r\n                _classID: 'Msc ',\r\n                ClSz: unitsValue(f.filter.cellSize, 'cellSize'),\r\n            }, filterID: 1299407648 });\r\n        case 'pointillize': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Pointillize',\r\n                _classID: 'Pntl',\r\n                ClSz: f.filter.cellSize,\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1349416044 });\r\n        case 'clouds': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Clouds',\r\n                _classID: 'Clds',\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1131177075 });\r\n        case 'difference clouds': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Difference Clouds',\r\n                _classID: 'DfrC',\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1147564611 });\r\n        case 'fibers': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Fibers',\r\n                _classID: 'Fbrs',\r\n                Vrnc: f.filter.variance,\r\n                Strg: f.filter.strength,\r\n                RndS: f.filter.randomSeed,\r\n            }, filterID: 1180856947 });\r\n        case 'lens flare': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Lens Flare',\r\n                _classID: 'LnsF',\r\n                Brgh: f.filter.brightness,\r\n                FlrC: {\r\n                    _name: '',\r\n                    _classID: 'Pnt ',\r\n                    Hrzn: f.filter.position.x,\r\n                    Vrtc: f.filter.position.y,\r\n                },\r\n                'Lns ': Lns.encode(f.filter.lensType),\r\n            }, filterID: 1282306886 });\r\n        case 'sharpen': return __assign(__assign({}, base), { filterID: 1399353968 });\r\n        case 'sharpen edges': return __assign(__assign({}, base), { filterID: 1399353925 });\r\n        case 'sharpen more': return __assign(__assign({}, base), { filterID: 1399353933 });\r\n        case 'smart sharpen': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Smart Sharpen',\r\n                _classID: 'smartSharpen',\r\n                Amnt: unitsPercentF(f.filter.amount),\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n                Angl: f.filter.angle,\r\n                moreAccurate: f.filter.moreAccurate,\r\n                blur: blurType.encode(f.filter.blur),\r\n                preset: f.filter.preset,\r\n                sdwM: {\r\n                    _name: 'Parameters',\r\n                    _classID: 'adaptCorrectTones',\r\n                    Amnt: unitsPercentF(f.filter.shadow.fadeAmount),\r\n                    Wdth: unitsPercentF(f.filter.shadow.tonalWidth),\r\n                    'Rds ': f.filter.shadow.radius,\r\n                },\r\n                hglM: {\r\n                    _name: 'Parameters',\r\n                    _classID: 'adaptCorrectTones',\r\n                    Amnt: unitsPercentF(f.filter.highlight.fadeAmount),\r\n                    Wdth: unitsPercentF(f.filter.highlight.tonalWidth),\r\n                    'Rds ': f.filter.highlight.radius,\r\n                },\r\n            }, filterID: 698 });\r\n        case 'unsharp mask': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Unsharp Mask',\r\n                _classID: 'UnsM',\r\n                Amnt: unitsPercentF(f.filter.amount),\r\n                'Rds ': uvRadius(f.filter),\r\n                Thsh: f.filter.threshold,\r\n            }, filterID: 1433301837 });\r\n        case 'diffuse': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Diffuse',\r\n                _classID: 'Dfs ',\r\n                'Md  ': DfsM.encode(f.filter.mode),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1147564832 });\r\n        case 'emboss': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Emboss',\r\n                _classID: 'Embs',\r\n                Angl: f.filter.angle,\r\n                Hght: f.filter.height,\r\n                Amnt: f.filter.amount,\r\n            }, filterID: 1164796531 });\r\n        case 'extrude': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Extrude',\r\n                _classID: 'Extr',\r\n                ExtS: f.filter.size,\r\n                ExtD: f.filter.depth,\r\n                ExtF: f.filter.solidFrontFaces,\r\n                ExtM: f.filter.maskIncompleteBlocks,\r\n                ExtT: ExtT.encode(f.filter.type),\r\n                ExtR: ExtR.encode(f.filter.depthMode),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1165522034 });\r\n        case 'find edges': return __assign(__assign({}, base), { filterID: 1181639749 });\r\n        case 'solarize': return __assign(__assign({}, base), { filterID: 1399616122 });\r\n        case 'tiles': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Tiles',\r\n                _classID: 'Tls ',\r\n                TlNm: f.filter.numberOfTiles,\r\n                TlOf: f.filter.maximumOffset,\r\n                FlCl: FlCl.encode(f.filter.fillEmptyAreaWith),\r\n                FlRs: f.filter.randomSeed,\r\n            }, filterID: 1416393504 });\r\n        case 'trace contour': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Trace Contour',\r\n                _classID: 'TrcC',\r\n                'Lvl ': f.filter.level,\r\n                'Edg ': CntE.encode(f.filter.edge),\r\n            }, filterID: 1416782659 });\r\n        case 'wind': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Wind',\r\n                _classID: 'Wnd ',\r\n                WndM: WndM.encode(f.filter.method),\r\n                Drct: Drct.encode(f.filter.direction),\r\n            }, filterID: 1466852384 });\r\n        case 'de-interlace': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'De-Interlace',\r\n                _classID: 'Dntr',\r\n                IntE: IntE.encode(f.filter.eliminate),\r\n                IntC: IntC.encode(f.filter.newFieldsBy),\r\n            }, filterID: 1148089458 });\r\n        case 'ntsc colors': return __assign(__assign({}, base), { filterID: 1314149187 });\r\n        case 'invert': return __assign(__assign({}, base), { filterID: 1231976050 });\r\n        case 'custom': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Custom',\r\n                _classID: 'Cstm',\r\n                'Scl ': f.filter.scale,\r\n                Ofst: f.filter.offset,\r\n                Mtrx: f.filter.matrix,\r\n            }, filterID: 1131639917 });\r\n        case 'high pass': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'High Pass',\r\n                _classID: 'HghP',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1214736464 });\r\n        case 'maximum': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Maximum',\r\n                _classID: 'Mxm ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1299737888 });\r\n        case 'minimum': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Minimum',\r\n                _classID: 'Mnm ',\r\n                'Rds ': uvRadius(f.filter),\r\n            }, filterID: 1299082528 });\r\n        case 'offset': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Offset',\r\n                _classID: 'Ofst',\r\n                Hrzn: f.filter.horizontal,\r\n                Vrtc: f.filter.vertical,\r\n                'Fl  ': FlMd.encode(f.filter.undefinedAreas),\r\n            }, filterID: 1332114292 });\r\n        case 'puppet': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Rigid Transform',\r\n                _classID: 'rigidTransform',\r\n                'null': ['Ordn.Trgt'],\r\n                rigidType: f.filter.rigidType,\r\n                puppetShapeList: f.filter.puppetShapeList.map(function (p) { return ({\r\n                    _name: '',\r\n                    _classID: 'puppetShape',\r\n                    rigidType: p.rigidType,\r\n                    VrsM: 1,\r\n                    VrsN: 0,\r\n                    originalVertexArray: toUint8(new Float32Array(pointsToArray(p.originalVertexArray))),\r\n                    deformedVertexArray: toUint8(new Float32Array(pointsToArray(p.deformedVertexArray))),\r\n                    indexArray: toUint8(new Uint32Array(p.indexArray)),\r\n                    pinOffsets: pointsToArray(p.pinOffsets),\r\n                    posFinalPins: pointsToArray(p.posFinalPins),\r\n                    pinVertexIndices: p.pinVertexIndices,\r\n                    PinP: pointsToArray(p.pinPosition),\r\n                    PnRt: p.pinRotation,\r\n                    PnOv: p.pinOverlay,\r\n                    PnDp: p.pinDepth,\r\n                    meshQuality: p.meshQuality,\r\n                    meshExpansion: p.meshExpansion,\r\n                    meshRigidity: p.meshRigidity,\r\n                    imageResolution: p.imageResolution,\r\n                    meshBoundaryPath: {\r\n                        _name: '',\r\n                        _classID: 'pathClass',\r\n                        pathComponents: p.meshBoundaryPath.pathComponents.map(function (c) { return ({\r\n                            _name: '',\r\n                            _classID: 'PaCm',\r\n                            shapeOperation: \"shapeOperation.\".concat(c.shapeOperation),\r\n                            SbpL: c.paths.map(function (path) { return ({\r\n                                _name: '',\r\n                                _classID: 'Sbpl',\r\n                                Clsp: path.closed,\r\n                                'Pts ': path.points.map(function (pt) { return ({\r\n                                    _name: '',\r\n                                    _classID: 'Pthp',\r\n                                    Anch: pointToHrznVrtc(pt.anchor),\r\n                                    'Fwd ': pointToHrznVrtc(pt.forward),\r\n                                    'Bwd ': pointToHrznVrtc(pt.backward),\r\n                                    Smoo: pt.smooth,\r\n                                }); }),\r\n                            }); }),\r\n                        }); }),\r\n                    },\r\n                    selectedPin: p.selectedPin,\r\n                }); }),\r\n                PuX0: f.filter.bounds[0].x,\r\n                PuX1: f.filter.bounds[1].x,\r\n                PuX2: f.filter.bounds[2].x,\r\n                PuX3: f.filter.bounds[3].x,\r\n                PuY0: f.filter.bounds[0].y,\r\n                PuY1: f.filter.bounds[1].y,\r\n                PuY2: f.filter.bounds[2].y,\r\n                PuY3: f.filter.bounds[3].y,\r\n            }, filterID: 991 });\r\n        case 'oil paint plugin': {\r\n            var params = {};\r\n            for (var i = 0; i < f.filter.parameters.length; i++) {\r\n                var _a = f.filter.parameters[i], name_1 = _a.name, value = _a.value;\r\n                var suffix = \"\".concat(fromAtoZ[Math.floor(i / fromAtoZ.length)]).concat(fromAtoZ[i % fromAtoZ.length]);\r\n                params[\"PN\".concat(suffix)] = name_1;\r\n                params[\"PT\".concat(suffix)] = 0;\r\n                params[\"PF\".concat(suffix)] = value;\r\n            }\r\n            return __assign(__assign({}, base), { Fltr: __assign({ _name: 'Oil Paint Plugin', _classID: 'PbPl', KnNm: f.filter.name, GpuY: f.filter.gpu, LIWy: f.filter.lighting, FPth: '1' }, params), filterID: 1348620396 });\r\n        }\r\n        case 'oil paint': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Oil Paint',\r\n                _classID: 'oilPaint',\r\n                lightingOn: f.filter.lightingOn,\r\n                stylization: f.filter.stylization,\r\n                cleanliness: f.filter.cleanliness,\r\n                brushScale: f.filter.brushScale,\r\n                microBrush: f.filter.microBrush,\r\n                LghD: f.filter.lightDirection,\r\n                specularity: f.filter.specularity,\r\n            }, filterID: 1122 });\r\n        case 'liquify': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Liquify',\r\n                _classID: 'LqFy',\r\n                LqMe: f.filter.liquifyMesh,\r\n            }, filterID: 1282492025 });\r\n        case 'perspective warp': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Perspective Warp',\r\n                _classID: 'perspectiveWarpTransform',\r\n                vertices: f.filter.vertices.map(pointToHrznVrtc),\r\n                warpedVertices: f.filter.warpedVertices.map(pointToHrznVrtc),\r\n                quads: f.filter.quads.map(function (indices) { return ({ indices: indices }); }),\r\n            }, filterID: 442 });\r\n        case 'curves': return __assign(__assign({}, base), { Fltr: __assign({ _name: 'Curves', _classID: 'Crvs', presetKind: presetKindType.encode(f.filter.presetKind) }, (f.filter.adjustments ? {\r\n                Adjs: f.filter.adjustments.map(function (a) { return 'curve' in a ? {\r\n                    _name: '',\r\n                    _classID: 'CrvA',\r\n                    Chnl: a.channels.map(Chnl.encode),\r\n                    'Crv ': a.curve.map(function (c) { return (__assign({ _name: '', _classID: 'Pnt ', Hrzn: c.x, Vrtc: c.y }, (c.curved ? { Cnty: true } : {}))); }),\r\n                } : {\r\n                    _name: '',\r\n                    _classID: 'CrvA',\r\n                    Chnl: a.channels.map(Chnl.encode),\r\n                    Mpng: a.values,\r\n                }; })\r\n            } : {})), filterID: 1131574899 });\r\n        case 'brightness/contrast': return __assign(__assign({}, base), { Fltr: {\r\n                _name: 'Brightness/Contrast',\r\n                _classID: 'BrgC',\r\n                Brgh: f.filter.brightness,\r\n                Cntr: f.filter.contrast,\r\n                useLegacy: !!f.filter.useLegacy,\r\n            }, filterID: 1114793795 });\r\n        // case 'hsb/hsl': return {\r\n        // TODO: ...\r\n        // };\r\n        default: throw new Error(\"Unknow filter type: \".concat(f.type));\r\n    }\r\n}\r\n// let t: any;\r\nfunction getWarpFromPlacedLayer(placed) {\r\n    if (placed.warp)\r\n        return placed.warp;\r\n    if (!placed.width || !placed.height)\r\n        throw new Error('You must provide width and height of the linked image in placedLayer');\r\n    var w = placed.width;\r\n    var h = placed.height;\r\n    var x0 = 0, x1 = w / 3, x2 = w * 2 / 3, x3 = w;\r\n    var y0 = 0, y1 = h / 3, y2 = h * 2 / 3, y3 = h;\r\n    return {\r\n        style: 'custom',\r\n        value: 0,\r\n        perspective: 0,\r\n        perspectiveOther: 0,\r\n        rotate: 'horizontal',\r\n        bounds: {\r\n            top: { value: 0, units: 'Pixels' },\r\n            left: { value: 0, units: 'Pixels' },\r\n            bottom: { value: h, units: 'Pixels' },\r\n            right: { value: w, units: 'Pixels' },\r\n        },\r\n        uOrder: 4,\r\n        vOrder: 4,\r\n        customEnvelopeWarp: {\r\n            meshPoints: [\r\n                { x: x0, y: y0 }, { x: x1, y: y0 }, { x: x2, y: y0 }, { x: x3, y: y0 },\r\n                { x: x0, y: y1 }, { x: x1, y: y1 }, { x: x2, y: y1 }, { x: x3, y: y1 },\r\n                { x: x0, y: y2 }, { x: x1, y: y2 }, { x: x2, y: y2 }, { x: x3, y: y2 },\r\n                { x: x0, y: y3 }, { x: x1, y: y3 }, { x: x2, y: y3 }, { x: x3, y: y3 },\r\n            ],\r\n        },\r\n    };\r\n}\r\naddHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {\r\n    if (readSignature(reader) !== 'soLD')\r\n        throw new Error(\"Invalid SoLd type\");\r\n    var version = readInt32(reader);\r\n    if (version !== 4 && version !== 5)\r\n        throw new Error(\"Invalid SoLd version\");\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log('SoLd', require('util').inspect(desc, false, 99, true));\r\n    // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));\r\n    // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));\r\n    // desc.filterFX!.filterFXList[0].Fltr.puppetShapeList[0].meshBoundaryPath.pathComponents[0].SbpL[0]['Pts '] = [];\r\n    // console.log('read', require('util').inspect(desc.filterFX, false, 99, true));\r\n    // console.log('filterFXList[0]', require('util').inspect((desc as any).filterFX.filterFXList[0], false, 99, true));\r\n    // t = desc;\r\n    target.placedLayer = {\r\n        id: desc.Idnt,\r\n        placed: desc.placed,\r\n        type: placedLayerTypes[desc.Type],\r\n        pageNumber: desc.PgNm,\r\n        totalPages: desc.totalPages,\r\n        frameStep: frac(desc.frameStep),\r\n        duration: frac(desc.duration),\r\n        frameCount: desc.frameCount,\r\n        transform: desc.Trnf,\r\n        width: desc['Sz  '].Wdth,\r\n        height: desc['Sz  '].Hght,\r\n        resolution: parseUnits(desc.Rslt),\r\n        warp: parseWarp((desc.quiltWarp || desc.warp)),\r\n    };\r\n    if (desc.nonAffineTransform && desc.nonAffineTransform.some(function (x, i) { return x !== desc.Trnf[i]; })) {\r\n        target.placedLayer.nonAffineTransform = desc.nonAffineTransform;\r\n    }\r\n    if (desc.Crop)\r\n        target.placedLayer.crop = desc.Crop;\r\n    if (desc.comp)\r\n        target.placedLayer.comp = desc.comp;\r\n    if (desc.compInfo) {\r\n        target.placedLayer.compInfo = {\r\n            compID: desc.compInfo.compID,\r\n            originalCompID: desc.compInfo.originalCompID,\r\n        };\r\n    }\r\n    if (desc.filterFX)\r\n        target.placedLayer.filter = parseFilterFX(desc.filterFX, reader);\r\n    // console.log('filter', require('util').inspect(target.placedLayer.filter, false, 99, true));\r\n    skipBytes(reader, left()); // HACK\r\n}, function (writer, target) {\r\n    var _a, _b;\r\n    writeSignature(writer, 'soLD');\r\n    writeInt32(writer, 4); // version\r\n    var placed = target.placedLayer;\r\n    if (!placed.id || typeof placed.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(placed.id)) {\r\n        throw new Error('Placed layer ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n    }\r\n    var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, \r\n        // quiltWarp: {} as any,\r\n        warp: encodeWarp(getWarpFromPlacedLayer(placed)), 'Sz  ': {\r\n            _name: '',\r\n            _classID: 'Pnt ',\r\n            Wdth: placed.width || 0,\r\n            Hght: placed.height || 0, // TODO: find size ?\r\n        }, Rslt: placed.resolution ? unitsValue(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });\r\n    if (placed.filter) {\r\n        desc.filterFX = {\r\n            _name: '',\r\n            _classID: 'filterFXStyle',\r\n            enab: placed.filter.enabled,\r\n            validAtPosition: placed.filter.validAtPosition,\r\n            filterMaskEnable: placed.filter.maskEnabled,\r\n            filterMaskLinked: placed.filter.maskLinked,\r\n            filterMaskExtendWithWhite: placed.filter.maskExtendWithWhite,\r\n            filterFXList: placed.filter.list.map(function (f) { return serializeFilterFXItem(f); }),\r\n        };\r\n    }\r\n    // TODO:\r\n    // desc.comp = -1;\r\n    // desc.compInfo = { _name: '', _classID: 'null', compID: -1, originalCompID: -1 } as any;\r\n    // desc.ClMg = {\r\n    // \t_name: '',\r\n    // \t_classID: 'ClMg',\r\n    // \tplacedLayerOCIOConversion: 'placedLayerOCIOConversion.placedLayerOCIOConvertEmbedded'\r\n    // } as any;\r\n    // if (JSON.stringify(t) !== JSON.stringify(desc)) {\r\n    // \tconsole.log('read', require('util').inspect(t, false, 99, true));\r\n    // \tconsole.log('write', require('util').inspect(desc, false, 99, true));\r\n    // \tconsole.error('DIFFERENT');\r\n    // \t// throw new Error('DIFFERENT');\r\n    // }\r\n    if (placed.warp && isQuiltWarp(placed.warp)) {\r\n        var quiltWarp = encodeWarp(placed.warp);\r\n        desc.quiltWarp = quiltWarp;\r\n        desc.warp = {\r\n            warpStyle: 'warpStyle.warpNone',\r\n            warpValue: quiltWarp.warpValue,\r\n            warpPerspective: quiltWarp.warpPerspective,\r\n            warpPerspectiveOther: quiltWarp.warpPerspectiveOther,\r\n            warpRotate: quiltWarp.warpRotate,\r\n            bounds: quiltWarp.bounds,\r\n            uOrder: quiltWarp.uOrder,\r\n            vOrder: quiltWarp.vOrder,\r\n        };\r\n    }\r\n    else {\r\n        delete desc.quiltWarp;\r\n    }\r\n    if (placed.comp)\r\n        desc.comp = placed.comp;\r\n    if (placed.compInfo)\r\n        desc.compInfo = placed.compInfo;\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, desc.quiltWarp ? 'quiltWarp' : 'warp');\r\n});\r\naddHandlerAlias('SoLE', 'SoLd');\r\naddHandler('fxrp', hasKey('referencePoint'), function (reader, target) {\r\n    target.referencePoint = {\r\n        x: readFloat64(reader),\r\n        y: readFloat64(reader),\r\n    };\r\n}, function (writer, target) {\r\n    writeFloat64(writer, target.referencePoint.x);\r\n    writeFloat64(writer, target.referencePoint.y);\r\n});\r\naddHandler('Lr16', function () { return false; }, function (reader, _target, _left, psd, imageResources) {\r\n    readLayerInfo(reader, psd, imageResources);\r\n}, function (_writer, _target) {\r\n});\r\naddHandler('Lr32', function () { return false; }, function (reader, _target, _left, psd, imageResources) {\r\n    readLayerInfo(reader, psd, imageResources);\r\n}, function (_writer, _target) {\r\n});\r\naddHandler('LMsk', hasKey('userMask'), function (reader, target) {\r\n    target.userMask = {\r\n        colorSpace: readColor(reader),\r\n        opacity: readUint16(reader) / 0xff,\r\n    };\r\n    var flag = readUint8(reader);\r\n    if (flag !== 128)\r\n        throw new Error('Invalid flag value');\r\n    skipBytes(reader, 1);\r\n}, function (writer, target) {\r\n    var userMask = target.userMask;\r\n    writeColor(writer, userMask.colorSpace);\r\n    writeUint16(writer, clamp(userMask.opacity, 0, 1) * 0xff);\r\n    writeUint8(writer, 128);\r\n    writeZeros(writer, 1);\r\n});\r\nif (MOCK_HANDLERS) {\r\n    addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {\r\n        // console.log('additional info: Patt');\r\n        target._Patt = readBytes(reader, left());\r\n    }, function (writer, target) { return false && writeBytes(writer, target._Patt); });\r\n}\r\nelse {\r\n    addHandler('Patt', // TODO: handle also Pat2 & Pat3\r\n    function (// TODO: handle also Pat2 & Pat3\r\n    target) { return !target; }, function (reader, target, left) {\r\n        if (!left())\r\n            return;\r\n        skipBytes(reader, left());\r\n        return; // not supported yet\r\n        target;\r\n        readPattern;\r\n        // if (!target.patterns) target.patterns = [];\r\n        // target.patterns.push(readPattern(reader));\r\n        // skipBytes(reader, left());\r\n    }, function (_writer, _target) {\r\n    });\r\n}\r\n/*\r\ninterface CAIDesc {\r\n    _name: '';\r\n    _classID: 'null';\r\n    enab: boolean;\r\n    generationalGuid: string;\r\n}\r\n\r\naddHandler(\r\n    'CAI ', // content credentials ? something to do with generative tech\r\n    () => false,\r\n    (reader, _target, left) => {\r\n        const version = readUint32(reader); // 3\r\n        const desc = readVersionAndDescriptor(reader, true) as CAIDesc;\r\n        console.log('CAI version', version);\r\n        console.log('CAI', require('util').inspect(desc, false, 99, true));\r\n        console.log('CAI left', readBytes(reader, left())); // 8 bytes left, all zeroes\r\n    },\r\n    (_writer, _target) => {\r\n    },\r\n);\r\n// */\r\nif (MOCK_HANDLERS) {\r\n    addHandler('CAI ', function (target) { return target._CAI_ !== undefined; }, function (reader, target, left) {\r\n        target._CAI_ = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._CAI_);\r\n    });\r\n}\r\n// interface OCIODescriptor {\r\n// \t_name: '';\r\n// \t_classID: 'documentColorManagementInfo';\r\n// \t'Knd ': 'icc';\r\n// \tocio_display_view: {\r\n// \t\t_name: '';\r\n// \t\t_classID: 'viewColorManagementInfo';\r\n// \t\tdisplay: string;\r\n// \t\tview: string;\r\n// \t};\r\n// }\r\nif (MOCK_HANDLERS) {\r\n    addHandler('OCIO', // document color management info\r\n    function (// document color management info\r\n    target) { return target._OCIO !== undefined; }, function (reader, target, left) {\r\n        // const desc = readVersionAndDescriptor(reader, true) as OCIODescriptor;\r\n        // console.log('OCIO', require('util').inspect(desc, false, 99, true));\r\n        target._OCIO = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._OCIO);\r\n    });\r\n}\r\n// interface GenIDescriptor {\r\n//  _name: '';\r\n//  _classID: 'genTechInfo';\r\n// \tisUsingGenTech: number;\r\n//  externalModelList?: [];\r\n// }\r\nif (MOCK_HANDLERS) {\r\n    addHandler('GenI', // generative tech\r\n    function (// generative tech\r\n    target) { return target._GenI !== undefined; }, function (reader, target, left) {\r\n        var desc = readVersionAndDescriptor(reader, true); // as GenIDescriptor;\r\n        console.log('GenI', require('util').inspect(desc, false, 99, true));\r\n        target._GenI = readBytes(reader, left());\r\n    }, function (writer, target) {\r\n        writeBytes(writer, target._GenI);\r\n    });\r\n}\r\nfunction readRect(reader) {\r\n    var top = readInt32(reader);\r\n    var left = readInt32(reader);\r\n    var bottom = readInt32(reader);\r\n    var right = readInt32(reader);\r\n    return { top: top, left: left, bottom: bottom, right: right };\r\n}\r\nfunction writeRect(writer, rect) {\r\n    writeInt32(writer, rect.top);\r\n    writeInt32(writer, rect.left);\r\n    writeInt32(writer, rect.bottom);\r\n    writeInt32(writer, rect.right);\r\n}\r\naddHandler('Anno', function (target) { return target.annotations !== undefined; }, function (reader, target, left) {\r\n    var major = readUint16(reader);\r\n    var minor = readUint16(reader);\r\n    if (major !== 2 || minor !== 1)\r\n        throw new Error('Invalid Anno version');\r\n    var count = readUint32(reader);\r\n    var annotations = [];\r\n    for (var i = 0; i < count; i++) {\r\n        /*const length =*/ readUint32(reader);\r\n        var type = readSignature(reader);\r\n        var open_1 = !!readUint8(reader);\r\n        /*const flags =*/ readUint8(reader); // always 28\r\n        /*const optionalBlocks =*/ readUint16(reader);\r\n        var iconLocation = readRect(reader);\r\n        var popupLocation = readRect(reader);\r\n        var color = readColor(reader);\r\n        var author = readPascalString(reader, 2);\r\n        var name_2 = readPascalString(reader, 2);\r\n        var date = readPascalString(reader, 2);\r\n        /*const contentLength =*/ readUint32(reader);\r\n        /*const dataType =*/ readSignature(reader);\r\n        var dataLength = readUint32(reader);\r\n        var data = void 0;\r\n        if (type === 'txtA') {\r\n            if (dataLength >= 2 && readUint16(reader) === 0xfeff) {\r\n                data = readUnicodeStringWithLength(reader, (dataLength - 2) / 2);\r\n            }\r\n            else {\r\n                reader.offset -= 2;\r\n                data = readAsciiString(reader, dataLength);\r\n            }\r\n            data = data.replace(/\\r/g, '\\n');\r\n        }\r\n        else if (type === 'sndA') {\r\n            data = readBytes(reader, dataLength);\r\n        }\r\n        else {\r\n            throw new Error('Unknown annotation type');\r\n        }\r\n        annotations.push({\r\n            type: type === 'txtA' ? 'text' : 'sound',\r\n            open: open_1,\r\n            iconLocation: iconLocation,\r\n            popupLocation: popupLocation,\r\n            color: color,\r\n            author: author,\r\n            name: name_2,\r\n            date: date,\r\n            data: data,\r\n        });\r\n    }\r\n    target.annotations = annotations;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var annotations = target.annotations;\r\n    writeUint16(writer, 2);\r\n    writeUint16(writer, 1);\r\n    writeUint32(writer, annotations.length);\r\n    for (var _i = 0, annotations_1 = annotations; _i < annotations_1.length; _i++) {\r\n        var annotation = annotations_1[_i];\r\n        var sound = annotation.type === 'sound';\r\n        if (sound && !(annotation.data instanceof Uint8Array))\r\n            throw new Error('Sound annotation data should be Uint8Array');\r\n        if (!sound && typeof annotation.data !== 'string')\r\n            throw new Error('Text annotation data should be string');\r\n        var lengthOffset = writer.offset;\r\n        writeUint32(writer, 0); // length\r\n        writeSignature(writer, sound ? 'sndA' : 'txtA');\r\n        writeUint8(writer, annotation.open ? 1 : 0);\r\n        writeUint8(writer, 28);\r\n        writeUint16(writer, 1);\r\n        writeRect(writer, annotation.iconLocation);\r\n        writeRect(writer, annotation.popupLocation);\r\n        writeColor(writer, annotation.color);\r\n        writePascalString(writer, annotation.author || '', 2);\r\n        writePascalString(writer, annotation.name || '', 2);\r\n        writePascalString(writer, annotation.date || '', 2);\r\n        var contentOffset = writer.offset;\r\n        writeUint32(writer, 0); // content length\r\n        writeSignature(writer, sound ? 'sndM' : 'txtC');\r\n        writeUint32(writer, 0); // data length\r\n        var dataOffset = writer.offset;\r\n        if (sound) {\r\n            writeBytes(writer, annotation.data);\r\n        }\r\n        else {\r\n            writeUint16(writer, 0xfeff); // unicode string indicator\r\n            var text = annotation.data.replace(/\\n/g, '\\r');\r\n            for (var i = 0; i < text.length; i++)\r\n                writeUint16(writer, text.charCodeAt(i));\r\n        }\r\n        writer.view.setUint32(lengthOffset, writer.offset - lengthOffset, false);\r\n        writer.view.setUint32(contentOffset, writer.offset - contentOffset, false);\r\n        writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);\r\n    }\r\n});\r\nfunction createLnkHandler(tag) {\r\n    addHandler(tag, function (target) {\r\n        var psd = target;\r\n        if (!psd.linkedFiles || !psd.linkedFiles.length)\r\n            return false;\r\n        if (tag === 'lnkE' && !psd.linkedFiles.some(function (f) { return f.linkedFile; }))\r\n            return false;\r\n        return true;\r\n    }, function (reader, target, left, _psd) {\r\n        var psd = target;\r\n        psd.linkedFiles = psd.linkedFiles || [];\r\n        while (left() > 8) {\r\n            var size = readLength64(reader);\r\n            var startOffset = reader.offset;\r\n            var type = readSignature(reader);\r\n            // liFD - linked file data\r\n            // liFE - linked file external\r\n            // liFA - linked file alias\r\n            var version = readInt32(reader);\r\n            var id = readPascalString(reader, 1);\r\n            var name_3 = readUnicodeString(reader);\r\n            var fileType = readSignature(reader).trim(); // '    ' if empty\r\n            var fileCreator = readSignature(reader).trim(); // '    ' or '\\0\\0\\0\\0' if empty\r\n            var dataSize = readLength64(reader);\r\n            var hasFileOpenDescriptor = readUint8(reader);\r\n            var fileOpenDescriptor = hasFileOpenDescriptor ? readVersionAndDescriptor(reader) : undefined;\r\n            var linkedFileDescriptor = type === 'liFE' ? readVersionAndDescriptor(reader) : undefined;\r\n            var file = { id: id, name: name_3 };\r\n            if (fileType)\r\n                file.type = fileType;\r\n            if (fileCreator)\r\n                file.creator = fileCreator;\r\n            if (fileOpenDescriptor) {\r\n                file.descriptor = {\r\n                    compInfo: {\r\n                        compID: fileOpenDescriptor.compInfo.compID,\r\n                        originalCompID: fileOpenDescriptor.compInfo.originalCompID,\r\n                    }\r\n                };\r\n            }\r\n            if (type === 'liFE' && version > 3) {\r\n                var year = readInt32(reader);\r\n                var month = readUint8(reader);\r\n                var day = readUint8(reader);\r\n                var hour = readUint8(reader);\r\n                var minute = readUint8(reader);\r\n                var seconds = readFloat64(reader);\r\n                var wholeSeconds = Math.floor(seconds);\r\n                var ms = (seconds - wholeSeconds) * 1000;\r\n                file.time = (new Date(Date.UTC(year, month, day, hour, minute, wholeSeconds, ms))).toISOString();\r\n            }\r\n            var fileSize = type === 'liFE' ? readLength64(reader) : 0;\r\n            if (type === 'liFA')\r\n                skipBytes(reader, 8);\r\n            if (type === 'liFD')\r\n                file.data = readBytes(reader, dataSize); // seems to be a typo in docs\r\n            if (version >= 5)\r\n                file.childDocumentID = readUnicodeString(reader);\r\n            if (version >= 6)\r\n                file.assetModTime = readFloat64(reader);\r\n            if (version >= 7)\r\n                file.assetLockedState = readUint8(reader);\r\n            if (type === 'liFE' && version === 2)\r\n                file.data = readBytes(reader, fileSize);\r\n            if (reader.skipLinkedFilesData)\r\n                file.data = undefined;\r\n            if (tag === 'lnkE') {\r\n                file.linkedFile = {\r\n                    fileSize: fileSize,\r\n                    name: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor['Nm  ']) || '',\r\n                    fullPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.fullPath) || '',\r\n                    originalPath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.originalPath) || '',\r\n                    relativePath: (linkedFileDescriptor === null || linkedFileDescriptor === void 0 ? void 0 : linkedFileDescriptor.relPath) || '',\r\n                };\r\n            }\r\n            psd.linkedFiles.push(file);\r\n            while (size % 4)\r\n                size++;\r\n            reader.offset = startOffset + size;\r\n        }\r\n        skipBytes(reader, left()); // ?\r\n    }, function (writer, target) {\r\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\r\n        var psd = target;\r\n        for (var _i = 0, _k = psd.linkedFiles; _i < _k.length; _i++) {\r\n            var file = _k[_i];\r\n            if ((tag === 'lnkE') !== !!file.linkedFile)\r\n                continue;\r\n            var version = 2;\r\n            if (file.assetLockedState != null)\r\n                version = 7;\r\n            else if (file.assetModTime != null)\r\n                version = 6;\r\n            else if (file.childDocumentID != null)\r\n                version = 5;\r\n            else if (tag === 'lnkE')\r\n                version = 3;\r\n            writeLength64(writer, 0);\r\n            var sizeOffset = writer.offset;\r\n            writeSignature(writer, (tag === 'lnkE') ? 'liFE' : (file.data ? 'liFD' : 'liFA'));\r\n            writeInt32(writer, version);\r\n            if (!file.id || typeof file.id !== 'string' || !/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/.test(file.id)) {\r\n                throw new Error('Linked file ID must be in a GUID format (example: 20953ddb-9391-11ec-b4f1-c15674f50bc4)');\r\n            }\r\n            writePascalString(writer, file.id, 1);\r\n            writeUnicodeStringWithPadding(writer, file.name || '');\r\n            writeSignature(writer, file.type ? \"\".concat(file.type, \"    \").substring(0, 4) : '    ');\r\n            writeSignature(writer, file.creator ? \"\".concat(file.creator, \"    \").substring(0, 4) : '\\0\\0\\0\\0');\r\n            writeLength64(writer, file.data ? file.data.byteLength : 0);\r\n            if (file.descriptor && file.descriptor.compInfo) {\r\n                var desc = {\r\n                    compInfo: {\r\n                        compID: file.descriptor.compInfo.compID,\r\n                        originalCompID: file.descriptor.compInfo.originalCompID,\r\n                    },\r\n                };\r\n                writeUint8(writer, 1);\r\n                writeVersionAndDescriptor(writer, '', 'null', desc);\r\n            }\r\n            else {\r\n                writeUint8(writer, 0);\r\n            }\r\n            if (tag === 'lnkE') {\r\n                var desc = {\r\n                    descVersion: 2,\r\n                    'Nm  ': (_b = (_a = file.linkedFile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',\r\n                    fullPath: (_d = (_c = file.linkedFile) === null || _c === void 0 ? void 0 : _c.fullPath) !== null && _d !== void 0 ? _d : '',\r\n                    originalPath: (_f = (_e = file.linkedFile) === null || _e === void 0 ? void 0 : _e.originalPath) !== null && _f !== void 0 ? _f : '',\r\n                    relPath: (_h = (_g = file.linkedFile) === null || _g === void 0 ? void 0 : _g.relativePath) !== null && _h !== void 0 ? _h : '',\r\n                };\r\n                writeVersionAndDescriptor(writer, '', 'ExternalFileLink', desc);\r\n                var time = file.time ? new Date(file.time) : new Date();\r\n                writeInt32(writer, time.getUTCFullYear());\r\n                writeUint8(writer, time.getUTCMonth());\r\n                writeUint8(writer, time.getUTCDate());\r\n                writeUint8(writer, time.getUTCHours());\r\n                writeUint8(writer, time.getUTCMinutes());\r\n                writeFloat64(writer, time.getUTCSeconds() + time.getUTCMilliseconds() / 1000);\r\n            }\r\n            if (file.data) {\r\n                writeBytes(writer, file.data);\r\n            }\r\n            else {\r\n                writeLength64(writer, ((_j = file.linkedFile) === null || _j === void 0 ? void 0 : _j.fileSize) || 0);\r\n            }\r\n            if (version >= 5)\r\n                writeUnicodeStringWithPadding(writer, file.childDocumentID || '');\r\n            if (version >= 6)\r\n                writeFloat64(writer, file.assetModTime || 0);\r\n            if (version >= 7)\r\n                writeUint8(writer, file.assetLockedState || 0);\r\n            var size = writer.offset - sizeOffset;\r\n            writer.view.setUint32(sizeOffset - 4, size, false); // write size\r\n            while (size % 4) {\r\n                size++;\r\n                writeUint8(writer, 0);\r\n            }\r\n        }\r\n    });\r\n}\r\ncreateLnkHandler('lnk2');\r\ncreateLnkHandler('lnkE');\r\naddHandlerAlias('lnkD', 'lnk2');\r\naddHandlerAlias('lnk3', 'lnk2');\r\naddHandler('pths', hasKey('pathList'), function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader, true);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    // if (options.throwForMissingFeatures && desc?.pathList?.length) throw new Error('non-empty pathList in `pths`');\r\n    desc;\r\n    target.pathList = []; // TODO: read paths\r\n}, function (writer, _target) {\r\n    var desc = {\r\n        pathList: [], // TODO: write paths\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'pathsDataClass', desc);\r\n});\r\naddHandler('lyvr', hasKey('version'), function (reader, target) { return target.version = readUint32(reader); }, function (writer, target) { return writeUint32(writer, target.version); });\r\naddHandler('lfxs', function () { return false; }, // TODO: not sure when we actually need to write this section\r\n// NOTE: this might be insufficient\r\n// target => target.effects !== undefined && (\r\n// \t!!target.effects.dropShadow?.some(e => e.choke) ||\r\n// \t!!target.effects.innerShadow?.some(e => e.choke) ||\r\n// \t!!target.effects.outerGlow?.choke ||\r\n// \t!!target.effects.innerGlow?.choke\r\n// ),\r\nfunction (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid lfxs version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nfunction adjustmentType(type) {\r\n    return function (target) { return !!target.adjustment && target.adjustment.type === type; };\r\n}\r\naddHandler('brit', adjustmentType('brightness/contrast'), function (reader, target, left) {\r\n    if (!target.adjustment) { // ignore if got one from CgEd block\r\n        target.adjustment = {\r\n            type: 'brightness/contrast',\r\n            brightness: readInt16(reader),\r\n            contrast: readInt16(reader),\r\n            meanValue: readInt16(reader),\r\n            labColorOnly: !!readUint8(reader),\r\n            useLegacy: true,\r\n        };\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeInt16(writer, info.brightness || 0);\r\n    writeInt16(writer, info.contrast || 0);\r\n    writeInt16(writer, (_a = info.meanValue) !== null && _a !== void 0 ? _a : 127);\r\n    writeUint8(writer, info.labColorOnly ? 1 : 0);\r\n    writeZeros(writer, 1);\r\n});\r\nfunction readLevelsChannel(reader) {\r\n    var shadowInput = readInt16(reader);\r\n    var highlightInput = readInt16(reader);\r\n    var shadowOutput = readInt16(reader);\r\n    var highlightOutput = readInt16(reader);\r\n    var midtoneInput = readInt16(reader) / 100;\r\n    return { shadowInput: shadowInput, highlightInput: highlightInput, shadowOutput: shadowOutput, highlightOutput: highlightOutput, midtoneInput: midtoneInput };\r\n}\r\nfunction writeLevelsChannel(writer, channel) {\r\n    writeInt16(writer, channel.shadowInput);\r\n    writeInt16(writer, channel.highlightInput);\r\n    writeInt16(writer, channel.shadowOutput);\r\n    writeInt16(writer, channel.highlightOutput);\r\n    writeInt16(writer, Math.round(channel.midtoneInput * 100));\r\n}\r\naddHandler('levl', adjustmentType('levels'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 2)\r\n        throw new Error('Invalid levl version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'levels', rgb: readLevelsChannel(reader), red: readLevelsChannel(reader), green: readLevelsChannel(reader), blue: readLevelsChannel(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var defaultChannel = {\r\n        shadowInput: 0,\r\n        highlightInput: 255,\r\n        shadowOutput: 0,\r\n        highlightOutput: 255,\r\n        midtoneInput: 1,\r\n    };\r\n    writeUint16(writer, 2); // version\r\n    writeLevelsChannel(writer, info.rgb || defaultChannel);\r\n    writeLevelsChannel(writer, info.red || defaultChannel);\r\n    writeLevelsChannel(writer, info.blue || defaultChannel);\r\n    writeLevelsChannel(writer, info.green || defaultChannel);\r\n    for (var i = 0; i < 59; i++)\r\n        writeLevelsChannel(writer, defaultChannel);\r\n});\r\nfunction readCurveChannel(reader) {\r\n    var nodes = readUint16(reader);\r\n    var channel = [];\r\n    for (var j = 0; j < nodes; j++) {\r\n        var output = readInt16(reader);\r\n        var input = readInt16(reader);\r\n        channel.push({ input: input, output: output });\r\n    }\r\n    return channel;\r\n}\r\nfunction writeCurveChannel(writer, channel) {\r\n    writeUint16(writer, channel.length);\r\n    for (var _i = 0, channel_1 = channel; _i < channel_1.length; _i++) {\r\n        var n = channel_1[_i];\r\n        writeUint16(writer, n.output);\r\n        writeUint16(writer, n.input);\r\n    }\r\n}\r\naddHandler('curv', adjustmentType('curves'), function (reader, target, left) {\r\n    readUint8(reader);\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid curv version');\r\n    readUint16(reader);\r\n    var channels = readUint16(reader);\r\n    var info = { type: 'curves' };\r\n    if (channels & 1)\r\n        info.rgb = readCurveChannel(reader);\r\n    if (channels & 2)\r\n        info.red = readCurveChannel(reader);\r\n    if (channels & 4)\r\n        info.green = readCurveChannel(reader);\r\n    if (channels & 8)\r\n        info.blue = readCurveChannel(reader);\r\n    target.adjustment = __assign(__assign({}, target.adjustment), info);\r\n    // ignoring, duplicate information\r\n    // checkSignature(reader, 'Crv ');\r\n    // const cVersion = readUint16(reader);\r\n    // readUint16(reader);\r\n    // const channelCount = readUint16(reader);\r\n    // for (let i = 0; i < channelCount; i++) {\r\n    // \tconst index = readUint16(reader);\r\n    // \tconst nodes = readUint16(reader);\r\n    // \tfor (let j = 0; j < nodes; j++) {\r\n    // \t\tconst output = readInt16(reader);\r\n    // \t\tconst input = readInt16(reader);\r\n    // \t}\r\n    // }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var rgb = info.rgb, red = info.red, green = info.green, blue = info.blue;\r\n    var channels = 0;\r\n    var channelCount = 0;\r\n    if (rgb && rgb.length) {\r\n        channels |= 1;\r\n        channelCount++;\r\n    }\r\n    if (red && red.length) {\r\n        channels |= 2;\r\n        channelCount++;\r\n    }\r\n    if (green && green.length) {\r\n        channels |= 4;\r\n        channelCount++;\r\n    }\r\n    if (blue && blue.length) {\r\n        channels |= 8;\r\n        channelCount++;\r\n    }\r\n    writeUint8(writer, 0);\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, channels);\r\n    if (rgb && rgb.length)\r\n        writeCurveChannel(writer, rgb);\r\n    if (red && red.length)\r\n        writeCurveChannel(writer, red);\r\n    if (green && green.length)\r\n        writeCurveChannel(writer, green);\r\n    if (blue && blue.length)\r\n        writeCurveChannel(writer, blue);\r\n    writeSignature(writer, 'Crv ');\r\n    writeUint16(writer, 4); // version\r\n    writeUint16(writer, 0);\r\n    writeUint16(writer, channelCount);\r\n    if (rgb && rgb.length) {\r\n        writeUint16(writer, 0);\r\n        writeCurveChannel(writer, rgb);\r\n    }\r\n    if (red && red.length) {\r\n        writeUint16(writer, 1);\r\n        writeCurveChannel(writer, red);\r\n    }\r\n    if (green && green.length) {\r\n        writeUint16(writer, 2);\r\n        writeCurveChannel(writer, green);\r\n    }\r\n    if (blue && blue.length) {\r\n        writeUint16(writer, 3);\r\n        writeCurveChannel(writer, blue);\r\n    }\r\n});\r\naddHandler('expA', adjustmentType('exposure'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid expA version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'exposure', exposure: readFloat32(reader), offset: readFloat32(reader), gamma: readFloat32(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeFloat32(writer, info.exposure);\r\n    writeFloat32(writer, info.offset);\r\n    writeFloat32(writer, info.gamma);\r\n    writeZeros(writer, 2);\r\n});\r\naddHandler('vibA', adjustmentType('vibrance'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = { type: 'vibrance' };\r\n    if (desc.vibrance !== undefined)\r\n        target.adjustment.vibrance = desc.vibrance;\r\n    if (desc.Strt !== undefined)\r\n        target.adjustment.saturation = desc.Strt;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {};\r\n    if (info.vibrance !== undefined)\r\n        desc.vibrance = info.vibrance;\r\n    if (info.saturation !== undefined)\r\n        desc.Strt = info.saturation;\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\nfunction readHueChannel(reader) {\r\n    return {\r\n        a: readInt16(reader),\r\n        b: readInt16(reader),\r\n        c: readInt16(reader),\r\n        d: readInt16(reader),\r\n        hue: readInt16(reader),\r\n        saturation: readInt16(reader),\r\n        lightness: readInt16(reader),\r\n    };\r\n}\r\nfunction writeHueChannel(writer, channel) {\r\n    var c = channel || {};\r\n    writeInt16(writer, c.a || 0);\r\n    writeInt16(writer, c.b || 0);\r\n    writeInt16(writer, c.c || 0);\r\n    writeInt16(writer, c.d || 0);\r\n    writeInt16(writer, c.hue || 0);\r\n    writeInt16(writer, c.saturation || 0);\r\n    writeInt16(writer, c.lightness || 0);\r\n}\r\naddHandler('hue2', adjustmentType('hue/saturation'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 2)\r\n        throw new Error('Invalid hue2 version');\r\n    target.adjustment = __assign(__assign({}, target.adjustment), { type: 'hue/saturation', master: readHueChannel(reader), reds: readHueChannel(reader), yellows: readHueChannel(reader), greens: readHueChannel(reader), cyans: readHueChannel(reader), blues: readHueChannel(reader), magentas: readHueChannel(reader) });\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 2); // version\r\n    writeHueChannel(writer, info.master);\r\n    writeHueChannel(writer, info.reds);\r\n    writeHueChannel(writer, info.yellows);\r\n    writeHueChannel(writer, info.greens);\r\n    writeHueChannel(writer, info.cyans);\r\n    writeHueChannel(writer, info.blues);\r\n    writeHueChannel(writer, info.magentas);\r\n});\r\nfunction readColorBalance(reader) {\r\n    return {\r\n        cyanRed: readInt16(reader),\r\n        magentaGreen: readInt16(reader),\r\n        yellowBlue: readInt16(reader),\r\n    };\r\n}\r\nfunction writeColorBalance(writer, value) {\r\n    writeInt16(writer, value.cyanRed || 0);\r\n    writeInt16(writer, value.magentaGreen || 0);\r\n    writeInt16(writer, value.yellowBlue || 0);\r\n}\r\naddHandler('blnc', adjustmentType('color balance'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'color balance',\r\n        shadows: readColorBalance(reader),\r\n        midtones: readColorBalance(reader),\r\n        highlights: readColorBalance(reader),\r\n        preserveLuminosity: !!readUint8(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeColorBalance(writer, info.shadows || {});\r\n    writeColorBalance(writer, info.midtones || {});\r\n    writeColorBalance(writer, info.highlights || {});\r\n    writeUint8(writer, info.preserveLuminosity ? 1 : 0);\r\n    writeZeros(writer, 1);\r\n});\r\naddHandler('blwh', adjustmentType('black & white'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = {\r\n        type: 'black & white',\r\n        reds: desc['Rd  '],\r\n        yellows: desc.Yllw,\r\n        greens: desc['Grn '],\r\n        cyans: desc['Cyn '],\r\n        blues: desc['Bl  '],\r\n        magentas: desc.Mgnt,\r\n        useTint: !!desc.useTint,\r\n        presetKind: desc.bwPresetKind,\r\n        presetFileName: desc.blackAndWhitePresetFileName,\r\n    };\r\n    if (desc.tintColor !== undefined)\r\n        target.adjustment.tintColor = parseColor(desc.tintColor);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {\r\n        'Rd  ': info.reds || 0,\r\n        Yllw: info.yellows || 0,\r\n        'Grn ': info.greens || 0,\r\n        'Cyn ': info.cyans || 0,\r\n        'Bl  ': info.blues || 0,\r\n        Mgnt: info.magentas || 0,\r\n        useTint: !!info.useTint,\r\n        tintColor: serializeColor(info.tintColor),\r\n        bwPresetKind: info.presetKind || 0,\r\n        blackAndWhitePresetFileName: info.presetFileName || '',\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('phfl', adjustmentType('photo filter'), function (reader, target, left) {\r\n    var version = readUint16(reader);\r\n    if (version !== 2 && version !== 3)\r\n        throw new Error('Invalid phfl version');\r\n    var color;\r\n    if (version === 2) {\r\n        color = readColor(reader);\r\n    }\r\n    else { // version 3\r\n        // TODO: test this, this is probably wrong\r\n        color = {\r\n            l: readInt32(reader) / 100,\r\n            a: readInt32(reader) / 100,\r\n            b: readInt32(reader) / 100,\r\n        };\r\n    }\r\n    target.adjustment = {\r\n        type: 'photo filter',\r\n        color: color,\r\n        density: readUint32(reader) / 100,\r\n        preserveLuminosity: !!readUint8(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 2); // version\r\n    writeColor(writer, info.color || { l: 0, a: 0, b: 0 });\r\n    writeUint32(writer, (info.density || 0) * 100);\r\n    writeUint8(writer, info.preserveLuminosity ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\nfunction readMixrChannel(reader) {\r\n    var red = readInt16(reader);\r\n    var green = readInt16(reader);\r\n    var blue = readInt16(reader);\r\n    skipBytes(reader, 2);\r\n    var constant = readInt16(reader);\r\n    return { red: red, green: green, blue: blue, constant: constant };\r\n}\r\nfunction writeMixrChannel(writer, channel) {\r\n    var c = channel || {};\r\n    writeInt16(writer, c.red);\r\n    writeInt16(writer, c.green);\r\n    writeInt16(writer, c.blue);\r\n    writeZeros(writer, 2);\r\n    writeInt16(writer, c.constant);\r\n}\r\naddHandler('mixr', adjustmentType('channel mixer'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid mixr version');\r\n    var adjustment = target.adjustment = __assign(__assign({}, target.adjustment), { type: 'channel mixer', monochrome: !!readUint16(reader) });\r\n    if (!adjustment.monochrome) {\r\n        adjustment.red = readMixrChannel(reader);\r\n        adjustment.green = readMixrChannel(reader);\r\n        adjustment.blue = readMixrChannel(reader);\r\n    }\r\n    adjustment.gray = readMixrChannel(reader);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, info.monochrome ? 1 : 0);\r\n    if (info.monochrome) {\r\n        writeMixrChannel(writer, info.gray);\r\n        writeZeros(writer, 3 * 5 * 2);\r\n    }\r\n    else {\r\n        writeMixrChannel(writer, info.red);\r\n        writeMixrChannel(writer, info.green);\r\n        writeMixrChannel(writer, info.blue);\r\n        writeMixrChannel(writer, info.gray);\r\n    }\r\n});\r\nvar colorLookupType = createEnum('colorLookupType', '3DLUT', {\r\n    '3dlut': '3DLUT',\r\n    abstractProfile: 'abstractProfile',\r\n    deviceLinkProfile: 'deviceLinkProfile',\r\n});\r\nvar LUTFormatType = createEnum('LUTFormatType', 'look', {\r\n    look: 'LUTFormatLOOK',\r\n    cube: 'LUTFormatCUBE',\r\n    '3dl': 'LUTFormat3DL',\r\n});\r\nvar colorLookupOrder = createEnum('colorLookupOrder', 'rgb', {\r\n    rgb: 'rgbOrder',\r\n    bgr: 'bgrOrder',\r\n});\r\naddHandler('clrL', adjustmentType('color lookup'), function (reader, target, left) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid clrL version');\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.adjustment = { type: 'color lookup' };\r\n    var info = target.adjustment;\r\n    if (desc.lookupType !== undefined)\r\n        info.lookupType = colorLookupType.decode(desc.lookupType);\r\n    if (desc['Nm  '] !== undefined)\r\n        info.name = desc['Nm  '];\r\n    if (desc.Dthr !== undefined)\r\n        info.dither = desc.Dthr;\r\n    if (desc.profile !== undefined)\r\n        info.profile = desc.profile;\r\n    if (desc.LUTFormat !== undefined)\r\n        info.lutFormat = LUTFormatType.decode(desc.LUTFormat);\r\n    if (desc.dataOrder !== undefined)\r\n        info.dataOrder = colorLookupOrder.decode(desc.dataOrder);\r\n    if (desc.tableOrder !== undefined)\r\n        info.tableOrder = colorLookupOrder.decode(desc.tableOrder);\r\n    if (desc.LUT3DFileData !== undefined)\r\n        info.lut3DFileData = desc.LUT3DFileData;\r\n    if (desc.LUT3DFileName !== undefined)\r\n        info.lut3DFileName = desc.LUT3DFileName;\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    var desc = {};\r\n    if (info.lookupType !== undefined)\r\n        desc.lookupType = colorLookupType.encode(info.lookupType);\r\n    if (info.name !== undefined)\r\n        desc['Nm  '] = info.name;\r\n    if (info.dither !== undefined)\r\n        desc.Dthr = info.dither;\r\n    if (info.profile !== undefined)\r\n        desc.profile = info.profile;\r\n    if (info.lutFormat !== undefined)\r\n        desc.LUTFormat = LUTFormatType.encode(info.lutFormat);\r\n    if (info.dataOrder !== undefined)\r\n        desc.dataOrder = colorLookupOrder.encode(info.dataOrder);\r\n    if (info.tableOrder !== undefined)\r\n        desc.tableOrder = colorLookupOrder.encode(info.tableOrder);\r\n    if (info.lut3DFileData !== undefined)\r\n        desc.LUT3DFileData = info.lut3DFileData;\r\n    if (info.lut3DFileName !== undefined)\r\n        desc.LUT3DFileName = info.lut3DFileName;\r\n    writeUint16(writer, 1); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('nvrt', adjustmentType('invert'), function (reader, target, left) {\r\n    target.adjustment = { type: 'invert' };\r\n    skipBytes(reader, left());\r\n}, function () {\r\n    // nothing to write here\r\n});\r\naddHandler('post', adjustmentType('posterize'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'posterize',\r\n        levels: readUint16(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, (_a = info.levels) !== null && _a !== void 0 ? _a : 4);\r\n    writeZeros(writer, 2);\r\n});\r\naddHandler('thrs', adjustmentType('threshold'), function (reader, target, left) {\r\n    target.adjustment = {\r\n        type: 'threshold',\r\n        level: readUint16(reader),\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, (_a = info.level) !== null && _a !== void 0 ? _a : 128);\r\n    writeZeros(writer, 2);\r\n});\r\nvar grdmColorModels = ['', '', '', 'rgb', 'hsb', '', 'lab'];\r\naddHandler('grdm', adjustmentType('gradient map'), function (reader, target, left) {\r\n    var version = readUint16(reader);\r\n    if (version !== 1 && version !== 3)\r\n        throw new Error('Invalid grdm version');\r\n    var info = {\r\n        type: 'gradient map',\r\n        gradientType: 'solid',\r\n    };\r\n    info.reverse = !!readUint8(reader);\r\n    info.dither = !!readUint8(reader);\r\n    var hasMethod = !!readUint8(reader);\r\n    reader.offset--;\r\n    if (hasMethod) {\r\n        var method = readSignature(reader);\r\n        info.method = gradientInterpolationMethodType.decode(method);\r\n    }\r\n    info.name = readUnicodeString(reader);\r\n    info.colorStops = [];\r\n    info.opacityStops = [];\r\n    var stopsCount = readUint16(reader);\r\n    for (var i = 0; i < stopsCount; i++) {\r\n        info.colorStops.push({\r\n            location: readUint32(reader),\r\n            midpoint: readUint32(reader) / 100,\r\n            color: readColor(reader),\r\n        });\r\n        skipBytes(reader, 2);\r\n    }\r\n    var opacityStopsCount = readUint16(reader);\r\n    for (var i = 0; i < opacityStopsCount; i++) {\r\n        info.opacityStops.push({\r\n            location: readUint32(reader),\r\n            midpoint: readUint32(reader) / 100,\r\n            opacity: readUint16(reader) / 0xff,\r\n        });\r\n    }\r\n    var expansionCount = readUint16(reader);\r\n    if (expansionCount !== 2)\r\n        throw new Error('Invalid grdm expansion count');\r\n    var interpolation = readUint16(reader);\r\n    info.smoothness = interpolation / 4096;\r\n    var length = readUint16(reader);\r\n    if (length !== 32)\r\n        throw new Error('Invalid grdm length');\r\n    info.gradientType = readUint16(reader) ? 'noise' : 'solid';\r\n    info.randomSeed = readUint32(reader);\r\n    info.addTransparency = !!readUint16(reader);\r\n    info.restrictColors = !!readUint16(reader);\r\n    info.roughness = readUint32(reader) / 4096;\r\n    info.colorModel = (grdmColorModels[readUint16(reader)] || 'rgb');\r\n    info.min = [\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n    ];\r\n    info.max = [\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n        readUint16(reader) / 0x8000,\r\n    ];\r\n    skipBytes(reader, left());\r\n    for (var _i = 0, _a = info.colorStops; _i < _a.length; _i++) {\r\n        var s = _a[_i];\r\n        s.location /= interpolation;\r\n    }\r\n    for (var _b = 0, _c = info.opacityStops; _b < _c.length; _b++) {\r\n        var s = _c[_b];\r\n        s.location /= interpolation;\r\n    }\r\n    target.adjustment = info;\r\n}, function (writer, target) {\r\n    var _a, _b, _c;\r\n    var info = target.adjustment;\r\n    writeUint16(writer, info.method !== undefined ? 3 : 1); // version\r\n    writeUint8(writer, info.reverse ? 1 : 0);\r\n    writeUint8(writer, info.dither ? 1 : 0);\r\n    if (info.method !== undefined) {\r\n        writeSignature(writer, gradientInterpolationMethodType.encode(info.method));\r\n    }\r\n    writeUnicodeStringWithPadding(writer, info.name || '');\r\n    writeUint16(writer, info.colorStops && info.colorStops.length || 0);\r\n    var interpolation = Math.round(((_a = info.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);\r\n    for (var _i = 0, _d = info.colorStops || []; _i < _d.length; _i++) {\r\n        var s = _d[_i];\r\n        writeUint32(writer, Math.round(s.location * interpolation));\r\n        writeUint32(writer, Math.round(s.midpoint * 100));\r\n        writeColor(writer, s.color);\r\n        writeZeros(writer, 2);\r\n    }\r\n    writeUint16(writer, info.opacityStops && info.opacityStops.length || 0);\r\n    for (var _e = 0, _f = info.opacityStops || []; _e < _f.length; _e++) {\r\n        var s = _f[_e];\r\n        writeUint32(writer, Math.round(s.location * interpolation));\r\n        writeUint32(writer, Math.round(s.midpoint * 100));\r\n        writeUint16(writer, Math.round(s.opacity * 0xff));\r\n    }\r\n    writeUint16(writer, 2); // expansion count\r\n    writeUint16(writer, interpolation);\r\n    writeUint16(writer, 32); // length\r\n    writeUint16(writer, info.gradientType === 'noise' ? 1 : 0);\r\n    writeUint32(writer, info.randomSeed || 0);\r\n    writeUint16(writer, info.addTransparency ? 1 : 0);\r\n    writeUint16(writer, info.restrictColors ? 1 : 0);\r\n    writeUint32(writer, Math.round(((_b = info.roughness) !== null && _b !== void 0 ? _b : 1) * 4096));\r\n    var colorModel = grdmColorModels.indexOf((_c = info.colorModel) !== null && _c !== void 0 ? _c : 'rgb');\r\n    writeUint16(writer, colorModel === -1 ? 3 : colorModel);\r\n    for (var i = 0; i < 4; i++)\r\n        writeUint16(writer, Math.round((info.min && info.min[i] || 0) * 0x8000));\r\n    for (var i = 0; i < 4; i++)\r\n        writeUint16(writer, Math.round((info.max && info.max[i] || 0) * 0x8000));\r\n    writeZeros(writer, 4);\r\n});\r\nfunction readSelectiveColors(reader) {\r\n    return {\r\n        c: readInt16(reader),\r\n        m: readInt16(reader),\r\n        y: readInt16(reader),\r\n        k: readInt16(reader),\r\n    };\r\n}\r\nfunction writeSelectiveColors(writer, cmyk) {\r\n    var c = cmyk || {};\r\n    writeInt16(writer, c.c);\r\n    writeInt16(writer, c.m);\r\n    writeInt16(writer, c.y);\r\n    writeInt16(writer, c.k);\r\n}\r\naddHandler('selc', adjustmentType('selective color'), function (reader, target) {\r\n    if (readUint16(reader) !== 1)\r\n        throw new Error('Invalid selc version');\r\n    var mode = readUint16(reader) ? 'absolute' : 'relative';\r\n    skipBytes(reader, 8);\r\n    target.adjustment = {\r\n        type: 'selective color',\r\n        mode: mode,\r\n        reds: readSelectiveColors(reader),\r\n        yellows: readSelectiveColors(reader),\r\n        greens: readSelectiveColors(reader),\r\n        cyans: readSelectiveColors(reader),\r\n        blues: readSelectiveColors(reader),\r\n        magentas: readSelectiveColors(reader),\r\n        whites: readSelectiveColors(reader),\r\n        neutrals: readSelectiveColors(reader),\r\n        blacks: readSelectiveColors(reader),\r\n    };\r\n}, function (writer, target) {\r\n    var info = target.adjustment;\r\n    writeUint16(writer, 1); // version\r\n    writeUint16(writer, info.mode === 'absolute' ? 1 : 0);\r\n    writeZeros(writer, 8);\r\n    writeSelectiveColors(writer, info.reds);\r\n    writeSelectiveColors(writer, info.yellows);\r\n    writeSelectiveColors(writer, info.greens);\r\n    writeSelectiveColors(writer, info.cyans);\r\n    writeSelectiveColors(writer, info.blues);\r\n    writeSelectiveColors(writer, info.magentas);\r\n    writeSelectiveColors(writer, info.whites);\r\n    writeSelectiveColors(writer, info.neutrals);\r\n    writeSelectiveColors(writer, info.blacks);\r\n});\r\naddHandler('CgEd', function (target) {\r\n    var a = target.adjustment;\r\n    if (!a)\r\n        return false;\r\n    return (a.type === 'brightness/contrast' && !a.useLegacy) ||\r\n        ((a.type === 'levels' || a.type === 'curves' || a.type === 'exposure' || a.type === 'channel mixer' ||\r\n            a.type === 'hue/saturation') && a.presetFileName !== undefined);\r\n}, function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    if (desc.Vrsn !== 1)\r\n        throw new Error('Invalid CgEd version');\r\n    // this section can specify preset file name for other adjustment types\r\n    if ('presetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.presetKind, presetFileName: desc.presetFileName });\r\n    }\r\n    else if ('curvesPresetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.curvesPresetKind, presetFileName: desc.curvesPresetFileName });\r\n    }\r\n    else if ('mixerPresetFileName' in desc) {\r\n        target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.mixerPresetKind, presetFileName: desc.mixerPresetFileName });\r\n    }\r\n    else {\r\n        target.adjustment = {\r\n            type: 'brightness/contrast',\r\n            brightness: desc.Brgh,\r\n            contrast: desc.Cntr,\r\n            meanValue: desc.means,\r\n            useLegacy: !!desc.useLegacy,\r\n            labColorOnly: !!desc['Lab '],\r\n            auto: !!desc.Auto,\r\n        };\r\n    }\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c, _d;\r\n    var info = target.adjustment;\r\n    if (info.type === 'levels' || info.type === 'exposure' || info.type === 'hue/saturation') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            presetKind: (_a = info.presetKind) !== null && _a !== void 0 ? _a : 1,\r\n            presetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'curves') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            curvesPresetKind: (_b = info.presetKind) !== null && _b !== void 0 ? _b : 1,\r\n            curvesPresetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'channel mixer') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            mixerPresetKind: (_c = info.presetKind) !== null && _c !== void 0 ? _c : 1,\r\n            mixerPresetFileName: info.presetFileName || '',\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else if (info.type === 'brightness/contrast') {\r\n        var desc = {\r\n            Vrsn: 1,\r\n            Brgh: info.brightness || 0,\r\n            Cntr: info.contrast || 0,\r\n            means: (_d = info.meanValue) !== null && _d !== void 0 ? _d : 127,\r\n            'Lab ': !!info.labColorOnly,\r\n            useLegacy: !!info.useLegacy,\r\n            Auto: !!info.auto,\r\n        };\r\n        writeVersionAndDescriptor(writer, '', 'null', desc);\r\n    }\r\n    else {\r\n        throw new Error('Unhandled CgEd case');\r\n    }\r\n});\r\nfunction getTextLayersSortedByIndex(psd) {\r\n    var layers = [];\r\n    function collect(layer) {\r\n        var _a;\r\n        if (layer.children) {\r\n            for (var _i = 0, _b = layer.children; _i < _b.length; _i++) {\r\n                var child = _b[_i];\r\n                if (((_a = child.text) === null || _a === void 0 ? void 0 : _a.index) !== undefined) {\r\n                    layers[child.text.index] = child;\r\n                }\r\n                collect(child);\r\n            }\r\n        }\r\n    }\r\n    collect(psd);\r\n    return layers;\r\n}\r\naddHandler('Txt2', hasKey('engineData'), function (reader, target, left, psd) {\r\n    var data = readBytes(reader, left());\r\n    target.engineData = fromByteArray(data);\r\n    var layersByIndex = getTextLayersSortedByIndex(psd);\r\n    var engineData = parseEngineData(data);\r\n    var engineData2 = decodeEngineData2(engineData);\r\n    var TextFrameSet = engineData2.ResourceDict.TextFrameSet;\r\n    if (TextFrameSet) {\r\n        for (var i = 0; i < TextFrameSet.length; i++) {\r\n            var layer = layersByIndex[i];\r\n            if (TextFrameSet[i].path && (layer === null || layer === void 0 ? void 0 : layer.text)) {\r\n                layer.text.textPath = TextFrameSet[i].path;\r\n            }\r\n        }\r\n    }\r\n    // console.log(require('util').inspect(engineData, false, 99, true));\r\n    // require('fs').writeFileSync('test_data.bin', data);\r\n    // require('fs').writeFileSync('test_data.txt', require('util').inspect(engineData, false, 99, false), 'utf8');\r\n    // require('fs').writeFileSync('test_data.json', JSON.stringify(engineData2, null, 2), 'utf8');\r\n}, function (writer, target) {\r\n    var buffer = toByteArray(target.engineData);\r\n    writeBytes(writer, buffer);\r\n});\r\naddHandler('FEid', hasKey('filterEffectsMasks'), function (reader, target, leftBytes) {\r\n    var version = readInt32(reader);\r\n    if (version < 1 || version > 3)\r\n        throw new Error(\"Invalid filterEffects version \".concat(version));\r\n    target.filterEffectsMasks = [];\r\n    while (leftBytes() > 8) {\r\n        if (readUint32(reader))\r\n            throw new Error('filterEffects: 64 bit length is not supported');\r\n        var length_2 = readUint32(reader);\r\n        var end = reader.offset + length_2;\r\n        var id = readPascalString(reader, 1);\r\n        var effectVersion = readInt32(reader);\r\n        if (effectVersion !== 1)\r\n            throw new Error(\"Invalid filterEffect version \".concat(effectVersion));\r\n        if (readUint32(reader))\r\n            throw new Error('filterEffect: 64 bit length is not supported');\r\n        /*const effectLength =*/ readUint32(reader);\r\n        // const endOfEffect = reader.offset + effectLength;\r\n        var top_2 = readInt32(reader);\r\n        var left = readInt32(reader);\r\n        var bottom = readInt32(reader);\r\n        var right = readInt32(reader);\r\n        var depth = readInt32(reader);\r\n        var maxChannels = readInt32(reader);\r\n        var channels = [];\r\n        // 0 -> R, 1 -> G, 2 -> B, 25 -> A\r\n        for (var i = 0; i < (maxChannels + 2); i++) { // channels + user mask + sheet mask\r\n            var exists = readInt32(reader);\r\n            if (exists) {\r\n                if (readUint32(reader))\r\n                    throw new Error('filterEffect: 64 bit length is not supported');\r\n                var channelLength = readUint32(reader);\r\n                if (!channelLength)\r\n                    throw new Error('filterEffect: Empty channel');\r\n                var compressionMode = readUint16(reader);\r\n                var data = readBytes(reader, channelLength - 2);\r\n                channels.push({ compressionMode: compressionMode, data: data });\r\n            }\r\n            else {\r\n                channels.push(undefined);\r\n            }\r\n        }\r\n        target.filterEffectsMasks.push({ id: id, top: top_2, left: left, bottom: bottom, right: right, depth: depth, channels: channels });\r\n        if (reader.offset < end && readUint8(reader)) {\r\n            var top_3 = readInt32(reader);\r\n            var left_1 = readInt32(reader);\r\n            var bottom_1 = readInt32(reader);\r\n            var right_1 = readInt32(reader);\r\n            if (readUint32(reader))\r\n                throw new Error('filterEffect: 64 bit length is not supported');\r\n            var extraLength = readUint32(reader);\r\n            var compressionMode = readUint16(reader);\r\n            var data = readBytes(reader, extraLength - 2);\r\n            target.filterEffectsMasks[target.filterEffectsMasks.length - 1].extra = { top: top_3, left: left_1, bottom: bottom_1, right: right_1, compressionMode: compressionMode, data: data };\r\n        }\r\n        reader.offset = end;\r\n        var len = length_2;\r\n        while (len % 4) {\r\n            reader.offset++;\r\n            len++;\r\n        }\r\n    }\r\n}, function (writer, target) {\r\n    var _a;\r\n    writeInt32(writer, 3); // version\r\n    for (var _i = 0, _b = target.filterEffectsMasks; _i < _b.length; _i++) {\r\n        var mask = _b[_i];\r\n        writeUint32(writer, 0);\r\n        writeUint32(writer, 0);\r\n        var lengthOffset = writer.offset;\r\n        writePascalString(writer, mask.id, 1);\r\n        writeInt32(writer, 1); // version\r\n        writeUint32(writer, 0);\r\n        writeUint32(writer, 0);\r\n        var length2Offset = writer.offset;\r\n        writeInt32(writer, mask.top);\r\n        writeInt32(writer, mask.left);\r\n        writeInt32(writer, mask.bottom);\r\n        writeInt32(writer, mask.right);\r\n        writeInt32(writer, mask.depth);\r\n        var maxChannels = Math.max(0, mask.channels.length - 2);\r\n        writeInt32(writer, maxChannels);\r\n        for (var i = 0; i < (maxChannels + 2); i++) {\r\n            var channel = mask.channels[i];\r\n            writeInt32(writer, channel ? 1 : 0);\r\n            if (channel) {\r\n                writeUint32(writer, 0);\r\n                writeUint32(writer, channel.data.length + 2);\r\n                writeUint16(writer, channel.compressionMode);\r\n                writeBytes(writer, channel.data);\r\n            }\r\n        }\r\n        writer.view.setUint32(length2Offset - 4, writer.offset - length2Offset, false);\r\n        var extra = (_a = target.filterEffectsMasks[target.filterEffectsMasks.length - 1]) === null || _a === void 0 ? void 0 : _a.extra;\r\n        if (extra) {\r\n            writeUint8(writer, 1);\r\n            writeInt32(writer, extra.top);\r\n            writeInt32(writer, extra.left);\r\n            writeInt32(writer, extra.bottom);\r\n            writeInt32(writer, extra.right);\r\n            writeUint32(writer, 0);\r\n            writeUint32(writer, extra.data.byteLength + 2);\r\n            writeUint16(writer, extra.compressionMode);\r\n            writeBytes(writer, extra.data);\r\n        }\r\n        var length_3 = writer.offset - lengthOffset;\r\n        writer.view.setUint32(lengthOffset - 4, length_3, false);\r\n        while (length_3 % 4) {\r\n            writeZeros(writer, 1);\r\n            length_3++;\r\n        }\r\n    }\r\n});\r\naddHandlerAlias('FXid', 'FEid');\r\naddHandler('FMsk', hasKey('filterMask'), function (reader, target) {\r\n    target.filterMask = {\r\n        colorSpace: readColor(reader),\r\n        opacity: readUint16(reader) / 0xff,\r\n    };\r\n}, function (writer, target) {\r\n    var _a;\r\n    writeColor(writer, target.filterMask.colorSpace);\r\n    writeUint16(writer, clamp((_a = target.filterMask.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 0xff);\r\n});\r\naddHandler('artd', // document-wide artboard info\r\nfunction (// document-wide artboard info\r\ntarget) { return target.artboards !== undefined; }, function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    target.artboards = {\r\n        count: desc['Cnt '],\r\n        autoExpandOffset: { horizontal: desc.autoExpandOffset.Hrzn, vertical: desc.autoExpandOffset.Vrtc },\r\n        origin: { horizontal: desc.origin.Hrzn, vertical: desc.origin.Vrtc },\r\n        autoExpandEnabled: desc.autoExpandEnabled,\r\n        autoNestEnabled: desc.autoNestEnabled,\r\n        autoPositionEnabled: desc.autoPositionEnabled,\r\n        shrinkwrapOnSaveEnabled: !!desc.shrinkwrapOnSaveEnabled,\r\n        docDefaultNewArtboardBackgroundColor: parseColor(desc.docDefaultNewArtboardBackgroundColor),\r\n        docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,\r\n    };\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var _a, _b, _c, _d, _e;\r\n    var artb = target.artboards;\r\n    var desc = {\r\n        'Cnt ': artb.count,\r\n        autoExpandOffset: artb.autoExpandOffset ? { Hrzn: artb.autoExpandOffset.horizontal, Vrtc: artb.autoExpandOffset.vertical } : { Hrzn: 0, Vrtc: 0 },\r\n        origin: artb.origin ? { Hrzn: artb.origin.horizontal, Vrtc: artb.origin.vertical } : { Hrzn: 0, Vrtc: 0 },\r\n        autoExpandEnabled: (_a = artb.autoExpandEnabled) !== null && _a !== void 0 ? _a : true,\r\n        autoNestEnabled: (_b = artb.autoNestEnabled) !== null && _b !== void 0 ? _b : true,\r\n        autoPositionEnabled: (_c = artb.autoPositionEnabled) !== null && _c !== void 0 ? _c : true,\r\n        shrinkwrapOnSaveEnabled: (_d = artb.shrinkwrapOnSaveEnabled) !== null && _d !== void 0 ? _d : true,\r\n        docDefaultNewArtboardBackgroundColor: serializeColor(artb.docDefaultNewArtboardBackgroundColor),\r\n        docDefaultNewArtboardBackgroundType: (_e = artb.docDefaultNewArtboardBackgroundType) !== null && _e !== void 0 ? _e : 1,\r\n    };\r\n    writeVersionAndDescriptor(writer, '', 'null', desc, 'artd');\r\n});\r\nexport function hasMultiEffects(effects) {\r\n    return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });\r\n}\r\naddHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left) {\r\n    var version = readUint32(reader);\r\n    if (version !== 0)\r\n        throw new Error(\"Invalid lfx2 version\");\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log('READ', require('util').inspect(desc, false, 99, true));\r\n    // TODO: don't discard if we got it from lmfx\r\n    // discard if read in 'lrFX' section\r\n    target.effects = parseEffects(desc, !!reader.logMissingFeatures);\r\n    skipBytes(reader, left());\r\n}, function (writer, target, _, options) {\r\n    var desc = serializeEffects(target.effects, !!options.logMissingFeatures, true);\r\n    // console.log('WRITE', require('util').inspect(desc, false, 99, true));\r\n    writeUint32(writer, 0); // version\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\naddHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    function enumValue(desc) {\r\n        return desc.split('.')[1];\r\n    }\r\n    target.compositorUsed = {\r\n        description: desc.description,\r\n        reason: desc.reason,\r\n        engine: enumValue(desc.Engn),\r\n    };\r\n    if (desc.Vrsn)\r\n        target.compositorUsed.version = desc.Vrsn;\r\n    if (desc.psVersion)\r\n        target.compositorUsed.photoshopVersion = desc.psVersion;\r\n    if (desc.enableCompCore)\r\n        target.compositorUsed.enableCompCore = enumValue(desc.enableCompCore);\r\n    if (desc.enableCompCoreGPU)\r\n        target.compositorUsed.enableCompCoreGPU = enumValue(desc.enableCompCoreGPU);\r\n    if (desc.enableCompCoreThreads)\r\n        target.compositorUsed.enableCompCoreThreads = enumValue(desc.enableCompCoreThreads);\r\n    if (desc.compCoreSupport)\r\n        target.compositorUsed.compCoreSupport = enumValue(desc.compCoreSupport);\r\n    if (desc.compCoreGPUSupport)\r\n        target.compositorUsed.compCoreGPUSupport = enumValue(desc.compCoreGPUSupport);\r\n    skipBytes(reader, left());\r\n}, function (writer, target) {\r\n    var cinf = target.compositorUsed;\r\n    var desc = {\r\n        Vrsn: cinf.version || { major: 1, minor: 0, fix: 0 },\r\n    };\r\n    if (cinf.photoshopVersion)\r\n        desc.psVersion = cinf.photoshopVersion;\r\n    desc.description = cinf.description;\r\n    desc.reason = cinf.reason;\r\n    desc.Engn = \"Engn.\".concat(cinf.engine);\r\n    if (cinf.enableCompCore)\r\n        desc.enableCompCore = \"enable.\".concat(cinf.enableCompCore);\r\n    if (cinf.enableCompCoreGPU)\r\n        desc.enableCompCoreGPU = \"enable.\".concat(cinf.enableCompCoreGPU);\r\n    if (cinf.enableCompCoreThreads)\r\n        desc.enableCompCoreThreads = \"enable.\".concat(cinf.enableCompCoreThreads);\r\n    if (cinf.compCoreSupport)\r\n        desc.compCoreSupport = \"reason.\".concat(cinf.compCoreSupport);\r\n    if (cinf.compCoreGPUSupport)\r\n        desc.compCoreGPUSupport = \"reason.\".concat(cinf.compCoreGPUSupport);\r\n    writeVersionAndDescriptor(writer, '', 'null', desc);\r\n});\r\n// extension settings ?, ignore it\r\naddHandler('extn', function (target) { return target._extn !== undefined; }, function (reader, target) {\r\n    var desc = readVersionAndDescriptor(reader);\r\n    // console.log(require('util').inspect(desc, false, 99, true));\r\n    if (MOCK_HANDLERS)\r\n        target._extn = desc;\r\n}, function (writer, target) {\r\n    // TODO: need to add correct types for desc fields (resources/src.psd)\r\n    if (MOCK_HANDLERS)\r\n        writeVersionAndDescriptor(writer, '', 'null', target._extn);\r\n});\r\naddHandler('iOpa', hasKey('fillOpacity'), function (reader, target) {\r\n    target.fillOpacity = readUint8(reader) / 0xff;\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.fillOpacity * 0xff);\r\n    writeZeros(writer, 3);\r\n});\r\naddHandler('brst', hasKey('channelBlendingRestrictions'), function (reader, target, left) {\r\n    target.channelBlendingRestrictions = [];\r\n    while (left() > 4) {\r\n        target.channelBlendingRestrictions.push(readInt32(reader));\r\n    }\r\n}, function (writer, target) {\r\n    for (var _i = 0, _a = target.channelBlendingRestrictions; _i < _a.length; _i++) {\r\n        var channel = _a[_i];\r\n        writeInt32(writer, channel);\r\n    }\r\n});\r\naddHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target) {\r\n    target.transparencyShapesLayer = !!readUint8(reader);\r\n    skipBytes(reader, 3);\r\n}, function (writer, target) {\r\n    writeUint8(writer, target.transparencyShapesLayer ? 1 : 0);\r\n    writeZeros(writer, 3);\r\n});\r\n//# sourceMappingURL=additionalInfo.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { hasAlpha, createCanvas, writeDataRLE, offsetForChannel, createImageData, fromBlendMode, clamp, largeAdditionalInfoKeys, RAW_IMAGE_DATA, writeDataZipWithoutPrediction, imageDataToCanvas } from './helpers';\r\nimport { infoHandlers } from './additionalInfo';\r\nimport { resourceHandlers } from './imageResources';\r\nexport function createWriter(size) {\r\n    if (size === void 0) { size = 4096; }\r\n    var buffer = new ArrayBuffer(size);\r\n    var view = new DataView(buffer);\r\n    var offset = 0;\r\n    return { buffer: buffer, view: view, offset: offset, tempBuffer: undefined };\r\n}\r\nexport function getWriterBuffer(writer) {\r\n    return writer.buffer.slice(0, writer.offset);\r\n}\r\nexport function getWriterBufferNoCopy(writer) {\r\n    return new Uint8Array(writer.buffer, 0, writer.offset);\r\n}\r\nexport function writeUint8(writer, value) {\r\n    var offset = addSize(writer, 1);\r\n    writer.view.setUint8(offset, value);\r\n}\r\nexport function writeInt16(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setInt16(offset, value, false);\r\n}\r\nexport function writeUint16(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setUint16(offset, value, false);\r\n}\r\nexport function writeUint16LE(writer, value) {\r\n    var offset = addSize(writer, 2);\r\n    writer.view.setUint16(offset, value, true);\r\n}\r\nexport function writeInt32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setInt32(offset, value, false);\r\n}\r\nexport function writeInt32LE(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setInt32(offset, value, true);\r\n}\r\nexport function writeUint32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setUint32(offset, value, false);\r\n}\r\nexport function writeFloat32(writer, value) {\r\n    var offset = addSize(writer, 4);\r\n    writer.view.setFloat32(offset, value, false);\r\n}\r\nexport function writeFloat64(writer, value) {\r\n    var offset = addSize(writer, 8);\r\n    writer.view.setFloat64(offset, value, false);\r\n}\r\n// 32-bit fixed-point number 16.16\r\nexport function writeFixedPoint32(writer, value) {\r\n    writeInt32(writer, value * (1 << 16));\r\n}\r\n// 32-bit fixed-point number 8.24\r\nexport function writeFixedPointPath32(writer, value) {\r\n    writeInt32(writer, value * (1 << 24));\r\n}\r\nexport function writeBytes(writer, buffer) {\r\n    if (buffer) {\r\n        ensureSize(writer, writer.offset + buffer.length);\r\n        var bytes = new Uint8Array(writer.buffer);\r\n        bytes.set(buffer, writer.offset);\r\n        writer.offset += buffer.length;\r\n    }\r\n}\r\nexport function writeZeros(writer, count) {\r\n    for (var i = 0; i < count; i++) {\r\n        writeUint8(writer, 0);\r\n    }\r\n}\r\nexport function writeSignature(writer, signature) {\r\n    if (signature.length !== 4)\r\n        throw new Error(\"Invalid signature: '\".concat(signature, \"'\"));\r\n    for (var i = 0; i < 4; i++) {\r\n        writeUint8(writer, signature.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeAsciiString(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint8(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writePascalString(writer, text, padTo) {\r\n    var length = text.length;\r\n    if (length > 255)\r\n        throw new Error(\"String too long\");\r\n    writeUint8(writer, length);\r\n    for (var i = 0; i < length; i++) {\r\n        var code = text.charCodeAt(i);\r\n        // writeUint8(writer, code); // for testing\r\n        writeUint8(writer, code < 128 ? code : '?'.charCodeAt(0));\r\n    }\r\n    while (++length % padTo) {\r\n        writeUint8(writer, 0);\r\n    }\r\n}\r\nexport function writeUnicodeStringWithoutLength(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeUnicodeStringWithoutLengthLE(writer, text) {\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16LE(writer, text.charCodeAt(i));\r\n    }\r\n}\r\nexport function writeUnicodeString(writer, text) {\r\n    writeUint32(writer, text.length);\r\n    writeUnicodeStringWithoutLength(writer, text);\r\n}\r\nexport function writeUnicodeStringWithPadding(writer, text) {\r\n    writeUint32(writer, text.length + 1);\r\n    for (var i = 0; i < text.length; i++) {\r\n        writeUint16(writer, text.charCodeAt(i));\r\n    }\r\n    writeUint16(writer, 0);\r\n}\r\nfunction getLargestLayerSize(layers) {\r\n    if (layers === void 0) { layers = []; }\r\n    var max = 0;\r\n    for (var _i = 0, layers_1 = layers; _i < layers_1.length; _i++) {\r\n        var layer = layers_1[_i];\r\n        if (layer.canvas || layer.imageData) {\r\n            var _a = getLayerDimentions(layer), width = _a.width, height = _a.height;\r\n            max = Math.max(max, 2 * height + 2 * width * height);\r\n        }\r\n        if (layer.children) {\r\n            max = Math.max(max, getLargestLayerSize(layer.children));\r\n        }\r\n    }\r\n    return max;\r\n}\r\nexport function writeSection(writer, round, func, writeTotalLength, large) {\r\n    if (writeTotalLength === void 0) { writeTotalLength = false; }\r\n    if (large === void 0) { large = false; }\r\n    if (large)\r\n        writeUint32(writer, 0);\r\n    var offset = writer.offset;\r\n    writeUint32(writer, 0);\r\n    func();\r\n    var length = writer.offset - offset - 4;\r\n    var len = length;\r\n    while (len % round) {\r\n        writeUint8(writer, 0);\r\n        len++;\r\n    }\r\n    // while (writer.offset % round) {\r\n    // \twriteUint8(writer, 0);\r\n    // \tlen++;\r\n    // }\r\n    if (writeTotalLength) {\r\n        length = len;\r\n    }\r\n    writer.view.setUint32(offset, length, false);\r\n}\r\nfunction verifyBitCount(target) {\r\n    var _a;\r\n    (_a = target.children) === null || _a === void 0 ? void 0 : _a.forEach(verifyBitCount);\r\n    var data = target.imageData;\r\n    if (data && (data.data instanceof Uint32Array || data.data instanceof Uint16Array)) {\r\n        throw new Error('imageData has incorrect bitDepth');\r\n    }\r\n    if ('mask' in target && target.mask) {\r\n        var data_1 = target.mask.imageData;\r\n        if (data_1 && (data_1.data instanceof Uint32Array || data_1.data instanceof Uint16Array)) {\r\n            throw new Error('mask imageData has incorrect bitDepth');\r\n        }\r\n    }\r\n}\r\nexport function writePsd(writer, psd, options) {\r\n    var _a;\r\n    if (options === void 0) { options = {}; }\r\n    if (!(+psd.width > 0 && +psd.height > 0))\r\n        throw new Error('Invalid document size');\r\n    if ((psd.width > 30000 || psd.height > 30000) && !options.psb)\r\n        throw new Error('Document size is too large (max is 30000x30000, use PSB format instead)');\r\n    var bitsPerChannel = (_a = psd.bitsPerChannel) !== null && _a !== void 0 ? _a : 8;\r\n    if (bitsPerChannel !== 8)\r\n        throw new Error('bitsPerChannel other than 8 are not supported for writing');\r\n    verifyBitCount(psd);\r\n    var imageResources = __assign({}, psd.imageResources);\r\n    var opt = __assign(__assign({}, options), { layerIds: new Set(), layerToId: new Map() });\r\n    if (opt.generateThumbnail) {\r\n        imageResources.thumbnail = createThumbnail(psd);\r\n    }\r\n    var imageData = psd.imageData;\r\n    if (!imageData && psd.canvas) {\r\n        imageData = psd.canvas.getContext('2d').getImageData(0, 0, psd.canvas.width, psd.canvas.height);\r\n    }\r\n    if (imageData && (psd.width !== imageData.width || psd.height !== imageData.height))\r\n        throw new Error('Document canvas must have the same size as document');\r\n    var globalAlpha = !!imageData && hasAlpha(imageData);\r\n    var maxBufferSize = Math.max(getLargestLayerSize(psd.children), 4 * 2 * psd.width * psd.height + 2 * psd.height);\r\n    writer.tempBuffer = new Uint8Array(maxBufferSize);\r\n    // header\r\n    writeSignature(writer, '8BPS');\r\n    writeUint16(writer, options.psb ? 2 : 1); // version\r\n    writeZeros(writer, 6);\r\n    writeUint16(writer, globalAlpha ? 4 : 3); // channels\r\n    writeUint32(writer, psd.height);\r\n    writeUint32(writer, psd.width);\r\n    writeUint16(writer, bitsPerChannel); // bits per channel\r\n    writeUint16(writer, 3 /* ColorMode.RGB */); // we only support saving RGB right now\r\n    // color mode data\r\n    writeSection(writer, 1, function () {\r\n        var _a, _b, _c;\r\n        if (psd.palette) {\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_a = psd.palette[i]) === null || _a === void 0 ? void 0 : _a.r) || 0);\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_b = psd.palette[i]) === null || _b === void 0 ? void 0 : _b.g) || 0);\r\n            for (var i = 0; i < 256; i++)\r\n                writeUint8(writer, ((_c = psd.palette[i]) === null || _c === void 0 ? void 0 : _c.b) || 0);\r\n        }\r\n        // TODO: other data?\r\n    });\r\n    var layers = [];\r\n    addChildren(layers, psd.children);\r\n    if (!layers.length)\r\n        layers.push({});\r\n    // image resources\r\n    imageResources.layersGroup = layers.map(function (l) { return l.linkGroup || 0; });\r\n    imageResources.layerGroupsEnabledId = layers.map(function (l) { return l.linkGroupEnabled == false ? 0 : 1; });\r\n    writeSection(writer, 1, function () {\r\n        var _loop_1 = function (handler) {\r\n            var has = handler.has(imageResources);\r\n            var count = has === false ? 0 : (has === true ? 1 : has);\r\n            var _loop_2 = function (i) {\r\n                writeSignature(writer, '8BIM');\r\n                writeUint16(writer, handler.key);\r\n                writePascalString(writer, '', 2);\r\n                writeSection(writer, 2, function () { return handler.write(writer, imageResources, i); });\r\n            };\r\n            for (var i = 0; i < count; i++) {\r\n                _loop_2(i);\r\n            }\r\n        };\r\n        for (var _i = 0, resourceHandlers_1 = resourceHandlers; _i < resourceHandlers_1.length; _i++) {\r\n            var handler = resourceHandlers_1[_i];\r\n            _loop_1(handler);\r\n        }\r\n    });\r\n    // layer and mask info\r\n    writeSection(writer, 2, function () {\r\n        writeLayerInfo(writer, layers, psd, globalAlpha, opt);\r\n        writeGlobalLayerMaskInfo(writer, psd.globalLayerMaskInfo);\r\n        writeAdditionalLayerInfo(writer, psd, psd, opt);\r\n    }, undefined, !!opt.psb);\r\n    // image data\r\n    var channels = globalAlpha ? [0, 1, 2, 3] : [0, 1, 2];\r\n    var width = imageData ? imageData.width : psd.width;\r\n    var height = imageData ? imageData.height : psd.height;\r\n    var data = { data: new Uint8Array(width * height * 4), width: width, height: height };\r\n    writeUint16(writer, 1 /* Compression.RleCompressed */); // Photoshop doesn't support zip compression of composite image data\r\n    if (RAW_IMAGE_DATA && psd.imageDataRaw) {\r\n        console.log('writing raw image data');\r\n        writeBytes(writer, psd.imageDataRaw);\r\n    }\r\n    else {\r\n        if (imageData)\r\n            data.data.set(new Uint8Array(imageData.data.buffer, imageData.data.byteOffset, imageData.data.byteLength));\r\n        // add weird white matte\r\n        if (globalAlpha) {\r\n            var size = data.width * data.height * 4;\r\n            var p = data.data;\r\n            for (var i = 0; i < size; i += 4) {\r\n                var pa = p[i + 3];\r\n                if (pa != 0 && pa != 255) {\r\n                    var a = pa / 255;\r\n                    var ra = 255 * (1 - a);\r\n                    p[i + 0] = p[i + 0] * a + ra;\r\n                    p[i + 1] = p[i + 1] * a + ra;\r\n                    p[i + 2] = p[i + 2] * a + ra;\r\n                }\r\n            }\r\n        }\r\n        writeBytes(writer, writeDataRLE(writer.tempBuffer, data, channels, !!options.psb));\r\n    }\r\n}\r\nfunction writeLayerInfo(writer, layers, psd, globalAlpha, options) {\r\n    writeSection(writer, 4, function () {\r\n        var _a;\r\n        writeInt16(writer, globalAlpha ? -layers.length : layers.length);\r\n        var layersData = layers.map(function (l, i) { return getChannels(writer.tempBuffer, l, i === 0, options); });\r\n        var _loop_3 = function (layerData) {\r\n            var layer = layerData.layer, top_1 = layerData.top, left = layerData.left, bottom = layerData.bottom, right = layerData.right, channels = layerData.channels;\r\n            writeInt32(writer, top_1);\r\n            writeInt32(writer, left);\r\n            writeInt32(writer, bottom);\r\n            writeInt32(writer, right);\r\n            writeUint16(writer, channels.length);\r\n            for (var _e = 0, channels_1 = channels; _e < channels_1.length; _e++) {\r\n                var c = channels_1[_e];\r\n                writeInt16(writer, c.channelId);\r\n                if (options.psb)\r\n                    writeUint32(writer, 0);\r\n                writeUint32(writer, c.length);\r\n            }\r\n            writeSignature(writer, '8BIM');\r\n            writeSignature(writer, fromBlendMode[layer.blendMode] || 'norm');\r\n            writeUint8(writer, Math.round(clamp((_a = layer.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 255));\r\n            writeUint8(writer, layer.clipping ? 1 : 0);\r\n            var flags = 0x08; // 1 for Photoshop 5.0 and later, tells if bit 4 has useful information\r\n            if (layer.transparencyProtected)\r\n                flags |= 0x01;\r\n            if (layer.hidden)\r\n                flags |= 0x02;\r\n            if (layer.vectorMask || (layer.sectionDivider && layer.sectionDivider.type !== 0 /* SectionDividerType.Other */) || layer.adjustment) {\r\n                flags |= 0x10; // pixel data irrelevant to appearance of document\r\n            }\r\n            if (layer.effectsOpen)\r\n                flags |= 0x20;\r\n            writeUint8(writer, flags);\r\n            writeUint8(writer, 0); // filler\r\n            writeSection(writer, 1, function () {\r\n                writeLayerMaskData(writer, layer, layerData);\r\n                writeLayerBlendingRanges(writer, layer);\r\n                writePascalString(writer, (layer.name || '').substring(0, 255), 4);\r\n                writeAdditionalLayerInfo(writer, layer, psd, options);\r\n            });\r\n        };\r\n        // layer records\r\n        for (var _i = 0, layersData_1 = layersData; _i < layersData_1.length; _i++) {\r\n            var layerData = layersData_1[_i];\r\n            _loop_3(layerData);\r\n        }\r\n        // layer channel image data\r\n        for (var _b = 0, layersData_2 = layersData; _b < layersData_2.length; _b++) {\r\n            var layerData = layersData_2[_b];\r\n            for (var _c = 0, _d = layerData.channels; _c < _d.length; _c++) {\r\n                var channel = _d[_c];\r\n                writeUint16(writer, channel.compression);\r\n                if (channel.buffer) {\r\n                    writeBytes(writer, channel.buffer);\r\n                }\r\n            }\r\n        }\r\n    }, true, options.psb);\r\n}\r\nfunction writeLayerMaskData(writer, _a, layerData) {\r\n    var mask = _a.mask, realMask = _a.realMask;\r\n    writeSection(writer, 1, function () {\r\n        if (!mask && !realMask)\r\n            return;\r\n        var params = 0, flags = 0, realFlags = 0;\r\n        if (mask) {\r\n            if (mask.userMaskDensity !== undefined)\r\n                params |= 1 /* MaskParams.UserMaskDensity */;\r\n            if (mask.userMaskFeather !== undefined)\r\n                params |= 2 /* MaskParams.UserMaskFeather */;\r\n            if (mask.vectorMaskDensity !== undefined)\r\n                params |= 4 /* MaskParams.VectorMaskDensity */;\r\n            if (mask.vectorMaskFeather !== undefined)\r\n                params |= 8 /* MaskParams.VectorMaskFeather */;\r\n            if (mask.disabled)\r\n                flags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;\r\n            if (mask.positionRelativeToLayer)\r\n                flags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;\r\n            if (mask.fromVectorData)\r\n                flags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;\r\n            if (params)\r\n                flags |= 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */;\r\n        }\r\n        var m = layerData.mask || {};\r\n        writeInt32(writer, m.top || 0);\r\n        writeInt32(writer, m.left || 0);\r\n        writeInt32(writer, m.bottom || 0);\r\n        writeInt32(writer, m.right || 0);\r\n        writeUint8(writer, mask && mask.defaultColor || 0);\r\n        writeUint8(writer, flags);\r\n        if (realMask) {\r\n            if (realMask.disabled)\r\n                realFlags |= 2 /* LayerMaskFlags.LayerMaskDisabled */;\r\n            if (realMask.positionRelativeToLayer)\r\n                realFlags |= 1 /* LayerMaskFlags.PositionRelativeToLayer */;\r\n            if (realMask.fromVectorData)\r\n                realFlags |= 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */;\r\n            var r = layerData.realMask || {};\r\n            writeUint8(writer, realFlags);\r\n            writeUint8(writer, realMask.defaultColor || 0);\r\n            writeInt32(writer, r.top || 0);\r\n            writeInt32(writer, r.left || 0);\r\n            writeInt32(writer, r.bottom || 0);\r\n            writeInt32(writer, r.right || 0);\r\n        }\r\n        if (params && mask) {\r\n            writeUint8(writer, params);\r\n            if (mask.userMaskDensity !== undefined)\r\n                writeUint8(writer, Math.round(mask.userMaskDensity * 0xff));\r\n            if (mask.userMaskFeather !== undefined)\r\n                writeFloat64(writer, mask.userMaskFeather);\r\n            if (mask.vectorMaskDensity !== undefined)\r\n                writeUint8(writer, Math.round(mask.vectorMaskDensity * 0xff));\r\n            if (mask.vectorMaskFeather !== undefined)\r\n                writeFloat64(writer, mask.vectorMaskFeather);\r\n        }\r\n        writeZeros(writer, 2);\r\n    });\r\n}\r\nfunction writerBlendingRange(writer, range) {\r\n    writeUint8(writer, range[0]);\r\n    writeUint8(writer, range[1]);\r\n    writeUint8(writer, range[2]);\r\n    writeUint8(writer, range[3]);\r\n}\r\nfunction writeLayerBlendingRanges(writer, layer) {\r\n    writeSection(writer, 1, function () {\r\n        var ranges = layer.blendingRanges;\r\n        if (ranges) {\r\n            writerBlendingRange(writer, ranges.compositeGrayBlendSource);\r\n            writerBlendingRange(writer, ranges.compositeGraphBlendDestinationRange);\r\n            for (var _i = 0, _a = ranges.ranges; _i < _a.length; _i++) {\r\n                var r = _a[_i];\r\n                writerBlendingRange(writer, r.sourceRange);\r\n                writerBlendingRange(writer, r.destRange);\r\n            }\r\n        }\r\n    });\r\n}\r\nfunction writeGlobalLayerMaskInfo(writer, info) {\r\n    writeSection(writer, 1, function () {\r\n        if (info) {\r\n            writeUint16(writer, info.overlayColorSpace);\r\n            writeUint16(writer, info.colorSpace1);\r\n            writeUint16(writer, info.colorSpace2);\r\n            writeUint16(writer, info.colorSpace3);\r\n            writeUint16(writer, info.colorSpace4);\r\n            writeUint16(writer, info.opacity * 0xff);\r\n            writeUint8(writer, info.kind);\r\n            writeZeros(writer, 3);\r\n        }\r\n    });\r\n}\r\nfunction writeAdditionalLayerInfo(writer, target, psd, options) {\r\n    var _loop_4 = function (handler) {\r\n        var key = handler.key;\r\n        if (key === 'Txt2' && options.invalidateTextLayers)\r\n            return \"continue\";\r\n        if (key === 'vmsk' && options.psb)\r\n            key = 'vsms';\r\n        if (handler.has(target)) {\r\n            var large = options.psb && largeAdditionalInfoKeys.indexOf(key) !== -1;\r\n            var writeTotalLength = key !== 'Txt2' && key !== 'cinf' && key !== 'extn' && key !== 'CAI ' && key !== 'OCIO';\r\n            var fourBytes = key === 'Txt2' || key === 'luni' || key === 'vmsk' || key === 'artb' || key === 'artd' ||\r\n                key === 'vogk' || key === 'SoLd' || key === 'lnk2' || key === 'vscg' || key === 'vsms' || key === 'GdFl' ||\r\n                key === 'lmfx' || key === 'lrFX' || key === 'cinf' || key === 'PlLd' || key === 'Anno' || key === 'CAI ' || key === 'OCIO' || key === 'GenI' || key === 'FEid' || key === 'curv' || key === 'CgEd' || key === 'vibA' || key === 'blwh' || key === 'grdm';\r\n            writeSignature(writer, large ? '8B64' : '8BIM');\r\n            writeSignature(writer, key);\r\n            writeSection(writer, fourBytes ? 4 : 2, function () {\r\n                handler.write(writer, target, psd, options);\r\n            }, writeTotalLength, large);\r\n        }\r\n    };\r\n    for (var _i = 0, infoHandlers_1 = infoHandlers; _i < infoHandlers_1.length; _i++) {\r\n        var handler = infoHandlers_1[_i];\r\n        _loop_4(handler);\r\n    }\r\n}\r\nfunction addChildren(layers, children) {\r\n    if (!children)\r\n        return;\r\n    // const layerIds: number[] = [2];\r\n    // const timestamps: number[] = [1740120767.0230637];\r\n    for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {\r\n        var c = children_1[_i];\r\n        if (c.children && c.canvas)\r\n            throw new Error(\"Invalid layer, cannot have both 'canvas' and 'children' properties\");\r\n        if (c.children && c.imageData)\r\n            throw new Error(\"Invalid layer, cannot have both 'imageData' and 'children' properties\");\r\n        if (c.children) {\r\n            layers.push({\r\n                name: '</Layer group>',\r\n                sectionDivider: {\r\n                    type: 3 /* SectionDividerType.BoundingSectionDivider */,\r\n                },\r\n                // blendingRanges: children[0].blendingRanges,\r\n                // nameSource: 'lset',\r\n                // id: layerIds.shift(),\r\n                // protected: {\r\n                // \ttransparency: false,\r\n                // \tcomposite: false,\r\n                // \tposition: false,\r\n                // },\r\n                // layerColor: 'red',\r\n                // timestamp: timestamps.shift(),\r\n                // referencePoint: { x: 0, y: 0 },\r\n            });\r\n            addChildren(layers, c.children);\r\n            layers.push(__assign(__assign({}, c), { blendMode: c.blendMode === 'pass through' ? 'normal' : c.blendMode, sectionDivider: {\r\n                    type: c.opened === false ? 2 /* SectionDividerType.ClosedFolder */ : 1 /* SectionDividerType.OpenFolder */,\r\n                    key: fromBlendMode[c.blendMode] || 'pass',\r\n                    subType: 0,\r\n                } }));\r\n        }\r\n        else {\r\n            layers.push(__assign({}, c));\r\n        }\r\n    }\r\n}\r\nfunction resizeBuffer(writer, size) {\r\n    var newLength = writer.buffer.byteLength;\r\n    do {\r\n        newLength *= 2;\r\n    } while (size > newLength);\r\n    var newBuffer = new ArrayBuffer(newLength);\r\n    var newBytes = new Uint8Array(newBuffer);\r\n    var oldBytes = new Uint8Array(writer.buffer);\r\n    newBytes.set(oldBytes);\r\n    writer.buffer = newBuffer;\r\n    writer.view = new DataView(writer.buffer);\r\n}\r\nfunction ensureSize(writer, size) {\r\n    if (size > writer.buffer.byteLength) {\r\n        resizeBuffer(writer, size);\r\n    }\r\n}\r\nfunction addSize(writer, size) {\r\n    var offset = writer.offset;\r\n    ensureSize(writer, writer.offset += size);\r\n    return offset;\r\n}\r\nfunction createThumbnail(psd) {\r\n    var canvas = createCanvas(10, 10);\r\n    var scale = 1;\r\n    if (psd.width > psd.height) {\r\n        canvas.width = 160;\r\n        canvas.height = Math.floor(psd.height * (canvas.width / psd.width));\r\n        scale = canvas.width / psd.width;\r\n    }\r\n    else {\r\n        canvas.height = 160;\r\n        canvas.width = Math.floor(psd.width * (canvas.height / psd.height));\r\n        scale = canvas.height / psd.height;\r\n    }\r\n    var context = canvas.getContext('2d');\r\n    context.scale(scale, scale);\r\n    if (psd.imageData) {\r\n        context.drawImage(imageDataToCanvas(psd.imageData), 0, 0);\r\n    }\r\n    else if (psd.canvas) {\r\n        context.drawImage(psd.canvas, 0, 0);\r\n    }\r\n    return canvas;\r\n}\r\nfunction getMaskChannels(tempBuffer, layerData, layer, mask, options, realMask) {\r\n    var top = mask.top | 0;\r\n    var left = mask.left | 0;\r\n    var right = mask.right | 0;\r\n    var bottom = mask.bottom | 0;\r\n    var _a = getLayerDimentions(mask), width = _a.width, height = _a.height;\r\n    var imageData = mask.imageData;\r\n    if (!imageData && mask.canvas && width && height) {\r\n        imageData = mask.canvas.getContext('2d').getImageData(0, 0, width, height);\r\n    }\r\n    if (imageData && (imageData.width !== width || imageData.height !== height)) {\r\n        throw new Error('Invalid imageData dimentions');\r\n    }\r\n    right = left + width;\r\n    bottom = top + height;\r\n    var buffer;\r\n    var compression;\r\n    if (RAW_IMAGE_DATA && layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw']) {\r\n        buffer = layer[realMask ? 'realMaskDataRaw' : 'maskDataRaw'];\r\n        compression = layer[realMask ? 'realMaskDataRawCompression' : 'maskDataRawCompression'];\r\n    }\r\n    else if (!imageData) {\r\n        buffer = new Uint8Array(0);\r\n        compression = 1 /* Compression.RleCompressed */;\r\n    }\r\n    else if (options.compress) {\r\n        buffer = writeDataZipWithoutPrediction(imageData, [0]);\r\n        compression = 2 /* Compression.ZipWithoutPrediction */;\r\n    }\r\n    else {\r\n        buffer = writeDataRLE(tempBuffer, imageData, [0], !!options.psb);\r\n        compression = 1 /* Compression.RleCompressed */;\r\n    }\r\n    layerData.channels.push({ channelId: realMask ? -3 /* ChannelID.RealUserMask */ : -2 /* ChannelID.UserMask */, compression: compression, buffer: buffer, length: 2 + buffer.length });\r\n    layerData[realMask ? 'realMask' : 'mask'] = { top: top, left: left, right: right, bottom: bottom };\r\n}\r\nfunction getChannels(tempBuffer, layer, background, options) {\r\n    var layerData = getLayerChannels(tempBuffer, layer, background, options);\r\n    if (layer.mask)\r\n        getMaskChannels(tempBuffer, layerData, layer, layer.mask, options, false);\r\n    if (layer.realMask)\r\n        getMaskChannels(tempBuffer, layerData, layer, layer.realMask, options, true);\r\n    return layerData;\r\n}\r\nfunction getLayerDimentions(_a) {\r\n    var _b, _c, _d, _e;\r\n    var canvas = _a.canvas, imageData = _a.imageData;\r\n    // this way in case canvas/imageData are incorrect objects without width/height properties\r\n    var width = (_c = (_b = imageData === null || imageData === void 0 ? void 0 : imageData.width) !== null && _b !== void 0 ? _b : canvas === null || canvas === void 0 ? void 0 : canvas.width) !== null && _c !== void 0 ? _c : 0;\r\n    var height = (_e = (_d = imageData === null || imageData === void 0 ? void 0 : imageData.height) !== null && _d !== void 0 ? _d : canvas === null || canvas === void 0 ? void 0 : canvas.height) !== null && _e !== void 0 ? _e : 0;\r\n    return { width: width, height: height };\r\n}\r\nfunction cropImageData(data, left, top, width, height) {\r\n    if (data.data instanceof Uint32Array || data.data instanceof Uint16Array) {\r\n        throw new Error('imageData has incorrect bit depth');\r\n    }\r\n    var croppedData = createImageData(width, height);\r\n    var srcData = data.data;\r\n    var dstData = croppedData.data;\r\n    for (var y = 0; y < height; y++) {\r\n        for (var x = 0; x < width; x++) {\r\n            var src = ((x + left) + (y + top) * data.width) * 4;\r\n            var dst = (x + y * width) * 4;\r\n            dstData[dst] = srcData[src];\r\n            dstData[dst + 1] = srcData[src + 1];\r\n            dstData[dst + 2] = srcData[src + 2];\r\n            dstData[dst + 3] = srcData[src + 3];\r\n        }\r\n    }\r\n    return croppedData;\r\n}\r\nfunction getLayerChannels(tempBuffer, layer, background, options) {\r\n    var _a;\r\n    var top = layer.top | 0;\r\n    var left = layer.left | 0;\r\n    var right = layer.right | 0;\r\n    var bottom = layer.bottom | 0;\r\n    var channels = [\r\n        { channelId: -1 /* ChannelID.Transparency */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 0 /* ChannelID.Color0 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 1 /* ChannelID.Color1 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n        { channelId: 2 /* ChannelID.Color2 */, compression: 0 /* Compression.RawData */, buffer: undefined, length: 2 },\r\n    ];\r\n    var _b = getLayerDimentions(layer), width = _b.width, height = _b.height;\r\n    if (!(layer.canvas || layer.imageData) || !width || !height) {\r\n        right = left;\r\n        bottom = top;\r\n        return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n    }\r\n    right = left + width;\r\n    bottom = top + height;\r\n    var data = layer.imageData || layer.canvas.getContext('2d').getImageData(0, 0, width, height);\r\n    if (options.trimImageData) {\r\n        var trimmed = trimData(data);\r\n        if (trimmed.left !== 0 || trimmed.top !== 0 || trimmed.right !== data.width || trimmed.bottom !== data.height) {\r\n            left += trimmed.left;\r\n            top += trimmed.top;\r\n            right -= (data.width - trimmed.right);\r\n            bottom -= (data.height - trimmed.bottom);\r\n            width = right - left;\r\n            height = bottom - top;\r\n            if (!width || !height)\r\n                return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n            data = cropImageData(data, trimmed.left, trimmed.top, width, height);\r\n        }\r\n    }\r\n    var channelIds = [\r\n        0 /* ChannelID.Color0 */,\r\n        1 /* ChannelID.Color1 */,\r\n        2 /* ChannelID.Color2 */,\r\n    ];\r\n    if (!background || options.noBackground || layer.mask || hasAlpha(data) || (RAW_IMAGE_DATA && ((_a = layer.imageDataRaw) === null || _a === void 0 ? void 0 : _a['-1']))) {\r\n        channelIds.unshift(-1 /* ChannelID.Transparency */);\r\n    }\r\n    channels = channelIds.map(function (channelId) {\r\n        var offset = offsetForChannel(channelId, false); // TODO: psd.colorMode === ColorMode.CMYK);\r\n        var buffer;\r\n        var compression;\r\n        if (RAW_IMAGE_DATA && layer.imageDataRaw) {\r\n            // console.log('written raw layer image data');\r\n            buffer = layer.imageDataRaw[channelId];\r\n            compression = layer.imageDataRawCompression[channelId];\r\n        }\r\n        else if (options.compress) {\r\n            buffer = writeDataZipWithoutPrediction(data, [offset]);\r\n            compression = 2 /* Compression.ZipWithoutPrediction */;\r\n        }\r\n        else {\r\n            buffer = writeDataRLE(tempBuffer, data, [offset], !!options.psb);\r\n            compression = 1 /* Compression.RleCompressed */;\r\n        }\r\n        return { channelId: channelId, compression: compression, buffer: buffer, length: 2 + buffer.length };\r\n    });\r\n    return { layer: layer, top: top, left: left, right: right, bottom: bottom, channels: channels };\r\n}\r\nfunction isRowEmpty(_a, y, left, right) {\r\n    var data = _a.data, width = _a.width;\r\n    var start = ((y * width + left) * 4 + 3) | 0;\r\n    var end = (start + (right - left) * 4) | 0;\r\n    for (var i = start; i < end; i = (i + 4) | 0) {\r\n        if (data[i] !== 0) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction isColEmpty(_a, x, top, bottom) {\r\n    var data = _a.data, width = _a.width;\r\n    var stride = (width * 4) | 0;\r\n    var start = (top * stride + x * 4 + 3) | 0;\r\n    for (var y = top, i = start; y < bottom; y++, i = (i + stride) | 0) {\r\n        if (data[i] !== 0) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction trimData(data) {\r\n    var top = 0;\r\n    var left = 0;\r\n    var right = data.width;\r\n    var bottom = data.height;\r\n    while (top < bottom && isRowEmpty(data, top, left, right))\r\n        top++;\r\n    while (bottom > top && isRowEmpty(data, bottom - 1, left, right))\r\n        bottom--;\r\n    while (left < right && isColEmpty(data, left, top, bottom))\r\n        left++;\r\n    while (right > left && isColEmpty(data, right - 1, top, bottom))\r\n        right--;\r\n    return { top: top, left: left, right: right, bottom: bottom };\r\n}\r\nexport function writeColor(writer, color) {\r\n    if (!color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeZeros(writer, 8);\r\n    }\r\n    else if ('r' in color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeUint16(writer, Math.round(color.r * 257));\r\n        writeUint16(writer, Math.round(color.g * 257));\r\n        writeUint16(writer, Math.round(color.b * 257));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('fr' in color) {\r\n        writeUint16(writer, 0 /* ColorSpace.RGB */);\r\n        writeUint16(writer, Math.round(color.fr * 255 * 257));\r\n        writeUint16(writer, Math.round(color.fg * 255 * 257));\r\n        writeUint16(writer, Math.round(color.fb * 255 * 257));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('l' in color) {\r\n        writeUint16(writer, 7 /* ColorSpace.Lab */);\r\n        writeInt16(writer, Math.round(color.l * 10000));\r\n        writeInt16(writer, Math.round(color.a < 0 ? (color.a * 12800) : (color.a * 12700)));\r\n        writeInt16(writer, Math.round(color.b < 0 ? (color.b * 12800) : (color.b * 12700)));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('h' in color) {\r\n        writeUint16(writer, 1 /* ColorSpace.HSB */);\r\n        writeUint16(writer, Math.round(color.h * 0xffff));\r\n        writeUint16(writer, Math.round(color.s * 0xffff));\r\n        writeUint16(writer, Math.round(color.b * 0xffff));\r\n        writeUint16(writer, 0);\r\n    }\r\n    else if ('c' in color) {\r\n        writeUint16(writer, 2 /* ColorSpace.CMYK */);\r\n        writeUint16(writer, Math.round(color.c * 257));\r\n        writeUint16(writer, Math.round(color.m * 257));\r\n        writeUint16(writer, Math.round(color.y * 257));\r\n        writeUint16(writer, Math.round(color.k * 257));\r\n    }\r\n    else {\r\n        writeUint16(writer, 8 /* ColorSpace.Grayscale */);\r\n        writeUint16(writer, Math.round(color.k * 10000 / 255));\r\n        writeZeros(writer, 6);\r\n    }\r\n}\r\n//# sourceMappingURL=psdWriter.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { BlnM, parseAngle, parsePercent, parseUnitsToNumber, readVersionAndDescriptor } from './descriptor';\r\nimport { checkSignature, createReader, readBytes, readDataRLE, readInt16, readInt32, readPascalString, readPattern, readSignature, readUint16, readUint32, readUint8, skipBytes } from './psdReader';\r\nvar dynamicsControl = ['off', 'fade', 'pen pressure', 'pen tilt', 'stylus wheel', 'initial direction', 'direction', 'initial rotation', 'rotation'];\r\nvar dynamicBrushShapeShapes = ['round point', 'round blunt', 'round curve', 'round angle', 'round fan', 'flat point', 'flat blunt', 'flat curve', 'flat angle', 'flat fan'];\r\nvar tipsBrushShapeShapes = ['erodible point', 'erodible flat', 'erodible round', 'erodible square', 'erodible triangle', 'custom'];\r\nvar toBrushType = {\r\n    _: 'brush',\r\n    MixB: 'mixer brush',\r\n    SmTl: 'smudge brush',\r\n    // PbTl\r\n    // ErTl\r\n};\r\nfunction parseDynamics(desc) {\r\n    return {\r\n        control: dynamicsControl[desc.bVTy],\r\n        steps: desc.fStp,\r\n        jitter: parsePercent(desc.jitter),\r\n        minimum: parsePercent(desc['Mnm ']),\r\n    };\r\n}\r\nfunction parseBrushShape(desc) {\r\n    switch (desc._classID) {\r\n        case 'computedBrush': {\r\n            return {\r\n                type: 'computed',\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                angle: parseAngle(desc.Angl),\r\n                roundness: parsePercent(desc.Rndn),\r\n                spacingOn: desc.Intr,\r\n                spacing: parsePercent(desc.Spcn),\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n                hardness: parsePercent(desc.Hrdn),\r\n            };\r\n        }\r\n        case 'sampledBrush': {\r\n            return {\r\n                type: 'sampled',\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                angle: parseAngle(desc.Angl),\r\n                roundness: parsePercent(desc.Rndn),\r\n                spacingOn: desc.Intr,\r\n                spacing: parsePercent(desc.Spcn),\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n                name: desc['Nm  '],\r\n                sampledData: desc.sampledData,\r\n            };\r\n        }\r\n        case 'dBrush':\r\n            return {\r\n                type: 'dynamic',\r\n                shape: dynamicBrushShapeShapes[desc['Shp ']],\r\n                angle: parseAngle(desc.Angl),\r\n                size: parseUnitsToNumber(desc.Dmtr, 'Pixels'),\r\n                density: parsePercent(desc.Dnst),\r\n                length: parsePercent(desc.Lngt),\r\n                clumping: parsePercent(desc.clumping),\r\n                thickness: parsePercent(desc.thickness),\r\n                stiffness: parsePercent(desc.stiffness),\r\n                physics: desc.physics,\r\n                spacing: parsePercent(desc.Spcn),\r\n                spacingOn: desc.Intr,\r\n                flipX: desc.flipX,\r\n                flipY: desc.flipY,\r\n            };\r\n        case 'dTips': {\r\n            return __assign(__assign({ type: 'tips', angle: parseAngle(desc.Angl), size: parseUnitsToNumber(desc.Dmtr, 'Pixels'), shape: dynamicBrushShapeShapes[desc['Shp ']], physics: desc.physics, spacing: parsePercent(desc.Spcn), spacingOn: desc.Intr, flipX: desc.flipX, flipY: desc.flipY, \r\n                // tips:\r\n                tipsType: tipsBrushShapeShapes[desc.dtipsType], tipsLengthRatio: parsePercent(desc.dtipsLengthRatio), tipsHardness: parsePercent(desc.dtipsHardness) }, (desc.dtipsGridSize && desc.dtipsErodibleTipHeightMap ? {\r\n                tipsGridSize: desc.dtipsGridSize,\r\n                tipsErodibleTipHeightMap: parseHeightmap(desc.dtipsErodibleTipHeightMap),\r\n            } : {})), { \r\n                // airbrush\r\n                tipsAirbrushCutoffAngle: desc.dtipsAirbrushCutoffAngle, tipsAirbrushGranularity: parsePercent(desc.dtipsAirbrushGranularity), tipsAirbrushStreakiness: parsePercent(desc.dtipsAirbrushStreakiness), tipsAirbrushSplatSize: parsePercent(desc.dtipsAirbrushSplatSize), tipsAirbrushSplatCount: desc.dtipsAirbrushSplatCount });\r\n        }\r\n        default:\r\n            console.log(require('util').inspect(desc, false, 99, true));\r\n            throw new Error(\"Unknown brush classId: \".concat(desc._classID));\r\n    }\r\n}\r\nfunction parseHeightmap(array) {\r\n    var result = [];\r\n    for (var i = 0; i < array.byteLength; i++) {\r\n        result.push(array[i]);\r\n    }\r\n    return result;\r\n    // const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\r\n    // const result: number[] = [];\r\n    // for (let i = 0, len = (array.byteLength / 4) | 0; i < len; i++) {\r\n    // \tresult.push(view.getInt32(i * 4)); ????\r\n    // }\r\n    // return result;\r\n}\r\nexport function readAbr(buffer, options) {\r\n    var _a, _b, _c, _d;\r\n    if (options === void 0) { options = {}; }\r\n    var reader = createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength);\r\n    var version = readInt16(reader);\r\n    var samples = [];\r\n    var brushes = [];\r\n    var patterns = [];\r\n    if (version === 1 || version === 2) {\r\n        throw new Error(\"Unsupported ABR version (\".concat(version, \")\")); // TODO: ...\r\n    }\r\n    else if (version === 6 || version === 7 || version === 9 || version === 10) {\r\n        var minorVersion = readInt16(reader);\r\n        if (minorVersion !== 1 && minorVersion !== 2)\r\n            throw new Error('Unsupported ABR minor version');\r\n        while (reader.offset < reader.view.byteLength) {\r\n            checkSignature(reader, '8BIM');\r\n            var type = readSignature(reader);\r\n            var size = readUint32(reader);\r\n            var end = reader.offset + size;\r\n            switch (type) {\r\n                case 'samp': {\r\n                    while (reader.offset < end) {\r\n                        var brushLength = readUint32(reader);\r\n                        while (brushLength & 3)\r\n                            brushLength++; // pad to 4 byte alignment\r\n                        var brushEnd = reader.offset + brushLength;\r\n                        var id = readPascalString(reader, 1);\r\n                        // v1 - Skip the Int16 bounds rectangle and the unknown Int16.\r\n                        // v2 - Skip the unknown bytes.\r\n                        skipBytes(reader, minorVersion === 1 ? 10 : 264);\r\n                        var y = readInt32(reader);\r\n                        var x = readInt32(reader);\r\n                        var h = readInt32(reader) - y;\r\n                        var w = readInt32(reader) - x;\r\n                        if (w <= 0 || h <= 0)\r\n                            throw new Error('Invalid bounds');\r\n                        var bithDepth = readInt16(reader);\r\n                        var compression = readUint8(reader); // 0 - raw, 1 - RLE\r\n                        var alpha = new Uint8Array(w * h);\r\n                        if (bithDepth === 8) {\r\n                            if (compression === 0) {\r\n                                alpha.set(readBytes(reader, alpha.byteLength));\r\n                            }\r\n                            else if (compression === 1) {\r\n                                readDataRLE(reader, { width: w, height: h, data: alpha }, w, h, bithDepth, 1, [0], false);\r\n                            }\r\n                            else {\r\n                                throw new Error('Invalid compression');\r\n                            }\r\n                        }\r\n                        else if (bithDepth === 16) {\r\n                            if (compression === 0) {\r\n                                for (var i = 0; i < alpha.byteLength; i++) {\r\n                                    alpha[i] = readUint16(reader) >> 8; // convert to 8bit values\r\n                                }\r\n                            }\r\n                            else if (compression === 1) {\r\n                                throw new Error('not implemented (16bit RLE)'); // TODO: ...\r\n                            }\r\n                            else {\r\n                                throw new Error('Invalid compression');\r\n                            }\r\n                        }\r\n                        else {\r\n                            throw new Error('Invalid depth');\r\n                        }\r\n                        samples.push({ id: id, bounds: { x: x, y: y, w: w, h: h }, alpha: alpha });\r\n                        reader.offset = brushEnd;\r\n                    }\r\n                    break;\r\n                }\r\n                case 'desc': {\r\n                    var desc = readVersionAndDescriptor(reader, true);\r\n                    // console.log(require('util').inspect(desc, false, 99, true));\r\n                    // require('fs').writeFileSync('test.log', require('util').inspect(desc, false, 99, false), 'utf8');\r\n                    for (var _i = 0, _e = desc.Brsh; _i < _e.length; _i++) {\r\n                        var brush = _e[_i];\r\n                        var b = {\r\n                            name: brush['Nm  '],\r\n                            shape: parseBrushShape(brush.Brsh),\r\n                            spacing: parsePercent(brush.Spcn),\r\n                            // TODO: brushGroup ???\r\n                            wetEdges: brush.Wtdg,\r\n                            noise: brush.Nose,\r\n                            // TODO: TxtC ??? smoothing / build-up ?\r\n                            // TODO: 'Rpt ' ???\r\n                            useBrushSize: brush.useBrushSize, // ???\r\n                        };\r\n                        if (brush.interpretation != null)\r\n                            b.interpretation = brush.interpretation;\r\n                        if (brush.protectTexture != null)\r\n                            b.protectTexture = brush.protectTexture;\r\n                        if (brush.useTipDynamics) {\r\n                            b.shapeDynamics = {\r\n                                tiltScale: parsePercent(brush.tiltScale),\r\n                                sizeDynamics: parseDynamics(brush.szVr),\r\n                                angleDynamics: parseDynamics(brush.angleDynamics),\r\n                                roundnessDynamics: parseDynamics(brush.roundnessDynamics),\r\n                                flipX: brush.flipX,\r\n                                flipY: brush.flipY,\r\n                                brushProjection: brush.brushProjection,\r\n                                minimumDiameter: parsePercent(brush.minimumDiameter),\r\n                                minimumRoundness: parsePercent(brush.minimumRoundness),\r\n                            };\r\n                        }\r\n                        if (brush.useScatter) {\r\n                            b.scatter = {\r\n                                count: brush['Cnt '],\r\n                                bothAxes: brush.bothAxes,\r\n                                countDynamics: parseDynamics(brush.countDynamics),\r\n                                scatterDynamics: parseDynamics(brush.scatterDynamics),\r\n                            };\r\n                        }\r\n                        if (brush.useTexture && brush.Txtr) {\r\n                            b.texture = {\r\n                                id: brush.Txtr.Idnt,\r\n                                name: brush.Txtr['Nm  '],\r\n                                blendMode: BlnM.decode(brush.textureBlendMode),\r\n                                depth: parsePercent(brush.textureDepth),\r\n                                depthMinimum: parsePercent(brush.minimumDepth),\r\n                                depthDynamics: parseDynamics(brush.textureDepthDynamics),\r\n                                scale: parsePercent(brush.textureScale),\r\n                                invert: brush.InvT,\r\n                                brightness: brush.textureBrightness,\r\n                                contrast: brush.textureContrast,\r\n                                textureEachTip: !!brush.TxtC,\r\n                            };\r\n                        }\r\n                        var db = brush.dualBrush;\r\n                        if (db && db.useDualBrush) {\r\n                            b.dualBrush = {\r\n                                flip: db.Flip,\r\n                                shape: parseBrushShape(db.Brsh),\r\n                                blendMode: BlnM.decode(db.BlnM),\r\n                                useScatter: db.useScatter,\r\n                                spacing: parsePercent(db.Spcn),\r\n                                count: db['Cnt '],\r\n                                bothAxes: db.bothAxes,\r\n                                countDynamics: parseDynamics(db.countDynamics),\r\n                                scatterDynamics: parseDynamics(db.scatterDynamics),\r\n                            };\r\n                        }\r\n                        if (brush.useColorDynamics) {\r\n                            b.colorDynamics = {\r\n                                foregroundBackground: parseDynamics(brush.clVr),\r\n                                hue: parsePercent(brush['H   ']),\r\n                                saturation: parsePercent(brush.Strt),\r\n                                brightness: parsePercent(brush.Brgh),\r\n                                purity: parsePercent(brush.purity),\r\n                                perTip: brush.colorDynamicsPerTip,\r\n                            };\r\n                        }\r\n                        if (brush.usePaintDynamics) {\r\n                            b.transfer = {\r\n                                flowDynamics: parseDynamics(brush.prVr),\r\n                                opacityDynamics: parseDynamics(brush.opVr),\r\n                                wetnessDynamics: parseDynamics(brush.wtVr),\r\n                                mixDynamics: parseDynamics(brush.mxVr),\r\n                            };\r\n                        }\r\n                        if (brush.useBrushPose) {\r\n                            b.brushPose = {\r\n                                overrideAngle: brush.overridePoseAngle,\r\n                                overrideTiltX: brush.overridePoseTiltX,\r\n                                overrideTiltY: brush.overridePoseTiltY,\r\n                                overridePressure: brush.overridePosePressure,\r\n                                pressure: parsePercent(brush.brushPosePressure),\r\n                                tiltX: brush.brushPoseTiltX,\r\n                                tiltY: brush.brushPoseTiltY,\r\n                                angle: brush.brushPoseAngle,\r\n                            };\r\n                        }\r\n                        var to = brush.toolOptions;\r\n                        if (to) {\r\n                            b.toolOptions = {\r\n                                type: toBrushType[to._classID] || 'brush',\r\n                                brushPreset: to.brushPreset,\r\n                                flow: (_a = to.flow) !== null && _a !== void 0 ? _a : 100,\r\n                                smooth: (_b = to.Smoo) !== null && _b !== void 0 ? _b : 0,\r\n                                mode: BlnM.decode(to['Md  '] || 'BlnM.Nrml'),\r\n                                opacity: (_c = to.Opct) !== null && _c !== void 0 ? _c : 100,\r\n                                smoothing: !!to.smoothing,\r\n                                smoothingValue: to.smoothingValue || 0,\r\n                                smoothingRadiusMode: !!to.smoothingRadiusMode,\r\n                                smoothingCatchup: !!to.smoothingCatchup,\r\n                                smoothingCatchupAtEnd: !!to.smoothingCatchupAtEnd,\r\n                                smoothingZoomCompensation: !!to.smoothingZoomCompensation,\r\n                                pressureSmoothing: !!to.pressureSmoothing,\r\n                                usePressureOverridesSize: !!to.usePressureOverridesSize,\r\n                                usePressureOverridesOpacity: !!to.usePressureOverridesOpacity,\r\n                                useLegacy: !!to.useLegacy,\r\n                            };\r\n                            if (to.prVr)\r\n                                b.toolOptions.flowDynamics = parseDynamics(to.prVr);\r\n                            if (to.opVr)\r\n                                b.toolOptions.opacityDynamics = parseDynamics(to.opVr);\r\n                            if (to.szVr)\r\n                                b.toolOptions.sizeDynamics = parseDynamics(to.szVr);\r\n                            if ('wetness' in to)\r\n                                b.toolOptions.wetness = to.wetness;\r\n                            if ('dryness' in to)\r\n                                b.toolOptions.dryness = to.dryness;\r\n                            if ('mix' in to)\r\n                                b.toolOptions.mix = to.mix;\r\n                            if ('autoFill' in to)\r\n                                b.toolOptions.autoFill = to.autoFill;\r\n                            if ('autoClean' in to)\r\n                                b.toolOptions.autoClean = to.autoClean;\r\n                            if ('loadSolidColorOnly' in to)\r\n                                b.toolOptions.loadSolidColorOnly = to.loadSolidColorOnly;\r\n                            if ('sampleAllLayers' in to)\r\n                                b.toolOptions.sampleAllLayers = to.sampleAllLayers;\r\n                            if ('SmdF' in to)\r\n                                b.toolOptions.smudgeFingerPainting = to.SmdF;\r\n                            if ('SmdS' in to)\r\n                                b.toolOptions.smudgeSampleAllLayers = to.SmdS;\r\n                            if ('Prs ' in to)\r\n                                b.toolOptions.strength = to['Prs '];\r\n                            if ('SmdF' in to)\r\n                                b.toolOptions.smudgeFingerPainting = to.SmdF;\r\n                            if ('SmdS' in to)\r\n                                b.toolOptions.smudgeSampleAllLayers = to.SmdS;\r\n                        }\r\n                        brushes.push(b);\r\n                    }\r\n                    break;\r\n                }\r\n                case 'patt': {\r\n                    while (reader.offset < end) {\r\n                        patterns.push(readPattern(reader));\r\n                    }\r\n                    reader.offset = end;\r\n                    break;\r\n                }\r\n                case 'phry': {\r\n                    // TODO: what is this ?\r\n                    var desc = readVersionAndDescriptor(reader);\r\n                    // example:\r\n                    // hierarchy: [\r\n                    // \t{\r\n                    // \t\t'Nm  ': 'PRE_EXPORT ',\r\n                    // \t\tzuid: '965209f2-6f35-9a40-aa43-485684382172'\r\n                    // \t},\r\n                    // \t{},\r\n                    //  ...\r\n                    // ]\r\n                    if (options.logMissingFeatures) {\r\n                        if ((_d = desc.hierarchy) === null || _d === void 0 ? void 0 : _d.length) {\r\n                            // console.log('unhandled phry section', desc);\r\n                        }\r\n                    }\r\n                    break;\r\n                }\r\n                default:\r\n                    throw new Error(\"Invalid brush type: \".concat(type));\r\n            }\r\n            // align to 4 bytes\r\n            while (size % 4) {\r\n                reader.offset++;\r\n                size++;\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        throw new Error(\"Unsupported ABR version (\".concat(version, \")\"));\r\n    }\r\n    return { samples: samples, patterns: patterns, brushes: brushes };\r\n}\r\n//# sourceMappingURL=abr.js.map","var __assign = (this && this.__assign) || function () {\r\n    __assign = Object.assign || function(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n                t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\nimport { readVectorMask } from './additionalInfo';\r\nimport { readUint32, checkSignature, createReader, readPascalString, readUnicodeString } from './psdReader';\r\nexport function readCsh(buffer) {\r\n    var reader = createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength);\r\n    var csh = { shapes: [] };\r\n    checkSignature(reader, 'cush');\r\n    if (readUint32(reader) !== 2)\r\n        throw new Error('Invalid version');\r\n    var count = readUint32(reader);\r\n    for (var i = 0; i < count; i++) {\r\n        var name_1 = readUnicodeString(reader);\r\n        while (reader.offset % 4)\r\n            reader.offset++; // pad to 4byte bounds\r\n        if (readUint32(reader) !== 1)\r\n            throw new Error('Invalid shape version');\r\n        var size = readUint32(reader);\r\n        var end = reader.offset + size;\r\n        var id = readPascalString(reader, 1);\r\n        // this might not be correct ???\r\n        var y1 = readUint32(reader);\r\n        var x1 = readUint32(reader);\r\n        var y2 = readUint32(reader);\r\n        var x2 = readUint32(reader);\r\n        var width = x2 - x1;\r\n        var height = y2 - y1;\r\n        var mask = { paths: [] };\r\n        readVectorMask(reader, mask, width, height, end - reader.offset);\r\n        csh.shapes.push(__assign({ name: name_1, id: id, width: width, height: height }, mask));\r\n        reader.offset = end;\r\n    }\r\n    return csh;\r\n}\r\n//# sourceMappingURL=csh.js.map","export var ColorMode;\r\n(function (ColorMode) {\r\n    ColorMode[ColorMode[\"Bitmap\"] = 0] = \"Bitmap\";\r\n    ColorMode[ColorMode[\"Grayscale\"] = 1] = \"Grayscale\";\r\n    ColorMode[ColorMode[\"Indexed\"] = 2] = \"Indexed\";\r\n    ColorMode[ColorMode[\"RGB\"] = 3] = \"RGB\";\r\n    ColorMode[ColorMode[\"CMYK\"] = 4] = \"CMYK\";\r\n    ColorMode[ColorMode[\"Multichannel\"] = 7] = \"Multichannel\";\r\n    ColorMode[ColorMode[\"Duotone\"] = 8] = \"Duotone\";\r\n    ColorMode[ColorMode[\"Lab\"] = 9] = \"Lab\";\r\n})(ColorMode || (ColorMode = {}));\r\nexport var SectionDividerType;\r\n(function (SectionDividerType) {\r\n    SectionDividerType[SectionDividerType[\"Other\"] = 0] = \"Other\";\r\n    SectionDividerType[SectionDividerType[\"OpenFolder\"] = 1] = \"OpenFolder\";\r\n    SectionDividerType[SectionDividerType[\"ClosedFolder\"] = 2] = \"ClosedFolder\";\r\n    SectionDividerType[SectionDividerType[\"BoundingSectionDivider\"] = 3] = \"BoundingSectionDivider\";\r\n})(SectionDividerType || (SectionDividerType = {}));\r\nexport var LayerCompCapturedInfo;\r\n(function (LayerCompCapturedInfo) {\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"None\"] = 0] = \"None\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Visibility\"] = 1] = \"Visibility\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Position\"] = 2] = \"Position\";\r\n    LayerCompCapturedInfo[LayerCompCapturedInfo[\"Appearance\"] = 4] = \"Appearance\";\r\n})(LayerCompCapturedInfo || (LayerCompCapturedInfo = {}));\r\nexport var ChannelID;\r\n(function (ChannelID) {\r\n    ChannelID[ChannelID[\"Color0\"] = 0] = \"Color0\";\r\n    ChannelID[ChannelID[\"Color1\"] = 1] = \"Color1\";\r\n    ChannelID[ChannelID[\"Color2\"] = 2] = \"Color2\";\r\n    ChannelID[ChannelID[\"Color3\"] = 3] = \"Color3\";\r\n    ChannelID[ChannelID[\"Transparency\"] = -1] = \"Transparency\";\r\n    ChannelID[ChannelID[\"UserMask\"] = -2] = \"UserMask\";\r\n    ChannelID[ChannelID[\"RealUserMask\"] = -3] = \"RealUserMask\";\r\n})(ChannelID || (ChannelID = {}));\r\nexport var Compression;\r\n(function (Compression) {\r\n    Compression[Compression[\"RawData\"] = 0] = \"RawData\";\r\n    Compression[Compression[\"RleCompressed\"] = 1] = \"RleCompressed\";\r\n    Compression[Compression[\"ZipWithoutPrediction\"] = 2] = \"ZipWithoutPrediction\";\r\n    Compression[Compression[\"ZipWithPrediction\"] = 3] = \"ZipWithPrediction\";\r\n})(Compression || (Compression = {}));\r\n//# sourceMappingURL=psd.js.map","import { writePsd as writePsdInternal, getWriterBuffer, createWriter, getWriterBufferNoCopy } from './psdWriter';\r\nimport { readPsd as readPsdInternal, createReader, decodeLayerImageData } from './psdReader';\r\nimport { fromByteArray } from 'base64-js';\r\nexport * from './abr';\r\nexport * from './csh';\r\nexport { initializeCanvas } from './helpers';\r\nexport * from './psd';\r\nexport var byteArrayToBase64 = fromByteArray;\r\nexport function readPsd(buffer, options) {\r\n    var reader = 'buffer' in buffer ?\r\n        createReader(buffer.buffer, buffer.byteOffset, buffer.byteLength) :\r\n        createReader(buffer);\r\n    return readPsdInternal(reader, options);\r\n}\r\nexport function writePsd(psd, options) {\r\n    var writer = createWriter();\r\n    writePsdInternal(writer, psd, options);\r\n    return getWriterBuffer(writer);\r\n}\r\nexport function writePsdUint8Array(psd, options) {\r\n    var writer = createWriter();\r\n    writePsdInternal(writer, psd, options);\r\n    return getWriterBufferNoCopy(writer);\r\n}\r\nexport function writePsdBuffer(psd, options) {\r\n    if (typeof Buffer === 'undefined') {\r\n        throw new Error('Buffer not supported on this platform');\r\n    }\r\n    return Buffer.from(writePsdUint8Array(psd, options));\r\n}\r\nexport function decodeLayerPixels(layer, useImageData) {\r\n    decodeLayerImageData(layer, useImageData);\r\n}\r\n//# sourceMappingURL=index.js.map","/* @license\nPapa Parse\nv5.5.3\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n((e,t)=>{\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()})(this,function r(){var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==n?n:{};var d,s=!n.document&&!!n.postMessage,a=n.IS_PAPA_WORKER||!1,o={},h=0,v={};function u(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine=\"\",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},function(e){var t=b(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null);this._handle=new i(t),(this._handle.streamer=this)._config=t}.call(this,e),this.parseChunk=function(t,e){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<i){let e=this._config.newline;e||(r=this._config.quoteChar||'\"',e=this._handle.guessLineEndings(t,r)),t=[...t.split(e).slice(i)].join(e)}this.isFirstChunk&&U(this._config.beforeFirstChunk)&&void 0!==(r=this._config.beforeFirstChunk(t))&&(t=r),this.isFirstChunk=!1,this._halted=!1;var i=this._partialLine+t,r=(this._partialLine=\"\",this._handle.parse(i,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){t=r.meta.cursor,i=(this._finished||(this._partialLine=i.substring(t-this._baseIndex),this._baseIndex=t),r&&r.data&&(this._rowCount+=r.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview);if(a)n.postMessage({results:r,workerId:v.WORKER_ID,finished:i});else if(U(this._config.chunk)&&!e){if(this._config.chunk(r,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=r=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(r.data),this._completeResults.errors=this._completeResults.errors.concat(r.errors),this._completeResults.meta=r.meta),this._completed||!i||!U(this._config.complete)||r&&r.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||r&&r.meta.paused||this._nextChunk(),r}this._halted=!0},this._sendError=function(e){U(this._config.error)?this._config.error(e):a&&this._config.error&&n.postMessage({workerId:v.WORKER_ID,error:e,finished:!1})}}function f(e){var r;(e=e||{}).chunkSize||(e.chunkSize=v.RemoteChunkSize),u.call(this,e),this._nextChunk=s?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),s||(r.onload=y(this._chunkLoaded,this),r.onerror=y(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!s),this._config.downloadRequestHeaders){var e,t=this._config.downloadRequestHeaders;for(e in t)r.setRequestHeader(e,t[e])}var i;this._config.chunkSize&&(i=this._start+this._config.chunkSize-1,r.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+i));try{r.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}s&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize||r.responseText.length,this._finished=!this._config.chunkSize||this._start>=(e=>null!==(e=e.getResponseHeader(\"Content-Range\"))?parseInt(e.substring(e.lastIndexOf(\"/\")+1)):-1)(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){e=r.statusText||e;this._sendError(new Error(e))}}function l(e){(e=e||{}).chunkSize||(e.chunkSize=v.LocalChunkSize),u.call(this,e);var i,r,n=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,n?((i=new FileReader).onload=y(this._chunkLoaded,this),i.onerror=y(this._chunkError,this)):i=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input,t=(this._config.chunkSize&&(t=Math.min(this._start+this._config.chunkSize,this._input.size),e=r.call(e,this._start,t)),i.readAsText(e,this._config.encoding));n||this._chunkLoaded({target:{result:t}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(i.error)}}function c(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){var e,t;if(!this._finished)return e=this._config.chunkSize,i=e?(t=i.substring(0,e),i.substring(e)):(t=i,\"\"),this._finished=!i,this.parseChunk(t)}}function p(e){u.call(this,e=e||{});var t=[],i=!0,r=!1;this.pause=function(){u.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){u.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):i=!0},this._streamData=y(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),i&&(i=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=y(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=y(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=y(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var n,s,a,t,o=Math.pow(2,53),h=-o,u=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,d=/^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/,i=this,r=0,f=0,l=!1,e=!1,c=[],p={data:[],errors:[],meta:{}};function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){if(p&&a&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+v.DefaultDelimiter+\"'\"),a=!1),m.skipEmptyLines&&(p.data=p.data.filter(function(e){return!y(e)})),_()){if(p)if(Array.isArray(p.data[0])){for(var e=0;_()&&e<p.data.length;e++)p.data[e].forEach(t);p.data.splice(0,1)}else p.data.forEach(t);function t(e,t){U(m.transformHeader)&&(e=m.transformHeader(e,t)),c.push(e)}}function i(e,t){for(var i=m.header?{}:[],r=0;r<e.length;r++){var n=r,s=e[r],s=((e,t)=>(e=>(m.dynamicTypingFunction&&void 0===m.dynamicTyping[e]&&(m.dynamicTyping[e]=m.dynamicTypingFunction(e)),!0===(m.dynamicTyping[e]||m.dynamicTyping)))(e)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&((e=>{if(u.test(e)){e=parseFloat(e);if(h<e&&e<o)return 1}})(t)?parseFloat(t):d.test(t)?new Date(t):\"\"===t?null:t):t)(n=m.header?r>=c.length?\"__parsed_extra\":c[r]:n,s=m.transform?m.transform(s,n):s);\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>c.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+c.length+\" fields but parsed \"+r,f+t):r<c.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+c.length+\" fields but parsed \"+r,f+t)),i}var r;p&&(m.header||m.dynamicTyping||m.transform)&&(r=1,!p.data.length||Array.isArray(p.data[0])?(p.data=p.data.map(i),r=p.data.length):p.data=i(p.data,0),m.header&&p.meta&&(p.meta.fields=c),f+=r)}function _(){return m.header&&0===c.length}function k(e,t,i,r){e={type:e,code:t,message:i};void 0!==r&&(e.row=r),p.errors.push(e)}U(m.step)&&(t=m.step,m.step=function(e){p=e,_()?g():(g(),0!==p.data.length&&(r+=e.data.length,m.preview&&r>m.preview?s.abort():(p.data=p.data[0],t(p,i))))}),this.parse=function(e,t,i){var r=m.quoteChar||'\"',r=(m.newline||(m.newline=this.guessLineEndings(e,r)),a=!1,m.delimiter?U(m.delimiter)&&(m.delimiter=m.delimiter(e),p.meta.delimiter=m.delimiter):((r=((e,t,i,r,n)=>{var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",v.RECORD_SEP,v.UNIT_SEP];for(var u=0;u<n.length;u++){for(var d,f=n[u],l=0,c=0,p=0,g=(o=void 0,new E({comments:r,delimiter:f,newline:t,preview:10}).parse(e)),_=0;_<g.data.length;_++)i&&y(g.data[_])?p++:(d=g.data[_].length,c+=d,void 0===o?o=d:0<d&&(l+=Math.abs(d-o),o=d));0<g.data.length&&(c/=g.data.length-p),(void 0===a||l<=a)&&(void 0===h||h<c)&&1.99<c&&(a=l,s=f,h=c)}return{successful:!!(m.delimiter=s),bestDelimiter:s}})(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess)).successful?m.delimiter=r.bestDelimiter:(a=!0,m.delimiter=v.DefaultDelimiter),p.meta.delimiter=m.delimiter),b(m));return m.preview&&m.header&&r.preview++,n=e,s=new E(r),p=s.parse(n,t,i),g(),l?{meta:{paused:!0}}:p||{meta:{paused:!1}}},this.paused=function(){return l},this.pause=function(){l=!0,s.abort(),n=U(m.chunk)?\"\":n.substring(s.getCharIndex())},this.resume=function(){i.streamer._halted?(l=!1,i.streamer.parseChunk(n,!0)):setTimeout(i.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,s.abort(),p.meta.aborted=!0,U(m.complete)&&m.complete(p),n=\"\"},this.guessLineEndings=function(e,t){e=e.substring(0,1048576);var t=new RegExp(P(t)+\"([^]*?)\"+P(t),\"gm\"),i=(e=e.replace(t,\"\")).split(\"\\r\"),t=e.split(\"\\n\"),e=1<t.length&&t[0].length<i[0].length;if(1===i.length||e)return\"\\n\";for(var r=0,n=0;n<i.length;n++)\"\\n\"===i[n][0]&&r++;return r>=i.length/2?\"\\r\\n\":\"\\r\"}}function P(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(C){var S=(C=C||{}).delimiter,O=C.newline,x=C.comments,I=C.step,A=C.preview,T=C.fastMode,D=null,L=!1,F=null==C.quoteChar?'\"':C.quoteChar,j=F;if(void 0!==C.escapeChar&&(j=C.escapeChar),(\"string\"!=typeof S||-1<v.BAD_DELIMITERS.indexOf(S))&&(S=\",\"),x===S)throw new Error(\"Comment character same as delimiter\");!0===x?x=\"#\":(\"string\"!=typeof x||-1<v.BAD_DELIMITERS.indexOf(x))&&(x=!1),\"\\n\"!==O&&\"\\r\"!==O&&\"\\r\\n\"!==O&&(O=\"\\n\");var z=0,M=!1;this.parse=function(i,t,r){if(\"string\"!=typeof i)throw new Error(\"Input must be a string\");var n=i.length,e=S.length,s=O.length,a=x.length,o=U(I),h=[],u=[],d=[],f=z=0;if(!i)return w();if(T||!1!==T&&-1===i.indexOf(F)){for(var l=i.split(O),c=0;c<l.length;c++){if(d=l[c],z+=d.length,c!==l.length-1)z+=O.length;else if(r)return w();if(!x||d.substring(0,a)!==x){if(o){if(h=[],k(d.split(S)),R(),M)return w()}else k(d.split(S));if(A&&A<=c)return h=h.slice(0,A),w(!0)}}return w()}for(var p=i.indexOf(S,z),g=i.indexOf(O,z),_=new RegExp(P(j)+P(F),\"g\"),m=i.indexOf(F,z);;)if(i[z]===F)for(m=z,z++;;){if(-1===(m=i.indexOf(F,m+1)))return r||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:z}),E();if(m===n-1)return E(i.substring(z,m).replace(_,F));if(F===j&&i[m+1]===j)m++;else if(F===j||0===m||i[m-1]!==j){-1!==p&&p<m+1&&(p=i.indexOf(S,m+1));var y=v(-1===(g=-1!==g&&g<m+1?i.indexOf(O,m+1):g)?p:Math.min(p,g));if(i.substr(m+1+y,e)===S){d.push(i.substring(z,m).replace(_,F)),i[z=m+1+y+e]!==F&&(m=i.indexOf(F,z)),p=i.indexOf(S,z),g=i.indexOf(O,z);break}y=v(g);if(i.substring(m+1+y,m+1+y+s)===O){if(d.push(i.substring(z,m).replace(_,F)),b(m+1+y+s),p=i.indexOf(S,z),m=i.indexOf(F,z),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:z}),m++}}else if(x&&0===d.length&&i.substring(z,z+a)===x){if(-1===g)return w();z=g+s,g=i.indexOf(O,z),p=i.indexOf(S,z)}else if(-1!==p&&(p<g||-1===g))d.push(i.substring(z,p)),z=p+e,p=i.indexOf(S,z);else{if(-1===g)break;if(d.push(i.substring(z,g)),b(g+s),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0)}return E();function k(e){h.push(e),f=z}function v(e){var t=0;return t=-1!==e&&(e=i.substring(m+1,e))&&\"\"===e.trim()?e.length:t}function E(e){return r||(void 0===e&&(e=i.substring(z)),d.push(e),z=n,k(d),o&&R()),w()}function b(e){z=e,k(d),d=[],g=i.indexOf(O,z)}function w(e){if(C.header&&!t&&h.length&&!L){var s=h[0],a=Object.create(null),o=new Set(s);let n=!1;for(let r=0;r<s.length;r++){let i=s[r];if(a[i=U(C.transformHeader)?C.transformHeader(i,r):i]){let e,t=a[i];for(;e=i+\"_\"+t,t++,o.has(e););o.add(e),s[r]=e,a[i]++,n=!0,(D=null===D?{}:D)[e]=i}else a[i]=1,s[r]=i;o.add(i)}n&&console.warn(\"Duplicate headers found and renamed.\"),L=!0}return{data:h,errors:u,meta:{delimiter:S,linebreak:O,aborted:M,truncated:!!e,cursor:f+(t||0),renamedHeaders:D}}}function R(){I(w()),h=[],u=[]}},this.abort=function(){M=!0},this.getCharIndex=function(){return z}}function g(e){var t=e.data,i=o[t.workerId],r=!1;if(t.error)i.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){r=!0,_(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:m,resume:m};if(U(i.userStep)){for(var s=0;s<t.results.data.length&&(i.userStep({data:t.results.data[s],errors:t.results.errors,meta:t.results.meta},n),!r);s++);delete t.results}else U(i.userChunk)&&(i.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!r&&_(t.workerId,t.results)}function _(e,t){var i=o[e];U(i.userComplete)&&i.userComplete(t),i.terminate(),delete o[e]}function m(){throw new Error(\"Not implemented.\")}function b(e){if(\"object\"!=typeof e||null===e)return e;var t,i=Array.isArray(e)?[]:{};for(t in e)i[t]=b(e[t]);return i}function y(e,t){return function(){e.apply(t,arguments)}}function U(e){return\"function\"==typeof e}return v.parse=function(e,t){var i=(t=t||{}).dynamicTyping||!1;U(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!U(t.transform)&&t.transform,!t.worker||!v.WORKERS_SUPPORTED)return i=null,v.NODE_STREAM_INPUT,\"string\"==typeof e?(e=(e=>65279!==e.charCodeAt(0)?e:e.slice(1))(e),i=new(t.download?f:c)(t)):!0===e.readable&&U(e.read)&&U(e.on)?i=new p(t):(n.File&&e instanceof File||e instanceof Object)&&(i=new l(t)),i.stream(e);(i=(()=>{var e;return!!v.WORKERS_SUPPORTED&&(e=(()=>{var e=n.URL||n.webkitURL||null,t=r.toString();return v.BLOB_URL||(v.BLOB_URL=e.createObjectURL(new Blob([\"var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; \",\"(\",t,\")();\"],{type:\"text/javascript\"})))})(),(e=new n.Worker(e)).onmessage=g,e.id=h++,o[e.id]=e)})()).userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=U(t.step),t.chunk=U(t.chunk),t.complete=U(t.complete),t.error=U(t.error),delete t.worker,i.postMessage({input:e,config:t,workerId:i.id})},v.unparse=function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1,h=((()=>{if(\"object\"==typeof t){if(\"string\"!=typeof t.delimiter||v.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter),\"boolean\"!=typeof t.quotes&&\"function\"!=typeof t.quotes&&!Array.isArray(t.quotes)||(n=t.quotes),\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(i=t.skipEmptyLines),\"string\"==typeof t.newline&&(y=t.newline),\"string\"==typeof t.quoteChar&&(s=t.quoteChar),\"boolean\"==typeof t.header&&(_=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");r=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s),t.escapeFormulae instanceof RegExp?o=t.escapeFormulae:\"boolean\"==typeof t.escapeFormulae&&t.escapeFormulae&&(o=/^[=+\\-@\\t\\r].*$/)}})(),new RegExp(P(s),\"g\"));\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||r),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\",n=(\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t)),Array.isArray(e)&&0<e.length),s=!Array.isArray(t[0]);if(n&&_){for(var a=0;a<e.length;a++)0<a&&(r+=m),r+=k(e[a],a);0<t.length&&(r+=y)}for(var o=0;o<t.length;o++){var h=(n?e:t[o]).length,u=!1,d=n?0===Object.keys(t[o]).length:0===t[o].length;if(i&&!n&&(u=\"greedy\"===i?\"\"===t[o].join(\"\").trim():1===t[o].length&&0===t[o][0].length),\"greedy\"===i&&n){for(var f=[],l=0;l<h;l++){var c=s?e[l]:l;f.push(t[o][c])}u=\"\"===f.join(\"\").trim()}if(!u){for(var p=0;p<h;p++){0<p&&!d&&(r+=m);var g=n&&s?e[p]:p;r+=k(t[o][g],p)}o<t.length-1&&(!i||0<h&&!d)&&(r+=y)}}return r}function k(e,t){var i,r;return null==e?\"\":e.constructor===Date?JSON.stringify(e).slice(1,25):(r=!1,o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,r=!0),i=e.toString().replace(h,a),(r=r||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||((e,t)=>{for(var i=0;i<t.length;i++)if(-1<e.indexOf(t[i]))return!0;return!1})(i,v.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1))?s+i+s:i)}},v.RECORD_SEP=String.fromCharCode(30),v.UNIT_SEP=String.fromCharCode(31),v.BYTE_ORDER_MARK=\"\\ufeff\",v.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',v.BYTE_ORDER_MARK],v.WORKERS_SUPPORTED=!s&&!!n.Worker,v.NODE_STREAM_INPUT=1,v.LocalChunkSize=10485760,v.RemoteChunkSize=5242880,v.DefaultDelimiter=\",\",v.Parser=E,v.ParserHandle=i,v.NetworkStreamer=f,v.FileStreamer=l,v.StringStreamer=c,v.ReadableStreamStreamer=p,n.jQuery&&((d=n.jQuery).fn.parse=function(o){var i=o.config||{},h=[];return this.each(function(e){if(!(\"INPUT\"===d(this).prop(\"tagName\").toUpperCase()&&\"file\"===d(this).attr(\"type\").toLowerCase()&&n.FileReader)||!this.files||0===this.files.length)return!0;for(var t=0;t<this.files.length;t++)h.push({file:this.files[t],inputElem:this,instanceConfig:d.extend({},i)})}),e(),this;function e(){if(0===h.length)U(o.complete)&&o.complete();else{var e,t,i,r,n=h[0];if(U(o.before)){var s=o.before(n.file,n.inputElem);if(\"object\"==typeof s){if(\"abort\"===s.action)return e=\"AbortError\",t=n.file,i=n.inputElem,r=s.reason,void(U(o.error)&&o.error({name:e},t,i,r));if(\"skip\"===s.action)return void u();\"object\"==typeof s.config&&(n.instanceConfig=d.extend(n.instanceConfig,s.config))}else if(\"skip\"===s)return void u()}var a=n.instanceConfig.complete;n.instanceConfig.complete=function(e){U(a)&&a(e,n.file,n.inputElem),u()},v.parse(n.file,n.instanceConfig)}}function u(){h.splice(0,1),e()}}),a&&(n.onmessage=function(e){e=e.data;void 0===v.WORKER_ID&&e&&(v.WORKER_ID=e.workerId);\"string\"==typeof e.input?n.postMessage({workerId:v.WORKER_ID,results:v.parse(e.input,e.config),finished:!0}):(n.File&&e.input instanceof File||e.input instanceof Object)&&(e=v.parse(e.input,e.config))&&n.postMessage({workerId:v.WORKER_ID,results:e,finished:!0})}),(f.prototype=Object.create(u.prototype)).constructor=f,(l.prototype=Object.create(u.prototype)).constructor=l,(c.prototype=Object.create(c.prototype)).constructor=c,(p.prototype=Object.create(u.prototype)).constructor=p,v});"],"names":["makeMap","str","map","key","val","EMPTY_OBJ","EMPTY_ARR","NOOP","NO","isOn","isModelListener","extend","remove","arr","el","i","hasOwnProperty","hasOwn","isArray","isMap","toTypeString","isSet","isDate","isFunction","isString","isSymbol","isObject","isPromise","objectToString","value","toRawType","isPlainObject","isIntegerKey","isReservedProp","cacheStringFunction","fn","cache","camelizeRE","camelize","c","hyphenateRE","hyphenate","capitalize","toHandlerKey","hasChanged","oldValue","invokeArrayFns","fns","arg","def","obj","writable","looseToNumber","n","toNumber","_globalThis","getGlobalThis","normalizeStyle","res","item","normalized","parseStringStyle","listDelimiterRE","propertyDelimiterRE","styleCommentRE","cssText","ret","tmp","normalizeClass","name","isSpecialBooleanAttr","includeBooleanAttr","looseCompareArrays","a","b","equal","looseEqual","aValidType","bValidType","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","isRef","toDisplayString","replacer","_key","entries","val2","stringifySymbol","v","_a","activeEffectScope","EffectScope","detached","l","currentEffectScope","current","fromParent","last","getCurrentScope","onScopeDispose","failSilently","activeSub","pausedQueueEffects","ReactiveEffect","batch","cleanupEffect","prepareDeps","prevEffect","prevShouldTrack","shouldTrack","cleanupDeps","link","removeSub","isDirty","batchDepth","batchedSub","batchedComputed","sub","isComputed","startBatch","endBatch","e","next","error","err","head","tail","prev","removeDep","refreshComputed","computed","globalVersion","dep","prevSub","soft","nextSub","prevDep","nextDep","trackStack","pauseTracking","resetTracking","cleanup","Link","Dep","debugInfo","addSub","currentTail","targetMap","ITERATE_KEY","MAP_KEY_ITERATE_KEY","ARRAY_ITERATE_KEY","track","target","type","depsMap","trigger","newValue","oldTarget","run","targetIsArray","isArrayIndex","newLength","key2","reactiveReadArray","array","raw","toReactive","shallowReadArray","toRaw","toWrapped","isReadonly","toReadonly","isReactive","arrayInstrumentations","iterator","args","x","thisArg","apply","searchProxy","separator","noTracking","reduce","comparer","self","method","wrapValue","iter","isShallow","result","arrayProto","wrappedRetFn","needsWrap","methodFn","result2","wrappedFn","index","wrapInitialAccumulator","acc","isNonTrackableKeys","builtInSymbols","BaseReactiveHandler","_isReadonly","_isShallow","receiver","isReadonly2","isShallow2","shallowReadonlyMap","readonlyMap","shallowReactiveMap","reactiveMap","readonly","MutableReactiveHandler","isArrayWithIntegerKey","isOldValueReadonly","hadKey","ReadonlyReactiveHandler","mutableHandlers","readonlyHandlers","shallowReactiveHandlers","shallowReadonlyHandlers","toShallow","getProto","createIterableMethod","rawTarget","targetIsMap","isPair","isKeyOnly","innerIterator","wrap","done","createReadonlyMethod","createInstrumentations","shallow","instrumentations","rawKey","has","callback","observed","proto","rawValue","valueToAdd","get","hadItems","createInstrumentationGetter","mutableCollectionHandlers","shallowCollectionHandlers","readonlyCollectionHandlers","shallowReadonlyCollectionHandlers","targetTypeMap","rawType","getTargetType","reactive","createReactiveObject","shallowReactive","shallowReadonly","baseHandlers","collectionHandlers","proxyMap","targetType","existingProxy","proxy","isProxy","markRaw","r","ref","createRef","shallowRef","RefImpl","useDirectValue","unref","ref2","shallowUnwrapHandlers","proxyRefs","objectWithRefs","CustomRefImpl","factory","set","newVal","customRef","ComputedRefImpl","setter","isSSR","getterOrOptions","debugOptions","getter","INITIAL_WATCHER_VALUE","cleanupMap","activeWatcher","onWatcherCleanup","cleanupFn","owner","cleanups","watch","source","cb","options","immediate","deep","once","scheduler","augmentJob","call","reactiveGetter","source2","traverse","effect","boundCleanup","forceTrigger","isMultiSource","s","currentEffect","baseGetter","depth","scope","watchHandle","_cb","job","immediateFirstRun","currentWatcher","cleanup2","seen","stack","isWarning","warn$1","msg","instance","appWarnHandler","trace","getComponentTrace","callWithErrorHandling","_b","vnode","formatComponentName","warnArgs","formatTrace","currentVNode","normalizedStack","parentInstance","logs","entry","formatTraceEntry","recurseCount","postfix","isRoot","open","close","formatProps","props","keys","formatProp","handleError","callWithAsyncErrorHandling","values","throwInDev","contextVNode","errorHandler","throwUnhandledErrorInProduction","cur","exposedInstance","errorInfo","errorCapturedHooks","logError","throwInProd","queue","flushIndex","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","resolvedPromise","currentFlushPromise","nextTick","p","findInsertionIndex","id","start","end","middle","middleJob","middleJobId","getId","queueJob","jobId","lastJob","queueFlush","flushJobs","queuePostFlushCb","flushPreFlushCbs","flushPostFlushCbs","deduped","currentRenderingInstance","currentScopeId","setCurrentRenderingInstance","withCtx","ctx","isNonScopedSlot","renderFnWithContext","setBlockTracking","prevInstance","withDirectives","directives","getComponentPublicInstance","bindings","dir","modifiers","invokeDirectiveHook","prevVNode","oldBindings","binding","hook","provide","currentInstance","provides","parentProvides","inject","defaultValue","treatDefaultAsFactory","getCurrentInstance","currentApp","ssrContextKey","useSSRContext","watchEffect","doWatch","flush","baseWatchOptions","runsImmediately","ssrCleanup","isInSSRComponentSetup","watchStopHandle","isPre","queuePostRenderEffect","isFirstRun","watch$1","instanceWatch","publicThis","createPathGetter","reset","setCurrentInstance","path","segments","pendingMounts","TeleportEndKey","isTeleport","isTeleportDisabled","isTeleportDeferred","isTargetSVG","isTargetMathML","resolveTarget","select","targetSelector","TeleportImpl","n1","n2","container","anchor","parentComponent","parentSuspense","namespace","slotScopeIds","optimized","internals","mountChildren","patchChildren","patchBlockChildren","insert","querySelector","createText","createComment","parentNode","disabled","dynamicChildren","mount","container2","anchor2","mountToTarget","disabled2","targetAnchor","prepareAnchor","updateCssVars","queuePendingMount","mountJob","mountContainer","placeholder","mainAnchor","pendingMount","wasDisabled","currentContainer","currentAnchor","traverseStaticChildren","moveTeleport","nextTarget","unmount","hostRemove","doRemove","shapeFlag","children","targetStart","shouldRemove","child","hydrateTeleport","parentAnchor","move","moveType","isReorder","node","nextSibling","hydrateChildren","hydrateAnchor","target2","targetNode","hydrateDisabledTeleport","node2","vnode2","Teleport","isDisabled","leaveCbKey","enterCbKey","useTransitionState","state","onMounted","onBeforeUnmount","TransitionHookValidator","BaseTransitionPropsValidators","recursiveGetSubtree","subTree","BaseTransitionImpl","slots","getTransitionRawChildren","findNonCommentChild","createCommentVNode","rawProps","mode","emptyPlaceholder","innerChild","getInnerChild$1","enterHooks","resolveTransitionHooks","hooks","Comment","setTransitionHooks","oldInnerChild","isSameVNodeType","leavingHooks","earlyRemove","delayedLeave","leavingVNodesCache","getLeavingNodesForType","BaseTransition","leavingVNodes","postClone","appear","persisted","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAfterAppear","onAppearCancelled","callHook","callAsyncHook","hook2","leavingVNode","afterHook","cancelHook","called","cancelled","hooks2","isKeepAlive","cloneVNode","keepComment","parentKey","keyedFragmentCount","Fragment","defineComponent","extraOptions","markAsyncBoundary","isTemplateRefKey","refs","desc","pendingSetRefMap","setRef","rawRef","oldRawRef","isUnmount","isAsyncWrapper","refValue","oldRef","setupState","rawSetupState","canSetSetupRef","canSetRef","invalidatePendingSetRef","oldRawRefAtom","_isString","_isRef","doSet","existing","pendingSetRef","onActivated","registerKeepAliveHook","onDeactivated","wrappedHook","injectHook","injectToKeepAliveRoot","keepAliveRoot","injected","onUnmounted","prepend","createHook","lifecycle","onBeforeMount","onBeforeUpdate","onUpdated","onServerPrefetch","onRenderTriggered","onRenderTracked","onErrorCaptured","COMPONENTS","resolveComponent","maybeSelfReference","resolveAsset","NULL_DYNAMIC_COMPONENT","resolveDynamicComponent","component","warnMissing","Component","selfName","getComponentName","resolve","registry","renderList","renderItem","cached","sourceIsArray","sourceIsReactiveArray","isReadonlySource","createSlots","dynamicSlots","slot","j","renderSlot","fallback","noSlotted","hasProps","openBlock","createBlock","createVNode","validSlotContent","ensureValidVNode","slotKey","rendered","vnodes","isVNode","getPublicInstance","isStatefulComponent","publicPropertiesMap","resolveMergedOptions","hasSetupBinding","PublicInstanceProxyHandlers","data","accessCache","appContext","shouldCacheAccess","publicGetter","cssModule","globalProperties","cssModules","descriptor","normalizePropsOrEmits","applyOptions","dataOptions","computedOptions","methods","watchOptions","provideOptions","injectOptions","created","beforeMount","mounted","beforeUpdate","updated","activated","deactivated","beforeDestroy","beforeUnmount","destroyed","unmounted","render","renderTracked","renderTriggered","errorCaptured","serverPrefetch","expose","inheritAttrs","components","filters","resolveInjections","methodHandler","opt","createWatcher","registerLifecycleHook","register","_hook","exposed","checkDuplicateProperties","normalizeInject","h","handler","base","mixins","extendsOptions","globalMixins","optionMergeStrategies","resolved","m","mergeOptions","to","from","strats","asMixin","strat","internalOptionMergeStrats","mergeDataFn","mergeEmitsOrPropsOptions","mergeObjectOptions","mergeAsArray","mergeWatchOptions","mergeInject","merged","createAppContext","uid$1","createAppAPI","hydrate","rootComponent","rootProps","context","installedPlugins","pluginCleanupFns","isMounted","app","version","plugin","mixin","directive","rootContainer","isHydrate","lastApp","getModelModifiers","modelName","emit","event","rawArgs","handlerName","onceHandler","mixinEmitsCache","normalizeEmitsOptions","comp","hasExtends","extendEmits","raw2","normalizedFromExtend","isEmitListener","markAttrsAccessed","renderComponentRoot","withProxy","propsOptions","attrs","renderCache","fallthroughAttrs","proxyToUse","thisProxy","normalizeVNode","render2","getFunctionalFallthrough","blockStack","root","filterModelListeners","shouldUpdateComponent","nextVNode","prevProps","prevChildren","nextProps","nextChildren","patchFlag","emits","hasPropsChanged","dynamicProps","hasPropValueChanged","emitsOptions","nextKeys","nextProp","prevProp","updateHOCHostEl","parent","suspense","internalObjectProto","createInternalObject","isInternalObject","initProps","isStateful","setFullProps","updateProps","rawPrevProps","rawCurrentProps","hasAttrsChanged","propsToUpdate","camelizedKey","resolvePropValue","kebabKey","needCastKeys","rawCastValues","camelKey","castValues","isAbsent","hasDefault","propsDefaults","mixinPropsCache","normalizePropsOptions","extendProps","normalizedKey","validatePropName","prop","propType","shouldCast","shouldCastTrue","typeName","isInternalKey","normalizeSlotValue","normalizeSlot","rawSlot","normalizeObjectSlots","rawSlots","normalizeVNodeSlots","assignSlots","initSlots","updateSlots","needDeletionCheck","deletionComparisonTarget","queueEffectWithSuspense","createRenderer","baseCreateRenderer","createHydrationFns","hostInsert","hostPatchProp","hostCreateElement","hostCreateText","hostCreateComment","hostSetText","hostSetElementText","hostParentNode","hostNextSibling","hostSetScopeId","hostInsertStaticContent","patch","getNextHostNode","Text","processText","processCommentNode","Static","mountStaticNode","processFragment","processElement","processComponent","moveStaticNode","removeStaticNode","mountElement","customElement","patchElement","vnodeHook","transition","dirs","resolveChildrenNamespace","setScopeId","invokeVNodeHook","needCallTransitionHooks","needTransition","scopeId","isSuspense","parentVNode","cloneIfMounted","oldProps","newProps","toggleRecurse","patchProps","oldChildren","newChildren","fallbackContainer","oldVNode","newVNode","fragmentStartAnchor","fragmentEndAnchor","fragmentSlotScopeIds","mountComponent","updateComponent","initialVNode","createComponentInstance","setupComponent","setupRenderEffect","updateComponentPreRender","componentUpdateFn","bu","u","nonHydratedAsyncRoot","locateNonHydratedAsyncRoot","update","originNext","nextTree","prevTree","bm","isAsyncWrapperVNode","scopedInitialVNode","c1","prevShapeFlag","c2","patchKeyedChildren","patchUnkeyedChildren","unmountChildren","oldLength","commonLength","nextChild","l2","e1","e2","nextPos","s1","s2","keyToNewIndexMap","patched","toBePatched","moved","maxNewIndexSoFar","newIndexToOldIndexMap","prevChild","newIndex","increasingNewIndexSequence","getSequence","nextIndex","anchorVNode","resolveAsyncComponentPlaceholder","leave","delayLeave","afterLeave","remove2","performLeave","cacheIndex","memo","shouldInvokeDirs","shouldInvokeVnodeHook","unmountComponent","shouldInvalidateMemo","removeFragment","performRemove","bum","um","invalidateMount","teleportEnd","isFlushing","currentNamespace","allowed","ch1","ch2","len","arrI","subComponent","anchorVnode","currentBlock","disableTracking","closeBlock","isBlockTreeEnabled","inVOnce","setupBlock","createElementBlock","createBaseVNode","normalizeKey","normalizeRef","ref_key","ref_for","isBlockNode","needFullChildrenNormalization","normalizeChildren","_createVNode","cloned","isClassComponent","guardReactiveProps","klass","style","extraProps","mergeRef","cloneTransition","mergedProps","mergeProps","createTextVNode","text","flag","createStaticVNode","content","numberOfNodes","asBlock","slotFlag","toMerge","incoming","emptyAppContext","uid","internalSetCurrentInstance","setInSSRSetupState","g","registerGlobalSetter","setters","unsetCurrentInstance","setupResult","setupStatefulComponent","setup","setupContext","createSetupContext","isAsyncSetup","resolvedResult","handleSetupResult","finishComponentSetup","skipOptions","attrsProxyHandlers","classifyRE","classify","includeInferred","match","inferFromRegistry","computed$1","propsOrChildren","policy","tt","unsafeToTrustedHTML","svgNS","mathmlNS","doc","templateContainer","nodeOps","tag","is","selector","before","template","wrapper","TRANSITION","ANIMATION","vtcKey","DOMTransitionPropsValidators","TransitionPropsValidators","Transition","t","resolveTransitionProps","h2","hasExplicitCallback","baseProps","duration","enterFromClass","enterActiveClass","enterToClass","appearFromClass","appearActiveClass","appearToClass","leaveFromClass","leaveActiveClass","leaveToClass","durations","normalizeDuration","enterDuration","leaveDuration","finishEnter","isAppear","isCancelled","removeTransitionClass","finishLeave","makeEnterHook","nextFrame","addTransitionClass","whenTransitionEnds","forceReflow","NumberOf","cls","_vtc","endId","expectedType","explicitTimeout","resolveIfNotStale","timeout","propCount","getTransitionInfo","endEvent","ended","onEnd","styles","getStyleProperties","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","d","toMs","patchClass","isSVG","transitionClasses","vShowOriginalDisplay","vShowHidden","vShow","setDisplay","CSS_VAR_TEXT","displayRE","patchStyle","isCssString","hasControlledDisplay","prevStyle","setStyle","shouldPreserveTextareaResizeStyle","cssVarText","importantRE","prefixed","autoPrefix","prefixes","prefixCache","rawName","xlinkNS","patchAttr","isBoolean","patchDOMProp","attrName","needRemove","addEventListener","removeEventListener","veiKey","patchEvent","prevValue","nextValue","invokers","existingInvoker","parseName","invoker","createInvoker","optionsModifierRE","cachedNow","getNow","initialValue","patchStopImmediatePropagation","originalStop","isNativeOn","patchProp","shouldSetAsProp","shouldSetAsPropForVueCE","camelize$1","REMOVAL","defineCustomElement","_createApp","Comp","VueCustomElement","VueElement","initialProps","BaseClass","_def","_props","createApp","mutations","isAsync","numberProps","asyncDef","declaredPropKeys","shouldReflect","shouldUpdate","ob","dispatch","parentComp","nonce","insertionAnchor","slotName","outlets","o","walker","roots","found","getModelAssigner","onCompositionStart","onCompositionEnd","assignKey","castValue","trim","number","vModelText","lazy","castToNumber","elValue","rootNode","vModelCheckbox","_","modelValue","elementValue","getValue","checked","assign","filtered","getCheckboxValue","setChecked","vModelSelect","isSetModel","selectedVal","setSelected","_binding","isMultiple","isArrayValue","option","optionValue","optionType","systemModifiers","modifierGuards","withModifiers","cacheKey","guard","keyNames","withKeys","eventKey","k","rendererOptions","renderer","ensureRenderer","containerOrSelector","normalizeContainer","resolveRootNamespace","isExternalUsable","SUPPORTED","FALLBACK","resolveLocale","explicit","detectLocale","nav","wanted","primary","resolveEndpoints","config","derive","autoSegment","manager","resolveToken","out","normalizeAuth","auth","useFileApi","endpoints","authConf","lastBearer","authHeaders","extra","token","creds","authHeadersSync","credentialsMode","statusMessage","status","tr","jsonFetch","url","init","headers","body","permissionsUrl","listPermissions","resolveEmail","email","searchUsers","q","addPermission","updatePermission","level","deletePermission","invitePermission","shareMail","qs","params","sp","managerUrl","action","sep","search","filter","globalSearch","query","opts","quotaMe","subfolders","newFolder","newFile","rename","items","deleteItems","copy","moveAsync","sourceDir","deleteAsync","restore","listTrash","storageName","restoreIds","ids","restored","taken","uploadMultipart","files","onProgress","fd","f","reject","xhr","ev","downloadUrl","previewUrl","fetchBlob","blob","mime","fetchArrayBuffer","limits","capabilities","e2eEscrowChallenge","e2eEscrowUsed","payload","createShare","listShares","revokeShare","uuid","archiveList","archiveExtract","members","archiveAdd","versionsUrl","listVersions","nodeId","restoreVersion","versionId","snapshotCurrent","snapshotVersion","commentsUrl","listComments","addComment","deleteComment","wsTicket","STORE_KEY","RESUME_TTL_MS","uploadFingerprint","file","defaultResumeStorage","read","store","parsed","write","pruneResume","now","changed","rec","loadResume","saveResume","clearResume","listResume","resumableState","markUnsupported","isStagedUnsupported","useUploadChunked","api","storage","DEFAULT_CHUNK","stagedBase","available","threshold","shouldChunk","resumableFor","listResumable","discardResumable","uploadId","uploadFile","inFlight","acked","report","inflight","chunkSize","bookmark","st","begun","MAX_ATTEMPTS","lastErr","attempt","sleep","putChunk","waitForOp","asError","total","opId","tmpl","delay","misses","op","TransferFailedError","MAX_OP_POLL_MISSES","message","ms","useSelection","selected","click","mod","list","aIdx","bIdx","lo","hi","clear","selectAll","add","size","isEmpty","nodes","RESERVED_COMBOS","isReservedCombo","combo","SHORTCUT_ACTIONS","HANDLER_KEY","SHORTCUTS_LS_KEY","readOverrides","overrides","writeOverrides","defOf","effectiveCombo","setShortcutOverride","resetShortcut","resetAllShortcuts","findShortcutConflict","excludeId","KEY_TOKEN_MAP","MODIFIER_KEYS","keyToken","mapped","comboFromEvent","parts","printableSymbol","useShortcutList","fixed","isMacLike","comboLabel","MENU_ACTION_SHORTCUTS","menuShortcutHint","menuKey","shortcutHint","eventMatchesShortcut","fired","useKeyboardShortcuts","rootEl","handlers","comboMap","onKey","inForm","messages","TIME_ZONE_TIERS","resolveTimeZone","sources","tier","isValidTimeZone","TIMEZONE_VIEWER_LS_KEY","TIMEZONE_ACCOUNT_LS_KEY","FALLBACK_ZONES","deviceTimeZone","tz","supportedTimeZones","zonedDayNumber","zone","activeTimeZone","y","day","readValid","writeOrClear","hasWindow","viewerZone","ownedTier","pick","hostTier","accountTier","rememberingOwners","EXPLORER_CLOCK","timeZoneSourcesFor","timeZoneSources","resolvedTimeZoneFor","activeTimeZoneFor","viewerTimeZone","setViewerTimeZone","valid","setHostTimeZone","setAccountTimeZone","releaseTimeZoneOwner","localeTag","code","BYTE_UNIT_KEYS","BYTE_UNIT_EN","formatByteSize","bytes","empty","label","idx","digits","num","fmt","numberFormatter","nfCache","max","min","dtfCache","zonedFormatter","formatInstant","toDate","COUNT_VARS","countedKey","vars","counter","one","useLocale","localeRef","lookup","clock","table","formatSize","nodeDisplayName","formatDate","date","formatDateFull","formatMonthYear","zonedYearMonth","POLL_MS","RETAIN_MS","normalizeOp","vals","rawStatus","opType","usePendingOps","ops","announced","settledAt","firstPollDone","hasActive","timer","startPolling","poll","stopPolling","localIds","visibleIncoming","visibleIds","local","after","at","dismiss","PING_INTERVAL_MS","MAX_BACKOFF_MS","MAX_RETRIES","RealtimeClient","__publicField","ticket","ws","active","burstDebounce","runStartedAt","untilCeiling","RELOAD_DEBOUNCE_MS","RELOAD_MAX_WAIT_MS","POLL_INTERVAL_MS","useRealtime","presenceUsers","connected","degraded","client","pendingSubscribe","debouncedReload","pollTimer","onPresence","onFallback","subscribe","wire","setFocus","stop","MAX_CACHED","useThumbs","apiBase","urls","order","failed","pending","resolveUrl","src","got","load","evict","monacoPromise","highlightPromise","monacoCached","highlightCached","preloadEditor","common$2","ensureMonaco","ensureHighlight","getMonaco","__props","showPhoto","initials","hue","_createElementBlock","_normalizeClass","_Fragment","_openBlock","_hoisted_3","EXPAND_KEY","others","expanded","toggleExpanded","keyOf","_hoisted_1","_renderList","PresenceAvatar","_createElementVNode","_toDisplayString","_hoisted_4","_createBlock","_hoisted_6","_createTextVNode","_unref","_hoisted_8","_hoisted_9","TRAY","EYE","STAR_PATH","PIN","PANEL","BIN","BOOKMARK","GLYPHS","SVG_CACHE","actionIconSvg","glyph","svg","__emit","hintFor","iconFor","targetNodes","menuEl","anchorX","anchorY","prevFocus","show","sheetEl","clampToViewport","focusItem","rect","margin","vw","vh","flipped","hide","sheetDragging","sheetDragY","menuItems","host","moveFocus","delta","sheetDragStart","onSheetDragStart","t0","onSheetDragMove","onSheetDragEnd","shouldClose","sheetStyle","visibleActions","vis","prefersDark","mq","syncPrefersDark","themeClass","__expose","_Teleport","_Transition","_hoisted_5","$event","_hoisted_10","_normalizeStyle","_hoisted_12","_hoisted_15","_hoisted_16","_hoisted_17","DENSITY_LS_KEY","SELBAR_MORE_BTN_W","HEADER_MENU_EVENT","density","adoptStoredDensity","onDensityStorage","toggleDensity","searchEl","localSearch","debounce","onSearchInput","focusSearch","toolbarItems","BAR_ICON_KEYS","hasSelection","barSplit","icons","rest","selBarEl","measureEl","selMoreBtnEl","selMoreRef","visibleActionCount","visibleBarItems","foldedBarItems","barMenuItems","folded","recalcFold","cont","meas","all","gap","widths","w","avail","moreW","used","count","foldRo","openBarMore","selSlot","selSlotOwned","selBodyEl","selPrimaryEl","findPrimary","pane","owned","releaseSelSlot","resolveSelSlot","syncSlotActive","reobserveSelection","domSelCount","selMo","selTick","recountSelection","scheduleRecount","selectedCount","selectionLabel","clearSelection","fire","coarse","coarseMq","syncCoarse","moreBtnEl","moreRef","offersView","utilityActions","narrowActions","util","paletteCombo","withKey","navToggleLabel","drivePlaceholder","onSearchKeydown","hostOwnsUtilities","publishHeaderMenu","detail","onMoreSelect","menuActions","openMore","$slots","_hoisted_2","_renderSlot","_ctx","_hoisted_29","_cache","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_38","_hoisted_13","_hoisted_14","_hoisted_19","_hoisted_20","_hoisted_23","_hoisted_26","ContextMenu","_hoisted_42","openTitle","tags","loading","adding","newTag","palette","colorFor","buildHeaders","persist","previous","_withKeys","EXT_FAMILIES","reg","family","exts","isStorageRow","iconFamilyFor","ext","FILE_BASE","iconSvg","TILE_CACHE","iconTile","tile","fileIconTile","isEncryptedFolder","LOCKED_FOLDER","LOCKED_FOLDER_TILE","encryptedFolderTile","EXT_TYPE_KEYS","FAMILY_TYPE_KEYS","typeLabelKey","own","typeLabelFor","E2E_MARKER_NAME","E2E_MAGIC","E2E_VERSION","E2E_MARKER_VERSION","E2E_DEFAULT_ITERATIONS","E2E_MIN_ITERATIONS","E2E_MAX_FILE_BYTES","E2E_MIN_PASSWORD_LEN","E2E_RECOVERY_KEY_BYTES","E2E_ESCROW_ALG","VERIFY_PLAINTEXT","MAGIC_BYTES","HEADER_LEN","WRAP_IV_OFF","WRAPPED_DEK_OFF","WRAPPED_DEK_LEN","DATA_IV_OFF","IV_LEN","FMK_LEN","RK_INFO","RK_SALT_LEN","E2eDecryptError","bytesToB64","b64ToBytes","buf","joinIvCt","iv","ct","gcmSeal","plain","gcmOpen","b64","pt","deriveKek","password","salt","iterations","material","deriveKekBits","bits","importFmk","B32_ALPHABET","formatRecoveryKey","generateRecoveryKey","parseRecoveryKey","clean","need","ch","deriveRecoveryKek","sealRecoverySlot","fmk","recoveryKey","rkek","importEscrowPublicKey","spkiB64","importEscrowPrivateKey","pkcs8B64","escrowKeyId","sealEscrowSlot","escrowSpkiB64","pub","createEncryptedFolder","kek","rawFmk","marker","upgradeMarkerV1","ok","rawKek","addEscrowSlot","escrowPublicKey","proof","opened","esc","declineEscrowSlot","when","escrowOfferState","installationKid","parseMarker","markerHasRecovery","markerHasEscrow","escrowAvailability","verifyPassword","fmkFromKek","unlockWithPassword","unlockWithRecoveryKey","fmkRaw","unlockWithEscrowKey","privateKey","hasMagic","encryptFile","rawDek","dek","wrapIV","dataIV","wrappedDek","decryptFile","createKeyRing","stripAdapter","parentDirOf","rel","filterInternalEntries","SHOW_HIDDEN_LS_KEY","readShowHidden","showHiddenFiles","setShowHiddenFiles","filterHiddenEntries","showHidden","filterListing","isStorageRootDir","dirname","isTrashListing","makeTrashRow","adapter","injectTrashRow","trashVisible","hydrateTrashRow","row","newest","ts","VIRTUAL_SEGMENTS","TAG_SEGMENT_PREFIX","makeTagSegment","tagOfSegment","segment","tagOfPath","virtualSegmentLabel","isVirtualViewPath","byFoldersFirst","ad","bd","SORT_KEYS","SORT_LS_KEY","DEFAULT_KEY","defaultSortDir","isSortKey","readStored","setSortLocale","modifiedMs","nameCompare","typeLabel","byActiveKey","dirWord","am","createSortStore","stored","setSort","applySort","toggleSortDir","chooseSortKey","compareNodesFn","compareInOrderFn","defaultStore","SORT_STORE_KEY","useSortStore","activeSortKey","activeSortDir","globalSort","transport","ready","persistable","viewPrefsReady","memoryOn","folderMemoryEnabled","nowSec","isViewMode","folderMap","readFolderMap","FOLDER_CAP","kept","folderKey","storageRef","relPath","SEEDED","folderPrefs","hit","_t","folderIsRemembered","rememberedCount","rememberFolder","scheduleSave","touchFolder","forgetFolder","forgetAllFolders","COLUMNS","FIXED_TRACKS","NAME_AUTO","specOf","isColumnId","readCols","spec","hidden","colsState","columnOrder","known","moveColumn","moveColumnBy","neighbour","full","canMoveColumn","columnWidth","setColumnWidth","px","widthsAreAuto","freezeWidths","columnHidden","setColumnHidden","resetColumns","columnsCustomised","OWNED_KEYS","foreign","takeForeign","currentDoc","SAVE_DEBOUNCE_MS","saveTimer","saveDirty","flushSave","attachViewPrefsStore","tableLayout","candidates","padding","visible","chrome","auto","nameSpec","room","give","UI_PROFILES","DEFAULT_UI_PROFILE","warned","resolveUiProfile","limit","fmtTime","diff","_withModifiers","_hoisted_7","EMPTY_FILTERS","fold","nameNeedle","pathActive","peopleOf","filtersActive","activeFilterCount","TYPE_FAMILIES","MIME_PREFIXES","matchesType","AROUND_MS","parseAnchor","matchesModified","MB","matchesSize","nameMatches","needle","matchesName","matchesPath","inside","ownerIdOf","ownedByViewer","ownerNameOf","arrivedFromOutside","peopleOptions","matchesPeople","want","applyFilters","mapStatus","jobs","clampPercent","opPercent","bytesTotal","bytesDone","percentOf","formatDateOf","single","isMulti","isFile","multiTotal","etag","thumb","headName","headCaption","kind","previewSrc","headIcon","canTag","shortHash","formatDateStr","copyText","effectivePerm","canManagePerms","permLabel","versionsState","versions","confirmVersionId","snapshotFirst","versionBusy","sharesState","shares","refreshSeq","refresh","seq","loadVersions","askRestore","confirmRestore","takeSnapshot","tab","peopleState","people","peopleSeq","loadPeople","personName","personInitial","shareBusy","createLink","activityUsable","commentsState","comments","commentDraft","commentBusy","commentNodeId","commentSeq","loadComments","sendComment","removeComment","relativeTime","iso","diffS","abs","units","rtf","unit","secs","_hoisted_18","_hoisted_21","_hoisted_22","_hoisted_24","_hoisted_25","_hoisted_28","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_37","_hoisted_39","_hoisted_43","_hoisted_44","TagPicker","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_97","_hoisted_98","_hoisted_99","_hoisted_100","TAG_PEEK","showLabels","sharedSet","IDENTITY_VIEWS","views","activeReadOnly","isActiveDest","tagsExpanded","allTags","visibleTags","hiddenTagCount","showTags","newBtnEl","newMenuRef","newActions","openNewMenu","onNewSelect","quotaPercent","quotaText","toggleLabel","_hoisted_36","FE_DND_MIME","FE_DND_SRC_MIME","native","NATIVE_DRAG_TTL_MS","beginNativeDrag","origin","endNativeDrag","activeNativeDrag","hasInternalDrag","internalDragItems","internalDragOrigin","canDownloadUrlDrag","authKindOf","downloadUrlPayload","dragKey","LONG_PRESS_MS","TAP_WINDOW_MS","MOVE_TOLERANCE_PX","ITEM_CONTROL_SELECTOR","clickMod","touch","checkMod","onControl","control","useRowTouch","onLongPress","longPressed","tapEndedAt","startedOnItem","stopTimer","onTouchStart","onTouchMove","onTouchEnd","tapped","isTap","MAX_BYTES","MAX_FILE_BYTES","MAX_INFLIGHT","MAX_LINES","MAX_LINE_CHARS","MAX_ROWS","MAX_COLS","TABLE_EXTS","isTrashRow","meta","previewKindFor","drawsAsPage","drawsAsVideo","KEYWORDS","TEXT_MARKER","bareToken","toLine","clipped","indent","first","splitCells","line","quoted","separatorFor","firstLine","parsePreview","truncated","bad","lines","rows","cols","createFilePreviews","enabled","queued","controllers","bound","observer","watching","remember","readHead","reader","chunks","joined","ctrl","pump","enqueue","ensureObserver","kindFor","io","dateBucketFor","today","ym","groupingActive","groupByDate","runs","side","firsts","setNodeStarred","starred","toggle","snippetSegments","snippet","re","matchedInContent","matched","applyDragGhost","dt","badge","ordered","firstDirPath","firstFilePath","sort","grouped","headingBefore","thumbOf","previews","previewKind","previewFor","bindPreview","canStar","isSelected","onCheckClick","onClick","onDbl","onCtx","onMenuButton","onItemDragStart","dropTargetPath","onItemDragOver","onItemDragLeave","onItemDrop","displayDate","captionFor","keepGlyph","cardSnippet","snippetTitle","seg","ri","cell","ci","ln","li","StarButton","ItemCheck","si","filtering","shownStorages","shownRecent","shownStarred","filteredEmpty","shown","NO_SELECTION","storageTile","storageCaption","lastOpen","openNode","_hoisted_11","GridView","_hoisted_27","connectionsBase","cut","connectionsOrigin","publicUrl","told","useConnections","drivers","storages","me","loaded","canManage","denial","statusOf","messageOf","createStorage","updateStorage","deleteStorage","testStorage","driver","fields","defaults","missingRequired","cfg","driverNames","hostOf","isPlainHttp","userOf","GUIDE_BUILDERS","user","secret","facts","clients","notes","endpoint","bucket","akid","pathStyle","port","portFlag","pasv","ro","GUIDE_NAMES","guideName","guideProtocols","buildGuide","protocol","builder","showAdvanced","revealed","basic","advanced","help","optionLabel","alias","bool","isInvalid","inputType","toggleReveal","activeClient","copied","copyTimer","ta","blockId","prefix","isCode","useS3Keys","connection","canMint","create","req","setDisabled","dismissSecret","guideKey","usable","useScrolledX","scrolledX","onScroll","on","locale","busy","confirmRevoke","publish","conn","_c","_d","_e","mint","revoke","shortDate","scopeOf","useSSHKeys","canAdd","hasUsableKey","showKeys","pasted","confirmRemove","submit","drop","fingerprintOf","useNFSExports","exports","dismissPath","guideExport","readOnly","allowCidrs","mountLine","copyLine","useTokens","tokens","confirming","FULL_SCOPES","scopeState","rootPath","expiresInDays","buildScopes","defaultLabel","labelPlaceholder","scopes","copySecret","fmtDate","usedLabel","_vModelCheckbox","osDark","onMq","themeResolved","form","fName","fDriver","fReadOnly","fEnabled","fConfig","fInvalid","saving","testing","testResult","nfs","formError","confirmDelete","driverOptions","translated","formFields","openNew","openEdit","closeForm","onDriverChange","validate","missing","runTest","save","summaryOf","rootField","aliases","protocols","guideStorage","s3","sftp","guide","_f","_g","_h","_i","_j","_l","_k","_n","_m","_p","_o","_r","_q","_s","_v","_u","_w","_x","_y","_z","_A","names","StorageFields","_hoisted_40","_hoisted_41","S3KeysPanel","SSHKeysPanel","NFSExportsPanel","TokensPanel","ConnectionGuideView","EVERYWHERE_MIN_CHARS","EVERYWHERE_LIMIT","EVERYWHERE_DEBOUNCE_MS","SAVED_LS_KEY","SAVED_MAX","inputEl","listEl","extOf","dot","iconHtml","it","matchScore","sc","gotoItems","fileItems","scored","commandItems","everywhere","everywhereLoading","everywhereTimer","everywhereSeq","scheduleEverywhere","hits","hitCrumb","slash","hitItems","savedSearches","readSavedSearches","writeSavedSearches","saveSearch","removeSavedSearch","flat","savedItems","fileOffset","hitOffset","savedOffset","cmdOffset","choose","onDocKeydown","FOCUSABLE","cardEl","modalSeq","titleId","focusable","onBackdrop","emptyAdvSearch","pathBase","tagToken","negated","advQueryString","tok","advSearchEmpty","parseTagList","advSearchTruncated","returned","queryEl","tagsRaw","excludeRaw","modified","aroundDate","aroundSpan","sizeFrom","sizeTo","sizeUnit","pathMode","TYPE_OPTIONS","MODIFIED_OPTIONS","SIZE_OPTIONS","SPAN_OPTIONS","UNIT_FACTOR","scopeOptions","SCOPE_ICON","PATH_MODES","PEOPLE_FIXED","ownerFilterable","snapshot","submitted","seed","counted","countError","request","nothingToAsk","wireQuery","counting","peopleLabel","scheduleCount","mine","countLabel","Modal","groups","THEME_LS_KEY","LEGACY_THEME_LS_KEY","DEFAULT_THEME_ID","THEMES","themeById","ALL_TOKEN_KEYS","readStoredThemeId","legacy","themeId","setTheme","useThemeState","THEME_MODE_LS_KEY","MODE_VALUES","readStoredThemeMode","themeMode","setThemeMode","useThemeModeState","applyThemeToEl","dark","theme","STYLE_ATTR","cssDecls","generateThemeCss","light","darkSelectors","autoDarkSelectors","syncThemeStyle","css","cardVars","th","MODES","shownMode","DEFAULT_ID","ThemePalette","LIMIT","tid","inputDomId","listId","input","ALIASES","offsetAliases","offset","sign","hRaw","minRaw","hh","mm","forms","namePart","clockFor","fallbackZone","indexKey","buildIndex","loc","fz","defaultHay","segs","city","region","genericLocal","genericEn","haystack","ensureIndex","tick","startTick","stopTick","scrollBox","oy","measureDrop","ir","box","below","above","MIN","MAX","useAbove","score","terms","term","best","matches","display","off","rowTime","openList","scrollActiveIntoView","closeList","onInput","commit","moveActive","onKeydown","inputId","inForce","inForceZone","TimeZonePicker","useExplorerTimeZone","deps","asked","anyOverridden","capturingId","conflict","reserved","labelOf","beginCapture","cancelCapture","attemptAssign","clash","confirmConflictTake","dismissConflict","dismissReserved","onReset","onResetAll","onWindowKeydown","onClose","ONLYOFFICE_API_PATH","trimBase","browserProbeURL","service","MAX_TEXT_BYTES","ONLYOFFICE_SCRIPT_ID","IMAGE","VIDEO","AUDIO","CODE_LANGS","TEXT_PLAIN","OFFICE","VIEWER_MAP","Viewer3D","EpubViewer","MermaidViewer","DrawioViewer","TiffViewer","PsdViewer","IpynbViewer","CsvViewer","ArchiveViewer","wantEdit","viewerCmp","viewerLoadError","pdfFallbackToNative","loadViewerFor","extension","loader","onPdfFallback","viewerProps","openInNewTab","buildAndOpenStandalone","openEditInNewTab","EDITABLE_EXTS","canEditKind","download","showChrome","viewerEl","tileHtml","displayName","counterText","metaLine","canNav","starNodeId","FILL_KINDS","stageModifier","ZOOM_STEPS","zoom","imgEl","fitWidth","canZoom","measureFit","imageStyle","stepZoom","lower","resetZoom","zoomLabel","canZoomIn","canZoomOut","isFullscreen","onFullscreenChange","toggleFullscreen","onGroundClick","fetchError","rawText","tooLarge","mdDirty","mdSaving","mdReRenderTimer","mdAutosaveTimer","onMdInput","renderMarkdown","saveMarkdown","fetchText","markdownHtml","markdownEl","markdownUnavailable","index$1","Md","sanitizeHtml","enrichMarkdown","html","blocks","mermaid","katex","block","isMermaid","isMath","katex$1","codeHtml","highlightCode","language","hljs","monacoEl","monacoEditor","codeAutosaveTimer","monacoReady","monacoUnavailable","saveOk","saveError","disposeMonaco","monacoLanguageFor","tryMountMonaco","monaco","editable","saveCode","txt","runOrchestration","officeError","disposeOnlyOfficeEditor","lang","mountOnlyOfficeEditor","codeLanguage","officeEl","officeEditor","documentServerUrl","loadOnlyOfficeScript","mountId","formatOnlyOfficeError","W","script","_resolveDynamicComponent","_mergeProps","_hoisted_75","inFormControl","NAV_KEYS","hintSegments","PreviewModal","RING_R","history","hasError","overall","runningCount","RING_C","ringOffset","ringSpin","pctText","badgeAria","KIND_ICONS","kindLabel","rowTitle","statusText","chipText","onDocPointerDown","DONE_LINGER_MS","HISTORY_CAP","toOperation","terminal","useOperations","actions","retired","lingerTimers","clearTimer","tm","retire","scheduleLinger","acts","sync","group","present","cancel","retry","clearHistory","errorCount","overallPercent","running","sum","frac","PAD","GAP","hintCombos","STEPS","activeSteps","stepIdx","step","resolveSteps","spot","cardStyle","targetEl","stepDesc","place","cw","sTop","sBottom","sLeft","sRight","clampX","clampY","midX","midY","top","left","placeRaf","onViewportChange","back","skip","dragIndex","overIndex","onDragStart","onDragOver","onDragLeave","onDrop","onDragEnd","onTabMiddleDown","onAux","OVERFLOW_THRESHOLD","confinedRel","floorLabel","crumbs","adapterPrefix","floor","part","homeCrumb","trail","homeIsCurrent","collapsed","leadCrumbs","middleCrumbs","tailCrumbs","overflowOpen","moreWrapEl","subOpen","subWrapEl","anyMenuOpen","closeMenus","onOverflowPick","crumb","toggleSub","onDocClick","onHomeClick","onHomeContext","onContext","onHomeDrop","onCrumbDrop","onCrumbDragOver","editing","pathDraft","pathInput","startEdit","trimmed","submitPath","cancelEdit","findLabel","GROUPS","peopleChoices","optionsFor","chipLabel","chosen","activeCount","sortKey","sortAscending","ranked","sortKeyLabel","sortDirLabel","pickSortKey","flipSortDir","openSortMenu","actionRows","runAction","openPop","pos","panelEl","anchorEls","setAnchorEl","openGroup","popOptions","popTitle","popChecked","popLabel","popPick","panel","r2","restoreFocus","clearAll","localName","nameTimer","onNameInput","clearName","onDocPointer","offers","DRAG_SLOP","CLICK_SWALLOW_MS","onRowClick","onRowDbl","onRowCtx","onRowMenu","isPinnedSpecial","fullDate","typeColumnShown","visibleCols","isPlainDir","locationLabel","rowSnippet","rowInContent","sortDir","toggleSort","sortTitle","ariaSort","candidateCols","listWidth","onListScroll","onResizeMove","onResizeEnd","layout","tableStyle","colStyle","colClass","SORT_OF","COL_LABEL","colLabel","cellText","ownerLabel","cellTitle","ownerTitle","nameTitle","isResizable","resizing","freezeBeforeEdit","onResizeStart","onResizeKey","onResizeReset","dragState","dragCol","dropAt","dragEndedAt","isMovable","onHeadPointerDown","onHeadPointerMove","onHeadPointerUp","onDragKey","movable","endDrag","drawn","armed","onHeadClickCapture","colMenuOpen","colMenuX","colMenuY","colMenuEl","colMenuThemeClass","menuCols","nudgeCol","canResetCols","rememberedFolders","thisFolderRemembered","openColMenu","clampColMenu","pad","closeColMenu","toggleCol","onResetColumns","onApplyToAll","onForgetFolder","pinned","groupLabels","actor","actorSelf","actorId","who","metaFor","OPEN_GUARD_MS","ownPath","ownRows","ownLoading","ownError","ownPerm","panePath","paneRows","paneLoading","paneError","atVirtualRoot","loadFolder","requested","resp","goTo","paneWire","paneAdapter","onCrumbNavigate","adapterPath","displayFiles","filtersOn","paneFilterMode","paneFindLabel","paneSubfolders","openedAt","withinOpenGuard","onViewClick","onRowOpen","onViewDbl","onViewContext","onBgContext","onBgClick","onRowDragStart","dropBg","acceptDrag","handleDropPayload","targetWire","onViewDropInto","onBgDragOver","onBgDragLeave","onBgDrop","reload","goUp","getPath","visibleNodes","rowCount","rowPaths","dirPerm","Breadcrumb","ViewSwitcher","FilterBar","ListView","GalleryView","makeId","useTabs","tabs","activeId","activeTab","activeIndex","hasMultiple","vm","rawSplit","split","viewMode","syncActive","openTab","closeTab","wasActive","activate","setSplit","password2","ack","title","hasEscrow","escrowUnavailableReason","recoveryValue","escrowValue","localErr","nothingAvailable","shownError","PERM_LEVELS","rowMillis","nodeRowToFileNode","configured","isDir","perm","hostReadOnly","TTL_MS","invalidateTagCache","fetchAllTags","fetchTaggedRows","wireAdapterOf","resolveTransfer","intent","cross","archiveTicketUrl","absoluteTicketUrl","ticketUrl","requestArchive","paths","DOWNLOAD_FRAME_TTL_MS","triggerFileNavigation","frame","downloadArchive","DRIVES","splitWire","trimSlashes","joinWire","parentOfWire","multiDrive","labelOfWire","drivesLabel","crumbsOfWire","permAllowsWrite","isAtOrInside","ancestor","ca","cr","aa","ar","blockedReason","candidate","moving","norm","destinationRows","driveRows","initialLocation","multi","only","here","isOpen","hereBlocked","hereWritable","canChoose","reasonIsRefusal","reason","confirmLabel","openRow","satisfied","ty","offered","withheld","withheldText","svc","selectedType","labelFor","tileFor","dest","pickingDest","dirCache","canWrite","loadDir","destLabel","destWritable","destChecked","nameTouched","collision","failure","finalName","nameHasSeparator","freeName","cand","takenNames","checkSeq","checkTimer","refreshDestination","scheduleCheck","defaultDestination","onTileKey","onDestinationPicked","onOuterClose","canCreate","DestinationPickerModal","iframeRef","formats","selectedTo","srcExt","fromFmt","ins","toList","uniq","iframeSrc","msgId","send","cmd","transfer","onMessage","loadFormats","doConvert","outName","shQuote","shareCliCommand","share","STOCK_EXPIRY_DAYS","clampExpiryOptions","days","maxDays","defaultExpiryDays","validUntilLine","expiresAt","ttlCeilingHint","shareDetailLine","localeCode","L","pathParts","titleTile","toggleSection","direct","inherited","storageRbac","notice","noAccount","createRole","inviteResult","suggestions","showSuggest","searchTimer","levels","levelLabel","sharePwd","shareExpiry","shareResult","shareErr","shareMailTo","shareMailBusy","shareMailNotice","shareKind","downloadShares","dropShares","expiryLabel","expiryOptions","ttlHint","dropExpiry","shareMaxDl","maxDlOptions","shareCli","dropPwd","dropShowAdv","dropMaxFiles","dropMaxSizeMB","dropAllowedExt","dropAskName","dropBusy","dropErr","dropResult","dropMailTo","dropMailBusy","dropMailNotice","splitEmails","mailResultNotice","sent","reloadShares","onEmailInput","pickUser","lvl","submitEmail","addr","inviteCreateUser","gotoShareWithMail","changeLevel","newLevel","removeGrant","glabel","ginitial","expiresAtISO","toggleLink","linkOn","sendShareMail","dropExpiresAtISO","createDropLink","drop_settings","sendDropMail","canShare","humanSize","expiryLine","validUntil","primaryLink","whoLine","linkDetail","linkSummary","peopleSummary","dropSummary","shareBody","pin","sz","dropBody","folder","maxFiles","maxMB","nativeShare","_hoisted_83","_hoisted_84","_hoisted_96","_hoisted_101","_hoisted_102","_hoisted_103","_hoisted_104","_hoisted_105","_hoisted_106","_hoisted_107","_hoisted_108","_hoisted_109","_hoisted_110","_hoisted_111","_hoisted_112","_hoisted_113","_hoisted_114","_hoisted_115","_hoisted_116","_hoisted_117","_hoisted_118","_hoisted_119","_hoisted_121","_hoisted_122","_hoisted_123","_hoisted_124","_hoisted_126","_hoisted_128","_hoisted_129","_hoisted_130","_hoisted_132","_hoisted_133","_hoisted_135","_hoisted_136","_hoisted_137","_hoisted_138","_hoisted_139","_hoisted_142","VIEW_MODE_KEY","INSPECTOR_LS_KEY","SIDENAV_LS_KEY","ADV_CONTENT_LIMIT","PATH_LS_KEY","DRAGOUT_PREFETCH_MAX_BYTES","DRAGOUT_PREFETCH_MAX_ITEMS","STANDALONE_ROUTE","TOUR_LS_KEY","TABS_LS_BASE","e2eEscrowDocsUrl","realtime","realtimeDegraded","realtimeRoom","vp","qualify","currentPath","thumbs","chunked","opUndo","pendingOps","undo","flashToast","undoToast","verb","splitPaneRef","rootPathProp","rootFloor","initialFloorPath","dirReadOnly","notFoundPath","loadError","loadErrorPath","retryLoad","restoringFolderView","searchQuery","trashMode","trashOrigin","trashActive","navView","navViewOrigin","crossFolderView","folderMemoryOn","currentFolderKey","makeFolderKey","globalViewMode","appliedSig","viewSig","applyFolderView","wantView","buildAuthHeaders","rdy","sig","navTag","NAV_VIEW_DIRNAME","virtualViewOf","soleStorageName","multiStorageRoot","canGoUp","filterRowMode","displayOrder","previewables","previewPosition","previewTarget","onPreviewNav","selection","focusFiles","clipboard","capabilitiesData","showTimeZone","shareMaxTtlDays","starredIds","showRecents","showTagPicker","tagPickerNode","recentRefreshKey","loadStarred","onStarChange","starableNodes","targets","identitySurfaces","selectionAllStarred","toggleStar","rollback","loadNavView","markRecent","openTagPickerFor","openTagView","loadTagView","onNodeTagsChanged","loadNavTags","onRecentOpen","onRecentContext","onContextTarget","effectiveOnlyOfficeBase","effectiveOnlyOfficeConfigEndpoint","effectiveDrawioUrl","override","effectiveConvertUrl","newDocTypes","canNewDocument","uploadJobs","fileInputEl","showNewFolder","showNewDocument","showRename","showDelete","showPreview","renameTarget","mutationInPane","previewMode","showConvert","convertTarget","showPerm","permTarget","showDestPicker","destPickerMode","destPickerTargets","destPickerBusy","showInspector","persistInspector","toggleInspector","openInspector","closeInspector","uiProfile","simpleUi","infoPanelToggle","sideNavExpanded","persistSideNav","navDrawerOpen","sideNavEnabled","navVisible","isNarrow","navOffersTrash","navToggleOn","toggleSideNav","closeNavDrawer","sharedStorageNames","connectionsEnabled","callerIsApp","showConnections","showTokens","openConnections","openTokens","closeOverlays","anyOverlayOpen","onConnectionsError","allowedViewModes","driveFilters","advFilters","advScope","listingOrder","clearDriveFilters","setDriveFilters","showAdvSearch","advPathBase","advContentAvailable","advHitToNode","drive","mtime","advFetchRows","advTarget","virtualToWire","advSearchCount","openAdvancedSearch","advSearchSeed","applyAdvancedSearch","onToolbarSearch","driveScopeLabel","paletteSeed","openPaletteWith","showPalette","permInitialTab","openFileRequest","onInspectorShareCreated","quotaSnapshot","loadQuota","unlimited","nodeRowToFileNodePure","fetchNavRows","homeRecent","homeStarred","homeLoading","homeStorages","loadHome","e2eRoot","forgetFolderPerm","probeTrashPolicy","loadTrash","navTags","navTagsLoaded","force","openNavDest","openNavStorage","loadSharedStorages","folderLabelOf","onInspectorManage","permCanEdit","inVirtualView","rowPerm","nodeReadOnly","nodeCanEdit","PERM_RANK","selPerm","sel","weakest","ungated","selReadOnly","canWriteHere","emptyCanUpload","ctxRef","toolbarRef","isCoarse","narrowRO","syncCoarsePointer","toast","toastTimer","showToast","dismissToast","runToastAction","act","splitVirtualPath","wireToVirtual","virtualStorageRows","toggleHiddenFiles","refreshAll","asView","writePersistedPath","leaving","arriveAt","arrived","hydrateTrashRowShared","leaveNotFound","trashRetentionDays","trashCanEmpty","trashEmptying","showTrashConfirm","trashBannerText","trashTotalBytes","trashSizeKnown","trashConfirmKey","emptyTrash","wireBasename","wireParent","sameDir","pre","wireJoin","movedNamesCollide","registerMoveUndo","originWire","collides","movedPaths","persistMode","hashPersistEnabled","safeDecode","readLsPath","readHashPath","readPersistedPath","fromHash","encoded","onHashChange","fromPersist","cap","showShortcutsHelp","paletteGlobalSearch","openSearchHit","targetRel","paneIsActive","psel","splitSelection","paneCtxTargets","pn","onPaneOpen","paneCut","paneCopy","copyToClipboard","panePaste","paste","quickLookToggle","newTabHere","closeTabById","tabsActiveId","nextTab","prevTab","triggerUpload","dispatchItemAction","activeTargets","onCopyPath","OFFICE_EXTS","e2eUnlocked","e2eOpenPreview","e2eLocked","previewModeForExt","VIEW_DEFAULT_EXTS","restoreSelection","previewNode","openNodeInNewTab","e2eActive","absolutePageUrl","ctxMode","breadcrumbCtxPath","breadcrumbCtxLabel","selectionMode","onToolbarAction","desktopSync","keptPairs","refreshKept","keepActive","refreshKeepStatus","ds","keepPokeTimer","keepAlive","onKeepPoke","keepRemoteOf","remoteInside","keepStateOf","remote","keepBadgeFor","keepStripLabel","keepStripPercent","keepActionsFor","ctxUnlistedTargets","onContextCanvas","onCrumbContext","onPaneMenu","activePane","contextActions","selectionActionList","any","trimmedPath","view","tagsLabel","singleHasId","allStarred","accessLabel","toolbarActions","onContextAction","actingInPane","downloadSelection","openConvert","inPane","duplicate","openNodeInTab","plan","downloadFile","e2eDownload","transferItems","onDocumentCreated","submitNewFolder","dirWire","submitRename","oldPath","oldName","newPath","nodeIds","restoreUndo","onConvertDone","onFilePicked","uploadFiles","e2eEncryptUploads","chunkedUpload","legacyUpload","percent","registered","dragCounter","dragOver","isExternalFileDrag","hasFile","onDragEnter","onDropUpload","d1Origin","d1Here","d1Items","cancelShellDrag","onWindowDragOver","onWindowDrop","onGlobalPointerUp","dragOut","afterDrop","dragOutQuiet","clippedPaths","onPaneClickRow","onPaneItemDragStart","prepareDragOut","dragOutReadyKey","dragOutBusy","dragOutPrefetchTimer","quiet","moveSourcesAsync","targetDir","opLabel","originOverride","onItemDropInto","dndOrigin","onCrumbDropInto","onCancelUpload","onDismissUpload","onNavigate","effectiveViewerBaseUrl","showThemeGallery","activeThemeId","setActiveTheme","themeModePref","setThemeModePref","themeMq","themeOsDark","onThemeMqChange","themeResolvedDark","showShortcutSettings","quickLookOpen","quickLookTarget","e2eFetchDecrypted","quickLookNav","onlyFiles","quickLookOpenFull","opsCenter","retryUploadJob","showTour","tourTimer","tourAlreadyDone","startTour","onTourClose","onTourRestartEvent","tabsStorageKey","tabsApi","tabsRestored","activeSplit","tabLabel","virtualLabel","tabItems","tb","tabsVisible","applyTabLocation","settle","activateTab","onListAuxClick","onListMiddleDown","mainPaneRef","splitDisplayOrder","splitFilters","splitFolderKey","sto","paneRowVisible","splitOffered","hostBodyState","splitVisible","toggleSplit","closeSplit","onPaneNavigate","paneToUser","onPaneOpenTrash","paneViewMode","setPaneViewMode","displayedViewMode","setDisplayedViewMode","setPaneMain","mainPaneFocus","activePaneId","heldSelection","activePanePath","panePathOf","panePathsOf","heldValid","inspectorHeld","inspectorNodes","live","inspectorHeldIn","inspectorDirLabel","inspectorDirCount","inspectorDirPerm","paneClamp","onPaneTransfer","e2eRing","e2eRingVer","e2eUrls","e2ePw","e2eUnlockBusy","e2eUnlockErr","showEncFolder","e2eCreateBusy","e2eMarker","showRecoveryUnlock","e2eRecoverBusy","e2eRecoverErr","showRecoveryKey","recoveryKeyValue","recoveryKeyVariant","recoveryKeyFolder","e2eUpgradeOffer","e2eUpgradePw","e2eUpgradeBusy","e2eEscrowOffer","e2eEscrowOfferMode","e2eEscrowPw","e2eEscrowBusy","e2eEscrowErr","e2eEscrowPub","e2eEscrowKid","e2eKek","e2eRevokeAll","e2eUnlock","markerText","e2eLock","E2E_MIME","e2eMimeFor","e2ePreviewSrc","submitEncryptedFolder","markerFile","newDirWire","e2eRecoverUnlock","priv","openRecoveryUnlock","e2eDoUpgrade","up","e2eEscrowOfferState","e2eOpenEscrowOffer","e2eWriteMarker","e2eAcceptEscrow","e2eDeclineEscrow","e2eCloseEscrowOffer","e2eDeclineUpgrade","closeRecoveryKey","Toolbar","SideNav","TabBar","FilePane","PresenceBar","HomeView","InspectorPanel","ConnectionsPanel","UploadProgress","PendingOpsTray","OperationsCenter","NewDocumentModal","NewFolderModal","EncryptedFolderModal","RecoveryKeyModal","E2eRecoveryUnlockModal","RenameModal","DeleteConfirmModal","ConvertModal","PermissionsModal","RecentlyOpened","AdvancedSearch","CommandPalette","ShortcutsHelp","ThemeGallery","TimeZoneDialog","ShortcutSettings","QuickLook","OnboardingTour","oa","oi","Sv","Bv","Iv","Ms","ko","Es","qa","Ei","ba","Yu","Vn","Gs","nd","Dn","Pi","jn","Wm","qm","vd","ky","pi","gd","kd","Xr","Ns","My","wd","tu","nu","au","Ey","ou","$d","Un","Us","Qy","Zr","vi","eb","To","$u","Ln","Qi","Ua","zC","Ys","tl","LC","nl","stylesInjected","injectStylesOnce","coreCss","buildConfig","isMountable","warnIfStillUnconfigured","FilexExplorerWrapper","FileExplorer","FilexConnectionsWrapper","FilexElement","FilexConnectionsElement","deepFreeze","Response","escapeHTML","inherit$1","original","objects","SPAN_CLOSE","emitsWrappingTags","scopeToCSSClass","pieces","HTMLRenderer","parseTree","className","newNode","TokenTree","TokenTreeEmitter","emitter","lookahead","concat","anyNumberOfTimes","optional","stripOptionsFromArgs","either","countMatchGroups","startsWith","lexeme","BACKREF_RE","_rewriteBackreferences","regexps","joinWith","numCaptures","regex","MATCH_NOTHING_RE","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","SHEBANG","beginShebang","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","begin","modeOptions","ENGLISH_WORD","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","skipIfHasPrecedingDot","response","scopeClassName","_parent","beginKeywords","compileIllegal","compileMatch","compileRelevance","beforeMatchExt","originalMode","COMMON_KEYWORDS","DEFAULT_KEYWORD_SCOPE","compileKeywords","rawKeywords","caseInsensitive","scopeName","compiledKeywords","compileList","keywordList","keyword","pair","scoreForKeyword","providedScore","commonKeyword","seenDeprecations","warn","deprecated","MultiClassError","remapScopeNames","regexes","scopeNames","positions","beginMultiClass","endMultiClass","scopeSugar","MultiClass","compileLanguage","langRe","global","MultiRegex","terminators","matchData","ResumableMultiRegex","matcher","m2","buildModeRegex","compileMode","cmode","keywordPattern","expandOrCloneMode","dependencyOnParent","variant","HTMLInjectionError","escape","inherit","NO_MATCH","MAX_KEYWORD_HITS","HLJS","languages","plugins","SAFE_MODE","LANGUAGE_NOT_FOUND","PLAINTEXT_LANGUAGE","shouldNotHighlight","languageName","blockLanguage","classes","getLanguage","_class","highlight","codeOrLanguageName","optionsOrCode","ignoreIllegals","_highlight","codeToHighlight","continuation","keywordHits","keywordData","matchText","processKeywords","modeBuffer","lastIndex","word","keywordRelevance","relevance","cssClass","emitKeyword","processSubLanguage","continuations","highlightAuto","processBuffer","emitMultiClass","startNewMode","endOfMode","matchPlusRemainder","doIgnore","resumeScanAtSamePosition","doBeginMatch","newMode","beforeCallbacks","doEndMatch","endMode","processContinuations","lastMatch","processLexeme","textBeforeMatch","processed","md","beforeMatch","processedCount","justTextHighlightResult","languageSubset","plaintext","results","autoDetection","sorted","secondBest","updateClassName","element","currentLang","resultLang","highlightElement","configure","userOptions","initHighlighting","highlightAll","initHighlightingOnLoad","wantsHighlight","boot","registerLanguage","languageDefinition","error$1","registerAliases","unregisterLanguage","listLanguages","aliasList","upgradePluginAPI","addPlugin","removePlugin","deprecateHighlightBlock","core","xml","TAG_NAME_RE","XML_IDENT_RE","XML_ENTITIES","XML_META_KEYWORDS","XML_META_PAR_KEYWORDS","APOS_META_STRING_MODE","QUOTE_META_STRING_MODE","TAG_INTERNALS","xml_1","bash","VAR","BRACED_VAR","SUBST","HERE_DOC","QUOTE_STRING","ESCAPED_QUOTE","APOS_STRING","ESCAPED_APOS","ARITHMETIC","SH_LIKE_SHELLS","KNOWN_SHEBANG","FUNCTION","LITERALS","PATH_MODE","SHELL_BUILT_INS","BASH_BUILT_INS","ZSH_BUILT_INS","GNU_CORE_UTILS","bash_1","DECLTYPE_AUTO_RE","NAMESPACE_RE","FUNCTION_TYPE_RE","TYPES","STRINGS","NUMBERS","PREPROCESSOR","FUNCTION_TITLE","EXPRESSION_CONTAINS","EXPRESSION_CONTEXT","FUNCTION_DECLARATION","c_1","cpp","CPP_PRIMITIVE_TYPES","RESERVED_KEYWORDS","RESERVED_TYPES","TYPE_HINTS","FUNCTION_HINTS","CPP_KEYWORDS","FUNCTION_DISPATCH","cpp_1","csharp","BUILT_IN_KEYWORDS","FUNCTION_MODIFIERS","LITERAL_KEYWORDS","NORMAL_KEYWORDS","CONTEXTUAL_KEYWORDS","RAW_STRING","VERBATIM_STRING","VERBATIM_STRING_NO_LF","SUBST_NO_LF","INTERPOLATED_STRING","INTERPOLATED_VERBATIM_STRING","INTERPOLATED_VERBATIM_STRING_NO_LF","STRING","GENERIC_MODIFIER","TYPE_IDENT_RE","AT_IDENTIFIER","csharp_1","HTML_TAGS","SVG_TAGS","TAGS","MEDIA_FEATURES","PSEUDO_CLASSES","PSEUDO_ELEMENTS","ATTRIBUTES","modes","VENDOR_PREFIX","AT_MODIFIERS","AT_PROPERTY_RE","css_1","markdown","INLINE_HTML","HORIZONTAL_RULE","CODE","LIST","LINK_REFERENCE","URL_SCHEME","LINK","BOLD","ITALIC","BOLD_WITHOUT_ITALIC","ITALIC_WITHOUT_BOLD","CONTAINABLE","markdown_1","diff_1","ruby","RUBY_METHOD_RE","CLASS_NAME_RE","CLASS_NAME_WITH_NAMESPACE_RE","RUBY_KEYWORDS","YARDOCTAG","IRB_OBJECT","COMMENT_MODES","decimal","NUMBER","PARAMS","RUBY_DEFAULT_CONTAINS","IRB_DEFAULT","ruby_1","go","go_1","graphql","GQL_NAME","graphql_1","ini","COMMENTS","VARIABLES","ARRAY","BARE_KEY","QUOTED_KEY_DOUBLE_QUOTE","QUOTED_KEY_SINGLE_QUOTE","ANY_KEY","DOTTED_KEY","ini_1","decimalDigits","hexDigits","NUMERIC","recurRegex","substitution","java","JAVA_IDENT_RE","GENERIC_IDENT_RE","ANNOTATION","java_1","ERROR_TYPES","BUILT_IN_GLOBALS","BUILT_IN_VARIABLES","BUILT_INS","javascript","hasClosingTag","IDENT_RE$1","FRAGMENT","XML_SELF_CLOSING","XML_TAG","afterMatchIndex","nextChar","afterMatch","KEYWORDS$1","decimalInteger","HTML_TEMPLATE","CSS_TEMPLATE","GRAPHQL_TEMPLATE","TEMPLATE_STRING","SUBST_INTERNALS","SUBST_AND_COMMENTS","PARAMS_CONTAINS","CLASS_OR_EXTENDS","CLASS_REFERENCE","USE_STRICT","FUNCTION_DEFINITION","UPPER_CASE_CONSTANT","noneOf","FUNCTION_CALL","PROPERTY_ACCESS","GETTER_OR_SETTER","FUNC_LEAD_IN_RE","FUNCTION_VARIABLE","javascript_1","json","ATTRIBUTE","PUNCTUATION","LITERALS_MODE","json_1","kotlin","KEYWORDS_WITH_LABEL","LABEL","VARIABLE","ANNOTATION_USE_SITE","KOTLIN_NUMBER_MODE","KOTLIN_NESTED_COMMENT","KOTLIN_PAREN_TYPE","KOTLIN_PAREN_TYPE2","kotlin_1","PSEUDO_SELECTORS","less","PSEUDO_SELECTORS$1","INTERP_IDENT_RE","RULES","VALUE_MODES","STRING_MODE","IDENT_MODE","AT_KEYWORDS","PARENS_MODE","VALUE_WITH_RULESETS","MIXIN_GUARD_MODE","RULE_MODE","AT_RULE_MODE","VAR_RULE_MODE","SELECTOR_MODE","PSEUDO_SELECTOR_MODE","less_1","lua","OPENING_LONG_BRACKET","CLOSING_LONG_BRACKET","LONG_BRACKETS","lua_1","makefile","FUNC","ASSIGNMENT","META","TARGET","makefile_1","perl","REGEX_MODIFIERS","PERL_KEYWORDS","METHOD","ATTR","STRING_CONTAINS","REGEX_DELIMS","PAIRED_DOUBLE_RE","PAIRED_RE","PERL_DEFAULT_CONTAINS","perl_1","objectivec","API_CLASS","IDENTIFIER_RE","CLASS_KEYWORDS","objectivec_1","php","NOT_PERL_ETC","PASCAL_CASE_CLASS_NAME_RE","UPCASE_NAME_RE","SINGLE_QUOTED","DOUBLE_QUOTED","HEREDOC","NOWDOC","WHITESPACE","KWS","normalizeKeywords","CONSTRUCTOR_CALL","CONSTANT_REFERENCE","LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON","NAMED_ARGUMENT","PARAMS_MODE","FUNCTION_INVOKE","ATTRIBUTE_CONTAINS","php_1","phpTemplate","phpTemplate_1","plaintext_1","python","RESERVED_WORDS","PROMPT","LITERAL_BRACKET","digitpart","pointfloat","COMMENT_TYPE","python_1","pythonRepl","pythonRepl_1","NUMBER_TYPES_RE","OPERATORS_RE","PUNCTUATION_RE","r_1","rust","RAW_IDENTIFIER","NUMBER_SUFFIX","BUILTINS","rust_1","scss","PSEUDO_ELEMENTS$1","PSEUDO_CLASSES$1","scss_1","shell","shell_1","sql","COMMENT_MODE","QUOTED_IDENTIFIER","MULTI_WORD_TYPES","NON_RESERVED_WORDS","RESERVED_FUNCTIONS","POSSIBLE_WITHOUT_PARENS","COMBOS","FUNCTIONS","OPERATOR","kws_to_regex","kw","MULTI_WORD_KEYWORDS","reduceRelevancy","exceptions","qualifyFn","sql_1","keywordWrapper","dotKeywords","optionalDotKeywords","keywordTypes","keywords","literals","precedencegroupKeywords","numberSignKeywords","builtIns","operatorHead","operatorCharacter","operator","identifierHead","identifierCharacter","identifier","typeIdentifier","keywordAttributes","availabilityKeywords","swift","BLOCK_COMMENT","DOT_KEYWORD","KEYWORD_GUARD","PLAIN_KEYWORDS","REGEX_KEYWORDS","KEYWORD","KEYWORD_MODES","BUILT_IN_GUARD","BUILT_IN","OPERATOR_GUARD","OPERATORS","ESCAPED_CHARACTER","rawDelimiter","ESCAPED_NEWLINE","INTERPOLATION","MULTILINE_STRING","SINGLE_LINE_STRING","REGEXP_CONTENTS","BARE_REGEXP_LITERAL","EXTENDED_REGEXP_LITERAL","REGEXP","IMPLICIT_PARAMETER","PROPERTY_WRAPPER_PROJECTION","IDENTIFIERS","AVAILABLE_ATTRIBUTE","KEYWORD_ATTRIBUTE","USER_DEFINED_ATTRIBUTE","TYPE","GENERIC_ARGUMENTS","TUPLE_ELEMENT_NAME","TUPLE","GENERIC_PARAMETERS","FUNCTION_PARAMETER_NAME","FUNCTION_PARAMETERS","FUNCTION_OR_MACRO","INIT_SUBSCRIPT","OPERATOR_DECLARATION","PRECEDENCEGROUP","CLASS_FUNC_DECLARATION","CLASS_VAR_DECLARATION","TYPE_DECLARATION","interpolation","submodes","swift_1","yaml","URI_CHARACTERS","KEY","TEMPLATE_VARIABLES","SINGLE_QUOTE_STRING","CONTAINER_STRING","TIMESTAMP","VALUE_CONTAINER","OBJECT","yaml_1","typescript","tsLanguage","NAMESPACE","INTERFACE","TS_SPECIFIC_KEYWORDS","DECORATOR","swapMode","replacement","indx","ATTRIBUTE_HIGHLIGHT","OPTIONAL_KEY_OR_ARGUMENT","functionDeclaration","typescript_1","vbnet","CHARACTER","MM_DD_YYYY","YYYY_MM_DD","TIME_12H","TIME_24H","DATE","DOC_COMMENT","vbnet_1","wasm","LINE_COMMENT","FUNCTION_REFERENCE","ARGUMENT","PARENS","MATH_OPERATIONS","wasm_1","require$$0","require$$1","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","common","SUPPORTED_EXTS","isSupported","onModelError","typeTile","_component_model_viewer","EPUB_STEP_TIMEOUT_MS","containerRef","toc","fontSize","book","rendition","withTimeout","Epub","fetchOk","fetchViewerArrayBuffer","fetchViewerText","surface","scale","tx","dragging","dragStart","renderToken","cachedMermaid","ensureMermaid","myToken","svgEl","onWheel","factor","onPointerDown","onPointerMove","onPointerUp","_vShow","drawioBase","pendingXml","loadXml","bootIfReady","canvasEl","pageIndex","pageCount","pageDims","UTIF","ifds","ensureUtif","lib","paint","ifd","rgba","canvas","imageData","pageLabel","layers","dims","agPsd","ensureAgPsd","flattenLayers","psd","composite","cells","renderedSources","renderedMarkdown","mdRenderer","ensureMd","joinSource","nb","langOk","outputText","outputImage","outputHtml","PAGE_SIZE","ROW_LIMIT","firstRowHeader","page","detectedDelim","userDelim","detectDelimiter","sample","sampleLines","semi","comma","parseWith","delim","papaparse_min","dataRows","totalPages","visibleRows","fmtSize","totalSize","fileCount","entryTile","decodeCache","getDecodeCache","exclude","decode","string","b1","b2","chr","b3","b4","encodeCache","getEncodeCache","encode","keepEscaped","nextCode","format","Url","protocolPattern","portPattern","simplePathPattern","delims","unwise","autoEscape","nonHostChars","hostEndingChars","hostnameMaxLen","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","urlParse","slashesDenoteHost","lowerProto","hec","slashes","simplePath","hostEnd","atSign","ipv6Hostname","hostparts","newpart","validParts","notHost","bit","hash","Any","Cc","regex$1","P","Z","htmlDecodeTree","xmlDecodeTree","decodeMap","fromCodePoint","codePoint","output","replaceCodePoint","CharCodes","TO_LOWER_BIT","BinTrieFlags","isNumber","isHexadecimalCharacter","isAsciiAlphaNumeric","isEntityInAttributeInvalidEnd","EntityDecoderState","DecodingMode","EntityDecoder","decodeTree","emitCodePoint","errors","decodeMode","digitCount","startIdx","char","lastCp","expectedLength","valueLength","determineBranch","consumed","getDecoder","decoder","nodeIdx","branchCount","jumpOffset","mid","midVal","htmlDecoder","decodeHTML","_hasOwnProperty","object","arrayReplaceAt","newElements","isValidEntityCode","surrogate1","surrogate2","UNESCAPE_MD_RE","ENTITY_RE","UNESCAPE_ALL_RE","DIGITAL_ENTITY_TEST_RE","replaceEntityPattern","decoded","unescapeMd","unescapeAll","escaped","entity","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","escapeHtml","REGEXP_ESCAPE_RE","escapeRE","isSpace","isWhiteSpace","isPunctChar","ucmicro.P","ucmicro.S","isMdAsciiPunct","normalizeReference","mdurl","ucmicro","parseLinkLabel","disableNested","prevPos","oldPos","labelEnd","parseLinkDestination","parseLinkTitle","prev_state","default_rules","env","slf","info","langName","langAttrs","highlighted","tmpAttrs","tmpToken","Renderer","needLf","nextToken","rules","Ruler","chains","rule","altName","chain","beforeName","ruleName","afterName","ignoreInvalid","chainName","Token","nesting","attrData","StateCore","NEWLINES_RE","NULL_RE","normalize","inline","isLinkOpen","isLinkClose","linkify","blockTokens","htmlLinkLevel","currentToken","links","lastPos","fullUrl","urlText","token_o","token_t","token_c","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","replace","blkIdx","QUOTE_TEST_RE","QUOTE_RE","APOSTROPHE","replaceAt","process_inlines","thisLevel","OUTER","canOpen","canClose","isSingle","lastChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","openQuote","closeQuote","smartquotes","text_join","curr","_rules","r_normalize","r_block","r_inline","r_linkify","r_replacements","r_smartquotes","r_text_join","Core","StateBlock","indent_found","keepLastLF","lineIndent","lineStart","MAX_AUTOCOMPLETED_CELLS","getLine","escapedSplit","isEscaped","startLine","endLine","silent","nextLine","firstCh","secondCh","lineText","columns","aligns","columnCount","oldParentType","terminatorRules","token_to","tableLines","token_tho","token_htro","token_ho","token_il","tbodyLines","autocompletedCells","terminate","token_tbo","token_tro","token_tdo","fence","mem","markup","haveEndMarker","blockquote","oldLineMax","oldBMarks","oldBSCount","oldSCount","oldTShift","lastLineEmpty","isOutdented","initial","spaceAfterMarker","adjustTab","oldIndent","hr","cnt","skipBulletListMarker","skipOrderedListMarker","markTightParagraphs","tight","isTerminatingParagraph","isOrdered","markerValue","posAfterMarker","markerCharCode","listTokIdx","listLines","prevEmptyEnd","contentStart","indentAfterMarker","itemLines","oldTight","oldListIndent","reference","_endLine","getNextLine","isContinuation","lineContent","destRes","href","destEndPos","destEndLineNo","titleRes","block_names","attr_name","attr_value","open_tag","close_tag","comment","processing","declaration","cdata","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","HTML_SEQUENCES","html_block","heading","token_i","lheading","paragraph","r_table","r_code","r_fence","r_blockquote","r_hr","r_list","r_reference","r_html_block","r_heading","r_lheading","r_paragraph","ParserBlock","maxNesting","hasEmptyLines","prevLine","outTokens","StateInline","token_meta","canSplitWord","left_flanking","right_flanking","isTerminatorChar","SCHEME_RE","urlEnd","newline","pmax","ESCAPED","escapedStr","origStr","backtick","openerLength","matchEnd","matchStart","closerLength","strikethrough_tokenize","scanned","postProcess","delimiters","loneMarkers","startDelim","endDelim","strikethrough_postProcess","tokens_meta","r_strikethrough","emphasis_tokenize","isStrong","emphasis_post_process","r_emphasis","parseReference","labelStart","image","EMAIL_RE","AUTOLINK_RE","autolink","isLetter","lc","html_inline","DIGITAL_RE","NAMED_RE","processDelimiters","openersBottom","headerIdx","lastTokenIdx","jumps","closerIdx","closer","minOpenerIdx","openerIdx","newMinOpenerIdx","opener","isOddMatch","lastJump","link_pairs","fragments_join","r_text","r_newline","r_escape","r_backticks","r_link","r_image","r_autolink","r_html_inline","r_entity","_rules2","r_balance_pairs","r_fragments_join","ParserInline","reFactory","text_separators","isRegExp","defaultOptions","isOptionsObj","defaultSchemas","tlds_2ch_src_re","tlds_default","resetScanCache","createValidator","createNormalizer","compile","tlds","untpl","tpl","schemaError","compiled","slist","Match","shift","createMatch","LinkifyIt","schemas","schema","definition","ml","tld_pos","at_pos","keepOld","maxInt","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexPunycode","regexNonASCII","regexSeparators","baseMinusTMin","stringFromCharCode","length","mapDomain","domain","labels","ucs2decode","ucs2encode","codePoints","basicToDigit","digitToBasic","digit","adapt","numPoints","firstTime","inputLength","bias","oldi","baseMinusT","currentValue","basicLength","handledCPCount","handledCPCountPlusOne","qMinusT","punycode","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","RECODE_HOSTNAME_FOR","normalizeLink","mdurl.parse","mdurl.encode","mdurl.format","normalizeLinkText","mdurl.decode","MarkdownIt","presetName","utils.isString","ParserCore","utils","utils.assign","helpers","presets","missed","ParseError","underlined","right","uppercase","ESCAPE_LOOKUP","ESCAPE_REGEX","getBaseElem","characterNodesTypes","isCharacterBox","protocolFromUrl","SETTINGS_SCHEMA","color","defs","getDefaultValue","defaultType","Settings","errorCode","errorMsg","strict","trust","Style","cramped","sup","fracNum","fracDen","cramp","text$1","D","Dc","T","Tc","S","Sc","SS","SSc","Style$1","scriptData","scriptFromCodepoint","codepoint","allBlocks","supportedCodepoint","doubleBrushStroke","svgPath","hLinePad","sqrtMain","extraVinculum","sqrtSize1","sqrtSize2","sqrtSize3","sqrtSize4","phasePath","sqrtTall","viewBoxHeight","vertSegment","sqrtPath","innerPath","height","tallDelim","midHeight","DocumentFragment","frag","toText","ptPerUnit","relativeUnit","validUnit","calculateSize","sizeValue","unitOptions","makeEm","createClass","initNode","toNode","tagName","attr","invalidAttributeNameRegex","toMarkup","Span","attribute","Anchor","Img","alt","iCombinations","SymbolNode","italic","width","span","needsSpan","SvgNode","attributes","PathNode","pathName","alternate","LineNode","assertSymbolDomNode","assertSpan","hasHtmlDomChildren","fontMetricsData","sigmasAndXis","extraCharacterMap","setFontMetrics","fontName","metrics","getCharacterMetrics","character","font","fontMetricsBySizeIndex","getGlobalMetrics","sizeIndex","ATOMS","NON_ATOMS","symbols","defineSymbol","acceptUnicodeChar","math","main","ams","accent","bin","inner","mathord","punct","spacing","textord","ligatures","mathTextSymbols","textSymbols","_ch","letters","_i2","_ch2","wideChar","_i3","_ch3","_i4","_ch4","extraLatin","_i5","_ch5","wideLatinLetterData","wideNumeralData","wideCharacterFont","H","lookupSymbol","makeSymbol","symbolNode","mathsym","boldsymbol","makeOrd","isFont","fontOrFamily","wideFontName","wideFontClass","fontClasses","fontData","fontMap","retrieveTextFontName","makeFragment","_fontName","_fontName2","_fontName3","canCombine","tryCombineChars","chars","sizeElementFromChildren","elem","maxFontSize","makeSpan","makeSvgSpan","makeLineSpan","thickness","makeAnchor","fragment","wrapFragment","getVListChildrenAndDepth","_depth","currPos","bottom","firstChild","makeVList","pstrutSize","pstrut","realChildren","minPos","maxPos","_child","_elem","childWrap","vlist","emptySpan","depthStrut","topStrut","vtable","makeGlue","measurement","fontFamily","fontWeight","fontShape","baseFontName","fontStylesName","svgData","staticSvg","svgNode","thinspace","mediumspace","thickspace","spacings","tightSpacings","_functions","_htmlGroupBuilders","_mathmlGroupBuilders","defineFunction","_ref","htmlBuilder","mathmlBuilder","defineFunctionBuilders","_ref2","normalizeArgument","ordargument","binLeftCanceller","binRightCanceller","styleMap$1","DomEnum","buildExpression$1","expression","isRealGroup","surrounding","buildGroup$1","glueOptions","dummyPrev","dummyNext","_traverseNonSpaceNodes","prevType","_tightSpacings$prevTy","_spacings$prevType","getTypeOfDomTree","space","partialGroup","checkPartialGroup","nonspace","_getOutermostNode","makeNullDelimiter","moreClasses","baseOptions","groupNode","multiplier","buildHTMLUnbreakable","strut","buildHTML","tree","eqnNum","nobreak","tagChild","htmlNode","newDocumentFragment","MathNode","TextNode","SpaceNode","noVariantSymbols","rowLikeTypes","makeText","makeRow","getVariant","isNumberPunctuation","buildExpression","isOrdgroup","buildGroup","lastGroup","_group","lastChild","buildExpressionRow","buildMathML","texExpression","isDisplayMode","forMathmlOnly","annotation","semantics","wrapperClass","sizeStyleMap","sizeMultipliers","sizeAtStyle","Options","wantSize","oldOptions","optionsFromSettings","settings","displayWrap","buildTree","katexNode","mathMLNode","_htmlNode","buildHTMLTree","stretchyCodePoint","stretchyMathML","katexImagesData","wideAccentLabels","stretchySvg","buildSvgSpan_","viewBoxWidth","grp","numChars","_height","imgIndex","spans","_minWidth","_viewBoxHeight","_height2","numSvgChildren","widthClasses","align1","_path","_svgNode","_span","minWidth","stretchyEnclose","topPad","bottomPad","img","totalHeight","assertNodeType","assertSymbolNodeType","typedNode","checkSymbolNodeType","getBaseSymbol","htmlBuilder$a","supSubGroup","mustShift","_getBaseSymbol$skew","_getBaseSymbol","accentBelow","clearance","accentBody","accentFull","accentWrap","mathmlBuilder$9","accentNode","NON_STRETCHY_ACCENT_REGEX","isStretchy","isShifty","parser","funcName","innerGroup","kern","paddedNode","optArgs","newOptions","upperGroup","arrowPrefix","lowerGroup","arrowBody","arrowShift","upperShift","lowerShift","arrowNode","upperNode","lowerNode","_lowerNode","htmlBuilder$9","elements","mathmlBuilder$8","binrelClass","atom","_ref3","baseArg","shiftedArg","mclass","baseOp","supsub","cdArrowFunctionName","newCell","isStartOfArrow","isLabelEnd","endChar","cdArrow","arrowChar","leftLabel","bareArrow","sizedArrow","rightLabel","arrowGroup","arrow","parseCD","parsedRows","rowNodes","labelNum","inLabel","wrappedArrow","htmlBuilder$8","mathmlBuilder$7","breakOnTokenText","newLine","globalMap","checkControlSequence","getRHS","letCommand","macro","numArgs","_ref4","getMetrics","symbol","styleWrap","toStyle","delimSizeMultiplier","centerSpan","makeSmallDelim","center","mathrmSize","makeLargeDelim","makeGlyphSpan","sizeClass","corner","makeInner","lapInEms","lap","verts","doubleVerts","makeStackedDelim","heightTotal","repeat","svgLabel","topMetrics","topHeightTotal","repeatMetrics","repeatHeightTotal","bottomMetrics","bottomHeightTotal","middleHeightTotal","middleFactor","middleMetrics","minHeight","repeatCount","realHeightTotal","axisHeight","pathStr","innerHeight","_innerHeight","vbPad","emPad","sqrtSvg","sqrtName","pathNode","makeSqrtImage","traverseSequence","stackLargeDelimiterSequence","sizeMultiplier","spanHeight","texHeight","advanceWidth","sizeToMaxHeight","stackLargeDelimiters","stackAlwaysDelimiters","stackNeverDelimiters","makeSizedDelim","stackNeverDelimiterSequence","stackAlwaysDelimiterSequence","delimTypeToFont","delimKind","sequence","delimType","heightDepth","makeCustomSizedDelim","makeLeftRightDelim","delimiterFactor","delimiterExtend","maxDistFromAxis","delimiterSizes","checkDelimiter","symDelim","assertParsed","innerDepth","hadMiddle","leftDelim","middleDelim","isMiddle","rightDelim","colorOptions","leftNode","rightNode","textNode","middleNode","htmlBuilder$7","imgShift","isSingleChar","lineWeight","angleHeight","ruleThickness","mathmlBuilder$6","fboxsep","thk","borderColor","backgroundColor","_ref5","_ref6","_environments","defineEnvironment","_macros","defineMacro","SourceLocation","lexer","second","endToken","getHLines","hlineInfo","nxt","validateAmsEnvironmentContext","gatherEnvironments","getAutoTag","parseArray","hskipBeforeAndAfter","addJot","arraystretch","colSeparationType","autoTag","singleRow","emptySingleRow","maxNumCols","leqno","stretch","rowGaps","hLinesBeforeRow","beginRow","endRow","cellBody","dCellStyle","envName","htmlBuilder$6","nr","nc","hlines","arraycolsep","localMultiplier","baselineskip","jot","arrayskip","arstrutHeight","arstrutDepth","setHLinePos","hlinesInGap","inrow","outrow","elt","rowGap","colDescriptions","colSep","colDescrNum","tagSpans","rw","tagSpan","_colDescr3","colDescr","firstSeparator","_colDescr","lineType","_shift","sepwidth","_colDescr$pregap","_colDescr2","colElems","_shift2","colVList","colSpan","_colDescr$postgap","_colDescr4","tableBody","dashes","vListElems","hline","lineShift","eqnNumCol","tagCol","alignMap","mathmlBuilder$5","tbl","glue","menclose","align","columnLines","prevTypeWasAlign","iStart","iEnd","col","_cols","rowLines","alignedHandler","separationType","isSplit","numMaths","numCols","emptyGroup","arg0","isAligned","styling","ordgroup","curMaths","pregap","symNode","colalign","nde","colAlign","environments","nameGroup","_args","endNameToken","htmlBuilder$5","mathmlBuilder$4","fontAliases","func","htmlBuilder$4","nstyle","dstyle","numerm","hStrut","dStrut","denomm","ruleWidth","ruleSpacing","numShift","denomShift","midShift","candidateClearance","delimSize","mathmlBuilder$3","withDelims","leftOp","rightOp","wrapWithStyle","numer","denom","hasBarLine","continued","replaceWith","stylArray","delimFromValue","delimString","barNode","barSize","styl","textOrd","htmlBuilder$3","braceBody","vSpan","mathmlBuilder$2","trustContext","firstEquals","_value","sizeData","totalheight","attributeStr","keyVal","mathFunction","muUnit","dimension","fix","outerMode","chooseMathStyle","assembleSupSub","supGroup","subGroup","slant","baseShift","subIsSingleCharacter","finalGroup","_bottom","spacer","noSuccessor","htmlBuilder$2","hasLimits","large","stash","oval","mathmlBuilder$1","singleCharBigOps","singleCharIntegrals","htmlBuilder$1","childText","isAllString","defaultRuleThickness","phantom","amount","dy","sizingGroup","sizeFuncs","smashHeight","smashDepth","tbArg","letter","smashedNode","theta","phi","lineClearance","minDelimiterHeight","delimDepth","rootm","toShift","rootVList","rootVListWrap","styleMap","newStyle","styleAttributes","htmlBuilderDelegate","delegate","_delegate","isSup","builderDelegate","valueBase","valueSup","valueSub","supm","subm","supShift","subShift","isCharBox","_newOptions","minSupShift","marginRight","marginLeft","isOiint","maxWidth","psi","vlistElem","_vlistElem","isBrace","isOver","nodeType","_base2","_base","defaultVariant","cssSpace","regularSpace","ord","padNode","textFontFamilies","textFontWeights","textFontShapes","optionsWithFont","mpadded","makeVerb","functions","spaceRegexString","controlWordRegexString","controlSymbolRegexString","controlWordWhitespaceRegexString","controlSpaceRegexString","combiningDiacriticalMarkString","combiningDiacriticalMarksEndRegex","tokenRegexString","Lexer","nlIndex","Namespace","builtins","globalMacros","undefs","undef","macros","digitToNumber","newcommand","existsOK","nonexistsOK","skipIfExists","exists","argText","dotsByToken","dotsbGroups","thedots","spaceAfterDots","latexRaiseA","braketHelper","middleDouble","oldMiddle","oldMiddleDouble","midMacro","double","doubled","implicitCommands","MacroExpander","isOptional","isDelimited","expandableOnly","topToken","expansion","oldStackLength","catcode","stripped","bodyLexer","unicodeSubRegEx","uSubsAndSups","unicodeAccents","unicodeSymbols","Parser","consume","parse","oldToken","breakOnInfix","lex","numerNode","denomNode","numerBody","denomBody","_node","symbolToken","textordArray","colorNode","superscript","subscript","prime","primes","isSub","subsupTokens","funcData","totalArgs","argType","_group2","modeName","argToken","firstToken","lastToken","isBlank","groupEnd","afterNext","nucleus","star","command","toParse","baseNode","renderToDomTree","renderToString","generateParseTree","renderError","renderToHTMLTree","__domTree","TYPED_OK","_has","fnTyped","src_offs","dest_offs","chunk","fnUntyped","Z_FIXED","Z_BINARY","Z_TEXT","Z_UNKNOWN","zero","STORED_BLOCK","STATIC_TREES","DYN_TREES","MIN_MATCH","MAX_MATCH","LENGTH_CODES","L_CODES","D_CODES","BL_CODES","HEAP_SIZE","MAX_BITS","Buf_size","MAX_BL_BITS","END_BLOCK","REP_3_6","REPZ_3_10","REPZ_11_138","extra_lbits","extra_dbits","extra_blbits","bl_order","DIST_CODE_LEN","static_ltree","static_dtree","_dist_code","_length_code","base_length","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","static_l_desc","static_d_desc","static_bl_desc","TreeDesc","dyn_tree","stat_desc","d_code","dist","put_short","send_bits","send_code","bi_reverse","bi_flush","gen_bitlen","max_code","stree","has_stree","xbits","overflow","gen_codes","bl_count","next_code","tr_static_init","init_block","bi_windup","copy_block","header","smaller","_n2","_m2","pqdownheap","compress_block","ltree","dtree","lx","build_tree","scan_tree","prevlen","curlen","nextlen","max_count","min_count","send_tree","build_bl_tree","max_blindex","send_all_trees","lcodes","dcodes","blcodes","rank","detect_data_type","black_mask","static_init_done","_tr_init","_tr_stored_block","stored_len","_tr_align","_tr_flush_block","opt_lenb","static_lenb","_tr_tally","trees","adler32","adler","adler32_1","makeTable","crcTable","crc32","crc","crc32_1","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_OK","Z_STREAM_END","Z_STREAM_ERROR","Z_DATA_ERROR","Z_BUF_ERROR","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_DEFAULT_STRATEGY","Z_DEFLATED","MAX_MEM_LEVEL","MAX_WBITS","DEF_MEM_LEVEL","MIN_LOOKAHEAD","PRESET_DICT","INIT_STATE","EXTRA_STATE","NAME_STATE","COMMENT_STATE","HCRC_STATE","BUSY_STATE","FINISH_STATE","BS_NEED_MORE","BS_BLOCK_DONE","BS_FINISH_STARTED","BS_FINISH_DONE","OS_CODE","strm","flush_pending","flush_block_only","put_byte","putShortMSB","read_buf","longest_match","cur_match","chain_length","scan","best_len","nice_match","_win","wmask","strend","scan_end1","scan_end","fill_window","_w_size","more","deflate_stored","max_block_size","max_start","deflate_fast","hash_head","bflush","deflate_slow","max_insert","deflate_rle","deflate_huff","Config","good_length","max_lazy","nice_length","max_chain","configuration_table","lm_init","DeflateState","deflateResetKeep","deflateReset","deflateSetHeader","deflateInit2","windowBits","memLevel","strategy","deflateInit","deflate","old_flush","beg","level_flags","bstate","deflateEnd","deflateSetDictionary","dictionary","dictLength","tmpDict","deflate_1","STR_APPLY_OK","STR_APPLY_UIA_OK","_utf8len","strings","m_pos","str_len","buf_len","buf2binstring","c_len","utf16buf","ZStream","zstream","zlib_deflate","toString","Z_SYNC_FLUSH","Deflate","dict","_mode","deflator","deflateRaw","gzip","BAD","inffast","_in","_out","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","from_source","dolen","dodist","MAXBITS","ENOUGH_LENS","ENOUGH_DISTS","CODES","LENS","DISTS","lbase","lext","dbase","dext","inftrees","lens","lens_index","codes","table_index","work","sym","huff","incr","fill","low","mask","base_index","offs","extra_index","here_bits","here_op","here_val","inflate_fast","inflate_table","Z_TREES","Z_NEED_DICT","Z_MEM_ERROR","HEAD","FLAGS","TIME","OS","EXLEN","EXTRA","NAME","HCRC","DICTID","DICT","TYPEDO","STORED","COPY_","COPY","TABLE","LENLENS","CODELENS","LEN_","LEN","LENEXT","DIST","DISTEXT","MATCH","LIT","CHECK","LENGTH","DONE","MEM","SYNC","DEF_WBITS","zswap32","InflateState","inflateResetKeep","inflateReset","inflateReset2","inflateInit2","inflateInit","virgin","lenfix","distfix","fixedtables","updatewindow","inflate","put","have","last_bits","last_op","last_val","hbuf","inf_leave","inflateEnd","inflateGetHeader","inflateSetDictionary","dictid","inflate_1","constants","GZheader","gzheader","zlib_inflate","Inflate","next_out_utf8","utf8str","allowBufError","inflator","inflateRaw","pako","pako_1","module","require","log","V","B","X","z","C","J","A","E","Q","K","F","M","I","R","G","O","U","N","Y","metadata","idf","prfx","ifdo","noffs","buff","noff","cmpr","fo","bipp","bipl","soff","bcnt","bilen","tw","tbuff","rps","tgt","toff","bps","noc","bpp","bpl","roff","ntoff","nv","prm","getbithuff","inp","src_length","raw_width","tiff_bps","arw2","ljpeg_diff","lim","clr","b0","pix","imax","imin","sh","dp","imgs","nikon_tree","make_decoder","mn","mdo","ver0","ver1","vpred","csize","shl","hpred","bti","nbits","zero_after_ff","bitbuf","vbits","tables","tlen","SOI","EOI","boff","byte1","byte2","olen","rst","DQT","DHT","DRI","SOF0","SOS","joff","sosMarker","isTiled","jpgIchgFmt","jifoff","jpgIchgFmtLen","jiflen","soffTag","ycbcrss","ssx","ssy","spp","jpgresint","ooff","qtables","htables","sofpos","tmptab","tmpoff","soslen","sosoff","dlen","buffoff","jpegData","sa","d2","d3","qoff","msk","addKeys","i0","inc","termW","termB","makeW","makeB","makeA","lensW","lensB","slen","wrd","pline","a0","a1","toRead","dl","is1D","tn","tln","totl","chrl","ClearCode","EoiCode","Code","OldCode","cd","cl","nit","nil","so","debug","voff","o0","oarr","subfd","subsub","eoff","ki","area","qarea","intp","qi","smpls","ti","mi","gotAlpha","sufs","suff","vsns","ma","ind","cnv","imgd","xoff","yoff","xlim","ylim","tof","sof","$","Z_FIXED$1","Z_UNKNOWN$1","zero$1","MIN_MATCH$1","MAX_MATCH$1","LENGTH_CODES$1","LITERALS$1","L_CODES$1","D_CODES$1","BL_CODES$1","HEAP_SIZE$1","MAX_BITS$1","sx","block_mask","_tr_init$1","_tr_stored_block$1","_tr_align$1","_tr_flush_block$1","_tr_tally$1","_tr_init_1","_tr_stored_block_1","_tr_flush_block_1","_tr_tally_1","_tr_align_1","constants$2","Z_NO_FLUSH$2","Z_FULL_FLUSH$1","Z_FINISH$3","Z_BLOCK$1","Z_OK$3","Z_STREAM_END$3","Z_STREAM_ERROR$2","Z_DATA_ERROR$2","Z_BUF_ERROR$1","Z_DEFAULT_COMPRESSION$1","Z_DEFAULT_STRATEGY$1","Z_DEFLATED$2","MAX_WBITS$1","GZIP_STATE","slide_hash","HASH","min_block","deflateStateCheck","deflate$2","gzhead_extra","deflateInit_1","deflateInit2_1","deflateReset_1","deflateResetKeep_1","deflateSetHeader_1","deflate_2$1","deflateEnd_1","deflateSetDictionary_1","deflateInfo","deflate_1$2","flattenChunks","string2buf","buf2string","utf8border","toString$1","Z_NO_FLUSH$1","Z_FINISH$2","Z_OK$2","Z_STREAM_END$2","Z_DEFLATED$1","Deflate$1","flush_mode","_flush_mode","deflate$1","deflate_2","deflate_1$1","BAD$1","TYPE$1","ENOUGH_LENS$1","ENOUGH_DISTS$1","CODES$1","LENS$1","DISTS$1","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","inflateStateCheck","inflate$2","inflateReset_1","inflateReset2_1","inflateResetKeep_1","inflateInit_1","inflateInit2_1","inflate_2$1","inflateEnd_1","inflateGetHeader_1","inflateSetDictionary_1","inflateInfo","inflate_1$2","Inflate$1","last_avail_out","inflate$1","inflate_2","inflate_1$1","dctZigZag","dctCos1","dctSin1","dctCos3","dctSin3","dctCos6","dctSin6","dctSqrt2","dctSqrt1d2","maxResolutionInMP","maxMemoryUsageBytes","totalBytesAllocated","requestMemoryAllocation","increaseAmount","totalMemoryImpactBytes","exceededAmount","buildHuffmanTable","codeLengths","decodeScan","resetInterval","spectralStart","spectralEnd","successivePrev","successive","mcusPerLine","progressive","startOffset","bitsData","bitsCount","readBit","nextByte","decodeHuffman","receive","receiveAndExtend","decodeBaseline","zz","rs","decodeDCFirst","decodeDCSuccessive","_component","eobrun","decodeACFirst","successiveACState","successiveACNextValue","decodeACSuccessive","direction","decodeMcu","mcu","mcuRow","mcuCol","blockRow","blockCol","decodeBlock","componentsLength","decodeFn","mcuExpected","buildComponentData","blocksPerLine","blocksPerColumn","samplesPerLine","quantizeAndInverse","dataOut","dataIn","qt","t_1","v0","v1","v2","v3","v4","v7","v5","v6","t_2","scanLine","clampTo8bit","maxResolutionInPixels","readUint16","readDataBlock","prepareComponents","maxH","maxV","componentId","mcusPerColumn","blocksPerLineForMcu","blocksPerColumnForMcu","blocksToAllocate","jfif","adobe","quantizationTables","frames","huffmanTablesAC","huffmanTablesDC","fileMarker","malformedDataOffset","appData","ii","quantizationTablesLength","quantizationTablesEnd","quantizationTableSpec","tableData","pixelsInFrame","componentsCount","qId","huffmanLength","huffmanTableSpec","codeLengthSum","huffmanValues","selectorsCount","tableSpec","successiveApproximation","nextOffset","cp","getData","colorTransform","dataLength","component1","component1Line","component2","component2Line","Y1","Y2","component3","component3Line","Cb","Cr","component4","component4Line","Ye","decodeJpeg","createImageData","imageDataArray","RAW_IMAGE_DATA","fromBlendMode","toBlendMode","layerColors","largeAdditionalInfoKeys","revMap","createEnum","rev","ColorSpace","LayerMaskFlags","MaskParams","offsetForChannel","channelId","cmyk","clamp","hasAlpha","resetImageData","alpha","imageDataToCanvas","pixelData","createCanvas","dst","decodeBitmap","writeDataRLE","buffer","offsets","stride","ol","offsets_1","strideStart","strideEnd","lastIndex2","value1","value2","value3","countIndex","writeLast","length_1","writeDataZipWithoutPrediction","channel","buffers","totalLength","offsets_2","deflateSync","buffers_1","createCanvasFromData","context_1","tempCanvas","initializeCanvas","createCanvasMethod","createImageDataMethod","toByteArray_1","toByteArray","fromByteArray_1","fromByteArray","revLookup","Arr","getLens","validLen","placeHoldersLen","_byteLength","curByte","tripletToBase64","encodeChunk","uint8","extraBytes","maxChunkLength","len2","charLengthInBytes","stringLengthInBytes","writeCharacter","encodeStringTo","fullCode","encodeString","continuationByte","decodeString","byte3","byte4","__assign","__rest","unitsMap","unitsMapRev","makeType","classID","nullType","fieldToExtType","fieldToArrayExtType","typeToField","channels","fieldToArrayType","fieldToType","field","getTypeByKey","readAsciiStringOrClassId","readInt32","readAsciiString","writeAsciiStringOrClassId","writer","writeInt32","writeSignature","writeUint8","readDescriptorStructure","includeClass","struct","readClassStructure","itemsCount","readUint32","readSignature","readOSType","writeDescriptorStructure","classId","writeUnicodeStringWithPadding","keyCount","writeUint32","keys_1","extType","writeOSType","readReferenceStructure","itemType","readFloat64","readFloat32","readUnicodeString","enumType","high","readUint8","length_2","length_3","readBytes","length_4","type1","valuesCount","readInt32LE","charsCount","readUnicodeStringWithLengthLE","ObArTypes","writeReferenceStructure","name_1","type_1","writeFloat64","writeFloat32","_type","writeBytes","type_2","length_5","writeInt32LE","writeUnicodeStringWithoutLengthLE","keyID","typeID","enumValue","writeClassStructure","writeUnicodeString","readVersionAndDescriptor","writeVersionAndDescriptor","horzVrtcToXY","hv","xyToHorzVrtc","xy","descBoundsToBounds","parseUnits","boundsToDescBounds","bounds","unitsValue","parseFxObject","fx","stroke","FStl","FrFl","BlnM","parsePercent","parseColor","parseGradientContent","parsePatternContent","serializeFxObject","FrFX","unitsPercent","serializeColor","serializeGradientContent","serializePatternContent","serializeEffects","unitsPercentF","arrayKeys","arrayKeys_1","useMulti","useSingle","serializeEffectObject","value_1","parseEffects","effects","masterFXSwitch","DrSh","dropShadowMulti","IrSh","innerShadowMulti","OrGl","IrGl","ebbl","SoFi","solidFillMulti","patternFill","GrFl","gradientFillMulti","ChFX","frameFXMulti","parseEffectObject","parseKeyList","keyList","logMissingFeatures","denominator","numerator","animKey","time","animInterpStyleEnum","key_1","serializeKeyList","animInterpStyle","parseTrackList","trackList","tracks","stdTrackID","serializeTrackList","reportErrors","BESl","BESs","bvlT","BETE","IGSr","GrdT","gradientInterpolationMethodType","parseAngle","parseGradient","objName","objKey","unitsAngle","serializeGradient","grad","samples_1","ClrS","samples_2","parseVectorContent","serializeVectorContent","parsePercentOrAngle","parseUnitsOrNumber","parseUnitsToNumber","expectedUnits","textGridding","Ornt","Annt","warpStyle","ESliceType","ESliceHorzAlign","ESliceVertAlign","ESliceOrigin","ESliceBGColorType","strokeStyleLineCapType","strokeStyleLineJoinType","strokeStyleLineAlignment","BlrM","BlrQ","SmBM","SmBQ","DspM","UndA","Cnvr","RplS","SphM","Wvtp","ZZTy","Dstr","Chnl","MztT","Lns","blurType","DfsM","ExtT","ExtR","FlCl","CntE","WndM","Drct","IntE","IntC","FlMd","presetKindType","resourceHandlers","resourceHandlersMap","addHandler","RESOLUTION_UNITS","MEASUREMENT_UNITS","hex","charToNibble","byteAt","readUtf8String","writeUtf8String","readEncodedString","notAscii","writeEncodedString","ascii","captionDigest","byte","Inte","horizontalResolution","readFixedPoint32","horizontalResolutionUnit","widthUnit","verticalResolution","verticalResolutionUnit","heightUnit","writeFixedPoint32","writeUint16","printScaleStyles","readInt16","writeInt16","skipBytes","name_2","readColor","writeColor","flags","writeAsciiString","horizontal","vertical","grid","guides","guides_1","layerComps","onionSkinsBlendModes","onionSkins","clipID","timeScope","muted","audioLevel","frameReader","timeline","disclosure","long","boundsToBounds","boundsFromBounds","clamped","sliceOrigins","sliceTypes","sliceAlignments","top_1","groupName","slices_1","groupId","origin_1","associatedLayerId","name_3","left_1","top_2","right_1","bottom_1","target_1","altTag","cellTextIsHTML","horizontalAlignment","verticalAlignment","backgroundColorType","slice","slices","bitsPerPixel","planes","dataUrl","widthBytes","sizeAfterCompression","versionInfo","_left","FrmD","checkSignature","readSection","_loop_1","writeSection","anim","supportedColorModes","colorModes","setupGrayscale","createReader","warnOrThrow","peekUint8","readUint16LE","readFixedPointPath32","readShortString","validSignatureAt","readPascalString","padTo","readUnicodeStringWithLength","signature","isValidSignature","readPsd","readOptions","bitsPerChannel","colorMode","maxSize","imageResources","realignWithSignature","readLayerInfo","globalLayerMaskInfo","readGlobalLayerMaskInfo","readAdditionalLayerInfo","hasChildren","skipComposite","readImageData","layersGroup","layerGroupsEnabledId","layerCount","layerChannels","readLayerRecord","layer","readLayerChannelImageData","channelCount","blendMode","readLayerMaskData","blendingRanges","readLayerBlendingRanges","realMask","realFlags","readBlendingRange","compositeGrayBlendSource","compositeGraphBlendDestinationRange","ranges","sourceRange","destRange","channels_1","compression","decodeLayerImageData","resetAlpha","useImageData","throwForMissingFeatures","layerWidth","layerHeight","initializedAlpha","createImageDataBitDepth","channels_2","dataReader","maskWidth","maskHeight","maskData","readData","targetData","cmykData","cmykToRgb","pixels","bitDepth","readDataRaw","readDataRLE","readDataZip","overlayColorSpace","colorSpace1","colorSpace2","colorSpace3","colorSpace4","opacity","fixOffsets","isValid","sigOffset","fixOffsets_1","isValidAdditionalInfoSignature","u64","infoHandlersMap","indexedImageData","indexedToRgb","cmykImageData","pa","ra","invA","rgb","reverseAlpha","srcData","dstData","indexed","verifyCompatible","bytesToArray","copyChannelToPixelData","decodePredicted","compressed","prediction","decompressed","inflateSync","di","_bitDepth","lengths","extraLimit","round","skipEmpty","eightBytes","colorSpace","readPattern","version2","channelsCount","pixelDepth","ctop","cleft","cbottom","cright","pixelDepth2","compressionMode","ox","y_1","x_1","y_2","x_2","tempData","cdataReader","copyChannelToRGBA","bevelStyles","readBlendMode","writeBlendMode","readFixedPoint8","writeFixedPoint8","readEffects","effectsCount","version_1","blockSize","version_2","angle","distance","useGlobalLight","shadowInfo","version_3","version_4","version_5","strength","highlightBlendMode","shadowBlendMode","highlightColor","shadowColor","highlightOpacity","shadowOpacity","version_6","writeShadowInfo","shadow","writeEffects","dropShadow","innerShadow","outerGlow","innerGlow","bevel","solidFill","writeZeros","isWhitespace","parseEngineData","skipWhitespace","getTextByte","getText","pushContainer","pushValue","pop","pushProperty","i_1","floatKeys","intArrays","serializeEngineData","condensed","newBuffer","writeString","writeIndent","writeProperty","writeValue","serializeInt","serializeFloat","serializeNumber","isFloat","getKeys","writeStringByte","inProperty","writePrefix","intArray","value_2","defaultFont","defaultParagraphStyle","defaultStyle","defaultGridInfo","paragraphStyleKeys","styleKeys","antialias","justification","upperFirst","decodeColor","encodeColor","arraysEqual","objectsEqual","findOrAddFont","fonts","decodeObject","Key","encodeObject","keys_2","decodeParagraphStyle","decodeStyle","encodeParagraphStyle","encodeStyle","deduplicateValues","identical","styleValue","runs_1","same","keys_3","decodeEngineData","engineData","engineDict","resourceDict","removedCharacters","photoshop","paragraphRun","run_1","styleRun","encodeEngineData","defFont","paragraphRunArray","paragraphRunLengthArray","paragraphRuns","leftLength_1","paragraphRuns_1","run_2","runLength","styleSheetData","styleRuns","styleRunArray","styleRunLengthArray","leftLength","styleRuns_1","run_3","gridInfo","WritingDirection","Procession","ShapeType","Photoshop","defaultResources","keysColor","keysStyleSheet","keysParagraph","keysStyleSheetData","keysRoot","decodeObj","decodeEngineData2","fromAtoZ","infoHandlers","addHandlerAlias","hasKey","readLength64","writeLength64","leftBytes","transform","warp","textData","textDescriptor","encodeWarp","readBezierKnot","y0","x0","y1","x1","y2","x2","writeBezierKnot","points","writeFixedPointPath32","booleanOperations","readVectorMask","vectorMask","boolOp","resolution","linkedKnot","unlinkedKnot","linked","rectRadii","corners","trnf","orig","radii","hasMultiEffects","_psd","propagate","animationFrames","animationFrameFlags","timestamp","comps","artboard","placedLayerTypes","parseWarp","envelopeWarp","xs","ys","isQuiltWarp","isQuilt","desc2","customEnvelopeWarp","meshPoints","pageNumber","placedLayerType","warpVersion","placed","writePascalString","getWarpFromPlacedLayer","uint8ToFloat32","uint8ToUint32","toUint8","arrayToPoints","pointsToArray","uint8ToPoints","hrznVrtcToPoint","pointToHrznVrtc","point","parseFilterFXItem","parameters","Flrt","parseFilterFX","uvRadius","serializeFilterFXItem","suffix","indices","x3","y3","quiltWarp","_target","_writer","userMask","readRect","writeRect","major","minor","annotations","open_1","iconLocation","popupLocation","author","annotations_1","sound","lengthOffset","contentOffset","dataOffset","createLnkHandler","fileType","fileCreator","dataSize","hasFileOpenDescriptor","fileOpenDescriptor","linkedFileDescriptor","year","month","hour","minute","seconds","wholeSeconds","fileSize","sizeOffset","adjustmentType","readLevelsChannel","shadowInput","highlightInput","shadowOutput","highlightOutput","midtoneInput","writeLevelsChannel","defaultChannel","readCurveChannel","writeCurveChannel","channel_1","red","green","blue","readHueChannel","writeHueChannel","readColorBalance","writeColorBalance","readMixrChannel","constant","writeMixrChannel","adjustment","colorLookupType","LUTFormatType","colorLookupOrder","grdmColorModels","hasMethod","stopsCount","opacityStopsCount","expansionCount","colorModel","readSelectiveColors","writeSelectiveColors","getTextLayersSortedByIndex","collect","layersByIndex","engineData2","TextFrameSet","effectVersion","maxChannels","channelLength","top_3","extraLength","length2Offset","artb","cinf","createWriter","getWriterBuffer","getWriterBufferNoCopy","addSize","writeUint16LE","ensureSize","writeUnicodeStringWithoutLength","getLargestLayerSize","layers_1","getLayerDimentions","writeTotalLength","verifyBitCount","data_1","writePsd","createThumbnail","globalAlpha","maxBufferSize","addChildren","_loop_2","resourceHandlers_1","writeLayerInfo","writeGlobalLayerMaskInfo","writeAdditionalLayerInfo","layersData","getChannels","_loop_3","layerData","writeLayerMaskData","writeLayerBlendingRanges","layersData_1","layersData_2","writerBlendingRange","range","_loop_4","fourBytes","infoHandlers_1","children_1","resizeBuffer","newBytes","oldBytes","getMaskChannels","tempBuffer","background","getLayerChannels","cropImageData","croppedData","trimData","channelIds","isRowEmpty","isColEmpty","dynamicsControl","dynamicBrushShapeShapes","tipsBrushShapeShapes","toBrushType","parseDynamics","parseBrushShape","parseHeightmap","readAbr","samples","brushes","patterns","minorVersion","brushLength","brushEnd","bithDepth","brush","db","readCsh","csh","ColorMode","SectionDividerType","LayerCompCapturedInfo","ChannelID","Compression","byteArrayToBase64","readPsdInternal","writePsdInternal","writePsdUint8Array","writePsdBuffer","decodeLayerPixels","this"],"mappings":"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E,EAEN,EACEA,EAAM,SAAS,KAAKE,CAAY,EAChC,MAAMC,EAAgB,CACpB,MAAO,KACX,EACQC,EAAc,CAClB,UAAW,SACX,MAAO,IACP,IAAK,GACT,EACQC,EAAe,CACnB,MAAO,KACX,EACQC,EAAa,CACjB,MAAO,UACP,IAAK,OACL,SAAU,CACR,CACE,MAAO,gBACP,UAAW,UAEbp5C,EAAK,YACL44C,EAEN,EACQS,EAAiB,CACrB,OACA,OACA,MACA,KACA,MACA,MACA,OACA,OACA,MACJ,EACQC,EAAgBt5C,EAAK,QAAQ,CACjC,OAAQ,IAAIq5C,EAAe,KAAK,GAAG,CAAC,IACpC,UAAW,EACf,CAAG,EACKE,EAAW,CACf,UAAW,WACX,MAAO,4BACP,YAAa,GACb,SAAU,CAAEv5C,EAAK,QAAQA,EAAK,WAAY,CAAE,MAAO,YAAY,CAAE,CAAC,EAClE,UAAW,CACf,EAEQ9kB,EAAW,CACf,KACA,OACA,OACA,OACA,KACA,OACA,MACA,QACA,QACA,KACA,KACA,OACA,OACA,OACA,SACA,WACA,QACJ,EAEQs+D,EAAW,CACf,OACA,OACJ,EAGQC,EAAY,CAAE,MAAO,gBAAgB,EAGrCC,EAAkB,CACtB,QACA,KACA,WACA,OACA,OACA,OACA,SACA,UACA,OACA,MACA,WACA,SACA,QACA,OACA,QACA,OACA,QACA,OACJ,EAEQC,EAAiB,CACrB,QACA,OACA,UACA,SACA,UACA,UACA,OACA,SACA,OACA,MACA,QACA,SACA,UACA,SACA,OACA,YACA,SACA,OACA,OACA,UACA,SACA,SACJ,EAEQC,EAAgB,CACpB,WACA,KACA,UACA,MACA,MACA,QACA,QACA,gBACA,WACA,UACA,eACA,YACA,aACA,YACA,WACA,UACA,aACA,OACA,UACA,SACA,SACA,SACA,UACA,KACA,KACA,QACA,YACA,SACA,QACA,UACA,UACA,OACA,OACA,QACA,MACA,SACA,OACA,QACA,QACA,SACA,SACA,QACA,SACA,SACA,OACA,UACA,SACA,aACA,SACA,UACA,WACA,QACA,OACA,SACA,QACA,QACA,WACA,UACA,OACA,MACA,WACA,aACA,QACA,OACA,cACA,UACA,SACA,MACJ,EAEQC,EAAiB,CACrB,QACA,QACA,QACA,QACA,KACA,KACA,KACA,MACA,YACA,KACA,KACA,QACA,SACA,QACA,SACA,KACA,WACA,KACA,QACA,QACA,OACA,QACA,WACA,OACA,QACA,SACA,SACA,MACA,QACA,OACA,SACA,MACA,SACA,MACA,OACA,OACA,OACA,SACA,KACA,SACA,KACA,QACA,MACA,KACA,UACA,YACA,YACA,YACA,YACA,OACA,OACA,QACA,MACA,MACA,OACA,KACA,QACA,WACA,OACA,KACA,OACA,WACA,SACA,OACA,UACA,KACA,OACA,MACA,OACA,SAEA,SACA,SACA,KACA,OACA,UACA,OACA,QACA,QACA,UACA,QACA,WACA,SACA,MACA,WACA,SACA,MACA,QACA,OACA,SACA,OACA,MACA,OACA,UAEA,MACA,QACA,SACA,SACA,QACA,MACA,SACA,KACJ,EAEE,MAAO,CACL,KAAM,OACN,QAAS,CACP,KACA,OAEF,SAAU,CACR,SAAU,wBACV,QAAS3+D,EACT,QAASs+D,EACT,SAAU,CACR,GAAGE,EACH,GAAGC,EAEH,MACA,QACA,GAAGC,EACH,GAAGC,IAGP,SAAU,CACRP,EACAt5C,EAAK,QAAO,EACZu5C,EACAH,EACA9K,EACAyK,EACAU,EACAT,EACAC,EACAC,EACAC,EACAP,EAEN,CACA,CAEA,OAAAkB,GAAiBnB,mDCjZjB,SAASvqI,EAAE4xF,EAAM,CACf,MAAMwtC,EAAQxtC,EAAK,MAIb0uC,EAAsB1uC,EAAK,QAAQ,KAAM,IAAK,CAAE,SAAU,CAAE,CAAE,MAAO,MAAM,CAAE,CAAE,CAAE,EACjF+5C,EAAmB,qBACnBC,EAAe,kBAEfC,EAAmB,IACrBF,EAAmB,IACnBvM,EAAM,SAASwM,CAAY,EAC3B,gBAAkBxM,EAAM,SAJC,UAI4B,EACvD,IAGI0M,EAAQ,CACZ,UAAW,OACX,SAAU,CACR,CAAE,MAAO,oBAAoB,EAC7B,CAAE,MAAO,uBAAuB,EAGtC,EAKQC,EAAU,CACd,UAAW,SACX,SAAU,CACR,CACE,MAAO,cACP,IAAK,IACL,QAAS,MACT,SAAU,CAAEn6C,EAAK,gBAAgB,GAEnC,CACE,MAAO,eAXa,uDAWyB,MAC7C,IAAK,IACL,QAAS,KAEXA,EAAK,kBAAkB,CACrB,MAAO,mCACP,IAAK,qBACb,CAAO,EAEP,EAEQo6C,EAAU,CACd,UAAW,SACX,SAAU,CACR,CAAE,MAAO,cAAc,EACvB,CAAE,MAAO,iFAAiF,EAC1F,CAAE,MAAO,kHAAkH,EAC3H,CAAE,MAAO,wDAAwD,GAEnE,UAAW,CACf,EAEQC,EAAe,CACnB,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,yGACwD,EAC5D,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbr6C,EAAK,QAAQm6C,EAAS,CAAE,UAAW,QAAQ,CAAE,EAC7C,CACE,UAAW,SACX,MAAO,SAETzL,EACA1uC,EAAK,qBAEX,EAEQivC,EAAa,CACjB,UAAW,QACX,MAAOzB,EAAM,SAASwM,CAAY,EAAIh6C,EAAK,SAC3C,UAAW,CACf,EAEQs6C,EAAiB9M,EAAM,SAASwM,CAAY,EAAIh6C,EAAK,SAAW,UAoFhE9kB,EAAW,CACf,QAnFiB,CACjB,MACA,OACA,QACA,OACA,WACA,UACA,KACA,OACA,OACA,SACA,MACA,UACA,OACA,KACA,SACA,WACA,WACA,SACA,SACA,SACA,gBACA,SACA,SACA,UACA,QACA,WACA,QACA,WACA,WACA,UACA,WACA,YACA,iBACA,gBAEA,UACA,UACA,WACA,gBACA,eAEA,SACJ,EAyCI,KAvCc,CACd,QACA,SACA,SACA,WACA,MACA,QACA,OACA,OACA,OACA,QACA,UACA,WACA,aACA,aACA,aACA,aACA,cACA,cACA,eACA,WACA,WACA,WACA,YACA,YACA,YACA,aAEA,QACA,SACA,YAEA,UACA,OACA,WACJ,EAKI,QAAS,kBAET,SAAU,kzBASd,EAEQq/D,EAAsB,CAC1BF,EACAH,EACAxL,EACA1uC,EAAK,qBACLo6C,EACAD,CACJ,EAEQK,EAAqB,CAIzB,SAAU,CACR,CACE,MAAO,IACP,IAAK,KAEP,CACE,MAAO,KACP,IAAK,MAEP,CACE,cAAe,wBACf,IAAK,MAGT,SAAUt/D,EACV,SAAUq/D,EAAoB,OAAO,CACnC,CACE,MAAO,KACP,IAAK,KACL,SAAUr/D,EACV,SAAUq/D,EAAoB,OAAO,CAAE,MAAM,CAAE,EAC/C,UAAW,EAEnB,CAAK,EACD,UAAW,CACf,EAEQE,EAAuB,CAC3B,MAAO,IAAMR,EAAmB,eAAiBK,EACjD,YAAa,GACb,IAAK,QACL,WAAY,GACZ,SAAUp/D,EACV,QAAS,iBACT,SAAU,CACR,CACE,MAAO6+D,EACP,SAAU7+D,EACV,UAAW,GAEb,CACE,MAAOo/D,EACP,YAAa,GACb,SAAU,CAAEt6C,EAAK,QAAQivC,EAAY,CAAE,UAAW,gBAAgB,CAAE,CAAC,EACrE,UAAW,GAIb,CACE,UAAW,EACX,MAAO,KAET,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAU/zD,EACV,UAAW,EACX,SAAU,CACRwzD,EACA1uC,EAAK,qBACLm6C,EACAC,EACAF,EAEA,CACE,MAAO,KACP,IAAK,KACL,SAAUh/D,EACV,UAAW,EACX,SAAU,CACR,OACAwzD,EACA1uC,EAAK,qBACLm6C,EACAC,EACAF,MAKRA,EACAxL,EACA1uC,EAAK,qBACLq6C,EAEN,EAEE,MAAO,CACL,KAAM,IACN,QAAS,CAAE,GAAG,EACd,SAAUn/D,EAGV,kBAAmB,GACnB,QAAS,KACT,SAAU,CAAA,EAAG,OACXs/D,EACAC,EACAF,EACA,CACEF,EACA,CACE,MAAOr6C,EAAK,SAAW,KACvB,SAAU9kB,GAEZ,CACE,UAAW,QACX,cAAe,0BACf,IAAK,WACL,SAAU,CACR,CAAE,cAAe,oBAAoB,EACrC8kB,EAAK,YAGjB,CAAO,EACH,QAAS,CACP,aAAcq6C,EACd,QAASF,EACT,SAAUj/D,EAEhB,CACA,CAEA,OAAAw/D,GAAiBtsI,mDCrUjB,SAASusI,EAAI36C,EAAM,CACjB,MAAMwtC,EAAQxtC,EAAK,MAIb0uC,EAAsB1uC,EAAK,QAAQ,KAAM,IAAK,CAAE,SAAU,CAAE,CAAE,MAAO,MAAM,CAAE,CAAE,CAAE,EACjF+5C,EAAmB,qBACnBC,EAAe,kBAEfC,EAAmB,cACrBF,EAAmB,IACnBvM,EAAM,SAASwM,CAAY,EAC3B,gBAAkBxM,EAAM,SAJC,UAI4B,EACvD,IAEIoN,EAAsB,CAC1B,UAAW,OACX,MAAO,oBACX,EAKQT,EAAU,CACd,UAAW,SACX,SAAU,CACR,CACE,MAAO,cACP,IAAK,IACL,QAAS,MACT,SAAU,CAAEn6C,EAAK,gBAAgB,GAEnC,CACE,MAAO,eAXa,uDAWyB,MAC7C,IAAK,IACL,QAAS,KAEXA,EAAK,kBAAkB,CACrB,MAAO,mCACP,IAAK,qBACb,CAAO,EAEP,EAEQo6C,EAAU,CACd,UAAW,SACX,SAAU,CAER,CAAE,MACA,gVAoBF,CAAE,MACA,gKAgBJ,UAAW,CACf,EAEQC,EAAe,CACnB,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,wFACuC,EAC3C,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbr6C,EAAK,QAAQm6C,EAAS,CAAE,UAAW,QAAQ,CAAE,EAC7C,CACE,UAAW,SACX,MAAO,SAETzL,EACA1uC,EAAK,qBAEX,EAEQivC,EAAa,CACjB,UAAW,QACX,MAAOzB,EAAM,SAASwM,CAAY,EAAIh6C,EAAK,SAC3C,UAAW,CACf,EAEQs6C,EAAiB9M,EAAM,SAASwM,CAAY,EAAIh6C,EAAK,SAAW,UAGhE66C,EAAoB,CACxB,UACA,UACA,MACA,SACA,MACA,gBACA,gBACA,kBACA,OACA,SACA,QACA,QACA,OACA,QACA,QACA,WACA,YACA,WACA,QACA,UACA,gBACA,YACA,YACA,YACA,WACA,WACA,UACA,SACA,KACA,kBACA,OACA,OACA,WACA,SACA,SACA,QACA,QACA,MACA,SACA,OACA,KACA,SACA,SACA,SACA,UACA,YACA,MACA,WACA,MACA,SACA,UACA,WACA,KACA,QACA,WACA,UACA,YACA,SACA,WACA,WACA,sBACA,WACA,SACA,SACA,gBACA,iBACA,SACA,SACA,eACA,WACA,OACA,eACA,QACA,mBACA,2BACA,OACA,MACA,UACA,SACA,WACA,QACA,QACA,UACA,WACA,QACA,MACA,QACJ,EAGQC,EAAiB,CACrB,OACA,OACA,WACA,WACA,UACA,SACA,QACA,MACA,OACA,QACA,OACA,UACA,WACA,SACA,QACA,QACJ,EAEQC,EAAa,CACjB,MACA,WACA,UACA,mBACA,SACA,UACA,qBACA,yBACA,qBACA,QACA,aACA,WACA,WACA,SACA,YACA,mBACA,gBACA,UACA,QACA,aACA,WACA,WACA,QACA,WACA,gBACA,gBACA,OACA,UACA,iBACA,QACA,kBACA,wBACA,cACA,MACA,gBACA,cACA,eACA,qBACA,aACA,QACA,cACA,eACA,cACA,SACA,YACA,QACA,cACA,aACA,gBACA,qBACA,qBACA,gBACA,UACA,SACA,WACA,UACA,cACJ,EAEQC,EAAiB,CACrB,QACA,MACA,OACA,QACA,WACA,OACA,OACA,QACA,SACA,OACA,OACA,MACA,OACA,MACA,OACA,OACA,UACA,OACA,WACA,OACA,MACA,OACA,QACA,OACA,UACA,UACA,QACA,OACA,QACA,SACA,SACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,OACA,UACA,QACA,MACA,QACA,YACA,cACA,4BACA,aACA,cACA,SACA,SACA,SACA,SACA,SACA,OACA,OACA,MACA,SACA,UACA,OACA,UACA,QACA,MACA,OACA,WACA,UACA,OACA,SACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,SACA,UACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,SACA,OACA,MACA,OACA,YACA,gBACA,UACA,UACA,WACA,QACA,UACA,UACJ,EAaQC,EAAe,CACnB,KAAMH,EACN,QAASD,EACT,QAde,CACf,OACA,QACA,UACA,UACA,MACJ,EASI,SANe,CAAE,SAAS,EAO1B,YAAaE,CACjB,EAEQG,EAAoB,CACxB,UAAW,oBACX,UAAW,EACX,SAAU,CAER,MAAOF,CAAc,EACvB,MAAOxN,EAAM,OACX,KACA,eACA,SACA,UACA,aACA,YACAxtC,EAAK,SACLwtC,EAAM,UAAU,kBAAkB,CAAC,CACzC,EAEQ+M,EAAsB,CAC1BW,EACAb,EACAO,EACAlM,EACA1uC,EAAK,qBACLo6C,EACAD,CACJ,EAEQK,EAAqB,CAIzB,SAAU,CACR,CACE,MAAO,IACP,IAAK,KAEP,CACE,MAAO,KACP,IAAK,MAEP,CACE,cAAe,wBACf,IAAK,MAGT,SAAUS,EACV,SAAUV,EAAoB,OAAO,CACnC,CACE,MAAO,KACP,IAAK,KACL,SAAUU,EACV,SAAUV,EAAoB,OAAO,CAAE,MAAM,CAAE,EAC/C,UAAW,EAEnB,CAAK,EACD,UAAW,CACf,EAEQE,EAAuB,CAC3B,UAAW,WACX,MAAO,IAAMR,EAAmB,eAAiBK,EACjD,YAAa,GACb,IAAK,QACL,WAAY,GACZ,SAAUW,EACV,QAAS,iBACT,SAAU,CACR,CACE,MAAOlB,EACP,SAAUkB,EACV,UAAW,GAEb,CACE,MAAOX,EACP,YAAa,GACb,SAAU,CAAErL,CAAU,EACtB,UAAW,GAIb,CACE,MAAO,KACP,UAAW,GAGb,CACE,MAAO,IACP,eAAgB,GAChB,SAAU,CACRkL,EACAC,IAKJ,CACE,UAAW,EACX,MAAO,KAET,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUa,EACV,UAAW,EACX,SAAU,CACRvM,EACA1uC,EAAK,qBACLm6C,EACAC,EACAQ,EAEA,CACE,MAAO,KACP,IAAK,KACL,SAAUK,EACV,UAAW,EACX,SAAU,CACR,OACAvM,EACA1uC,EAAK,qBACLm6C,EACAC,EACAQ,MAKRA,EACAlM,EACA1uC,EAAK,qBACLq6C,EAEN,EAEE,MAAO,CACL,KAAM,MACN,QAAS,CACP,KACA,MACA,MACA,MACA,KACA,MACA,OAEF,SAAUY,EACV,QAAS,KACT,iBAAkB,CAAE,oBAAqB,UAAU,EACnD,SAAU,CAAA,EAAG,OACXT,EACAC,EACAS,EACAX,EACA,CACEF,EACA,CACE,MAAO,8NACP,IAAK,IACL,SAAUY,EACV,SAAU,CACR,OACAL,IAGJ,CACE,MAAO56C,EAAK,SAAW,KACvB,SAAUi7C,GAEZ,CACE,MAAO,CAEL,wDACA,MACA,OAEF,UAAW,CACT,EAAG,UACH,EAAG,eAGf,CAAO,CACP,CACA,CAEA,OAAAE,GAAiBR,mDCnlBjB,SAASS,EAAOp7C,EAAM,CACpB,MAAMq7C,EAAoB,CACxB,OACA,OACA,OACA,UACA,WACA,SACA,UACA,OACA,QACA,MACA,OACA,OACA,QACA,SACA,QACA,QACA,SACA,QACA,OACA,QACJ,EACQC,EAAqB,CACzB,SACA,UACA,YACA,SACA,WACA,YACA,WACA,QACA,SACA,WACA,SACA,UACA,MACA,SACA,SACJ,EACQC,EAAmB,CACvB,UACA,QACA,OACA,MACJ,EACQC,EAAkB,CACtB,WACA,KACA,OACA,QACA,OACA,QACA,QACA,QACA,WACA,KACA,OACA,QACA,WACA,SACA,UACA,QACA,MACA,UACA,OACA,KACA,WACA,KACA,YACA,WACA,KACA,OACA,YACA,MACA,WACA,MACA,WACA,SACA,UACA,YACA,SACA,WACA,SACA,MACA,SACA,SACA,SACA,SACA,aACA,SACA,SACA,SACA,OACA,QACA,MACA,SACA,YACA,SACA,QACA,UACA,OACA,WACA,OACJ,EACQC,EAAsB,CAC1B,MACA,QACA,MACA,YACA,OACA,QACA,QACA,KACA,aACA,UACA,SACA,OACA,OACA,MACA,SACA,QACA,OACA,OACA,OACA,MACA,SACA,MACA,UACA,KACA,KACA,UACA,UACA,SACA,SACA,WACA,SACA,SACA,MACA,YACA,UACA,MACA,OACA,QACA,OACA,OACJ,EAEQvgE,EAAW,CACf,QAASsgE,EAAgB,OAAOC,CAAmB,EACnD,SAAUJ,EACV,QAASE,CACb,EACQtM,EAAajvC,EAAK,QAAQA,EAAK,WAAY,CAAE,MAAO,qBAAsB,EAC1Eo6C,EAAU,CACd,UAAW,SACX,SAAU,CACR,CAAE,MAAO,eAAgB,EACzB,CAAE,MAAO,iEAAoE,EAC7E,CAAE,MAAO,qFAA0F,GAErG,UAAW,CACf,EACQsB,EAAa,CA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,MAAO,cAET,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,mDAET,kBAAmB,CACjB,UAAW,WACX,MAAO,gBAET,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMs8C,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAUhB,SAAShoD,EAAIoL,EAAM,CACjB,MAAMwtC,EAAQxtC,EAAK,MACb68C,EAAQ9nD,EAAMiL,CAAI,EAClB88C,EAAgB,CAAE,MAAO,8BAA8B,EACvDC,EAAe,kBACfC,EAAiB,oBACjBtP,EAAW,0BACXyM,EAAU,CACdn6C,EAAK,iBACLA,EAAK,iBACT,EAEE,MAAO,CACL,KAAM,MACN,iBAAkB,GAClB,QAAS,UACT,SAAU,CAAE,iBAAkB,SAAS,EACvC,iBAAkB,CAGhB,iBAAkB,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P,IAAK,WAEP,CACE,MAAO,QACP,IAAK,cAInB,EAAQ,OAAOyF,EAAYC,CAAa,EAClC,UAAW,EAEjB,EAAI,OAAOD,EAAYC,CAAa,EAElC1F,EAAM,SAAW8F,EACjBD,EAAO,SAAWC,EASlB,MAAMC,EAAc,CAClB,CACE,MAAO,SACP,OAAQ,CACN,IAAK,IACL,SAAUD,IAGd,CACE,UAAW,cACX,MAAO,KAfW,QAeY,IAbX,kCAakC,IAZtC,iDAYyD,WACxE,OAAQ,CACN,IAAK,IACL,SAAUP,EACV,SAAUO,GAGlB,EAEE,OAAAJ,EAAc,QAAQD,CAAU,EAEzB,CACL,KAAM,OACN,QAAS,CACP,KACA,UACA,UACA,OACA,OAEF,SAAUF,EACV,QAAS,OACT,SAAU,CAAEr+C,EAAK,QAAQ,CAAE,OAAQ,MAAM,CAAE,CAAC,EACzC,OAAO6+C,CAAW,EAClB,OAAOL,CAAa,EACpB,OAAOI,CAAqB,CACnC,CACA,CAEA,OAAAE,GAAiBb,mDCtbjB,SAASc,EAAG/+C,EAAM,CAyEhB,MAAM9kB,EAAW,CACf,QA5BU,CACV,QACA,OACA,OACA,QACA,WACA,UACA,QACA,OACA,cACA,MACA,OACA,KACA,OACA,KACA,SACA,YACA,MACA,UACA,QACA,SACA,SACA,SACA,SACA,OACA,KACJ,EAGI,KAnDY,CACZ,OACA,OACA,YACA,aACA,QACA,UACA,UACA,OACA,QACA,QACA,QACA,SACA,QACA,SACA,SACA,SACA,MACA,OACA,UACA,MACJ,EA+BI,QA3Ee,CACf,OACA,QACA,OACA,KACJ,EAuEI,SAtEgB,CAChB,SACA,MACA,QACA,UACA,OACA,OACA,MACA,OACA,MACA,QACA,QACA,UACA,OACA,UACA,QACJ,CAuDA,EACE,MAAO,CACL,KAAM,KACN,QAAS,CAAE,QAAQ,EACnB,SAAUA,EACV,QAAS,KACT,SAAU,CACR8kB,EAAK,oBACLA,EAAK,qBACL,CACE,UAAW,SACX,SAAU,CACRA,EAAK,kBACLA,EAAK,iBACL,CACE,MAAO,IACP,IAAK,OAIX,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,6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AASE,EAAW9hE,EAAI+hE,EAAczgI,EAAO,CAC3C,OAAIA,IAAU,GAAW,GAElB0+D,EAAG,QAAQ+hE,EAAclpG,GACvBipG,EAAW9hE,EAAI+hE,EAAczgI,EAAQ,CAAC,CAC9C,CACH,CAGA,SAAS0gI,EAAKngD,EAAM,CAClB,MAAMwtC,EAAQxtC,EAAK,MACbogD,EAAgB,iCAChBC,EAAmBD,EACrBH,EAAW,OAASG,EAAgB,kBAAoBA,EAAgB,WAAY,OAAQ,CAAC,EAsE3FllE,EAAW,CACf,QAtEoB,CACpB,eACA,WACA,UACA,MACA,SACA,KACA,SACA,MACA,QACA,WACA,UACA,YACA,SACA,SACA,QACA,OACA,OACA,OACA,QACA,YACA,QACA,aACA,WACA,OACA,SACA,UACA,UACA,SACA,MACA,SACA,WACA,SACA,YACA,SACA,UACA,SACA,WACA,UACA,KACA,SACA,QACA,UACA,OACA,MACJ,EA0BI,QAnBe,CACf,QACA,OACA,MACJ,EAgBI,KAdY,CACZ,OACA,UACA,OACA,QACA,MACA,OACA,QACA,QACJ,EAMI,SA1BgB,CAChB,QACA,MACJ,CAwBA,EAEQolE,EAAa,CACjB,UAAW,OACX,MAAO,IAAMF,EACb,SAAU,CACR,CACE,MAAO,KACP,IAAK,KACL,SAAU,CAAE,MAAM,GAG1B,EACQzB,EAAS,CACb,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUzjE,EACV,UAAW,EACX,SAAU,CAAE8kB,EAAK,oBAAoB,EACrC,WAAY,EAChB,EAEE,MAAO,CACL,KAAM,OACN,QAAS,CAAE,KAAK,EAChB,SAAU9kB,EACV,QAAS,QACT,SAAU,CACR8kB,EAAK,QACH,UACA,OACA,CACE,UAAW,EACX,SAAU,CACR,CAEE,MAAO,OACP,UAAW,GAEb,CACE,UAAW,SACX,MAAO,iBAMf,CACE,MAAO,wBACP,SAAU,SACV,UAAW,GAEbA,EAAK,oBACLA,EAAK,qBACL,CACE,MAAO,MACP,IAAK,MACL,UAAW,SACX,SAAU,CAAEA,EAAK,gBAAgB,GAEnCA,EAAK,iBACLA,EAAK,kBACL,CACE,MAAO,CACL,oDACA,MACAogD,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CAEE,MAAO,aACP,MAAO,WAET,CACE,MAAO,CACL5S,EAAM,OAAO,WAAY4S,CAAa,EACtC,MACAA,EACA,MACA,UAEF,UAAW,CACT,EAAG,OACH,EAAG,WACH,EAAG,aAGP,CACE,MAAO,CACL,SACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,eAEL,SAAU,CACRzB,EACA3+C,EAAK,oBACLA,EAAK,uBAGT,CAGE,cAAe,wBACf,UAAW,GAEb,CACE,MAAO,CACL,MAAQqgD,EAAmB,QAC3BrgD,EAAK,oBACL,aAEF,UAAW,CAAE,EAAG,gBAAgB,EAChC,SAAU9kB,EACV,SAAU,CACR,CACE,UAAW,SACX,MAAO,KACP,IAAK,KACL,SAAUA,EACV,UAAW,EACX,SAAU,CACRolE,EACAtgD,EAAK,iBACLA,EAAK,kBACLggD,EACAhgD,EAAK,uBAGTA,EAAK,oBACLA,EAAK,uBAGTggD,EACAM,EAEN,CACA,CAEA,OAAAC,GAAiBJ,mDClSjB,MAAMzS,EAAW,2BACXxyD,EAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACMs+D,EAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMU,EAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMsG,EAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,EAAmB,CACvB,cACA,aACA,gBACA,eAEA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ACT,MAAO,OACP,MAAO,cAET,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,mDAET,kBAAmB,CACjB,UAAW,WACX,MAAO,gBAET,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMs8C,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAGV6G,EAAmB/G,EAAe,OAAOC,CAAe,EAAE,KAAI,EAAG,QAAO,EAY9E,SAAS+G,EAAK1jD,EAAM,CAClB,MAAM68C,EAAQ9nD,EAAMiL,CAAI,EAClB2jD,EAAqBF,EAErB1G,EAAe,kBACfrP,EAAW,UACXkW,EAAkB,IAAMlW,EAAW,QAAUA,EAAW,OAIxDmW,EAAQ,CAAA,EAAUC,EAAc,CAAA,EAEhCC,EAAc,SAAS31I,EAAG,CAC9B,MAAO,CAEL,UAAW,SACX,MAAO,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K,MACb9kB,EAAW,CACf,MACA,SACA,QACA,MACA,QACA,OACA,UACA,QACA,QACA,SACA,QACA,QACA,QACA,OACA,QACA,MACA,SACA,QACA,QACA,WACA,UACA,WACA,MACA,QACA,WACA,UACA,UACA,SACA,MACA,KACA,OACA,OACA,OACA,QACA,WACA,aACA,YACA,cACA,WACA,aACA,MACA,OACA,OACA,SACA,OACA,MACA,QACA,QACA,SACA,QACA,MACA,UACA,OACA,SACA,WACA,OACA,WACA,WACA,WACA,gBACA,gBACA,aACA,WACA,eACA,eACA,YACA,cACA,UACA,cACA,iBACA,mBACA,cACA,WACA,WACA,WACA,gBACA,gBACA,aACA,cACA,aACA,QACA,OACA,SACA,OACA,OACA,KACA,MACA,KACA,QACA,MACA,QACA,OACA,OACA,OACA,OACA,KACA,UACA,SACA,OACA,SACA,QACA,YACA,MACA,QACA,KACA,KACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,KACA,KACA,OACA,KACA,MACA,MACA,OACA,UACA,KACA,MACA,MACA,OACA,UACA,OACA,MACA,MACA,QACA,SACA,YACA,OACA,MACA,KACA,YACA,KACA,KACA,OACA,OACA,UACA,WACA,WACA,WACA,OACA,OACA,MACA,SACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,MACA,SACA,OACA,UACA,SACA,SACA,SACA,QACA,OACA,WACA,aACA,YACA,UACA,cACA,cACA,WACA,aACA,aACA,QACA,SACA,SACA,UACA,WACA,WACA,MACA,QACA,SACA,aACA,OACA,SACA,QACA,UACA,OACA,QACA,OACA,QACA,QACA,MACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,OACA,UACA,MACA,OACA,OACA,QACA,KACA,WACA,KACA,UACA,QACA,QACA,SACA,SACA,SACA,UACA,QACA,QACA,MACA,QACA,SACA,MACA,OACA,UACA,YACA,OACA,OACA,QACA,QACA,MACA,MACA,KACJ,EAGQqqE,EAAkB,uBAClBC,EAAgB,CACpB,SAAU,SACV,QAAStqE,EAAS,KAAK,GAAG,CAC9B,EACQ49D,EAAQ,CACZ,UAAW,QACX,MAAO,UACP,IAAK,MACL,SAAU0M,CACd,EACQC,EAAS,CACb,MAAO,OACP,IAAK,IAET,EACQC,EAAO,CACX,MAAO,OACP,MAAO,yBACX,EACQ9M,EAAM,CACV,MAAO,WACP,SAAU,CACR,CAAE,MAAO,MAAM,EACf,CAAE,MAAOpL,EAAM,OACb,sDAGA,0BAGF,CAEE,MAAO,0BACP,UAAW,IAGf,SAAU,CAAEkY,CAAI,CACpB,EACQhH,EAAS,CACb,UAAW,SACX,SAAU,CAIR,CAAE,MAAO,oBAAoB,EAE7B,CAAE,MAAO,iDAAiD,EAE1D,CAAE,MAAO,mBAAmB,EAC5B,CAAE,MAAO,gCAAgC,EACzC,CAAE,MAAO,oBAAoB,GAE/B,UAAW,CACf,EACQiH,EAAkB,CACtB3lD,EAAK,iBACL84C,EACAF,CACJ,EACQgN,EAAe,CACnB,IACA,KACA,KACA,KACA,IACA,IACA,GACJ,EAMQC,EAAmB,CAAClgE,EAAQlkE,EAAMC,EAAQ,QAAU,CACxD,MAAM+B,EAAU/B,IAAU,MACtBA,EACA8rH,EAAM,OAAO9rH,EAAOD,CAAI,EAC5B,OAAO+rH,EAAM,OACXA,EAAM,OAAO,MAAO7nD,EAAQ,GAAG,EAC/BlkE,EACA,oBACAgC,EACA,oBACA/B,EACA6jI,CACN,CACA,EAMQO,EAAY,CAACngE,EAAQlkE,EAAMC,IACxB8rH,EAAM,OACXA,EAAM,OAAO,MAAO7nD,EAAQ,GAAG,EAC/BlkE,EACA,oBACAC,EACA6jI,CACN,EAEQQ,EAAwB,CAC5BnN,EACA54C,EAAK,kBACLA,EAAK,QACH,OACA,OACA,CAAE,eAAgB,EAAI,GAExBylD,EACA,CACE,UAAW,SACX,SAAUE,EACV,SAAU,CACR,CACE,MAAO,kBACP,IAAK,MACL,UAAW,GAEb,CACE,MAAO,kBACP,IAAK,MACL,UAAW,GAEb,CACE,MAAO,kBACP,IAAK,MACL,UAAW,GAEb,CACE,MAAO,kBACP,IAAK,MACL,UAAW,GAEb,CACE,MAAO,gBACP,IAAK,IACL,UAAW,GAEb,CACE,MAAO,UACP,IAAK,IACL,UAAW,GAEb,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAE3lD,EAAK,gBAAgB,GAEnC,CACE,MAAO,IACP,IAAK,KAEP,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAEA,EAAK,gBAAgB,GAEnC,CACE,MAAO,UACP,UAAW,GAEb,CACE,MAAO,eACP,UAAW,KAIjB0+C,EACA,CACE,MAAO,WAAa1+C,EAAK,eAAiB,gDAC1C,SAAU,kCACV,UAAW,EACX,SAAU,CACRA,EAAK,kBACL,CACE,UAAW,SACX,SAAU,CAER,CAAE,MAAO6lD,EAAiB,SAAUrY,EAAM,OAAO,GAAGoY,EAAc,CAAE,QAAS,EAAI,CAAE,CAAC,CAAC,EAErF,CAAE,MAAOC,EAAiB,SAAU,MAAO,KAAK,CAAC,EACjD,CAAE,MAAOA,EAAiB,SAAU,MAAO,KAAK,CAAC,EACjD,CAAE,MAAOA,EAAiB,SAAU,MAAO,KAAK,CAAC,GAEnD,UAAW,GAEb,CACE,UAAW,SACX,SAAU,CACR,CAGE,MAAO,aACP,UAAW,GAGb,CAAE,MAAOC,EAAU,YAAa,KAAM,IAAI,CAAC,EAE3C,CAAE,MAAOA,EAAU,OAAQtY,EAAM,OAAO,GAAGoY,EAAc,CAAE,QAAS,GAAM,EAAG,IAAI,CAAC,EAElF,CAAE,MAAOE,EAAU,OAAQ,KAAM,IAAI,CAAC,EACtC,CAAE,MAAOA,EAAU,OAAQ,KAAM,IAAI,CAAC,EACtC,CAAE,MAAOA,EAAU,OAAQ,KAAM,IAAI,CAAC,MAK9C,CACE,UAAW,WACX,cAAe,aACf,IAAK,uBACL,WAAY,GACZ,UAAW,EACX,SAAU,CAAE9lD,EAAK,WAAY0lD,CAAI,GAEnC,CACE,UAAW,QACX,cAAe,QACf,IAAK,OACL,WAAY,GACZ,UAAW,EACX,SAAU,CAAE1lD,EAAK,WAAY0lD,EAAMhH,CAAM,GAE3C,CACE,MAAO,UACP,UAAW,GAEb,CACE,MAAO,aACP,IAAK,YACL,YAAa,cACb,SAAU,CACR,CACE,MAAO,QACP,IAAK,IACL,UAAW,YAIrB,EACE,OAAA5F,EAAM,SAAWiN,EACjBN,EAAO,SAAWM,EAEX,CACL,KAAM,OACN,QAAS,CACP,KACA,MAEF,SAAUP,EACV,SAAUO,CACd,CACA,CAEA,OAAAC,GAAiBV,mDC/ejB,SAASW,EAAWjmD,EAAM,CACxB,MAAMkmD,EAAY,CAChB,UAAW,WACX,MAAO,sEACX,EACQC,EAAgB,yBAuJhBjrE,EAAW,CACf,oBAAqB,CACnB,OACA,SAEF,SAAUirE,EACV,QA3IU,CACV,QACA,SACA,SACA,UACA,QACA,SACA,MACA,QACA,WACA,SACA,UACA,KACA,KACA,SACA,OACA,OACA,OACA,QACA,SACA,MACA,OACA,UACA,WACA,WACA,WACA,SACA,WACA,SACA,WACA,SACA,YACA,OACA,gBACA,KACA,SACA,YACA,WACA,WACA,SACA,OACA,OACA,KACA,MACA,QACA,SACA,QACA,SACA,WACA,SACA,UACA,kBACA,WACA,aACA,UACA,OACA,YACA,OACA,SACA,SACA,WACA,mBACA,cACA,WACA,YACA,YACA,YACA,UACA,WACA,UACA,QACA,uBACA,WACA,oBACA,oBACA,kBACA,cACA,kBACA,WACA,WACA,YACA,oBACA,eACA,sBACA,gBACA,SACA,SACA,SACA,oBACA,UACA,WACA,mBACA,kBACA,QACA,eACA,4BACA,iBACA,oBACA,2BACA,YACA,eACA,gBACA,UACA,aACA,uBACA,0BACA,wBACA,uBACA,gBACA,mBACA,YACA,aACA,gBACA,iBACA,eACJ,EAyBI,QAxBe,CACf,QACA,OACA,QACA,OACA,MACA,MACA,KACA,MACJ,EAgBI,SAfgB,CAChB,kBACA,mBACA,gBACA,iBACA,eACJ,EAUI,KA/JY,CACZ,MACA,QACA,OACA,WACA,SACA,QACA,OACA,SACA,UACA,UACA,OACA,OACA,OACA,OACA,OACJ,CAgJA,EACQC,EAAiB,CACrB,SAAUD,EACV,QAAS,CACP,aACA,SACA,YACA,kBAEN,EACE,MAAO,CACL,KAAM,cACN,QAAS,CACP,KACA,OACA,QACA,UACA,iBAEF,SAAUjrE,EACV,QAAS,KACT,SAAU,CACRgrE,EACAlmD,EAAK,oBACLA,EAAK,qBACLA,EAAK,cACLA,EAAK,kBACLA,EAAK,iBACL,CACE,UAAW,SACX,SAAU,CACR,CACE,MAAO,KACP,IAAK,IACL,QAAS,MACT,SAAU,CAAEA,EAAK,gBAAgB,KAIvC,CACE,UAAW,OACX,MAAO,eACP,IAAK,IACL,SAAU,CAAE,QACR,gFAC+B,EACnC,SAAU,CACR,CACE,MAAO,OACP,UAAW,GAEbA,EAAK,QAAQA,EAAK,kBAAmB,CAAE,UAAW,SAAU,EAC5D,CACE,UAAW,SACX,MAAO,QACP,IAAK,IACL,QAAS,OAEXA,EAAK,oBACLA,EAAK,uBAGT,CACE,UAAW,QACX,MAAO,IAAMomD,EAAe,QAAQ,KAAK,GAAG,EAAI,OAChD,IAAK,SACL,WAAY,GACZ,SAAUA,EACV,SAAU,CAAEpmD,EAAK,qBAAqB,GAExC,CACE,MAAO,MAAQA,EAAK,oBACpB,UAAW,GAGnB,CACA,CAEA,OAAAqmD,GAAiBJ,mDChPjB,SAASK,EAAItmD,EAAM,CACjB,MAAMwtC,EAAQxtC,EAAK,MAGbumD,EAAe,yBACf7Y,EAAWF,EAAM,OACrB,2CACA+Y,CAAY,EAERC,EAA4BhZ,EAAM,OACtC,yEACA+Y,CAAY,EACRE,EAAiBjZ,EAAM,OAC3B,SACA+Y,CAAY,EACRrD,EAAW,CACf,MAAO,WACP,MAAO,OAASxV,CACpB,EACQ2M,EAAe,CACnB,MAAO,OACP,SAAU,CACR,CAAE,MAAO,SAAU,UAAW,EAAE,EAChC,CAAE,MAAO,MAAM,EAEf,CAAE,MAAO,MAAO,UAAW,EAAG,EAC9B,CAAE,MAAO,KAAK,EAEpB,EACQvB,EAAQ,CACZ,MAAO,QACP,SAAU,CACR,CAAE,MAAO,OAAO,EAChB,CACE,MAAO,OACP,IAAK,MAGb,EACQ4N,EAAgB1mD,EAAK,QAAQA,EAAK,iBAAkB,CAAE,QAAS,KAAO,EACtE2mD,EAAgB3mD,EAAK,QAAQA,EAAK,kBAAmB,CACzD,QAAS,KACT,SAAUA,EAAK,kBAAkB,SAAS,OAAO84C,CAAK,CAC1D,CAAG,EAEK8N,EAAU,CACd,MAAO,+BACP,IAAK,gBACL,SAAU5mD,EAAK,kBAAkB,SAAS,OAAO84C,CAAK,EACtD,WAAY,CAAC9/G,GAAGy4E,IAAS,CAAEA,EAAK,KAAK,YAAcz4E,GAAE,CAAC,GAAKA,GAAE,CAAC,CAAE,EAChE,SAAU,CAACA,GAAGy4E,IAAS,CAAMA,EAAK,KAAK,cAAgBz4E,GAAE,CAAC,GAAGy4E,EAAK,YAAW,CAAG,CACpF,EAEQo1C,EAAS7mD,EAAK,kBAAkB,CACpC,MAAO,qBACP,IAAK,eACT,CAAG,EAEK8mD,EAAa;AAAA,GACb7K,EAAS,CACb,MAAO,SACP,SAAU,CACR0K,EACAD,EACAE,EACAC,EAEN,EACQnI,EAAS,CACb,MAAO,SACP,SAAU,CACR,CAAE,MAAO,6BAA6B,EACtC,CAAE,MAAO,+BAA+B,EACxC,CAAE,MAAO,2CAA2C,EAEpD,CAAE,MAAO,4EAA4E,GAEvF,UAAW,CACf,EACQlF,EAAW,CACf,QACA,OACA,MACJ,EACQuN,EAAM,CAGV,YACA,UACA,WACA,eACA,2BACA,WACA,aACA,gBACA,YAGA,MACA,OACA,OACA,UACA,eACA,QACA,UACA,eAMA,QACA,WACA,MACA,KACA,SACA,OACA,UACA,QACA,WACA,OACA,QACA,QACA,QACA,QACA,WACA,UACA,UACA,KACA,SACA,OACA,SACA,QACA,aACA,SACA,aACA,QACA,YACA,WACA,OACA,OACA,UACA,QACA,UACA,QACA,MACA,UACA,OACA,SACA,OACA,KACA,aACA,aACA,YACA,MACA,UACA,YACA,QACA,WACA,OACA,UACA,QACA,MACA,QACA,SACA,KACA,UACA,YACA,SACA,WACA,OACA,SACA,SACA,SACA,QACA,QACA,MACA,QACA,MACA,MACA,OACA,QACA,MACA,OACJ,EAEQpG,EAAY,CAGhB,UACA,iBACA,qBACA,kBACA,gBACA,cACA,iBACA,2BACA,yBACA,kBACA,yBACA,eACA,YACA,oBACA,sBACA,kBACA,gBACA,iBACA,YACA,qBACA,iBACA,eACA,mBACA,2BACA,mBACA,kBACA,gBACA,iBACA,m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CnC,QAAS,KACT,UAAW,KACX,SAAU,KACV,KAAM,EAClB,CAAW,IAIX,CACA,CAEA,OAAA0nD,GAAiBD,mDC9CjB,SAASrR,EAAUp2C,EAAM,CACvB,MAAO,CACL,KAAM,aACN,QAAS,CACP,OACA,OAEF,kBAAmB,EACvB,CACA,CAEA,OAAA2nD,GAAiBvR,mDCXjB,SAASwR,EAAO5nD,EAAM,CACpB,MAAMwtC,EAAQxtC,EAAK,MACb0tC,EAAW,WAAA,sCAAA,GAAoC,EAC/Cma,EAAiB,CACrB,MACA,KACA,SACA,QACA,QACA,QACA,OACA,QACA,WACA,MACA,MACA,OACA,OACA,SACA,UACA,MACA,OACA,SACA,KACA,SACA,KACA,KACA,SACA,QACA,cACA,MACA,KACA,OACA,QACA,SACA,MACA,QACA,OACA,OACJ,EAsGQ3sE,EAAW,CACf,SAAU,sBACV,QAAS2sE,EACT,SAvGgB,CAChB,aACA,MACA,MACA,MACA,QACA,MACA,OACA,aACA,YACA,QACA,WACA,MACA,cACA,UACA,UACA,UACA,OACA,MACA,SACA,YACA,OACA,OACA,SACA,QACA,SACA,YACA,UACA,UACA,UACA,OACA,OACA,MACA,KACA,QACA,MACA,aACA,aACA,OACA,MACA,OACA,SACA,MACA,MACA,aACA,MACA,OACA,SACA,MACA,OACA,MACA,MACA,QACA,WACA,QACA,OACA,WACA,QACA,MACA,UACA,QACA,SACA,eACA,MACA,MACA,QACA,QACA,OACA,OACA,KACJ,EAkCI,QAhCe,CACf,YACA,WACA,QACA,OACA,iBACA,MACJ,EA0BI,KArBY,CACZ,MACA,WACA,YACA,OACA,OACA,UACA,UACA,WACA,WACA,MACA,QACA,OACA,OACJ,CAQA,EAEQC,EAAS,CACb,UAAW,OACX,MAAO,gBACX,EAEQhP,EAAQ,CACZ,UAAW,QACX,MAAO,KACP,IAAK,KACL,SAAU59D,EACV,QAAS,GACb,EAEQ6sE,EAAkB,CACtB,MAAO,OACP,UAAW,CACf,EAEQ9L,EAAS,CACb,UAAW,SACX,SAAU,CAAEj8C,EAAK,gBAAg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AE,GAGpC,CACA,CAEA,OAAAC,GAAiBjsI,mDCtPjB,SAASksI,EAAK1oD,EAAM,CAClB,MAAMwtC,EAAQxtC,EAAK,MAGb2oD,EAAiB,QACjBhb,EAAsBH,EAAM,OAAOmb,EAAgB3oD,EAAK,mBAAmB,EAC3E0tC,EAAWF,EAAM,OAAOmb,EAAgB3oD,EAAK,QAAQ,EAErDsnD,EAAkB,CACtB,UAAW,wBACX,UAAW,EACX,MAAO9Z,EAAM,OACX,KACA,oCACAE,EACAF,EAAM,UAAU,OAAO,CAAC,CAC9B,EACQob,EAAgB,wCAChB1tE,EAAW,CACf,WACA,KACA,QACA,QACA,SACA,MACA,QACA,QACA,WACA,QACA,KACA,MACA,OACA,OACA,SACA,QACA,QACA,KACA,MACA,KACA,OACA,KACA,MACA,OACA,QACA,QACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,SACA,OACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,OACA,SACA,QACA,SACA,UACA,MACA,UACA,QACA,QACA,OACJ,EACQs+D,EAAW,CACf,OACA,QACA,OACA,OACA,KACA,KACJ,EACQqP,EAAW,CAEf,QAEA,OACA,OACA,QACA,OACA,OACA,KACA,QACA,SACA,UACA,QACA,QACA,YACA,aACA,KACA,MACA,QACA,QACA,OACA,OACA,UACA,WACA,SACA,eACA,sBACA,oBACA,iBACA,WAEA,UACA,aACA,YACA,SACA,OACA,OACA,UACA,iBACA,gBACA,mBACA,OACA,YACA,SACA,QACA,UACA,eACA,iBACA,eACA,QACA,kBACA,eACA,cACA,SACA,WACA,UACA,aACA,OACA,iBACA,eACA,OACA,SACA,WACA,eACA,aACA,kBACJ,EACQ3O,EAAQ,CACZ,KACA,MACA,MACA,MACA,OACA,QACA,KACA,MACA,MACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,MACA,SACA,SACA,SACA,KACJ,EACE,MAAO,CACL,KAAM,OACN,QAAS,CAAE,IAAI,EACf,SAAU,CACR,SAAUl6C,EAAK,SAAW,KAC1B,KAAMk6C,EACN,QAASh/D,EACT,QAASs+D,EACT,SAAUqP,GAEZ,QAAS,KACT,SAAU,CACR7oD,EAAK,oBACLA,EAAK,QAAQ,OAAQ,OAAQ,CAAE,SAAU,CAAE,MAAM,EAAI,EACrDA,EAAK,QAAQA,EAAK,kBAAmB,CACnC,MAAO,MACP,QAAS,IACjB,CAAO,EACD,CACE,UAAW,SAEX,MAAO,gCAET,CACE,MAAO,SACP,SAAU,CACR,CAAE,MAAO,0BAA0B,EACnC,CACE,MAAO,MACP,IAAK,IACL,SAAU,CACR,CACE,MAAO,cACP,MAAO,qCAMjB,CACE,UAAW,SACX,SAAU,CACR,CAAE,MAAO,gBAAkB4oD,CAAa,EACxC,CAAE,MAAO,iBAAmBA,CAAa,EACzC,CAAE,MAAO,uBAAyBA,CAAa,EAC/C,CAAE,MAAO,kDACEA,CAAa,GAE1B,UAAW,GAEb,CACE,MAAO,CACL,KACA,MACAjb,GAEF,UAAW,CACT,EAAG,UACH,EAAG,mBAGP,CACE,UAAW,OACX,MAAO,SACP,IAAK,MACL,SAAU,CACR,CACE,UAAW,SACX,MAAO,IACP,IAAK,IACL,SAAU,CACR3tC,EAAK,qBAKb,CACE,MAAO,CACL,MACA,MACA,cACA2tC,GAEF,UAAW,CACT,EAAG,UACH,EAAG,UACH,EAAG,aAIP,CACE,MAAO,CACL,MACA,MACAA,EACA,MACA,MAEF,UAAW,CACT,EAAG,UACH,EAAG,WACH,EAAG,YAGP,CACE,MAAO,CACL,OACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CACE,MAAO,CACL,uCACA,MACAA,GAEF,UAAW,CACT,EAAG,UACH,EAAG,gBAGP,CACE,MAAO3tC,EAAK,SAAW,KACvB,SAAU,CACR,QAAS,OACT,SAAU6oD,EACV,KAAM3O,IAGV,CACE,UAAW,cACX,MAAO,MAEToN,EAEN,CACA,CAEA,OAAAwB,GAAiBJ,mDCrUjB,MAAM3zD,EAASiL,IACN,CACL,UAAW,CACT,MAAO,OACP,MAAO,cAET,cAAeA,EAAK,qBACpB,SAAU,CACR,MAAO,SACP,MAAO,mDAET,kBAAmB,CACjB,UAAW,WACX,MAAO,gBAET,wBAAyB,CACvB,MAAO,gBACP,MAAO,KACP,IAAK,KACL,QAAS,IACT,SAAU,CACRA,EAAK,iBACLA,EAAK,oBAGT,gBAAiB,CACf,MAAO,SACP,MAAOA,EAAK,UAAY,kGASxB,UAAW,GAEb,aAAc,CACZ,UAAW,OACX,MAAO,4BAEb,GAGMs8C,EAAY,CAChB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,aACA,OACA,SACA,SACA,UACA,OACA,OACA,KACA,MACA,UACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,OACA,MACA,SACA,KACA,WACA,SACA,IACA,UACA,IACA,QACA,OACA,UACA,SACA,SACA,OACA,SACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,KACA,MACA,OACF,EAEMC,EAAW,CACf,OACA,IACA,SACA,OACA,UACA,MACA,SACA,SACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,UACA,iBACA,UACA,UACA,eACA,WACA,qBACA,SACA,eACA,iBACA,iBACA,OACA,SACA,UACA,QACA,OACA,OACA,UACA,WACA,OACA,OACA,MACA,WACA,QACA,gBACA,UACF,EAEMC,EAAO,CACX,GAAGF,EACH,GAAGC,CACL,EAKME,EAAiB,CACrB,YACA,cACA,eACA,QACA,cACA,cACA,sBACA,gBACA,eACA,eACA,gBACA,OACA,SACA,QACA,kBACA,aACA,cACA,iBACA,kBACA,UACA,uBACA,mBACA,yBACA,+BACA,aACA,OACA,YACA,SACA,QAEA,YACA,YACA,aACA,YACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAiB,CACrB,SACA,WACA,QACA,UACA,UACA,UACA,UACA,MACA,WACA,OACA,QACA,UACA,QACA,cACA,gBACA,aACA,SACA,QACA,gBACA,eACA,MACA,OACA,eACA,QACA,gBACA,WACA,UACA,KACA,OACA,aACA,eACA,OACA,OACA,aACA,MACA,YACA,UACA,iBACA,eACA,mBACA,cACA,aACA,eACA,WACA,eACA,OACA,oBACA,YACA,aACA,WACA,QACA,OACA,QACA,SACA,gBACA,eACA,QACA,UACA,OACF,EAAE,KAAI,EAAG,QAAO,EAGVC,EAAkB,CACtB,QACA,WACA,SACA,MACA,aACA,eACA,aACA,gBACA,SACA,OACA,cACA,YACA,UACA,gBACF,EAAE,KAAI,EAAG,QAAO,EAEVC,EAAa,CACjB,eACA,gBACA,cACA,aACA,qBACA,MACA,cACA,YACA,wBACA,kBACA,sBACA,qBACA,sBACA,4BACA,iBACA,uBACA,kBACA,sBACA,wBACA,qBACA,4BACA,aACA,eACA,kBACA,sBACA,aACA,wBACA,wBACA,kBACA,mBACA,mBACA,oBACA,sBACA,wBACA,wBACA,oBACA,kBACA,iBACA,aACA,SACA,eACA,qBACA,mBACA,yBACA,yBACA,yBACA,qBACA,2BACA,2BACA,2BACA,qBACA,qBACA,gBACA,sBACA,4BACA,6BACA,sBACA,sBACA,kBACA,eACA,wBACA,0BACA,eACA,sBACA,sBACA,qBACA,sBACA,qBACA,gBACA,sBACA,oBACA,0BACA,0BACA,0BACA,sBACA,4BACA,4BACA,4BACA,sBACA,sBACA,cACA,oBACA,oBACA,oBACA,gBACA,eACA,qBACA,qBACA,qBACA,iBACA,0BACA,4BACA,eACA,aACA,mBACA,yBACA,0BACA,mBACA,mBACA,eACA,SACA,YACA,uBACA,gBACA,WACA,iBACA,YACA,oBACA,aACA,WACA,aACA,aACA,cACA,eACA,eACA,eACA,cACA,QACA,OACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,eACA,eACA,cACA,aACA,cACA,oBACA,oBACA,oBACA,cACA,eACA,UACA,UACA,+BACA,2BACA,gCACA,yBACA,0BACA,YACA,iBACA,iBACA,UACA,qBACA,oBACA,gBACA,cACA,MACA,YACA,aACA,SACA,KACA,KACA,YACA,UACA,oBACA,cACA,oBACA,eACA,OACA,eACA,YACA,SACA,OACA,aACA,iBACA,YACA,YACA,cACA,YACA,QACA,cACA,gBACA,OACA,OACA,eACA,cACA,wBACA,eACA,yBACA,sBACA,eACA,YACA,mBACA,cACA,iBACA,eACA,aACA,iBACA,0BACA,4BACA,uBACA,wBACA,eACA,0BACA,oBACA,0BACA,qBACA,yBACA,uBACA,wBACA,0BACA,cACA,sBACA,MACA,+BACA,6BACA,OACA,YACA,oBACA,iBACA,iBACA,cACA,kBACA,oBACA,WACA,WACA,eACA,iBACA,gBACA,sBACA,wBACA,qBACA,sBACA,SACA,sBACA,wBACA,UACA,OACA,oBACA,kBACA,mBACA,WACA,iBACA,uBACA,cACA,QACA,aACA,cACA,kBACA,oBACA,eACA,mBACA,qBACA,YACA,kBACA,gBACA,eACA,UACA,OACA,iBACA,iBACA,aACA,cACA,mBACA,aACA,mBACA,sBACA,kBACA,SACA,eACA,mBACA,qBACA,gBACA,gBACA,oBACA,sBACA,cACA,eACA,aACA,cACA,SACA,aACA,aACA,eACA,QACA,OACA,cACA,mBACA,qBACA,qBACA,oBACA,qBACA,oBACA,YACA,iBACA,aACA,YACA,cACA,gBACA,cACA,YACA,YACA,oBACA,aACA,aACA,aACA,iBACA,aACA,kBACA,YACA,iBACA,aACA,kBACA,YACA,iBACA,WACA,YACA,WACA,YACA,SACA,OACA,SACA,aACA,kBACA,SACA,gBACA,kBACA,cACA,kBACA,gBACA,UACA,QACA,UACA,UACA,gBACA,iBACA,gBACA,gBACA,WACA,kBACA,iBACA,uBACA,kBACA,gBACA,aACA,aACA,UACA,sBACA,4BACA,6BACA,wBACA,wBACA,UACA,gBACA,oBACA,sBACA,iBACA,iBACA,qBACA,uBACA,eACA,gBACA,cACA,OACA,mBACA,oBACA,oBACA,cACA,QACA,cACA,eACA,cACA,qBACA,gBACA,cACA,aACA,iBACA,WACA,kBACA,sBACA,qBACA,SACA,IACA,SACA,OACA,aACA,cACA,QACA,SACA,UACA,aACA,gBACA,QACA,kBACA,gBACA,sBACA,0BACA,4BACA,uBACA,uBACA,2BACA,6BACA,qBACA,sBACA,oBACA,iBACA,uBACA,2BACA,6BACA,wBACA,wBACA,4BACA,8BACA,sBACA,uBACA,qBACA,oBACA,mBACA,mBACA,kBACA,uBACA,uBACA,kBACA,mBACA,kBACA,wBACA,eACA,gBACA,kBACA,QACA,WACA,MACA,aACA,eACA,SACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,eACA,WACA,eACA,aACA,iBACA,kBACA,cACA,uBACA,kBACA,wBACA,uBACA,uBACA,2BACA,wBACA,4BACA,gBACA,sBACA,yBACA,sBACA,cACA,eACA,mBACA,gBACA,iBACA,cACA,mBACA,iBACA,wBACA,0BACA,YACA,iBACA,kBACA,iBACA,MACA,eACA,YACA,gBACA,mBACA,kBACA,aACA,sBACA,mBACA,sBACA,sBACA,6BACA,YACA,eACA,cACA,cACA,gBACA,iBACA,gBACA,qBACA,sBACA,qBACA,uBACA,aACA,gBACA,iBACA,eACA,cACA,cACA,aACA,eACA,eACA,cACA,uBACA,SACA,QACA,cACA,aACA,eACA,YACA,eACA,IACA,IACA,UACA,MACF,EAAE,KAAI,EAAG,QAAO,EAYhB,SAASmM,EAAK/oD,EAAM,CAClB,MAAM68C,EAAQ9nD,EAAMiL,CAAI,EAClBgpD,EAAoBrM,EACpBsM,EAAmBvM,EAEnBN,EAAgB,WAChBW,EAAe,kBAEfmG,EAAW,CACf,UAAW,WACX,MAAO,OAHQ,0BAGY,OAC3B,UAAW,CACf,EAEE,MAAO,CACL,KAAM,OACN,iBAAkB,GAClB,QAAS,SACT,SAAU,CACRljD,EAAK,oBACLA,EAAK,qBAGL68C,EAAM,gBACN,CACE,UAAW,cACX,MAAO,kBACP,UAAW,GAEb,CACE,UAAW,iBACX,MAAO,oBACP,UAAW,GAEbA,EAAM,wBACN,CACE,UAAW,eACX,MAAO,OAASL,EAAK,KAAK,GAAG,EAAI,OAEjC,UAAW,GAEb,CACE,UAAW,kBACX,MAAO,KAAOyM,EAAiB,KAAK,GAAG,EAAI,KAE7C,CACE,UAAW,kBACX,MAAO,SAAWD,EAAkB,KAAK,GAAG,EAAI,KAElD9F,EACA,CACE,MAAO,KACP,IAAK,KACL,SAAU,CAAErG,EAAM,eAAe,GAEnCA,EAAM,aACN,CACE,UAAW,YACX,MAAO,OAASD,EAAW,KAAK,GAAG,EAAI,QAEzC,CAAE,MAAO,4oCAA4oC,EACrpC,CACE,MAAO,IACP,IAAK,QACL,UAAW,EACX,SAAU,CACRC,EAAM,cACNqG,EACArG,EAAM,SACNA,EAAM,gBACN78C,EAAK,kBACLA,EAAK,iBACL68C,EAAM,UACNA,EAAM,oBAMV,CACE,MAAO,oBACP,SAAU,CACR,SAAUT,EACV,QAAS,qBAGb,CACE,MAAO,IACP,IAAK,OACL,YAAa,GACb,SAAU,CACR,SAAU,UACV,QAASW,EACT,UAAWN,EAAe,KAAK,GAAG,GAEpC,SAAU,CACR,CACE,MAAOL,EACP,UAAW,WAEb,CACE,MAAO,eACP,UAAW,aAEb8G,EACAljD,EAAK,kBACLA,EAAK,iBACL68C,EAAM,SACNA,EAAM,kBAGVA,EAAM,kBAEZ,CACA,CAEA,OAAAqM,GAAiBH,mDCj6BjB,SAASI,EAAMnpD,EAAM,CACnB,MAAO,CACL,KAAM,gBACN,QAAS,CACP,UACA,gBAEF,SAAU,CACR,CACE,UAAW,cAIX,MAAO,qCACP,OAAQ,CACN,IAAK,gBACL,YAAa,SAIvB,CACA,CAEA,OAAAopD,GAAiBD,mDCVjB,SAASE,EAAIrpD,EAAM,CACjB,MAAMwtC,EAAQxtC,EAAK,MACbspD,EAAetpD,EAAK,QAAQ,KAAM,GAAG,EACrCi8C,EAAS,CACb,MAAO,SACP,SAAU,CACR,CACE,MAAO,IACP,IAAK,IACL,SAAU,CAAE,CAAE,MAAO,IAAI,CAAE,GAGnC,EACQsN,EAAoB,CACxB,MAAO,IACP,IAAK,IACL,SAAU,CAAE,CAAE,MAAO,IAAI,CAAE,CAC/B,EAEQ/P,EAAW,CACf,OACA,QAGA,SACJ,EAEQgQ,EAAmB,CACvB,mBACA,eACA,gBACA,kBACJ,EAEQtP,EAAQ,CACZ,SACA,SACA,OACA,UACA,OACA,YACA,OACA,OACA,MACA,WACA,UACA,QACA,MACA,UACA,WACA,QACA,QACA,WACA,UACA,OACA,MACA,WACA,OACA,YACA,UACA,UACA,WACJ,EAEQuP,EAAqB,CACzB,MACA,MACA,YACA,OACA,QACA,QACA,OACA,MACJ,EAGQ5B,EAAiB,CACrB,MACA,OACA,MACA,WACA,QACA,MACA,MACA,MACA,QACA,YACA,wBACA,KACA,aACA,OACA,aACA,KACA,OACA,SACA,gBACA,MACA,QACA,cACA,kBACA,UACA,SACA,SACA,OACA,UACA,OACA,KACA,OACA,SACA,cACA,WACA,OACA,OACA,OACA,UACA,OACA,cACA,YACA,mBACA,QACA,aACA,OACA,QACA,WACA,UACA,UACA,SACA,SACA,YACA,UACA,aACA,WACA,UACA,OACA,OACA,gBACA,MACA,OACA,QACA,YACA,aACA,SACA,QACA,OACA,YACA,UACA,kBACA,eACA,kCACA,eACA,eACA,cACA,iBACA,eACA,oBACA,eACA,eACA,mCACA,eACA,SACA,QACA,OACA,MACA,aACA,MACA,UACA,WACA,UACA,UACA,SACA,SACA,aACA,QACA,WACA,gBACA,aACA,WACA,SACA,OACA,UACA,OACA,UACA,OACA,QACA,MACA,YACA,gBACA,WACA,SACA,SACA,QACA,SACA,OACA,UACA,SACA,MACA,WACA,UACA,QACA,QACA,SACA,cACA,QACA,QACA,MACA,UACA,YACA,OACA,OACA,OACA,WACA,SACA,MACA,SACA,QACA,QACA,WACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,UACA,QACA,QACA,cACA,SACA,MACA,UACA,YACA,eACA,WACA,OACA,KACA,OACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,WACA,QACA,aACA,UACA,OACA,UACA,OACA,OACA,aACA,UACA,KACA,QACA,YACA,iBACA,MACA,QACA,QACA,QACA,eACA,kBACA,UACA,MACA,SACA,QACA,SACA,MACA,SACA,MACA,WACA,SACA,QACA,WACA,WACA,UACA,QACA,QACA,MACA,KACA,OACA,YACA,MACA,YACA,QACA,OACA,SACA,UACA,eACA,oBACA,KACA,SACA,MACA,OACA,KACA,MACA,OACA,OACA,KACA,QACA,MACA,QACA,OACA,WACA,UACA,YACA,YACA,UACA,MACA,UACA,eACA,kBACA,kBACA,SACA,UACA,WACA,iBACA,QACA,WACA,YACA,UACA,UACA,YACA,MACA,QACA,OACA,QACA,OACA,YACA,MACA,aACA,cACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,UACA,SACA,SACA,UACA,SACA,QACA,WACA,SACA,MACA,aACA,OACA,UACA,YACA,QACA,SACA,SACA,SACA,OACA,SACA,YACA,eACA,MACA,OACA,UACA,MACA,OACA,OACA,WACA,OACA,WACA,eACA,MACA,eACA,WACA,aACA,OACA,QACA,SACA,aACA,cACA,cACA,SACA,YACA,kBACA,WACA,MACA,YACA,SACA,cACA,cACA,QACA,cACA,MACA,OACA,OACA,OACA,YACA,gBACA,kBACA,KACA,WACA,YACA,kBACA,cACA,QACA,UACA,OACA,aACA,OACA,WACA,UACA,QACA,SACA,UACA,SACA,SACA,QACA,OACA,QACA,QACA,SACA,WACA,UACA,WACA,YACA,UACA,UACA,aACA,OACA,WACA,QACA,eACA,SACA,OACA,SACA,UACA,MACJ,EAKQ6B,EAAqB,CACzB,MACA,OACA,YACA,OACA,OACA,MACA,OACA,OACA,UACA,WACA,OACA,MACA,OACA,QACA,YACA,aACA,YACA,aACA,QACA,UACA,MACA,UACA,cACA,QACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,MACA,aACA,OACA,UACA,KACA,MACA,QACA,QACA,MACA,MACA,MACA,YACA,QACA,SACA,eACA,kBACA,kBACA,W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,KACA,SACA,WACA,QACA,SACA,QACA,QACA,kBACA,WACA,KACA,KACA,WACA,cACA,OACA,MACA,QACA,WACA,cACA,cACA,OACA,WACA,WACA,WACA,UACA,UACA,kBACA,SACA,iBACA,UACA,WACA,gBACA,SACA,SACA,WACA,WACA,SACA,MACA,OACA,SACA,SACA,YACA,QACA,SACA,SACA,QACA,QACA,OACA,MACA,YACA,kBACA,oBACA,UACA,MACA,OACA,QACA,QACA,SACF,EAMMC,EAAW,CACf,QACA,MACA,MACF,EAGMC,EAA0B,CAC9B,aACA,gBACA,aACA,OACA,YACA,OACA,OACF,EAIMC,EAAqB,CACzB,gBACA,UACA,aACA,QACA,UACA,SACA,SACA,QACA,UACA,eACA,YACA,YACA,MACA,gBACA,WACA,QACA,YACA,kBACA,UACF,EAGMC,EAAW,CACf,MACA,MACA,MACA,SACA,mBACA,aACA,OACA,aACA,YACA,4BACA,MACA,MACA,cACA,eACA,eACA,eACA,sBACA,QACA,WACA,gBACA,WACA,SACA,OACA,oCACA,YACA,OACA,gBACA,iBACA,uBACA,2BACA,oBACA,aACA,0BACA,KACF,EAGMC,EAAehe,EACnB,oBACA,kBACA,iBACA,iBACA,iBACA,mCACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,UACF,EAGMie,EAAoBje,EACxBge,EACA,kBACA,kBACA,kBACA,kBACA,iBAGF,EAGME,EAAWte,EAAOoe,EAAcC,EAAmB,GAAG,EAGtDE,EAAiBne,EACrB,YACA,uDACA,yDACA,yDACA,kBACA,+DACA,yDACA,+BACA,yDACA,yDACA,8BAMF,EAGMoe,EAAsBpe,EAC1Bme,EACA,KACA,wDACF,EAGME,EAAaze,EAAOue,EAAgBC,EAAqB,GAAG,EAG5DE,EAAiB1e,EAAO,QAASwe,EAAqB,GAAG,EAKzDG,EAAoB,CACxB,WACA,cACA3e,EAAO,eAAgBI,EAAO,QAAS,QAAS,GAAG,EAAG,IAAI,EAC1D,oBACA,kBA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CE,UAAW,SAEX,MAAO,aACP,UAAW,GAEbA,EAAK,kBACL,CACE,cAAew5C,EACf,SAAU,CAAE,QAASA,CAAQ,GAE/BmV,EAGA,CACE,UAAW,SACX,MAAO3uD,EAAK,YAAc,MAC1B,UAAW,GAEb6uD,EACAtP,EACAkP,EACAxS,CACJ,EAEQ6H,EAAc,CAAE,GAAG/uD,CAAK,EAC9B,OAAA+uD,EAAY,IAAG,EACfA,EAAY,KAAK4K,CAAgB,EACjCE,EAAgB,SAAW9K,EAEpB,CACL,KAAM,OACN,iBAAkB,GAClB,QAAS,CAAE,KAAK,EAChB,SAAU/uD,CACd,CACA,CAEA,OAAA+5D,GAAiBT,mDCpNjB,MAAM3gB,EAAW,2BACXxyD,EAAW,CACf,KACA,KACA,KACA,KACA,MACA,QACA,UACA,MACA,MACA,WACA,KACA,SACA,OACA,OACA,QACA,QACA,aACA,OACA,QACA,OACA,UACA,MACA,SACA,WACA,SACA,SACA,MACA,QACA,QACA,QAIA,WACA,QACA,QACA,SACA,SACA,OACA,SACA,UAEA,OACF,EACMs+D,EAAW,CACf,OACA,QACA,OACA,YACA,MACA,UACF,EAGMU,EAAQ,CAEZ,SACA,WACA,UACA,SAEA,OACA,OACA,SACA,SAEA,SACA,SAEA,QACA,eACA,eACA,YACA,aACA,oBACA,aACA,aACA,cACA,cACA,gBACA,iBAEA,MACA,MACA,UACA,UAEA,cACA,oBACA,UACA,WACA,OAEA,UACA,YACA,oBACA,gBAEA,UACA,QAEA,OAEA,aACF,EAEMsG,EAAc,CAClB,QACA,YACA,gBACA,aACA,iBACA,cACA,YACA,UACF,EAEMC,EAAmB,CACvB,cACA,aACA,gBACA,eAEA,UACA,UAEA,OACA,WACA,QACA,aACA,WACA,YACA,qBACA,YACA,qBACA,SACA,UACF,EAEMC,EAAqB,CACzB,YACA,OACA,QACA,UACA,SACA,WACA,eACA,iBACA,SACA,QACF,EAEMC,EAAY,CAAA,EAAG,OACnBF,EACAvG,EACAsG,CACF,EAWA,SAASI,EAAW5gD,EAAM,CACxB,MAAMwtC,EAAQxtC,EAAK,M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AC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,QAAU,OAAS,EAAG,EAAG,IAAK,EACrC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACpC,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,OAAS,EAAG,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,GAAM,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC9B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,EAAG,EAAG,EAAG,IAAK,EACzB,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,EAAG,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,OAAS,OAAS,EAAG,EAAG,IAAK,EACrC,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B,IAAO,CAAC,EAAG,OAAS,EAAG,EAAG,IAAK,EAC/B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ACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,K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","x_google_ignoreList":[0,1,2,3,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264]}